silc_client_command_free(cmd);
}
+/* Pending callbcak that will be called after the NICK command was
+ replied by the server. This sets the nickname if there were no
+ errors. */
+
+SILC_CLIENT_CMD_FUNC(nick_change)
+{
+ SilcClientCommandContext cmd = (SilcClientCommandContext)context;
+ SilcClientConnection conn = cmd->conn;
+ SilcClientCommandReplyContext reply =
+ (SilcClientCommandReplyContext)context2;
+ SilcCommandStatus status;
+
+ SILC_GET16_MSB(status, silc_argument_get_arg_type(reply->args, 1, NULL));
+ if (status == SILC_STATUS_OK) {
+ /* Set the nickname */
+ if (conn->nickname)
+ silc_free(conn->nickname);
+ conn->nickname = strdup(cmd->argv[1]);
+ conn->local_entry->nickname = conn->nickname;
+ silc_idcache_del_by_context(conn->client_cache, conn->local_entry);
+ silc_idcache_add(conn->client_cache, strdup(cmd->argv[1]),
+ conn->local_entry->id, conn->local_entry, FALSE);
+ COMMAND;
+ } else {
+ COMMAND_ERROR;
+ }
+
+ silc_client_command_free(cmd);
+}
+
/* Command NICK. Shows current nickname/sets new nickname on current
window. */
goto out;
}
- /* Set new nickname */
- buffer = silc_command_payload_encode(SILC_COMMAND_NICK,
- cmd->argc - 1, ++cmd->argv,
- ++cmd->argv_lens, ++cmd->argv_types,
+ if (cmd->argv_lens[1] > 128)
+ cmd->argv_lens[1] = 128;
+
+ /* Send the NICK command */
+ buffer = silc_command_payload_encode(SILC_COMMAND_NICK, 1,
+ &cmd->argv[1],
+ &cmd->argv_lens[1],
+ &cmd->argv_types[1],
++cmd->conn->cmd_ident);
silc_client_packet_send(cmd->client, cmd->conn->sock,
SILC_PACKET_COMMAND, NULL, 0, NULL, NULL,
buffer->data, buffer->len, TRUE);
silc_buffer_free(buffer);
- cmd->argv--;
- cmd->argv_lens--;
- cmd->argv_types--;
- if (conn->nickname)
- silc_free(conn->nickname);
- conn->nickname = strdup(cmd->argv[1]);
- /* Notify application */
- COMMAND;
+ /* Register pending callback that will actually set the new nickname
+ if there were no errors returned by the server. */
+ silc_client_command_pending(conn, SILC_COMMAND_NICK,
+ cmd->conn->cmd_ident,
+ silc_client_command_destructor,
+ silc_client_command_nick_change,
+ silc_client_command_dup(cmd));
+ cmd->pending = TRUE;
+ return;
out:
silc_client_command_free(cmd);
conn->ping[i].start_time = time(NULL);
conn->ping[i].dest_id = id;
conn->ping[i].dest_name = strdup(conn->remote_host);
- conn->ping_count++;
break;
}
}
idp = silc_id_payload_encode(conn->local_id, SILC_ID_CLIENT);
+ if (cmd->argv_lens[1] > 256)
+ cmd->argv_lens[1] = 256;
+
/* Send JOIN command to the server */
if (cmd->argc == 2)
buffer =