From 0f60078dfd1f7a770311c3dffa011788e5b7dcc2 Mon Sep 17 00:00:00 2001 From: fatbob313 Date: Tue, 9 Feb 2010 17:14:56 +0000 Subject: [PATCH] Send channel links info at client connect --- src/channel.c | 1 + src/channel.h | 1 + src/messagehandler.c | 33 ++++++++++++++++++++++++++------- src/messages.c | 8 ++++++-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/channel.c b/src/channel.c index 4de6490..1fab5a4 100644 --- a/src/channel.c +++ b/src/channel.c @@ -212,6 +212,7 @@ void Chan_init() ch_dst = ch_itr; list_add_tail(&ch_dst->link_node, &ch_src->channel_links); + ch_src->linkcount++; Log_info("Adding channel link '%s' -> '%s'", ch_src->name, ch_dst->name); } } diff --git a/src/channel.h b/src/channel.h index e20bfad..6134646 100644 --- a/src/channel.h +++ b/src/channel.h @@ -46,6 +46,7 @@ typedef struct channel { struct dlist clients; struct dlist flatlist_node; struct dlist channel_links; + int linkcount; struct dlist link_node; } channel_t; diff --git a/src/messagehandler.c b/src/messagehandler.c index 98a9953..b2f5670 100644 --- a/src/messagehandler.c +++ b/src/messagehandler.c @@ -172,8 +172,7 @@ void Mh_handle_message(client_t *client, message_t *msg) /* Iterate channels and send channel info */ ch_itr = NULL; - Chan_iterate(&ch_itr); - do { + while (Chan_iterate(&ch_itr) != NULL) { sendmsg = Msg_create(ChannelState); sendmsg->payload.channelState->has_channel_id = true; sendmsg->payload.channelState->channel_id = ch_itr->id; @@ -185,12 +184,32 @@ void Mh_handle_message(client_t *client, message_t *msg) if (ch_itr->desc) sendmsg->payload.channelState->description = strdup(ch_itr->desc); Log_debug("Send channel info: %s", sendmsg->payload.channelState->name); - Client_send_message(client, sendmsg); - - Chan_iterate(&ch_itr); - } while (ch_itr != NULL); + Client_send_message(client, sendmsg); + } - /* Not supporting channel links yet */ + /* Iterate channels and send channel links info */ + ch_itr = NULL; + while (Chan_iterate(&ch_itr) != NULL) { + if (ch_itr->linkcount > 0) { /* Has links */ + uint32_t *links; + int i = 0; + struct dlist *itr; + + sendmsg = Msg_create(ChannelState); + sendmsg->payload.channelState->has_channel_id = true; + sendmsg->payload.channelState->channel_id = ch_itr->id; + sendmsg->payload.channelState->n_links = ch_itr->linkcount; + + links = (uint32_t *)malloc(ch_itr->linkcount * sizeof(uint32_t)); + list_iterate(itr, &ch_itr->channel_links) { /* Iterate links */ + channel_t *ch; + ch = list_get_entry(itr, channel_t, link_node); + links[i++] = ch->id; + } + sendmsg->payload.channelState->links = links; + Client_send_message(client, sendmsg); + } + } /* Send user state for connecting user to other users */ sendmsg = Msg_create(UserState); diff --git a/src/messages.c b/src/messages.c index 109f5eb..06a72eb 100644 --- a/src/messages.c +++ b/src/messages.c @@ -436,8 +436,12 @@ void Msg_free(message_t *msg) if (msg->unpacked) mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL); else { - free(msg->payload.channelState->name); - free(msg->payload.channelState->description); + if (msg->payload.channelState->name) + free(msg->payload.channelState->name); + if (msg->payload.channelState->description) + free(msg->payload.channelState->description); + if (msg->payload.channelState->links) + free(msg->payload.channelState->links); free(msg->payload.channelState); } break; -- 2.30.2