aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-10-16 17:15:32 +0200
committerMarius Halden <marius.h@lden.org>2016-10-16 17:15:32 +0200
commit305a1ddb6c5b03615f98ad45e80ee3d7a5387a3a (patch)
tree68d677081a1ec5806de151f71465e38c84b751d3
parentfe1b713ba65a2735548eec660c5b00357b15690a (diff)
parent6e991a9464ce13fb742dcd50a37d5e00084b4233 (diff)
Merge branch 'master' into patched-master
-rw-r--r--protocols/bee.h4
-rw-r--r--protocols/bee_chat.c25
-rw-r--r--protocols/jabber/conference.c3
-rw-r--r--protocols/purple/bpurple.h6
-rw-r--r--protocols/purple/purple.c47
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)