+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
SilcCommand command, SilcCommandStatus status, ...)
{
SilcClientInternal app = (SilcClientInternal)client->application;
+ SilcChannelUser chu;
va_list vp;
- int i;
if (!success)
return;
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;
+ }
}
}
SilcClientEntry client_entry;
SilcClientEntry client_entry2;
SilcChannelEntry channel;
+ SilcChannelUser chu;
SilcIDCacheEntry id_cache = NULL;
unsigned char *tmp;
unsigned int tmp_len, mode;
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 */
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;
}
}
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;
}
}
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 */
SilcChannelPayload payload = NULL;
SilcChannelID *id = NULL;
SilcChannelEntry channel;
+ SilcChannelUser chu;
SilcIDCacheEntry id_cache = NULL;
SilcClientID *client_id = NULL;
int i;
/* 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 */
SilcIDCacheEntry id_cache;
SilcIDCacheList list;
SilcChannelEntry channel;
+ SilcChannelUser chu;
int i;
if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY,
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;
}
}
SilcIDCacheEntry id_cache;
SilcIDCacheList list;
SilcChannelEntry channel;
+ SilcChannelUser chu;
int i;
if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY,
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;
}
}
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];
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] == '-')
SilcCommandStatus status;
SilcIDCacheEntry id_cache = NULL;
SilcChannelEntry channel;
+ SilcChannelUser chu;
SilcChannelID *channel_id = NULL;
SilcBuffer client_id_list;
SilcBuffer client_mode_list;
}
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. */
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) {
}
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));
}
}
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);
} 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);
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);
}
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 */
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 */