diff options
author | dequis <dx@dxzone.com.ar> | 2016-09-25 00:07:25 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2016-09-25 00:07:25 -0300 |
commit | 1a8875ffaae873853fd8537cdce43e35e9889266 (patch) | |
tree | ed07853842a13e1ab5d5064f73f40fd493ae89ca | |
parent | 985d66d3f99046583175fe44e125e54b666f3c51 (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.c | 6 |
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) |