updates.
[silc.git] / lib / silcclient / command_reply.c
index a9833571d2974604810ae453fe85a647cbc69e52..ec64040bd95ac268a35c96aca57cf4f08439a2c9 100644 (file)
@@ -90,7 +90,7 @@ const SilcCommandStatusMessage silc_command_status_messages[] = {
   { STAT(NOT_REGISTERED),    "You have not registered" },
   { STAT(NOT_ENOUGH_PARAMS), "Not enough parameters" },
   { STAT(TOO_MANY_PARAMS),   "Too many parameters" },
-  { STAT(PERM_DENIED),       "Your host is not among the privileged" },
+  { STAT(PERM_DENIED),       "Permission denied" },
   { STAT(BANNED_FROM_SERVER),"You are banned from this server" },
   { STAT(BAD_PASSWORD),      "Cannot join channel. Incorrect password" },
   { STAT(CHANNEL_IS_FULL),   "Cannot join channel. Channel is full" },
@@ -208,7 +208,8 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd,
   unsigned char *id_data, *tmp;
   char *nickname = NULL, *username = NULL;
   char *realname = NULL;
-  unsigned int idle = 0;
+  unsigned int idle = 0, mode = 0;
+  SilcBuffer channels = NULL;
   
   argc = silc_argument_get_arg_num(cmd->args);
 
@@ -232,7 +233,18 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd,
     return;
   }
 
+  tmp = silc_argument_get_arg_type(cmd->args, 6, &len);
+  if (tmp) {
+    channels = silc_buffer_alloc(len);
+    silc_buffer_pull_tail(channels, SILC_BUFFER_END(channels));
+    silc_buffer_put(channels, tmp, len);
+  }
+
   tmp = silc_argument_get_arg_type(cmd->args, 7, &len);
+  if (tmp)
+    SILC_GET32_MSB(mode, tmp);
+
+  tmp = silc_argument_get_arg_type(cmd->args, 8, &len);
   if (tmp)
     SILC_GET32_MSB(idle, tmp);
 
@@ -248,6 +260,7 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd,
     client_entry->username = strdup(username);
     if (realname)
       client_entry->realname = strdup(realname);
+    client_entry->mode = mode;
     
     /* Add client to cache */
     silc_idcache_add(conn->client_cache, client_entry->nickname,
@@ -263,6 +276,7 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd,
       silc_free(client_entry->username);
     if (client_entry->realname)
       silc_free(client_entry->realname);
+    client_entry->mode = mode;
 
     SILC_LOG_DEBUG(("Updating client entry"));
 
@@ -281,7 +295,10 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd,
   /* Notify application */
   if (!cmd->callback)
     COMMAND_REPLY((ARGS, client_entry, nickname, username, realname, 
-                  NULL, idle));
+                  channels, mode, idle));
+
+  if (channels)
+    silc_buffer_free(channels);
 }
 
 /* Received reply for WHOIS command. This maybe called several times
@@ -673,9 +690,34 @@ SILC_CLIENT_CMD_REPLY_FUNC(invite)
   SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_INVITE);
   silc_client_command_reply_free(cmd);
 }
+
+/* Received reply to the KILL command. */
  
 SILC_CLIENT_CMD_REPLY_FUNC(kill)
 {
+  SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+  SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+  SilcCommandStatus status;
+  unsigned char *tmp;
+
+  tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
+  SILC_GET16_MSB(status, tmp);
+  if (status != SILC_STATUS_OK) {
+    cmd->client->ops->say(cmd->client, conn,
+            "%s", silc_client_command_status_message(status));
+    COMMAND_REPLY_ERROR;
+    goto out;
+  }
+
+  /* Notify application */
+  COMMAND_REPLY((ARGS));
+
+  /* Execute any pending command callbacks */
+  SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_KILL);
+
+ out:
+  SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_KILL);
+  silc_client_command_reply_free(cmd);
 }
 
 /* Received reply to INFO command. We receive the server ID and some
@@ -1034,8 +1076,43 @@ SILC_CLIENT_CMD_REPLY_FUNC(motd)
   silc_client_command_reply_free(cmd);
 }
 
+/* Received reply tot he UMODE command. Save the current user mode */
+
 SILC_CLIENT_CMD_REPLY_FUNC(umode)
 {
+  SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context;
+  SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data;
+  SilcCommandStatus status;
+  unsigned char *tmp;
+  unsigned int mode;
+
+  tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
+  SILC_GET16_MSB(status, tmp);
+  if (status != SILC_STATUS_OK) {
+    cmd->client->ops->say(cmd->client, conn,
+            "%s", silc_client_command_status_message(status));
+    COMMAND_REPLY_ERROR;
+    goto out;
+  }
+
+  tmp = silc_argument_get_arg_type(cmd->args, 2, NULL);
+  if (!tmp) {
+    COMMAND_REPLY_ERROR;
+    goto out;
+  }
+
+  SILC_GET32_MSB(mode, tmp);
+  conn->local_entry->mode = mode;
+
+  /* Notify application */
+  COMMAND_REPLY((ARGS, mode));
+
+  /* Execute any pending command callbacks */
+  SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_UMODE);
+
+ out:
+  SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_UMODE);
+  silc_client_command_reply_free(cmd);
 }
 
 /* Received reply for CMODE command. */