SilcClientCommandReplyContext reply =
(SilcClientCommandReplyContext)context2;
+ SILC_LOG_DEBUG(("Start"));
+
if (reply) {
SilcCommandStatus status;
unsigned char *tmp = silc_argument_get_arg_type(reply->args, 1, NULL);
res->context = client;
res->sock = silc_socket_dup(conn->sock);
- silc_client_send_command(client, conn, SILC_COMMAND_WHOIS, ++conn->cmd_ident,
+ silc_client_command_register(client, SILC_COMMAND_WHOIS, NULL, NULL,
+ silc_client_command_reply_whois_i, 0,
+ ++conn->cmd_ident);
+ silc_client_command_send(client, conn, SILC_COMMAND_WHOIS, conn->cmd_ident,
1, 3, idp->data, idp->len);
silc_client_command_pending(conn, SILC_COMMAND_WHOIS, conn->cmd_ident,
silc_client_notify_by_server_destructor,
switch(type) {
case SILC_NOTIFY_TYPE_NONE:
/* Notify application */
- client->ops->notify(client, conn, type,
- silc_argument_get_arg_type(args, 1, NULL));
+ client->internal->ops->notify(client, conn, type,
+ silc_argument_get_arg_type(args, 1, NULL));
break;
case SILC_NOTIFY_TYPE_INVITE:
goto out;
/* Notify application */
- client->ops->notify(client, conn, type, channel, tmp, client_entry);
+ client->internal->ops->notify(client, conn, type, channel, tmp,
+ client_entry);
break;
case SILC_NOTIFY_TYPE_JOIN:
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, client_entry, channel);
+ client->internal->ops->notify(client, conn, type, client_entry, channel);
break;
case SILC_NOTIFY_TYPE_LEAVE:
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, client_entry, channel);
+ client->internal->ops->notify(client, conn, type, client_entry, channel);
break;
case SILC_NOTIFY_TYPE_SIGNOFF:
tmp = NULL;
/* Notify application */
- client->ops->notify(client, conn, type, client_entry, tmp);
+ client->internal->ops->notify(client, conn, type, client_entry, tmp);
/* Free data */
silc_client_del_client_entry(client, conn, client_entry);
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, silc_id_payload_get_type(idp),
- client_entry, tmp, channel);
+ client->internal->ops->notify(client, conn, type,
+ silc_id_payload_get_type(idp),
+ client_entry, tmp, channel);
silc_id_payload_free(idp);
break;
/* Find Client entry and if not found resolve it */
client_entry2 = silc_client_get_client_by_id(client, conn, client_id);
if (!client_entry2) {
+ /* Resolve the entry information */
silc_client_notify_by_server_resolve(client, conn, packet, client_id);
- goto out;
+
+ /* Add the new entry even though we resolved it. This is because we
+ want to replace the old entry with the new entry here right now. */
+ client_entry2 =
+ silc_client_add_client(client, conn, NULL, NULL, NULL,
+ silc_id_dup(client_id, SILC_ID_CLIENT),
+ client_entry->mode);
+
+ /* Replace old ID entry with new one on all channels. */
+ silc_client_replace_from_channels(client, conn, client_entry,
+ client_entry2);
} else {
if (client_entry2 != conn->local_entry)
silc_client_nickname_format(client, conn, client_entry2);
- }
- /* Remove the old from cache */
- silc_idcache_del_by_context(conn->client_cache, client_entry);
+ /* Remove the old from cache */
+ silc_idcache_del_by_context(conn->client_cache, client_entry);
- /* Replace old ID entry with new one on all channels. */
- silc_client_replace_from_channels(client, conn, client_entry,
- client_entry2);
+ /* Replace old ID entry with new one on all channels. */
+ silc_client_replace_from_channels(client, conn, client_entry,
+ client_entry2);
- /* Notify application */
- client->ops->notify(client, conn, type, client_entry, client_entry2);
+ /* Notify application */
+ client->internal->ops->notify(client, conn, type,
+ client_entry, client_entry2);
- /* Free data */
- silc_client_del_client_entry(client, conn, client_entry);
+ /* Free data */
+ silc_client_del_client_entry(client, conn, client_entry);
+ }
break;
case SILC_NOTIFY_TYPE_CMODE_CHANGE:
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, silc_id_payload_get_type(idp),
- client_entry, mode, NULL, tmp, channel);
+ client->internal->ops->notify(client, conn, type,
+ silc_id_payload_get_type(idp),
+ client_entry, mode, NULL, tmp, channel);
silc_id_payload_free(idp);
break;
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, client_entry, mode,
- client_entry2, channel);
+ client->internal->ops->notify(client, conn, type,
+ client_entry, mode,
+ client_entry2, channel);
break;
case SILC_NOTIFY_TYPE_MOTD:
goto out;
/* Notify application */
- client->ops->notify(client, conn, type, tmp);
+ client->internal->ops->notify(client, conn, type, tmp);
break;
case SILC_NOTIFY_TYPE_CHANNEL_CHANGE:
channel->id, channel, 0, NULL);
/* Notify application */
- client->ops->notify(client, conn, type, channel, channel);
+ client->internal->ops->notify(client, conn, type, channel, channel);
break;
case SILC_NOTIFY_TYPE_KICKED:
/* Notify application. The channel entry is sent last as this notify
is for channel but application don't know it from the arguments
sent by server. */
- client->ops->notify(client, conn, type, client_entry, tmp,
- client_entry2, channel);
+ client->internal->ops->notify(client, conn, type, client_entry, tmp,
+ client_entry2, channel);
/* If I was kicked from channel, remove the channel */
if (client_entry == conn->local_entry) {
tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
/* Notify application. */
- client->ops->notify(client, conn, type, client_entry, tmp);
+ client->internal->ops->notify(client, conn, type, client_entry, tmp);
if (client_entry != conn->local_entry) {
/* Remove client from all channels */
/* Notify application. We don't keep server entries so the server
entry is returned as NULL. The client's are returned as array
of SilcClientEntry pointers. */
- client->ops->notify(client, conn, type, NULL, clients, clients_count);
+ client->internal->ops->notify(client, conn, type, NULL,
+ clients, clients_count);
for (i = 0; i < clients_count; i++) {
/* Remove client from all channels */