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/

Reply via email to