Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: system.c Projeto: xtools/xt
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
Arquivo: system.c Projeto: xtools/xt
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;
}
Exemplo n.º 5
0
Arquivo: system.c Projeto: xtools/xt
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;
}
Exemplo n.º 6
0
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;
}