[next] telepathy-glib: base-client: don't create skeletons more than once

Simon McVittie smcv at kemper.freedesktop.org
Wed Sep 17 06:17:26 PDT 2014


Module: telepathy-glib
Branch: next
Commit: 75df253e7b8f0e18b34b4f0c7eacfea6b5101619
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=75df253e7b8f0e18b34b4f0c7eacfea6b5101619

Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date:   Mon May 12 15:17:28 2014 +0200

base-client: don't create skeletons more than once

The client can be registered more than once if user manually unregister it
first. We don't want to create different skeleton objects in that case.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=77882
Reviewed-by: Simon McVittie

---

 telepathy-glib/base-client.c |   57 ++++++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 24 deletions(-)

diff --git a/telepathy-glib/base-client.c b/telepathy-glib/base-client.c
index f4d2894..d7fa99e 100644
--- a/telepathy-glib/base-client.c
+++ b/telepathy-glib/base-client.c
@@ -1713,10 +1713,18 @@ observer_skeleton_init (TpBaseClient *self)
   GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (self);
   gboolean delay_approvers, recover;
 
-  self->priv->observer_skeleton = _tp_gdbus_client_observer_skeleton_new ();
+  if (self->priv->observer_skeleton == NULL)
+    {
+      self->priv->observer_skeleton = _tp_gdbus_client_observer_skeleton_new ();
 
-  g_dbus_object_skeleton_add_interface (skel,
-      G_DBUS_INTERFACE_SKELETON (self->priv->observer_skeleton));
+      g_dbus_object_skeleton_add_interface (skel,
+          G_DBUS_INTERFACE_SKELETON (self->priv->observer_skeleton));
+
+      /* Method */
+      g_signal_connect_object (self->priv->observer_skeleton,
+          "handle-observe-channel",
+          G_CALLBACK (_tp_base_client_observe_channel), self, 0);
+    }
 
   /* Properties */
   delay_approvers = ((self->priv->flags & CLIENT_OBSERVER_DELAYS_APPROVERS)
@@ -1732,11 +1740,6 @@ observer_skeleton_init (TpBaseClient *self)
   _tp_gdbus_client_observer_set_observer_channel_filter (
       self->priv->observer_skeleton,
       g_variant_builder_end (self->priv->observer_filters));
-
-  /* Method */
-  g_signal_connect_object (self->priv->observer_skeleton,
-      "handle-observe-channel", G_CALLBACK (_tp_base_client_observe_channel),
-      self, 0);
 }
 
 static void
@@ -1907,20 +1910,23 @@ approver_skeleton_init (TpBaseClient *self)
 {
   GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (self);
 
-  self->priv->approver_skeleton = _tp_gdbus_client_approver_skeleton_new ();
+  if (self->priv->approver_skeleton == NULL)
+    {
+      self->priv->approver_skeleton = _tp_gdbus_client_approver_skeleton_new ();
 
-  g_dbus_object_skeleton_add_interface (skel,
-      G_DBUS_INTERFACE_SKELETON (self->priv->approver_skeleton));
+      g_dbus_object_skeleton_add_interface (skel,
+          G_DBUS_INTERFACE_SKELETON (self->priv->approver_skeleton));
+
+      /* Method */
+      g_signal_connect_object (self->priv->approver_skeleton,
+          "handle-add-dispatch-operation",
+          G_CALLBACK (_tp_base_client_add_dispatch_operation), self, 0);
+    }
 
   /* Property */
   _tp_gdbus_client_approver_set_approver_channel_filter (
       self->priv->approver_skeleton,
       g_variant_builder_end (self->priv->approver_filters));
-
-  /* Method */
-  g_signal_connect_object (self->priv->approver_skeleton,
-      "handle-add-dispatch-operation",
-      G_CALLBACK (_tp_base_client_add_dispatch_operation), self, 0);
 }
 
 static void
@@ -2209,10 +2215,18 @@ handler_skeleton_init (TpBaseClient *self)
   GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (self);
   gboolean bypass;
 
-  self->priv->handler_skeleton = _tp_gdbus_client_handler_skeleton_new ();
+  if (self->priv->handler_skeleton == NULL)
+    {
+      self->priv->handler_skeleton = _tp_gdbus_client_handler_skeleton_new ();
 
-  g_dbus_object_skeleton_add_interface (skel,
-      G_DBUS_INTERFACE_SKELETON (self->priv->handler_skeleton));
+      g_dbus_object_skeleton_add_interface (skel,
+          G_DBUS_INTERFACE_SKELETON (self->priv->handler_skeleton));
+
+      /* Method */
+      g_signal_connect_object (self->priv->handler_skeleton,
+          "handle-handle-channel", G_CALLBACK (_tp_base_client_handle_channel),
+          self, 0);
+    }
 
   /* Properties */
   _tp_gdbus_client_handler_set_handler_channel_filter (
@@ -2228,11 +2242,6 @@ handler_skeleton_init (TpBaseClient *self)
       (const gchar * const *) self->priv->handler_caps->pdata);
 
   update_handled_channels_prop (self);
-
-  /* Method */
-  g_signal_connect_object (self->priv->handler_skeleton,
-      "handle-handle-channel", G_CALLBACK (_tp_base_client_handle_channel),
-      self, 0);
 }
 
 typedef struct



More information about the telepathy-commits mailing list