diff options
-rw-r--r-- | protocols/bee.h | 4 | ||||
-rw-r--r-- | protocols/bee_chat.c | 25 | ||||
-rw-r--r-- | protocols/jabber/conference.c | 3 | ||||
-rw-r--r-- | protocols/purple/bpurple.h | 6 | ||||
-rw-r--r-- | protocols/purple/purple.c | 47 |
5 files changed, 54 insertions, 31 deletions
diff --git a/protocols/bee.h b/protocols/bee.h index 5f47e464..56c34210 100644 --- a/protocols/bee.h +++ b/protocols/bee.h @@ -189,6 +189,8 @@ G_MODULE_EXPORT int bee_chat_msg(bee_t *bee, struct groupchat *c, const char *ms G_MODULE_EXPORT struct groupchat *bee_chat_by_title(bee_t *bee, struct im_connection *ic, const char *title); G_MODULE_EXPORT void imcb_chat_invite(struct im_connection *ic, const char *name, const char *who, const char *msg); -G_MODULE_EXPORT void bee_chat_list_finish(struct im_connection *ic); +G_GNUC_DEPRECATED G_MODULE_EXPORT void bee_chat_list_finish(struct im_connection *ic); +G_MODULE_EXPORT void imcb_chat_list_finish(struct im_connection *ic); +G_MODULE_EXPORT void imcb_chat_list_free(struct im_connection *ic); #endif /* __BEE_H__ */ diff --git a/protocols/bee_chat.c b/protocols/bee_chat.c index 76ed7f85..31b37737 100644 --- a/protocols/bee_chat.c +++ b/protocols/bee_chat.c @@ -274,7 +274,30 @@ void imcb_chat_invite(struct im_connection *ic, const char *name, const char *wh } } -void bee_chat_list_finish(struct im_connection *ic) +void imcb_chat_list_finish(struct im_connection *ic) { cmd_chat_list_finish(ic); } + +void bee_chat_list_finish(struct im_connection *ic) +{ + imcb_log(ic, "Warning: using deprecated bee_chat_list_finish. This will be removed in the stable release."); + imcb_chat_list_finish(ic); +} + +void imcb_chat_list_free(struct im_connection *ic) +{ + bee_chat_info_t *ci; + GSList *l = ic->chatlist; + + while (l) { + ci = l->data; + l = g_slist_delete_link(l, l); + + g_free(ci->title); + g_free(ci->topic); + g_free(ci); + } + + ic->chatlist = NULL; +} diff --git a/protocols/jabber/conference.c b/protocols/jabber/conference.c index 3a6cff7c..593e4233 100644 --- a/protocols/jabber/conference.c +++ b/protocols/jabber/conference.c @@ -465,7 +465,8 @@ void jabber_chat_pkt_message(struct im_connection *ic, struct jabber_buddy *bud, } if (subject && chat) { - char *subject_text = subject->text_len > 0 ? subject->text : ""; + char empty[1] = ""; + char *subject_text = subject->text_len > 0 ? subject->text : empty; if (g_strcmp0(chat->topic, subject_text) != 0) { bare_jid = (bud) ? jabber_get_bare_jid(bud->ext_jid) : NULL; imcb_chat_topic(chat, bare_jid, subject_text, diff --git a/protocols/purple/bpurple.h b/protocols/purple/bpurple.h index ca7cf70e..39677b86 100644 --- a/protocols/purple/bpurple.h +++ b/protocols/purple/bpurple.h @@ -14,10 +14,4 @@ struct purple_data guint next_request_id; }; -struct purple_roomlist_data -{ - GSList *chats; - gint topic; -}; - #endif /* !BPURPLE_H */ diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index f71cade2..db523ada 100644 --- a/protocols/purple/purple.c +++ b/protocols/purple/purple.c @@ -53,6 +53,13 @@ struct request_input_data { guint id; }; +struct purple_roomlist_data { + GSList *chats; + gint topic; + gboolean initialized; +}; + + struct im_connection *purple_ic_by_pa(PurpleAccount *pa) { GSList *i; @@ -365,21 +372,6 @@ static void purple_login(account_t *acc) } } -static void purple_chatlist_free(struct im_connection *ic) -{ - bee_chat_info_t *ci; - GSList *l = ic->chatlist; - - while (l) { - ci = l->data; - l = g_slist_delete_link(l, l); - - g_free(ci->title); - g_free(ci->topic); - g_free(ci); - } -} - static void purple_logout(struct im_connection *ic) { struct purple_data *pd = ic->proto_data; @@ -397,7 +389,7 @@ static void purple_logout(struct im_connection *ic) purple_account_set_enabled(pd->account, "BitlBee", FALSE); purple_connections = g_slist_remove(purple_connections, ic); purple_accounts_remove(pd->account); - purple_chatlist_free(ic); + imcb_chat_list_free(ic); g_hash_table_destroy(pd->input_requests); g_free(pd); } @@ -784,13 +776,21 @@ void purple_chat_list(struct im_connection *ic, const char *server) { PurpleRoomlist *list; struct purple_data *pd = ic->proto_data; + PurplePlugin *prpl = purple_plugins_find_with_id(pd->account->protocol_id); + PurplePluginProtocolInfo *pi = prpl->info->extra_info; + + if (!pi || !pi->roomlist_get_list) { + imcb_log(ic, "Room listing unsupported by this purple plugin"); + return; + } list = purple_roomlist_get_list(pd->account->gc); if (list) { + struct purple_roomlist_data *rld = list->ui_data; + rld->initialized = TRUE; + purple_roomlist_ref(list); - } else { - imcb_log(ic, "Room listing unsupported by this purple plugin"); } } @@ -1395,18 +1395,21 @@ static void prplcb_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progre struct im_connection *ic; struct purple_roomlist_data *rld = list->ui_data; - if (in_progress) { + if (in_progress || !rld) { return; } ic = purple_ic_by_pa(list->account); - purple_chatlist_free(ic); + imcb_chat_list_free(ic); ic->chatlist = g_slist_reverse(rld->chats); rld->chats = NULL; - bee_chat_list_finish(ic); - purple_roomlist_unref(list); + imcb_chat_list_finish(ic); + + if (rld->initialized) { + purple_roomlist_unref(list); + } } static void prplcb_roomlist_destroy(PurpleRoomlist *list) |