From b5fbb1eb1bd1229b1f1a3d75146ca3c89c210a64 Mon Sep 17 00:00:00 2001 From: Eion Robb Date: Wed, 19 Oct 2016 19:48:38 +1300 Subject: Fix for crashes caused by the group typing notification plugin from duplicate signal handling --- skypeweb/libskypeweb.c | 13 ++++++++++--- skypeweb/libskypeweb.h | 2 ++ skypeweb/skypeweb_messages.c | 13 ++++++++++++- skypeweb/skypeweb_messages.h | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/skypeweb/libskypeweb.c b/skypeweb/libskypeweb.c index 822c6f6..238d202 100644 --- a/skypeweb/libskypeweb.c +++ b/skypeweb/libskypeweb.c @@ -290,6 +290,9 @@ skypeweb_node_menu(PurpleBlistNode *node) return m; } +static gulong conversation_updated_signal = 0; +static gulong chat_conversation_typing_signal = 0; + static void skypeweb_login(PurpleAccount *account) { @@ -328,8 +331,12 @@ skypeweb_login(PurpleAccount *account) skypeweb_begin_oauth_login(sa); } - purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", pc, PURPLE_CALLBACK(skypeweb_mark_conv_seen), NULL); - purple_signal_connect(purple_conversations_get_handle(), "chat-conversation-typing", account, PURPLE_CALLBACK(skypeweb_conv_send_typing), sa); + if (!conversation_updated_signal) { + conversation_updated_signal = purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", purple_connection_get_protocol(pc), PURPLE_CALLBACK(skypeweb_mark_conv_seen), NULL); + } + if (!chat_conversation_typing_signal) { + chat_conversation_typing_signal = purple_signal_connect(purple_conversations_get_handle(), "chat-conversation-typing", purple_connection_get_protocol(pc), PURPLE_CALLBACK(skypeweb_conv_send_typing), NULL); + } } static void @@ -348,7 +355,6 @@ skypeweb_close(PurpleConnection *pc) purple_timeout_remove(sa->watchdog_timeout); skypeweb_logout(sa); - purple_signal_disconnect(purple_conversations_get_handle(), "conversation-updated", pc, PURPLE_CALLBACK(skypeweb_mark_conv_seen)); purple_debug_info("skypeweb", "destroying %d waiting connections\n", g_queue_get_length(sa->waiting_conns)); @@ -667,6 +673,7 @@ plugin_unload(PurplePlugin *plugin if (!purple_protocols_remove(skypeweb_protocol, error)) return FALSE; #endif + purple_signals_disconnect_by_handle(plugin); return TRUE; } diff --git a/skypeweb/libskypeweb.h b/skypeweb/libskypeweb.h index ef374aa..00ca914 100644 --- a/skypeweb/libskypeweb.h +++ b/skypeweb/libskypeweb.h @@ -118,6 +118,7 @@ #define purple_connection_set_protocol_data(pc, data) ((pc)->proto_data = (data)) #define purple_connection_set_flags(pc, flags) (pc->flags = flags) #define purple_connection_get_flags(pc) (pc->flags) + #define purple_connection_get_protocol purple_connection_get_prpl #define purple_conversation_present_error purple_conv_present_error #define purple_account_privacy_check purple_privacy_check #define purple_account_get_private_alias purple_account_get_alias @@ -154,6 +155,7 @@ #define purple_chat_conversation_add_user purple_conv_chat_add_user #define purple_chat_conversation_remove_user purple_conv_chat_remove_user #define purple_chat_conversation_clear_users purple_conv_chat_clear_users + #define purple_protocol_get_id purple_plugin_get_id #define purple_chat_conversation_get_id purple_conv_chat_get_id #define purple_protocol_got_user_status purple_prpl_got_user_status #define purple_protocol_got_user_idle purple_prpl_got_user_idle diff --git a/skypeweb/skypeweb_messages.c b/skypeweb/skypeweb_messages.c index 60c555e..c8e8a9f 100644 --- a/skypeweb/skypeweb_messages.c +++ b/skypeweb/skypeweb_messages.c @@ -661,6 +661,9 @@ skypeweb_mark_conv_seen(PurpleConversation *conv, PurpleConversationUpdateType t if (!PURPLE_CONNECTION_IS_CONNECTED(pc)) return; + if (g_strcmp0(purple_protocol_get_id(purple_connection_get_protocol(pc)), SKYPEWEB_PLUGIN_ID)) + return; + if (type == PURPLE_CONVERSATION_UPDATE_UNSEEN) { gchar *last_skypeweb_id = purple_conversation_get_data(conv, "last_skypeweb_id"); @@ -1101,11 +1104,19 @@ skypeweb_get_registration_token(SkypeWebAccount *sa) guint -skypeweb_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState state, SkypeWebAccount *sa) +skypeweb_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState state) { + PurpleConnection *pc = purple_conversation_get_connection(conv); + SkypeWebAccount *sa = purple_connection_get_protocol_data(pc); gchar *post, *url; JsonObject *obj; + if (!PURPLE_CONNECTION_IS_CONNECTED(pc)) + return 0; + + if (g_strcmp0(purple_protocol_get_id(purple_connection_get_protocol(pc)), SKYPEWEB_PLUGIN_ID)) + return 0; + url = g_strdup_printf("/v1/users/ME/conversations/%s/messages", purple_url_encode(purple_conversation_get_name(conv))); obj = json_object_new(); diff --git a/skypeweb/skypeweb_messages.h b/skypeweb/skypeweb_messages.h index 3138780..95fda7c 100644 --- a/skypeweb/skypeweb_messages.h +++ b/skypeweb/skypeweb_messages.h @@ -25,7 +25,7 @@ gint skypeweb_send_im(PurpleConnection *pc, const gchar *who, const gchar *msg, gint skypeweb_chat_send(PurpleConnection *pc, gint id, const gchar *message, PurpleMessageFlags flags); void skypeweb_set_idle(PurpleConnection *pc, int time); void skypeweb_set_status(PurpleAccount *account, PurpleStatus *status); -guint skypeweb_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState state, SkypeWebAccount *sa); +guint skypeweb_conv_send_typing(PurpleConversation *conv, PurpleIMTypingState state); guint skypeweb_send_typing(PurpleConnection *pc, const gchar *name, PurpleIMTypingState state); void skypeweb_poll(SkypeWebAccount *sa); void skypeweb_get_registration_token(SkypeWebAccount *sa); -- cgit v1.2.3