Changed channel->clients to SilcList.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 5 Nov 2000 18:16:43 +0000 (18:16 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 5 Nov 2000 18:16:43 +0000 (18:16 +0000)
CHANGES
apps/silc/client_ops.c
lib/silcclient/client.c
lib/silcclient/command.c
lib/silcclient/command_reply.c
lib/silcclient/idlist.h

diff --git a/CHANGES b/CHANGES
index e455029bb93e4c00ffbdbb25b7a88ce438fe09bb..d338e3487d8297ce15640a9882161ce8b00d9dae 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+Sun Nov  5 22:28:44 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Changed client librarys channel->clients table to SilcList and
+         changed code accordingly.
+
 Thu Nov  2 16:28:01 EET 2000  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Changed client's channel table to SilcList and changed code 
index a127140ce0b0fc7112542f2683b24431fcdb9edd..3a2342dbe660ec1f7b994c124934b847aadfecce 100644 (file)
@@ -284,8 +284,8 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn,
                        SilcCommand command, SilcCommandStatus status, ...)
 {
   SilcClientInternal app = (SilcClientInternal)client->application;
+  SilcChannelUser chu;
   va_list vp;
-  int i;
 
   if (!success)
     return;
@@ -319,16 +319,19 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn,
       break;
 
     case SILC_COMMAND_NAMES:
-      for (i = 0; i < conn->current_channel->clients_count; i++)
-       if (conn->current_channel->clients[i].client == conn->local_entry) {
+      silc_list_start(conn->current_channel->clients);
+      while ((chu = silc_list_get(conn->current_channel->clients)) 
+            != SILC_LIST_END) {
+       if (chu->client == conn->local_entry) {
          if (app->screen->bottom_line->mode)
            silc_free(app->screen->bottom_line->mode);
          app->screen->bottom_line->mode = 
-           silc_client_chumode_char(conn->current_channel->clients[i].mode);
+           silc_client_chumode_char(chu->mode);
          silc_screen_print_bottom_line(app->screen, 0);
          break;
        }
       break;
+      }
     }
 }
 
