[Telepathy-commits] [telepathy-salut/master] ContactManager: close all channels when disconnecting

Will Thompson will.thompson at collabora.co.uk
Thu Oct 23 07:30:42 PDT 2008


---
 src/salut-contact-manager.c |   52 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/src/salut-contact-manager.c b/src/salut-contact-manager.c
index 99854bf..281465a 100644
--- a/src/salut-contact-manager.c
+++ b/src/salut-contact-manager.c
@@ -46,6 +46,8 @@ static SalutContactChannel *salut_contact_manager_get_channel
     (SalutContactManager *mgr, TpHandle handle, gpointer request_token,
     gboolean *created);
 
+static void salut_contact_manager_close_all (SalutContactManager *mgr);
+
 static void
 _contact_finalized_cb (gpointer data, GObject *old_object);
 
@@ -77,6 +79,7 @@ typedef struct _SalutContactManagerPrivate SalutContactManagerPrivate;
 struct _SalutContactManagerPrivate
 {
   GHashTable *channels;
+  gulong status_changed_id;
   gboolean dispose_has_run;
 };
 
@@ -131,6 +134,8 @@ salut_contact_manager_init (SalutContactManager *obj)
   obj->contacts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 }
 
+static GObject *salut_contact_manager_constructor (GType type,
+    guint n_props, GObjectConstructParam *props);
 static void salut_contact_manager_dispose (GObject *object);
 static void salut_contact_manager_finalize (GObject *object);
 
@@ -145,6 +150,7 @@ salut_contact_manager_class_init (SalutContactManagerClass *salut_contact_manage
   object_class->get_property = salut_contact_manager_get_property;
   object_class->set_property = salut_contact_manager_set_property;
 
+  object_class->constructor = salut_contact_manager_constructor;
   object_class->dispose = salut_contact_manager_dispose;
   object_class->finalize = salut_contact_manager_finalize;
 
@@ -172,6 +178,39 @@ salut_contact_manager_class_init (SalutContactManagerClass *salut_contact_manage
       G_TYPE_INT);
 }
 
+static void
+connection_status_changed_cb (SalutConnection *conn,
+                              guint status,
+                              guint reason,
+                              SalutContactManager *self)
+{
+  if (status == TP_CONNECTION_STATUS_DISCONNECTED)
+    {
+      salut_contact_manager_close_all (self);
+    }
+}
+
+static GObject *
+salut_contact_manager_constructor (GType type,
+    guint n_props,
+    GObjectConstructParam *props)
+{
+  GObject *obj;
+  SalutContactManager *self;
+  SalutContactManagerPrivate *priv;
+
+  obj = G_OBJECT_CLASS (salut_contact_manager_parent_class)->
+           constructor (type, n_props, props);
+
+  self = SALUT_CONTACT_MANAGER (obj);
+  priv = SALUT_CONTACT_MANAGER_GET_PRIVATE (self);
+
+  priv->status_changed_id = g_signal_connect (self->connection,
+      "status-changed", (GCallback) connection_status_changed_cb, self);
+
+  return obj;
+}
+
 static gboolean
 dispose_contact (gpointer key, gpointer value, gpointer object)
 {
@@ -200,7 +239,7 @@ salut_contact_manager_dispose (GObject *object)
   priv->dispose_has_run = TRUE;
 
   /* release any references held by the object here */
-  tp_channel_factory_iface_close_all (TP_CHANNEL_FACTORY_IFACE (object));
+  salut_contact_manager_close_all (self);
 
   if (G_OBJECT_CLASS (salut_contact_manager_parent_class)->dispose)
     G_OBJECT_CLASS (salut_contact_manager_parent_class)->dispose (object);
@@ -331,9 +370,8 @@ salut_contact_manager_ensure_contact (SalutContactManager *self,
 }
 
 static void
-salut_contact_manager_factory_iface_close_all (TpChannelFactoryIface *iface)
+salut_contact_manager_close_all (SalutContactManager *mgr)
 {
-  SalutContactManager *mgr = SALUT_CONTACT_MANAGER (iface);
   SalutContactManagerPrivate *priv =
     SALUT_CONTACT_MANAGER_GET_PRIVATE (mgr);
 
@@ -351,6 +389,12 @@ salut_contact_manager_factory_iface_close_all (TpChannelFactoryIface *iface)
       g_hash_table_destroy (mgr->contacts);
       mgr->contacts = NULL;
     }
+
+  if (priv->status_changed_id != 0)
+    {
+      g_signal_handler_disconnect (mgr->connection, priv->status_changed_id);
+      priv->status_changed_id = 0;
+    }
 }
 
 static void
@@ -435,7 +479,7 @@ static void salut_contact_manager_factory_iface_init (gpointer g_iface,
 {
   TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *)g_iface;
 
-  klass->close_all = salut_contact_manager_factory_iface_close_all;
+  klass->close_all = (TpChannelFactoryIfaceProc) salut_contact_manager_close_all;
   klass->connecting = salut_contact_manager_factory_iface_connecting;
   klass->connected = salut_contact_manager_factory_iface_connected;
   klass->disconnected = salut_contact_manager_factory_iface_disconnected;
-- 
1.5.6.5




More information about the Telepathy-commits mailing list