aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordequis <dx@dxzone.com.ar>2016-09-25 00:07:25 -0300
committerdequis <dx@dxzone.com.ar>2016-09-25 00:07:25 -0300
commit1a8875ffaae873853fd8537cdce43e35e9889266 (patch)
treeed07853842a13e1ab5d5064f73f40fd493ae89ca
parent985d66d3f99046583175fe44e125e54b666f3c51 (diff)
purple: Fix another issue where /join results in two channels
Follow up to a3019499665384a3dcbbc11016d256e6d4dcd26c (which actually made things worse than before for this particular case - found it by bisecting) This affected skypeweb and hangouts, maybe others. Sometimes serv_join_chat() results in a call chain like this (outermost frame first) 1. purple_chat_join 2. serv_join_chat 3. (the join_chat function of the prpl) 4. serv_got_joined_chat 5. purple_conversation_new 6. prplcb_conv_new The last one tries to find a struct groupchat by name (that's the code from the referenced commit). If it doesn't exist, it creates a new one. This usually isn't an issue because the 4th step is done asynchronously, and a groupchat is created at the end of purple_chat_join. If it's not, you end up with two groupchats, which can lead to other nasty issues. This moves the creation of the groupchat right before serv_join_chat(). That way, it always exists even if the conversation is created immediately.
-rw-r--r--protocols/purple/purple.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index 6c8ddf0d..374b826b 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -722,6 +722,7 @@ struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, c
PurplePluginProtocolInfo *pi = prpl->info->extra_info;
GHashTable *chat_hash;
PurpleConversation *conv;
+ struct groupchat *gc;
GList *info, *l;
if (!pi->chat_info || !pi->chat_info_defaults ||
@@ -755,11 +756,14 @@ struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, c
g_list_free(info);
+ /* do this before serv_join_chat to handle cases where prplcb_conv_new is called immediately (not async) */
+ gc = imcb_chat_new(ic, room);
+
serv_join_chat(purple_account_get_connection(pd->account), chat_hash);
g_hash_table_destroy(chat_hash);
- return imcb_chat_new(ic, room);
+ return gc;
}
void purple_chat_list(struct im_connection *ic, const char *server)