updates.
[silc.git] / lib / silcclient / client_notify.c
index 50aebb3ca84f19db80c87459f2450b7237abd492..12db4c73a2f08c3983da2085178811ae9cf9232a 100644 (file)
@@ -223,9 +223,10 @@ void silc_client_notify_by_server(SilcClient client,
        client_entry->status &= ~SILC_CLIENT_STATUS_RESOLVING;
        goto out;
       }
-      client_entry->status |= SILC_CLIENT_STATUS_RESOLVING;
       silc_client_notify_by_server_resolve(client, conn, packet, 
                                           SILC_ID_CLIENT, client_id);
+      client_entry->status |= SILC_CLIENT_STATUS_RESOLVING;
+      client_entry->resolve_cmd_ident = conn->cmd_ident;
       goto out;
     } else {
       if (client_entry != conn->local_entry)
@@ -482,7 +483,7 @@ void silc_client_notify_by_server(SilcClient client,
     tmp = silc_argument_get_arg_type(args, 3, NULL);
     if (tmp) {
       /* Protocol version 1.1 */
-      char *tmp_nick;
+      char *tmp_nick = NULL;
 
       /* Check whether nickname changed at all.  It is possible that nick
         change notify is received but nickname didn't changed, only the
@@ -493,7 +494,7 @@ void silc_client_notify_by_server(SilcClient client,
       else
        tmp_nick = strdup(tmp);
 
-      if (!strcmp(tmp, tmp_nick)) {
+      if (tmp_nick && !strcmp(tmp, tmp_nick)) {
        /* Nickname didn't change. Update only the ID */
        silc_idcache_del_by_context(conn->client_cache, client_entry);
        silc_free(client_entry->id);
@@ -1030,6 +1031,38 @@ void silc_client_notify_by_server(SilcClient client,
     }
     break;
 
+  case SILC_NOTIFY_TYPE_ERROR:
+    {
+      /*
+       * Some has occurred and server is notifying us about it.
+       */
+      SilcStatus error;
+
+      tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
+      if (!tmp && tmp_len != 1)
+       goto out;
+      error = (SilcStatus)tmp[0];
+
+      SILC_LOG_DEBUG(("Notify: ERROR (%d)", error));
+
+      if (error == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
+       tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
+       if (tmp) {
+         client_id = silc_id_payload_parse_id(tmp, tmp_len, NULL);
+         if (!client_id)
+           goto out;
+         client_entry = silc_client_get_client_by_id(client, conn,
+                                                     client_id);
+         if (client_entry)
+           silc_client_del_client(client, conn, client_entry);
+       }
+      }
+
+      /* Notify application. */
+      client->internal->ops->notify(client, conn, type, error);
+    }
+    break;
+
   default:
     break;
   }