index 9737ceff6355a92d55f53c77c8270fc2ed6a69b8..4ba45528d9ecf1980317823d3c1fa7d3d794f3a6 100644 (file)
@@ -1294,6 +1294,7 @@ void silc_client_notify_by_server(SilcClient client,
   SilcClientEntry client_entry;
   SilcClientEntry client_entry2;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   SilcIDCacheEntry id_cache = NULL;
   unsigned char *tmp;
   unsigned int tmp_len, mode;
@@ -1390,22 +1391,9 @@ void silc_client_notify_by_server(SilcClient client,
     channel = (SilcChannelEntry)id_cache->context;
 
     /* Add client to channel */
-    for (i = 0; i < channel->clients_count; i++) {
-      if (channel->clients[i].client == NULL) {
-       channel->clients[channel->clients_count].client = client_entry;
-       channel->clients_count++;
-       break;
-      }
-    }
-
-    if (i == channel->clients_count) {
-      channel->clients = silc_realloc(channel->clients, 
-                                     sizeof(*channel->clients) * 
-                                     (channel->clients_count + 1));
-      channel->clients[channel->clients_count].client = client_entry;
-      channel->clients[channel->clients_count].mode = 0;
-      channel->clients_count++;
-    }
+    chu = silc_calloc(1, sizeof(*chu));
+    chu->client = client_entry;
+    silc_list_add(channel->clients, chu);
 
     /* XXX add support for multiple same nicks on same channel. Check
        for them here */
@@ -1444,10 +1432,11 @@ void silc_client_notify_by_server(SilcClient client,
     channel = (SilcChannelEntry)id_cache->context;
 
     /* Remove client from channel */
-    for (i = 0; i < channel->clients_count; i++) {
-      if (channel->clients[i].client == client_entry) {
-       channel->clients[i].client = NULL;
-       channel->clients_count--;
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      if (chu->client == client_entry) {
+       silc_list_del(channel->clients, chu);
+       silc_free(chu);
        break;
       }
     }
@@ -1694,9 +1683,10 @@ void silc_client_notify_by_server(SilcClient client,
     channel = (SilcChannelEntry)id_cache->context;
 
     /* Save the mode */
-    for (i = 0; i < channel->clients_count; i++) {
-      if (channel->clients[i].client == client_entry2) {
-       channel->clients[i].mode = mode;
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      if (chu->client == client_entry) {
+       chu->mode = mode;
        break;
       }
     }
@@ -1792,6 +1782,8 @@ void silc_client_new_channel_id(SilcClient client,
   channel->channel_name = channel_name;
   channel->id = silc_id_payload_get_id(idp);
   channel->mode = mode;
+  silc_list_init(channel->clients, struct SilcChannelUserStruct, next);
+
   conn->current_channel = channel;
 
   /* Put it to the ID cache */
@@ -1873,6 +1865,7 @@ void silc_client_channel_message(SilcClient client,
   SilcChannelPayload payload = NULL;
   SilcChannelID *id = NULL;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   SilcIDCacheEntry id_cache = NULL;
   SilcClientID *client_id = NULL;
   int i;
@@ -1907,10 +1900,12 @@ void silc_client_channel_message(SilcClient client,
 
   /* Find nickname */
   nickname = "[unknown]";
-  for (i = 0; i < channel->clients_count; i++) {
-    if (channel->clients[i].client && 
-       !SILC_ID_CLIENT_COMPARE(channel->clients[i].client->id, client_id))
-      nickname = channel->clients[i].client->nickname;
+  silc_list_start(channel->clients);
+  while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+    if (!SILC_ID_CLIENT_COMPARE(chu->client->id, client_id)) {
+      nickname = chu->client->nickname;
+      break;
+    }
   }
 
   /* Pass the message to application */
@@ -2011,6 +2006,7 @@ void silc_client_remove_from_channels(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcIDCacheList list;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   int i;
 
   if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY,
@@ -2023,10 +2019,11 @@ void silc_client_remove_from_channels(SilcClient client,
   while (channel) {
     
     /* Remove client from channel */
-    for (i = 0; i < channel->clients_count; i++) {
-      if (channel->clients[i].client == client_entry) {
-       channel->clients[i].client = NULL;
-       channel->clients_count--;
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      if (chu->client == client_entry) {
+       silc_list_del(channel->clients, chu);
+       silc_free(chu);
        break;
       }
     }
@@ -2053,6 +2050,7 @@ void silc_client_replace_from_channels(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcIDCacheList list;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   int i;
 
   if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY,
@@ -2064,10 +2062,11 @@ void silc_client_replace_from_channels(SilcClient client,
   
   while (channel) {
     
-    /* Remove client from channel */
-    for (i = 0; i < channel->clients_count; i++) {
-      if (channel->clients[i].client == old) {
-       channel->clients[i].client = new;
+    /* Replace client entry */
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      if (chu->client == old) {
+       chu->client = new;
        break;
       }
     }
index b19b8bec4339647174016a70d35361a5f6066353..0f706c350181071facfe95ea16b6566102ad1907 100644 (file)
@@ -928,6 +928,7 @@ SILC_CLIENT_CMD_FUNC(cumode)
   SilcClientCommandContext cmd = (SilcClientCommandContext)context;
   SilcClientConnection conn = cmd->conn;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   SilcClientEntry client_entry;
   SilcBuffer buffer, clidp, chidp;
   unsigned char *name, *cp, modebuf[4];
@@ -986,11 +987,12 @@ SILC_CLIENT_CMD_FUNC(cumode)
     return;
   }
   
-  for (i = 0; i < channel->clients_count; i++)
-    if (channel->clients[i].client == client_entry) {
-      mode = channel->clients[i].mode;
+  while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+    if (chu->client == client_entry) {
+      chu->mode = mode;
       break;
     }
+  }
 
   /* Are we adding or removing mode */
   if (cmd->argv[2][0] == '-')
index 91562fdba8c90ebf8111a58c3261aca19a04b5cc..80cee3bac93afe6668c32b7cd92bc0e11440ecad 100644 (file)
@@ -955,6 +955,7 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
   SilcCommandStatus status;
   SilcIDCacheEntry id_cache = NULL;
   SilcChannelEntry channel;
+  SilcChannelUser chu;
   SilcChannelID *channel_id = NULL;
   SilcBuffer client_id_list;
   SilcBuffer client_mode_list;
@@ -1035,16 +1036,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
     }
   list_count++;
 
-  /* Remove old client list from channel, if exists */
-  if (channel->clients) {
-    silc_free(channel->clients);
-    channel->clients = NULL;
-    channel->clients_count = 0;
+  /* Remove old client list from channel. */
+  silc_list_start(channel->clients);
+  while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+    silc_list_del(channel->clients, chu);
+    silc_free(chu);
   }
 
-  /* Allocate room for clients in the channel */
-  channel->clients = silc_calloc(list_count, sizeof(*channel->clients));
-
   /* Cache the received name list, client ID's and modes. This cache expires
      whenever server sends notify message to channel. It means two things;
      some user has joined or leaved the channel. */
@@ -1085,24 +1083,25 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
       id_cache = NULL;
     }
 
-    channel->clients[channel->clients_count].client = client;
-    channel->clients[channel->clients_count].mode = mode;
-    channel->clients_count++;
+    chu = silc_calloc(1, sizeof(*chu));
+    chu->client = client;
+    chu->mode = mode;
+    silc_list_add(channel->clients, chu);
 
     name_list += nick_len + 1;
   }
 
   name_list = cp;
   for (i = 0; i < list_count; i++) {
-    int c;
+    int c = 0;
     int nick_len = strcspn(name_list, " ");
     char *nickname = silc_calloc(nick_len + 1, sizeof(*nickname));
     memcpy(nickname, name_list, nick_len);
 
-    for (c = 0, k = 0; k < channel->clients_count; k++) {
-      if (channel->clients[k].client && 
-         !strncmp(channel->clients[k].client->nickname, 
-                  nickname, strlen(channel->clients[k].client->nickname))) {
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      if (!strncmp(chu->client->nickname, nickname, 
+                  strlen(chu->client->nickname))) {
        char t[8];
        
        if (!c) {
@@ -1111,13 +1110,10 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
        }
        
        memset(t, 0, sizeof(t));
-       channel->clients[k].client->nickname = 
-         silc_calloc(strlen(nickname) + 8, sizeof(*channel->clients[k].
-                                                  client->nickname));
+       chu->client->nickname = silc_calloc(strlen(nickname) + 8, 1);
        snprintf(t, sizeof(t), "[%d]", c++);
-       strncat(channel->clients[k].client->nickname, t, strlen(t));
-       strncat(channel->clients[k].client->nickname, nickname, 
-               strlen(nickname));
+       strncat(chu->client->nickname, t, strlen(t));
+       strncat(chu->client->nickname, nickname, strlen(nickname));
       }
     }
 
@@ -1131,13 +1127,14 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
     cmd->client->ops->say(cmd->client, conn, "Users on %s", 
                          channel->channel_name);
     
-    for (k = 0; k < channel->clients_count; k++) {
-      SilcClientEntry e = channel->clients[k].client;
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      SilcClientEntry e = chu->client;
       char *m, tmp[80], line[80];
 
       memset(line, 0, sizeof(line));
       memset(tmp, 0, sizeof(tmp));
-      m = silc_client_chumode_char(channel->clients[k].mode);
+      m = silc_client_chumode_char(chu->mode);
 
       strcat(line, " ");
       strcat(line, e->nickname);
@@ -1175,14 +1172,17 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
   } else {
     name_list = NULL;
     len1 = 0;
-    for (k = 0; k < channel->clients_count; k++) {
-      char *m, *n = channel->clients[k].client->nickname;
+    k = 0;
+
+    silc_list_start(channel->clients);
+    while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) {
+      char *m, *n = chu->client->nickname;
       len2 = strlen(n);
       len1 += len2;
 
       name_list = silc_realloc(name_list, sizeof(*name_list) * (len1 + 3));
 
-      m = silc_client_chumode_char(channel->clients[k].mode);
+      m = silc_client_chumode_char(chu->mode);
       if (m) {
        memcpy(name_list + (len1 - len2), m, strlen(m));
        len1 += strlen(m);
@@ -1191,15 +1191,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(names)
 
       memcpy(name_list + (len1 - len2), n, len2);
       name_list[len1] = 0;
-    
-      if (k == channel->clients_count - 1)
+      
+      if (k == silc_list_count(channel->clients) - 1)
        break;
       memcpy(name_list + len1, " ", 1);
       len1++;
+      k++;
     }
 
-    cmd->client->ops->say(cmd->client, conn,
-                         "Users on %s: %s", channel->channel_name, name_list);
+    cmd->client->ops->say(cmd->client, conn, "Users on %s: %s",
+                         channel->channel_name, name_list);
     silc_free(name_list);
   }
 
index f5c5abf0a1101ab2ff93ba4e849603ecd1800df6..4d1c8b1ba36d8c50148001519d60aec7c6540f5c 100644 (file)
@@ -37,15 +37,14 @@ typedef struct SilcClientEntryStruct {
      with the remote client. */
   SilcCipher send_key;
   SilcCipher receive_key;
-} SilcClientEntryObject;
-
-typedef SilcClientEntryObject *SilcClientEntry;
+} *SilcClientEntry;
 
 /* Client and its mode on a channel */
-typedef struct {
+typedef struct SilcChannelUserStruct {
   SilcClientEntry client;
   unsigned int mode;
-} SilcChannelUsers;
+  struct SilcChannelUserStruct *next;
+} *SilcChannelUser;
 
 /* Channel entry context. This is allocate for every channel client has
    joined to. This includes for example the channel specific keys */
@@ -57,17 +56,15 @@ typedef struct SilcChannelEntryStruct {
   unsigned int mode;
   int on_channel;
 
-  SilcChannelUsers *clients;
-  unsigned int clients_count;
+  /* Joined clients */
+  SilcList clients;
 
   /* Channel keys */
   SilcCipher channel_key;
   unsigned char *key;
   unsigned int key_len;
   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
-} SilcChannelEntryObject;
-
-typedef SilcChannelEntryObject *SilcChannelEntry;
+} *SilcChannelEntry;
 
 /* Prototypes */