Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/EionRobb/skype4pidgin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEion Robb <eion@robbmob.com>2016-10-19 09:48:38 +0300
committerEion Robb <eion@robbmob.com>2016-10-19 09:48:38 +0300
commitb5fbb1eb1bd1229b1f1a3d75146ca3c89c210a64 (patch)
tree5ebef17f6c8d35229592f0654c357479df4ccfcf
parent77a20f8248f6e62d25332f3801afa6a8f00af033 (diff)
Fix for crashes caused by the group typing notification plugin from duplicate signal handling
-rw-r--r--skypeweb/libskypeweb.c13
-rw-r--r--skypeweb/libskypeweb.h2
-rw-r--r--skypeweb/skypeweb_messages.c13
-rw-r--r--skypeweb/skypeweb_messages.h2
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);