[Telepathy-commits] [telepathy-salut/master] src/salut-im-manager.c: connect to TpSvcConnection::status-changed and close all channels in response to Disconnected

Alban Crequy alban.crequy at collabora.co.uk
Thu Oct 23 07:30:41 PDT 2008


---
 src/salut-im-manager.c |   46 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/src/salut-im-manager.c b/src/salut-im-manager.c
index e68c20c..273b618 100644
--- a/src/salut-im-manager.c
+++ b/src/salut-im-manager.c
@@ -68,6 +68,7 @@ struct _SalutImManagerPrivate
   SalutXmppConnectionManager *xmpp_connection_manager;
   GHashTable *channels;
   GHashTable *pending_connections;
+  gulong status_changed_id;
   gboolean dispose_has_run;
 };
 
@@ -150,6 +151,40 @@ message_stanza_callback (SalutXmppConnectionManager *mgr,
   salut_im_channel_received_stanza (chan, stanza);
 }
 
+static void
+salut_im_factory_close_all (SalutImManager *self)
+{
+  SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (self);
+
+  if (priv->channels != NULL)
+    {
+      GHashTable *tmp = priv->channels;
+
+      DEBUG ("closing channels");
+      priv->channels = NULL;
+      g_hash_table_destroy (tmp);
+    }
+
+  if (priv->status_changed_id != 0)
+    {
+      g_signal_handler_disconnect (priv->connection, priv->status_changed_id);
+      priv->status_changed_id = 0;
+    }
+}
+
+static void
+connection_status_changed_cb (SalutConnection *conn,
+                              guint status,
+                              guint reason,
+                              SalutImManager *self)
+{
+  if (status == TP_CONNECTION_STATUS_DISCONNECTED)
+    {
+      salut_im_factory_close_all (self);
+    }
+}
+
+
 static void salut_im_manager_dispose (GObject *object);
 static void salut_im_manager_finalize (GObject *object);
 
@@ -224,6 +259,9 @@ salut_im_manager_constructor (GType type,
       priv->xmpp_connection_manager, NULL,
       message_stanza_filter, message_stanza_callback, self);
 
+  priv->status_changed_id = g_signal_connect (priv->connection,
+      "status-changed", (GCallback) connection_status_changed_cb, self);
+
   return obj;
 }
 
@@ -288,7 +326,6 @@ salut_im_manager_dispose (GObject *object)
 {
   SalutImManager *self = SALUT_IM_MANAGER (object);
   SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (self);
-  GHashTable *t;
 
   if (priv->dispose_has_run)
     return;
@@ -311,12 +348,7 @@ salut_im_manager_dispose (GObject *object)
       priv->xmpp_connection_manager = NULL;
     }
 
-  if (priv->channels)
-    {
-      t = priv->channels;
-      priv->channels = NULL;
-      g_hash_table_destroy (t);
-    }
+  salut_im_factory_close_all (self);
 
   if (priv->pending_connections)
     {
-- 
1.5.6.5




More information about the Telepathy-commits mailing list