ta_identity_t *ta_identity_create(char *name, xt_core_log_t *log) { assert(name); assert(log); ta_identity_t *identity; xt_core_bool_t so_far_so_good; identity = malloc(sizeof *identity); if (identity) { identity->log = log; identity->phrases_qutex = NULL; identity->phrases = NULL; identity->name = xt_core_string_copy(name); if (identity->name) { so_far_so_good = xt_core_bool_true; } else { so_far_so_good = xt_core_bool_false; xt_core_log_trace(log, " ta ", "xt_core_string_copy"); } } else { so_far_so_good = xt_core_bool_false; xt_core_log_trace(log, " ta ", "malloc"); } if (so_far_so_good) { identity->phrases = xt_case_list_create(ta_phrase_compare, ta_phrase_copy, ta_phrase_destroy); if (identity->phrases) { so_far_so_good = xt_core_bool_true; xt_case_list_set_size_limit(identity->phrases, MAX_PHRASES_SIZE); } else { so_far_so_good = xt_core_bool_false; xt_core_log_enter(log, " ta ", "xt_case_list_create"); } } if (so_far_so_good) { identity->phrases_qutex = xt_sync_qutex_create(); if (!identity->phrases_qutex) { so_far_so_good = xt_core_bool_false; xt_core_log_enter(log, " ta ", "xt_sync_qutex_create"); } } if (identity && !so_far_so_good) { if (identity->name) { xt_core_string_destroy(identity->name); } if (identity->phrases) { xt_case_list_destroy(identity->phrases); } if (identity->phrases_qutex) { xt_sync_qutex_destroy(identity->phrases_qutex); } free(identity); identity = NULL; } return identity; }
xt_core_bool_t connect_to_server(xt_net_client_system_t *client) { assert(client); xt_core_bool_t success; unsigned short port; success = xt_core_bool_false; for (port = client->server_min_port; (port <= client->server_max_port) && (!success); port++) { client->socket = xt_net_client_socket_create(client->server_ip_address, port); if (client->socket >= 0) { client->server_socket_closed = xt_core_bool_false; client->server_port = port; xt_core_log_enter(client->log, "xnet", "client connected to server on port %i", port); pthread_mutex_lock(&client->messaging_mutex); { client->post = xt_net_post_system_create(client->socket); if (client->post) { if (xt_net_exchange_register_post (client->exchange, client->post)) { success = xt_core_bool_true; } else { xt_core_log_trace(client->log, "xnet", "x_net_exchange_register_post"); xt_net_client_socket_destroy(client->socket); client->server_socket_closed = xt_core_bool_true; xt_net_post_system_destroy(client->post); client->post = NULL; } } else { xt_core_log_trace(client->log, "xnet", "x_net_post_create"); xt_net_client_socket_destroy(client->socket); client->server_socket_closed = xt_core_bool_true; } } pthread_mutex_unlock(&client->messaging_mutex); } else { xt_core_log_enter(client->log, "xnet", "client could not connect to server on port %i", port); } } return success; }
xt_core_bool_t ta_identity_talk(ta_identity_t *identity, ta_phrase_t *phrase) { assert(identity); assert(phrase); xt_core_bool_t success; xt_core_bool_t zap; if (xt_case_list_get_size(identity->phrases) >= MAX_PHRASES_SIZE) { zap = xt_core_bool_true; } else { zap = xt_core_bool_false; } xt_sync_qutex_lock_exclusive(identity->phrases_qutex); if (zap) { xt_case_list_clear(identity->phrases); } ta_phrase_set_id(phrase, xt_case_list_get_size(identity->phrases)); if (xt_case_list_add_last(identity->phrases, phrase)) { xt_sync_qutex_unlock_exclusive(identity->phrases_qutex); success = xt_core_bool_true; } else { xt_sync_qutex_unlock_exclusive(identity->phrases_qutex); xt_core_log_enter(identity->log, " ta ", "xt_case_list_add_last"); success = xt_core_bool_false; } return success; }
xt_core_bool_t ensure_client_is_connected(xt_net_client_system_t *client) { assert(client); xt_core_bool_t connected; connected = xt_core_bool_true; if (client->server_socket_closed) { connected = connect_to_server(client); if (connected) { xt_core_log_enter(client->log, "xnet", "reconnected to server"); } else { xt_core_log_enter(client->log, "xnet", "could not reconnect to server"); } } return connected; }
xt_core_bool_t handle_disconnect(xt_net_client_system_t *client) { assert(client); xt_core_bool_t success; xt_core_log_enter(client->log, "xnet", "lost connection to server"); if (xt_net_exchange_unregister_post(client->exchange, client->socket)) { success = xt_core_bool_true; xt_net_post_system_destroy(client->post); client->post = NULL; } else { success = xt_core_bool_false; xt_core_log_trace(client->log, "xnet", "x_net_exchange_unregister_post"); } return success; }
int main(int argc, char *argv[]) { ta_system_t *ta_system; ta_server_t ta_server; xt_net_server_system_t *http_server; unsigned short http_server_min_port; unsigned short http_server_max_port; xt_net_engine_iengine_t http_iengine; xt_core_imessage_t http_imessage; xt_net_post_ipost_t http_ipost; xt_core_objects_t objects; xt_file_basic_t *log_file; xt_core_log_t *log; FILE *log_file_file; xt_config_system_t *config; char *atom_directory; unsigned long identities_shard_count; unsigned short clear_all_identities_period_minutes; xt_core_objects_init(&objects); log_file = xt_file_basic_create (LOG_FILENAME, XT_FILE_MODE_TRUNCATE_OR_CREATE_FOR_WRITE); if (!log_file) { xt_core_trace_exit("xt_file_basic_create"); } log = xt_core_log_create(stdout); if (!log) { xt_core_trace_exit("xt_core_log_create"); } log_file_file = xt_file_basic_get_file(log_file); if (log_file_file) { if (!xt_core_log_add_file(log, log_file_file)) { xt_core_log_trace_exit(log, " ta ", "xt_core_log_add_file"); } } else { xt_core_log_trace_exit(log, " ta ", "xt_file_basic_get_file"); } #ifdef XT_BUILD_DEMO xt_core_log_enter(log, " ta ", "demo build"); #endif #ifdef XT_BUILD_DEVELOPMENT xt_core_log_enter(log, " ta ", "development build"); #endif #ifdef XT_BUILD_RELEASE xt_core_log_enter(log, " ta ", "release build"); #endif config = xt_config_system_create(argc, argv, CONF_FILENAME, &objects); if (!config) { xt_core_log_trace_exit(log, " ta ", "xt_config_system_create"); } xt_config_system_find_as_string(config, "atom_directory", &atom_directory, DEFAULT_ATOM_DIRECTORY); xt_core_log_enter(log, " ta ", "using atom directory %s", atom_directory); xt_config_system_find_as_unsigned_short(config, "http_server_min_port", &http_server_min_port, DEFAULT_HTTP_SERVER_MIN_PORT); xt_config_system_find_as_unsigned_short(config, "http_server_max_port", &http_server_max_port, DEFAULT_HTTP_SERVER_MAX_PORT); xt_core_log_enter(log, " ta ", "using http server port range %i..%i", http_server_min_port, http_server_max_port); xt_config_system_find_as_unsigned_long(config, "identities_shard_count", &identities_shard_count, DEFAULT_IDENTITIES_SHARD_COUNT); xt_core_log_enter(log, " ta ", "identities_shard_count is %i", identities_shard_count); xt_config_system_find_as_unsigned_short(config, "clear_all_identities_period_minutes", &clear_all_identities_period_minutes, DEFAULT_CLEAR_ALL_IDENTITIES_PERIOD_MINUTES); xt_core_log_enter(log, " ta ", "clear_all_identities_period_minutes is %i", clear_all_identities_period_minutes); xt_net_engine_iengine_init(&http_iengine, ta_http_engine_create, ta_http_engine_destroy, ta_http_engine_get_handler_for_message, ta_http_engine_maintain, ta_http_engine_run, ta_http_engine_start, ta_http_engine_stop); xt_core_imessage_init(&http_imessage, xt_net_http_message_destroy, xt_net_http_message_get_client_socket, xt_net_http_message_get_engine_id, xt_net_http_message_get_type); xt_net_post_ipost_init(&http_ipost, xt_net_http_post_compare, xt_net_http_post_create, xt_net_http_post_create_decoy, xt_net_http_post_destroy, xt_net_http_post_destroy_decoy, xt_net_http_post_get_last_receive_activity_time, xt_net_http_post_get_socket, xt_net_http_post_get_stats, xt_net_http_post_receive_message, xt_net_http_post_receive_messages, xt_net_http_post_send_message, xt_net_http_post_send_messages, xt_net_http_post_is_socket_closed, xt_net_http_post_mod, xt_net_http_post_compare_equal); ta_system = ta_system_create(identities_shard_count, clear_all_identities_period_minutes, log); if (!ta_system) { xt_core_log_trace_exit(log, " ta ", "ta_system_create"); } ta_server_init(&ta_server, atom_directory, ta_system, log); http_server = xt_net_server_system_create("ta", http_server_min_port, http_server_max_port, HTTP_SERVER_MAX_THREADS, &http_imessage, &http_ipost, ta_get_engine_name, XT_NET_SERVER_SYSTEM_NO_CONFIG_SYSTEM, log); if (!http_server) { xt_core_log_trace_exit(log, " ta ", "xt_net_server_system_create"); } if (!xt_net_server_system_register_engine(http_server, XT_NET_ENGINE_HTTP, &ta_server, &http_iengine, 4, 8, XT_NET_MAINTAIN_1_MINUTE, XT_NET_MESSAGE_TYPE_COUNT_NONE)) { xt_core_log_trace_exit(log, " ta ", "xt_net_server_register_engine"); } if (!xt_net_server_system_start(http_server)) { xt_core_log_trace_exit(log, " ta ", "xt_net_server_start"); } xt_net_server_system_destroy(http_server); ta_server_free(&ta_server); ta_system_destroy(ta_system); xt_file_basic_destroy(log_file); xt_config_system_destroy(config); xt_core_log_destroy(log); return 0; }