After some additional testing, version 2 of the patch... On Feb 05 12:41, Wade Berrier wrote: > Hello, > Attached is a patch to re-join conversations after an account reconnects. > I'm still testing it out, but I thought I'd post it in the meantime. > Wade
>From 3e0adee4fed290f51e8c12b4fae36bf0b7dfc34d Mon Sep 17 00:00:00 2001 From: Wade Berrier <wberr...@gmail.com> Date: Fri, 5 Feb 2016 10:24:48 -0700 Subject: [PATCH] Add support for re-joining conversions when an account is reconnected Otherwise, the account connects back up, and it appears if the conversations are current, but they are actually disconnected. --- src/Conversations.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/Conversations.h | 4 ++++ 2 files changed, 49 insertions(+) diff --git a/src/Conversations.cpp b/src/Conversations.cpp index 58a0c81..c35f232 100644 --- a/src/Conversations.cpp +++ b/src/Conversations.cpp @@ -148,6 +148,13 @@ Conversations::Conversations() PURPLE_CALLBACK(buddy_typing_), this); purple_signal_connect(handle, "buddy-typing-stopped", this, PURPLE_CALLBACK(buddy_typing_), this); + + // setup the callbacks for connections in relation to conversations + void *connections_handle = purple_connections_get_handle(); + purple_signal_connect(connections_handle, "signed-on", this, + PURPLE_CALLBACK(account_signed_on_off_), this); + purple_signal_connect(connections_handle, "signed-off", this, + PURPLE_CALLBACK(account_signed_on_off_), this); } Conversations::~Conversations() @@ -432,6 +439,44 @@ void Conversations::buddy_typing(PurpleAccount *account, const char *who) updateLabel(i); } +void Conversations::account_signed_on_off(PurpleConnection *connection) +{ + // If signed on + if(PURPLE_CONNECTION_IS_CONNECTED(connection)) { + + for(ConversationsVector::iterator conv_child = conversations.begin(); conv_child != conversations.end(); ++conv_child) { + + if(!conv_child->conv) + continue; + + PurpleConversation *purple_conv = conv_child->conv->getPurpleConversation(); + + // Only process chats for this connection + if(purple_conversation_get_gc(purple_conv) == connection) { + + // TODO: add and consult "want-to-rejoin" configuration parameter? + + // Look up the chat from the buddy list + PurpleChat * purple_chat = purple_blist_find_chat( + purple_conversation_get_account(purple_conv), + purple_conversation_get_name(purple_conv) + ); + + if(!purple_chat) + continue; + + GHashTable *chat_components = purple_chat_get_components(purple_chat); + + if(chat_components) { + serv_join_chat(connection, chat_components); + } else { + LOG->error(_("Unable to re-join chat '%s'"), purple_conversation_get_name(purple_conv)); + } + } + } + } +} + void Conversations::send_typing_pref_change(const char *name, PurplePrefType /*type*/, gconstpointer /*val*/) { diff --git a/src/Conversations.h b/src/Conversations.h index 27d5837..2b0a9bc 100644 --- a/src/Conversations.h +++ b/src/Conversations.h @@ -146,6 +146,10 @@ private: { reinterpret_cast<Conversations*>(data)->buddy_typing(account, who); } void buddy_typing(PurpleAccount *account, const char *who); + static void account_signed_on_off_(PurpleConnection *connection, gpointer data) + { reinterpret_cast<Conversations*>(data)->account_signed_on_off(connection); } + void account_signed_on_off(PurpleConnection *connection); + // called when "/purple/conversations/im/send_typing" pref is changed static void send_typing_pref_change_(const char *name, PurplePrefType type, gconstpointer val, gpointer data) -- 1.8.3.1
-- _______________________________________________ Centerim-devel mailing list Centerim-devel@centerim.org http://centerim.org/mailman/listinfo/centerim-devel http://www.centerim.org/