Handle RESOLVING flag correctly during JOIN notify.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 16 Mar 2003 17:39:25 +0000 (17:39 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 16 Mar 2003 17:39:25 +0000 (17:39 +0000)
lib/silcclient/client_notify.c

index b6df9915e7f8456013721d71034863759d9b893b..9b57f415b3b21e04e774da9786f099e2cf7f706e 100644 (file)
@@ -291,6 +291,8 @@ void silc_client_notify_by_server(SilcClient client,
     /* Find Client entry and if not found query it */
     client_entry = silc_client_get_client_by_id(client, conn, client_id);
     if (!client_entry) {
+      silc_client_channel_set_wait(client, conn, channel,
+                                  conn->cmd_ident + 1);
       silc_client_notify_by_server_resolve(client, conn, packet, 
                                           SILC_ID_CLIENT, client_id);
       goto out;
@@ -299,9 +301,21 @@ void silc_client_notify_by_server(SilcClient client,
     /* If nickname or username hasn't been resolved, do so */
     if (!client_entry->nickname || !client_entry->username) {
       if (client_entry->status & SILC_CLIENT_STATUS_RESOLVING) {
-       client_entry->status &= ~SILC_CLIENT_STATUS_RESOLVING;
+       /* Attach to existing resolving */
+       SilcClientNotifyResolve res = silc_calloc(1, sizeof(*res));
+       res->packet = silc_packet_context_dup(packet);
+       res->context = client;
+       res->sock = silc_socket_dup(conn->sock);
+       silc_client_command_pending(conn, SILC_COMMAND_NONE, 
+                                   client_entry->resolve_cmd_ident,
+                                   silc_client_notify_by_server_pending,
+                                   res);
        goto out;
       }
+
+      /* Do new resolving */
+      silc_client_channel_set_wait(client, conn, channel,
+                                  conn->cmd_ident + 1);
       silc_client_notify_by_server_resolve(client, conn, packet, 
                                           SILC_ID_CLIENT, client_id);
       client_entry->status |= SILC_CLIENT_STATUS_RESOLVING;
@@ -326,6 +340,12 @@ void silc_client_notify_by_server(SilcClient client,
     if (!channel)
       break;
 
+    /* If information is being resolved for this channel, wait for it */
+    if (channel->resolve_cmd_ident) {
+      silc_client_channel_wait(client, conn, channel, packet);
+      goto out;
+    }
+
     /* Join the client to channel */
     if (!silc_client_on_channel(channel, client_entry)) {
       chu = silc_calloc(1, sizeof(*chu));
@@ -715,6 +735,8 @@ void silc_client_notify_by_server(SilcClient client,
                                     conn->cmd_ident + 1);
        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 (id_type == SILC_ID_SERVER) {
@@ -861,6 +883,8 @@ void silc_client_notify_by_server(SilcClient client,
                                     conn->cmd_ident + 1);
        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 (id_type == SILC_ID_SERVER) {