From 167f333f9382922ef617147de238339c98792844 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 29 Nov 2006 19:53:45 +0000 Subject: [PATCH] More client library rewrites. --- lib/silcclient/client.c | 1 + lib/silcclient/client_entry.c | 3 +++ lib/silcclient/client_register.c | 13 ++++++++++-- lib/silcclient/command.c | 21 ++++++++++++++------ lib/silcclient/command_reply.c | 34 +++++++++++++++++++++++++------- 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index 5fdb9dad..9a64a6c0 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -406,6 +406,7 @@ SILC_FSM_STATE(silc_client_st_run) if (client->internal->run_callback && client->internal->ops->running) { /* Call running callbcak back to application */ + SILC_LOG_DEBUG(("We are running, call running callback")); client->internal->run_callback = FALSE; client->internal->ops->running(client, client->application); return SILC_FSM_CONTINUE; diff --git a/lib/silcclient/client_entry.c b/lib/silcclient/client_entry.c index 23c3c728..58701bce 100644 --- a/lib/silcclient/client_entry.c +++ b/lib/silcclient/client_entry.c @@ -744,6 +744,7 @@ SilcClientEntry silc_client_add_client(SilcClient client, client_entry->nickname_normalized = nick; silc_mutex_unlock(conn->internal->lock); + silc_client_ref_client(client, conn, client_entry); return client_entry; } @@ -1296,6 +1297,7 @@ SilcChannelEntry silc_client_add_channel(SilcClient client, } silc_mutex_unlock(conn->internal->lock); + silc_client_ref_channel(client, conn, channel); return channel; } @@ -1671,6 +1673,7 @@ SilcServerEntry silc_client_add_server(SilcClient client, } silc_mutex_unlock(conn->internal->lock); + silc_client_ref_server(client, conn, server_entry); return server_entry; } diff --git a/lib/silcclient/client_register.c b/lib/silcclient/client_register.c index 5d12f79b..8ff3fb4c 100644 --- a/lib/silcclient/client_register.c +++ b/lib/silcclient/client_register.c @@ -60,6 +60,9 @@ SILC_FSM_STATE(silc_client_new_id) silc_buffer_len(&packet->buffer), &id)) goto out; + SILC_LOG_DEBUG(("New ID %s", silc_id_render(&id.u.client_id, + SILC_ID_CLIENT))); + /* Create local client entry */ conn->local_entry = silc_client_add_client(client, conn, client->username, @@ -74,8 +77,10 @@ SILC_FSM_STATE(silc_client_new_id) conn->internal->local_idp = silc_buffer_copy(&packet->buffer); /* Save cache entry */ - silc_idcache_find_by_id_one(conn->internal->client_cache, conn->local_id, - &conn->internal->local_entry); + if (!silc_idcache_find_by_id_one(conn->internal->client_cache, + conn->local_id, + &conn->internal->local_entry)) + goto out; /* Save remote ID */ if (packet->src_id_len) { @@ -90,6 +95,10 @@ SILC_FSM_STATE(silc_client_new_id) &conn->remote_id); } + /* Set IDs to the packet stream */ + silc_packet_set_ids(conn->stream, SILC_ID_CLIENT, conn->local_id, + conn->remote_id.type, SILC_ID_GET_ID(conn->remote_id)); + /* Signal connection that new ID was received so it can continue with the registering. */ if (conn->internal->registering) diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index 0eed6981..13d7fabd 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -238,6 +238,9 @@ silc_client_command_add_pending(SilcClientConnection conn, silc_list_add(cmd->reply_callbacks, cb); } + SILC_LOG_DEBUG(("pending: cmd %p, command %d, ident %d", cmd, cmd->cmd, + cmd->cmd_ident)); + /* Add pending reply */ silc_list_add(conn->internal->pending_commands, cmd); @@ -410,10 +413,10 @@ SilcUInt16 silc_client_command_call(SilcClient client, argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) * (argc + 1)); argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1)); if (!argv || !argv_lens || !argv_types) - return FALSE; + return 0; argv[argc] = silc_memdup(arg, strlen(arg)); if (!argv[argc]) - return FALSE; + return 0; argv_lens[argc] = strlen(arg); argv_types[argc] = argc; argc++; @@ -588,10 +591,16 @@ SILC_FSM_STATE(silc_client_command_whois) /* Given without arguments fetches client's own information */ if (cmd->argc < 2) { - silc_client_command_send(conn->client, conn, SILC_COMMAND_WHOIS, - NULL, NULL, 1, 4, - silc_buffer_datalen(conn->internal->local_idp)); - goto out; + silc_client_command_send_va(conn, cmd, cmd->cmd, NULL, NULL, 1, 4, + silc_buffer_data(conn->internal->local_idp), + silc_buffer_len(conn->internal->local_idp)); + + /* Notify application */ + COMMAND(SILC_STATUS_OK); + + /** Wait for command reply */ + silc_fsm_next(fsm, silc_client_command_reply_wait); + return SILC_FSM_CONTINUE; } for (i = 1; i < cmd->argc; i++) { diff --git a/lib/silcclient/command_reply.c b/lib/silcclient/command_reply.c index bc7b20fd..b3d91da7 100644 --- a/lib/silcclient/command_reply.c +++ b/lib/silcclient/command_reply.c @@ -32,7 +32,8 @@ do { \ silc_status_get_args(cmd->status, args, &arg1, &arg2); \ else \ cmd->status = error; \ - silc_client_command_callback(cmd, arg1, arg2); \ + SILC_LOG_DEBUG(("Error in command reply")); \ + silc_client_command_callback(cmd, arg1, arg2); \ } while(0) /* Check for error */ @@ -73,7 +74,9 @@ silc_client_command_callback(SilcClientCommandContext cmd, ...) /* Default reply callback */ if (cmd->called) { + SILC_LOG_DEBUG(("cp %p, ap %p", cp, ap)); silc_va_copy(cp, ap); + SILC_LOG_DEBUG(("cp %p, ap %p", cp, ap)); cmd->conn->client->internal->ops->command_reply( cmd->conn->client, cmd->conn, cmd->cmd, cmd->status, cmd->error, cp); @@ -84,7 +87,9 @@ silc_client_command_callback(SilcClientCommandContext cmd, ...) silc_list_start(cmd->reply_callbacks); while ((cb = silc_list_get(cmd->reply_callbacks))) if (!cb->do_not_call) { + SILC_LOG_DEBUG(("cp %p, ap %p", cp, ap)); silc_va_copy(cp, ap); + SILC_LOG_DEBUG(("cp %p, ap %p", cp, ap)); cb->do_not_call = cb->reply(cmd->conn->client, cmd->conn, cmd->cmd, cmd->status, cmd->error, cb->context, cp); va_end(cp); @@ -145,10 +150,15 @@ SILC_FSM_STATE(silc_client_command_reply) /* Find the command pending reply */ silc_mutex_lock(conn->internal->lock); silc_list_start(conn->internal->pending_commands); - while ((cmd = silc_list_get(conn->internal->pending_commands))) + while ((cmd = silc_list_get(conn->internal->pending_commands))) { + SILC_LOG_DEBUG(("cmd %p, command %d, ident %d", cmd, cmd->cmd, + cmd->cmd_ident)); if ((cmd->cmd == command || cmd->cmd == SILC_COMMAND_NONE) - && cmd->cmd_ident == cmd_ident) + && cmd->cmd_ident == cmd_ident) { + silc_list_del(conn->internal->pending_commands, cmd); break; + } + } silc_mutex_unlock(conn->internal->lock); if (!cmd) { @@ -157,6 +167,8 @@ SILC_FSM_STATE(silc_client_command_reply) return SILC_FSM_FINISH; } + SILC_LOG_DEBUG(("cmd %p, command %d", cmd, cmd->cmd)); + /* Signal command thread that command reply has arrived */ silc_fsm_set_state_context(&cmd->thread, payload); silc_fsm_next(&cmd->thread, silc_client_command_reply_process); @@ -658,6 +670,7 @@ SILC_FSM_STATE(silc_client_command_reply_nick) } /* Update the client entry */ + silc_mutex_lock(conn->internal->lock); if (!silc_idcache_update(conn->internal->client_cache, conn->internal->local_entry, &conn->local_entry->id, @@ -665,14 +678,18 @@ SILC_FSM_STATE(silc_client_command_reply_nick) conn->local_entry->nickname_normalized, tmp, TRUE)) { silc_free(tmp); + silc_mutex_unlock(conn->internal->lock); ERROR_CALLBACK(SILC_STATUS_ERR_BAD_NICKNAME); goto out; } - memcpy(conn->local_entry->nickname, nick, strlen(nick)); + silc_mutex_unlock(conn->internal->lock); + memset(conn->local_entry->nickname, 0, sizeof(conn->local_entry->nickname)); + memcpy(conn->local_entry->nickname, nick, len); conn->local_entry->nickname_normalized = tmp; silc_buffer_enlarge(conn->internal->local_idp, idp_len); silc_buffer_put(conn->internal->local_idp, idp, idp_len); silc_client_nickname_format(client, conn, conn->local_entry); + silc_packet_set_ids(conn->stream, SILC_ID_CLIENT, conn->local_id, 0, NULL); /* Notify application */ silc_client_command_callback(cmd, conn->local_entry, @@ -1009,9 +1026,10 @@ SILC_FSM_STATE(silc_client_command_reply_ping) SilcInt64 diff; diff = silc_time() - SILC_PTR_TO_64(cmd->context); - SAY(client, conn, SILC_CLIENT_MESSAGE_INFO, - "Ping reply from %s: %d second%s", conn->remote_host, - (int)diff, diff == 1 ? "" : "s"); + if (cmd->verbose) + SAY(client, conn, SILC_CLIENT_MESSAGE_INFO, + "Ping reply from %s: %d second%s", conn->remote_host, + (int)diff, diff == 1 ? "" : "s"); /* Notify application */ silc_client_command_callback(cmd); @@ -1144,6 +1162,8 @@ SILC_FSM_STATE(silc_client_command_reply_join) /* Mode */ SILC_GET32_MSB(mode, client_mode_list.data); + SILC_LOG_DEBUG(("id %s", silc_id_render(&id.u.client_id, SILC_ID_CLIENT))); + /* Get client entry */ client_entry = silc_client_get_client_by_id(client, conn, &id.u.client_id); if (!client_entry) -- 2.24.0