diff options
author | Marius Halden <marius.h@lden.org> | 2016-10-16 17:15:32 +0200 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2016-10-16 17:15:32 +0200 |
commit | 305a1ddb6c5b03615f98ad45e80ee3d7a5387a3a (patch) | |
tree | 68d677081a1ec5806de151f71465e38c84b751d3 /protocols/purple/purple.c | |
parent | fe1b713ba65a2735548eec660c5b00357b15690a (diff) | |
parent | 6e991a9464ce13fb742dcd50a37d5e00084b4233 (diff) |
Merge branch 'master' into patched-master
Diffstat (limited to 'protocols/purple/purple.c')
-rw-r--r-- | protocols/purple/purple.c | 47 |
1 files changed, 25 insertions, 22 deletions
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) |