diff options
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/purple/bpurple.h | 6 | ||||
| -rw-r--r-- | protocols/purple/purple.c | 26 | 
2 files changed, 22 insertions, 10 deletions
| 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 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) | 
