diff options
Diffstat (limited to 'protocols/purple/purple.c')
-rw-r--r-- | protocols/purple/purple.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index 374b826b..6b043101 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; @@ -770,13 +777,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"); } } @@ -1381,7 +1396,7 @@ 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; } @@ -1392,7 +1407,10 @@ static void prplcb_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progre rld->chats = NULL; bee_chat_list_finish(ic); - purple_roomlist_unref(list); + + if (rld->initialized) { + purple_roomlist_unref(list); + } } static void prplcb_roomlist_destroy(PurpleRoomlist *list) |