X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_channel.c;h=28cc6147099f53b100bb654e1ef5af0a11bfb30a;hb=598a79d875c80b1f6cbee2ae78198cbff46ab7dc;hp=37cd5a78e38bb499382e9e60c046f9b5c4da676c;hpb=71d1fefe6029e201edca6a93f39a0646a40c294b;p=silc.git diff --git a/lib/silcclient/client_channel.c b/lib/silcclient/client_channel.c index 37cd5a78..28cc6147 100644 --- a/lib/silcclient/client_channel.c +++ b/lib/silcclient/client_channel.c @@ -673,7 +673,9 @@ SilcChannelUser silc_client_on_channel(SilcChannelEntry channel, /* Adds client to channel. Returns TRUE if user was added or is already added to the channel, FALSE on error. */ -SilcBool silc_client_add_to_channel(SilcChannelEntry channel, +SilcBool silc_client_add_to_channel(SilcClient client, + SilcClientConnection conn, + SilcChannelEntry channel, SilcClientEntry client_entry, SilcUInt32 cumode) { @@ -689,6 +691,10 @@ SilcBool silc_client_add_to_channel(SilcChannelEntry channel, chu->client = client_entry; chu->channel = channel; chu->mode = cumode; + + silc_client_ref_client(client, conn, client_entry); + silc_client_ref_channel(client, conn, channel); + silc_hash_table_add(channel->user_list, client_entry, chu); silc_hash_table_add(client_entry->channels, channel, chu); @@ -697,7 +703,9 @@ SilcBool silc_client_add_to_channel(SilcChannelEntry channel, /* Removes client from a channel */ -SilcBool silc_client_remove_from_channel(SilcChannelEntry channel, +SilcBool silc_client_remove_from_channel(SilcClient client, + SilcClientConnection conn, + SilcChannelEntry channel, SilcClientEntry client_entry) { SilcChannelUser chu; @@ -710,6 +718,9 @@ SilcBool silc_client_remove_from_channel(SilcChannelEntry channel, silc_hash_table_del(chu->channel->user_list, chu->client); silc_free(chu); + silc_client_unref_client(client, conn, client_entry); + silc_client_unref_channel(client, conn, channel); + return TRUE; } @@ -726,8 +737,32 @@ void silc_client_remove_from_channels(SilcClient client, while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { silc_hash_table_del(chu->client->channels, chu->channel); silc_hash_table_del(chu->channel->user_list, chu->client); + silc_client_unref_client(client, conn, chu->client); + silc_client_unref_channel(client, conn, chu->channel); silc_free(chu); } silc_hash_table_list_reset(&htl); } + +/* Empties channel from users. */ + +void silc_client_empty_channel(SilcClient client, + SilcClientConnection conn, + SilcChannelEntry channel) +{ + SilcHashTableList htl; + SilcChannelUser chu; + + silc_hash_table_list(channel->user_list, &htl); + while (silc_hash_table_get(&htl, NULL, (void *)&chu)) { + silc_hash_table_del(chu->client->channels, chu->channel); + silc_hash_table_del(chu->channel->user_list, chu->client); + silc_client_unref_client(client, conn, chu->client); + silc_client_unref_channel(client, conn, chu->channel); + silc_free(chu); + } + silc_hash_table_list_reset(&htl); + + silc_hash_table_free(channel->user_list); +}