[Pkg-telepathy-commits] [telepathy-glib-1] 162/212: TpBaseConnection: be a GDBusObjectSkeleton

Simon McVittie smcv at debian.org
Wed May 14 12:09:10 UTC 2014


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian
in repository telepathy-glib-1.

commit 26b418ed39877b3ffdc26b7014541680e9e1c0dd
Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Fri Apr 11 14:47:29 2014 +0100

    TpBaseConnection: be a GDBusObjectSkeleton
    
    Reviewed-by: Xavier Claessens <xavier.claessens at collabora.com>
    Bug: https://bugs.freedesktop.org/show_bug.cgi?id=77189
---
 .../telepathy-glib/telepathy-glib-sections.txt     |   2 -
 examples/cm/call/conn.c                            |  23 +--
 examples/cm/channelspecific/conn.c                 |  16 --
 examples/cm/contactlist/conn.c                     |  44 +++--
 examples/cm/echo-message-parts/conn.c              |  16 --
 examples/cm/extended/conn.c                        |  29 +--
 telepathy-glib/base-connection.c                   | 200 ++++++++-------------
 telepathy-glib/base-connection.h                   |  15 +-
 telepathy-glib/versions/main-1.0.abi               |   1 -
 tests/dbus/connection-balance.c                    |  29 +--
 tests/dbus/proxy-preparation.c                     |   9 +-
 tests/lib/contacts-conn.c                          |  81 ++++++---
 tests/lib/my-conn-proxy.c                          |   1 +
 tests/lib/my-conn-proxy.h                          |   6 +-
 14 files changed, 205 insertions(+), 267 deletions(-)

diff --git a/docs/reference/telepathy-glib/telepathy-glib-sections.txt b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
index f07d33d..4a43f60 100644
--- a/docs/reference/telepathy-glib/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
@@ -42,7 +42,6 @@ TpBaseConnectionClass
 TpBaseConnectionCreateChannelManagersImpl
 TpBaseConnectionCreateHandleReposImpl
 TpBaseConnectionGetUniqueConnectionNameImpl
-TpBaseConnectionGetInterfacesImpl
 TpBaseConnectionProc
 TpBaseConnectionStartConnectingImpl
 tp_base_connection_get_bus_name
@@ -58,7 +57,6 @@ tp_base_connection_check_connected
 tp_base_connection_change_status
 tp_base_connection_disconnect_with_dbus_error
 tp_base_connection_finish_shutdown
-tp_base_connection_add_interfaces
 TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED
 tp_base_connection_add_possible_client_interest
 tp_base_connection_add_client_interest
diff --git a/examples/cm/call/conn.c b/examples/cm/call/conn.c
index d64dcac..e1d74de 100644
--- a/examples/cm/call/conn.c
+++ b/examples/cm/call/conn.c
@@ -214,10 +214,17 @@ constructed (GObject *object)
 {
   void (*chain_up) (GObject *) =
     G_OBJECT_CLASS (example_call_connection_parent_class)->constructed;
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (object);
+  GDBusInterfaceSkeleton *iface;
 
   if (chain_up != NULL)
     chain_up (object);
 
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_PRESENCE1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
   tp_presence_mixin_init (object,
       G_STRUCT_OFFSET (ExampleCallConnection, presence_mixin));
 }
@@ -326,21 +333,6 @@ example_call_connection_get_possible_interfaces (void)
   return interfaces_always_present;
 }
 
-static GPtrArray *
-get_interfaces_always_present (TpBaseConnection *base)
-{
-  GPtrArray *interfaces;
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      example_call_connection_parent_class)->get_interfaces_always_present (base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
-}
-
 static void
 example_call_connection_fill_contact_attributes (TpBaseConnection *conn,
     const gchar *dbus_interface,
@@ -375,7 +367,6 @@ example_call_connection_class_init (
   base_class->create_channel_managers = create_channel_managers;
   base_class->start_connecting = start_connecting;
   base_class->shut_down = shut_down;
-  base_class->get_interfaces_always_present = get_interfaces_always_present;
   base_class->fill_contact_attributes =
     example_call_connection_fill_contact_attributes;
 
diff --git a/examples/cm/channelspecific/conn.c b/examples/cm/channelspecific/conn.c
index c3da5ec..4cb7a59 100644
--- a/examples/cm/channelspecific/conn.c
+++ b/examples/cm/channelspecific/conn.c
@@ -227,21 +227,6 @@ example_csh_connection_get_possible_interfaces (void)
   return interfaces_always_present;
 }
 
-static GPtrArray *
-get_interfaces_always_present (TpBaseConnection *base)
-{
-  GPtrArray *interfaces;
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      example_csh_connection_parent_class)->get_interfaces_always_present (base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
-}
-
 static void
 example_csh_connection_class_init (ExampleCSHConnectionClass *klass)
 {
@@ -260,7 +245,6 @@ example_csh_connection_class_init (ExampleCSHConnectionClass *klass)
   base_class->create_channel_managers = create_channel_managers;
   base_class->start_connecting = start_connecting;
   base_class->shut_down = shut_down;
-  base_class->get_interfaces_always_present = get_interfaces_always_present;
 
   param_spec = g_param_spec_string ("account", "Account name",
       "The username of this user", NULL,
diff --git a/examples/cm/contactlist/conn.c b/examples/cm/contactlist/conn.c
index 4b1a9f3..266a0b2 100644
--- a/examples/cm/contactlist/conn.c
+++ b/examples/cm/contactlist/conn.c
@@ -265,6 +265,8 @@ static void
 constructed (GObject *object)
 {
   ExampleContactListConnection *self = EXAMPLE_CONTACT_LIST_CONNECTION (object);
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (object);
+  GDBusInterfaceSkeleton *iface;
   void (*chain_up) (GObject *) =
     G_OBJECT_CLASS (example_contact_list_connection_parent_class)->constructed;
 
@@ -284,6 +286,31 @@ constructed (GObject *object)
 
   tp_presence_mixin_init (object,
       G_STRUCT_OFFSET (ExampleContactListConnection, presence_mixin));
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_ALIASING1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_BLOCKING1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_GROUPS1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_LIST1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_PRESENCE1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
 }
 
 static gboolean
@@ -371,22 +398,6 @@ example_contact_list_connection_get_possible_interfaces (void)
   return interfaces_always_present;
 }
 
-static GPtrArray *
-get_interfaces_always_present (TpBaseConnection *base)
-{
-  GPtrArray *interfaces;
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      example_contact_list_connection_parent_class)->get_interfaces_always_present (
-          base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
-}
-
 enum
 {
   ALIASING_DP_ALIAS_FLAGS,
@@ -442,7 +453,6 @@ example_contact_list_connection_class_init (
   base_class->create_channel_managers = create_channel_managers;
   base_class->start_connecting = start_connecting;
   base_class->shut_down = shut_down;
-  base_class->get_interfaces_always_present = get_interfaces_always_present;
   base_class->fill_contact_attributes =
     example_contact_list_connection_fill_contact_attributes;
 
diff --git a/examples/cm/echo-message-parts/conn.c b/examples/cm/echo-message-parts/conn.c
index f8bb689..b0aaa42 100644
--- a/examples/cm/echo-message-parts/conn.c
+++ b/examples/cm/echo-message-parts/conn.c
@@ -168,21 +168,6 @@ example_echo_2_connection_get_possible_interfaces (void)
   return interfaces_always_present;
 }
 
-static GPtrArray *
-get_interfaces_always_present (TpBaseConnection *base)
-{
-  GPtrArray *interfaces;
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      example_echo_2_connection_parent_class)->get_interfaces_always_present (base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
-}
-
 static void
 example_echo_2_connection_class_init (ExampleEcho2ConnectionClass *klass)
 {
@@ -201,7 +186,6 @@ example_echo_2_connection_class_init (ExampleEcho2ConnectionClass *klass)
   base_class->create_channel_managers = create_channel_managers;
   base_class->start_connecting = start_connecting;
   base_class->shut_down = shut_down;
-  base_class->get_interfaces_always_present = get_interfaces_always_present;
 
   param_spec = g_param_spec_string ("account", "Account name",
       "The username of this user", NULL,
diff --git a/examples/cm/extended/conn.c b/examples/cm/extended/conn.c
index cb7846f..792952d 100644
--- a/examples/cm/extended/conn.c
+++ b/examples/cm/extended/conn.c
@@ -184,19 +184,21 @@ example_extended_connection_get_possible_interfaces (void)
   return interfaces_always_present;
 }
 
-static GPtrArray *
-get_interfaces_always_present (TpBaseConnection *base)
+static void
+constructed (GObject *object)
 {
-  GPtrArray *interfaces;
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      example_extended_connection_parent_class)->get_interfaces_always_present (base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
+  void (*chain_up) (GObject *) =
+    G_OBJECT_CLASS (example_extended_connection_parent_class)->constructed;
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (object);
+  GDBusInterfaceSkeleton *iface;
+
+  if (chain_up != NULL)
+    chain_up (object);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      EXAMPLE_TYPE_SVC_CONNECTION_INTERFACE_HATS);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
 }
 
 static void
@@ -209,6 +211,7 @@ example_extended_connection_class_init (ExampleExtendedConnectionClass *klass)
 
   object_class->get_property = get_property;
   object_class->set_property = set_property;
+  object_class->constructed = constructed;
   object_class->finalize = finalize;
   g_type_class_add_private (klass, sizeof (ExampleExtendedConnectionPrivate));
 
@@ -218,8 +221,6 @@ example_extended_connection_class_init (ExampleExtendedConnectionClass *klass)
   base_class->start_connecting = start_connecting;
   base_class->shut_down = shut_down;
 
-  base_class->get_interfaces_always_present = get_interfaces_always_present;
-
   param_spec = g_param_spec_string ("account", "Account name",
       "The username of this user", NULL,
       G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
diff --git a/telepathy-glib/base-connection.c b/telepathy-glib/base-connection.c
index ce84808..c9521fc 100644
--- a/telepathy-glib/base-connection.c
+++ b/telepathy-glib/base-connection.c
@@ -72,6 +72,10 @@
  * asynchronously, returning %TRUE in most cases and changing the status
  * to CONNECTED or DISCONNECTED later.
  *
+ * Subclasses may call g_dbus_object_skeleton_add_interface()
+ * at any time before the status reaches CONNECTED. It is considered
+ * to be an error to do so after CONNECTED status has been reached.
+ *
  * Returns: %FALSE if failure has already occurred, else %TRUE.
  */
 
@@ -110,38 +114,6 @@
  */
 
 /**
- * TpBaseConnectionGetInterfacesImpl:
- * @self: a #TpBaseConnection
- *
- * Signature of an implementation of
- * #TpBaseConnectionClass.get_interfaces_always_present virtual
- * function.
- *
- * Implementation must first chainup on parent class implementation and then
- * add extra interfaces into the #GPtrArray.
- *
- * |[
- * static GPtrArray *
- * my_connection_get_interfaces_always_present (TpBaseConnection *self)
- * {
- *   GPtrArray *interfaces;
- *
- *   interfaces = TP_BASE_CONNECTION_CLASS (
- *       my_connection_parent_class)->get_interfaces_always_present (self);
- *
- *   g_ptr_array_add (interfaces, TP_IFACE_BADGERS);
- *
- *   return interfaces;
- * }
- * ]|
- *
- * Returns: (transfer container): a #GPtrArray of static strings for D-Bus
- *   interfaces implemented by this client.
- *
- * Since: 0.19.4
- */
-
-/**
  * TpBaseConnectionClass:
  * @parent_class: The superclass' structure
  * @create_handle_repos: Fill in suitable handle repositories in the
@@ -167,12 +139,6 @@
  * @start_connecting: Asynchronously start connecting - called to implement
  *  the Connect D-Bus method. See #TpBaseConnectionStartConnectingImpl for
  *  details. May not be left as %NULL.
- * @get_interfaces_always_present: Returns a #GPtrArray of extra D-Bus
- *  interfaces which are always implemented by instances of this class,
- *  which may be filled in by subclasses. The default is to list no
- *  additional interfaces. Individual instances may detect which
- *  additional interfaces they support and signal them before going
- *  to state CONNECTED by calling tp_base_connection_add_interfaces().
  * @create_channel_managers: Create an array of channel managers for this
  *  Connection. This must be set by subclasses to a non-%NULL
  *  value. Since: 0.7.15
@@ -264,7 +230,7 @@ static void requests_iface_init (gpointer, gpointer);
 
 G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TpBaseConnection,
     tp_base_connection,
-    G_TYPE_OBJECT,
+    G_TYPE_DBUS_OBJECT_SKELETON,
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION,
       conn_iface_init);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_REQUESTS,
@@ -324,13 +290,6 @@ struct _TpBaseConnectionPrivate
 
   TpHandleRepoIface *handles[TP_NUM_ENTITY_TYPES];
 
-  /* Created in constructed, this is an array of static strings which
-   * represent the interfaces on this connection.
-   *
-   * Note that this is a GArray of gchar*, not a GPtrArray,
-   * so that we can use GArray's convenient auto-null-termination. */
-  GArray *interfaces;
-
   /* Array of GDBusMethodInvocation * representing Disconnect calls.
    * If NULL and we are in a state != DISCONNECTED, then we have not started
    * shutting down yet.
@@ -362,8 +321,6 @@ typedef struct
 } ClientData;
 
 static void client_data_free (ClientData *client);
-static const gchar * const *tp_base_connection_get_interfaces (
-    TpBaseConnection *self);
 
 static gboolean
 tp_base_connection_ensure_dbus (TpBaseConnection *self,
@@ -407,7 +364,9 @@ tp_base_connection_get_property (GObject *object,
       break;
 
     case PROP_INTERFACES:
-      g_value_set_boxed (value, tp_base_connection_get_interfaces (self));
+      g_value_take_boxed (value,
+          _tp_g_dbus_object_dup_interface_names (G_DBUS_OBJECT (self),
+            TP_IFACE_CONNECTION, TP_IFACE_CONNECTION_INTERFACE_REQUESTS));
       break;
 
     case PROP_DBUS_CONNECTION:
@@ -523,11 +482,6 @@ tp_base_connection_dispose (GObject *object)
   for (i = 0; i < TP_NUM_ENTITY_TYPES; i++)
     tp_clear_object (priv->handles + i);
 
-  if (priv->interfaces)
-    {
-      g_array_unref (priv->interfaces);
-    }
-
   if (G_OBJECT_CLASS (tp_base_connection_parent_class)->dispose)
     G_OBJECT_CLASS (tp_base_connection_parent_class)->dispose (object);
 }
@@ -769,24 +723,47 @@ _tp_base_connection_set_handle_repo (TpBaseConnection *self,
 }
 
 static void
-tp_base_connection_create_interfaces_array (TpBaseConnection *self)
+tp_base_connection_interface_changed_cb (TpBaseConnection *self,
+    GDBusInterface *interface,
+    gpointer user_data)
 {
-  TpBaseConnectionPrivate *priv = self->priv;
-  TpBaseConnectionClass *klass = TP_BASE_CONNECTION_GET_CLASS (self);
-  GPtrArray *always;
-  guint i;
-
-  g_assert (priv->interfaces == NULL);
+  GDBusInterfaceInfo *info = g_dbus_interface_get_info (interface);
+  gint what_happened = GPOINTER_TO_INT (user_data);
+  const gchar *verb = (what_happened == 1 ? "add" : "remove");
 
-  always = klass->get_interfaces_always_present (self);
+  g_assert (what_happened == 1 || what_happened == -1);
 
-  priv->interfaces = g_array_sized_new (TRUE, FALSE, sizeof (gchar *),
-      always->len);
+  if (self->priv->status == TP_CONNECTION_STATUS_CONNECTED)
+    {
+      WARNING ("Adding or removing Connection interfaces after CONNECTED "
+          "status has been reached is not supported. "
+          "(Tried to %s %s %p, \"%s\")",
+          verb, G_OBJECT_TYPE_NAME (interface), interface, info->name);
+    }
+  else
+    {
+      /* We'd ideally like to detect attempts to remove interfaces
+       * and diagnose those as invalid, too, but we can't do that because
+       * replacement by a subclass is represented as remove + add. */
+      DEBUG ("%s %s %p \"%s\"",
+          verb, G_OBJECT_TYPE_NAME (interface), interface, info->name);
+    }
+}
 
-  for (i = 0; i < always->len; i++)
-    g_array_append_val (priv->interfaces, g_ptr_array_index (always, i));
+static void
+object_skeleton_take_interface (GDBusObjectSkeleton *skel,
+    GDBusInterfaceSkeleton *iface)
+{
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+}
 
-  g_ptr_array_unref (always);
+static void
+object_skeleton_take_svc_interface (GDBusObjectSkeleton *skel,
+    GType type)
+{
+  object_skeleton_take_interface (skel,
+      tp_svc_interface_skeleton_new (skel, type));
 }
 
 static GObject *
@@ -834,13 +811,34 @@ tp_base_connection_constructor (GType type, guint n_construct_properties,
           (GCallback) manager_channel_closed_cb, self);
     }
 
-  tp_base_connection_create_interfaces_array (self);
-
   priv->been_constructed = TRUE;
 
   return (GObject *) self;
 }
 
+static void
+tp_base_connection_constructed (GObject *object)
+{
+  TpBaseConnection *self = TP_BASE_CONNECTION (object);
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (self);
+  void (*chain_up) (GObject *) =
+    ((GObjectClass *) tp_base_connection_parent_class)->constructed;
+
+  if (chain_up != NULL)
+    chain_up (object);
+
+  object_skeleton_take_svc_interface (skel, TP_TYPE_SVC_CONNECTION);
+  object_skeleton_take_svc_interface (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_REQUESTS);
+
+  g_signal_connect (self, "interface-added",
+      G_CALLBACK (tp_base_connection_interface_changed_cb),
+      GINT_TO_POINTER (+1));
+  g_signal_connect (self, "interface-removed",
+      G_CALLBACK (tp_base_connection_interface_changed_cb),
+      GINT_TO_POINTER (-1));
+}
+
 /**
  * tp_base_connection_add_possible_client_interest:
  * @self: a connection
@@ -959,24 +957,6 @@ conn_requests_get_dbus_property (GObject *object,
     }
 }
 
-static GPtrArray *
-tp_base_connection_get_interfaces_always_present (TpBaseConnection *self)
-{
-  GPtrArray *interfaces = g_ptr_array_new ();
-  const gchar **ptr;
-
-  /* copy the klass->interfaces_always_present property for backwards
-   * compatibility */
-  for (ptr = TP_BASE_CONNECTION_GET_CLASS (self)->interfaces_always_present;
-       ptr != NULL && *ptr != NULL;
-       ptr++)
-    {
-      g_ptr_array_add (interfaces, (gchar *) *ptr);
-    }
-
-  return interfaces;
-}
-
 /* this is not really gtk-doc - it's for gobject-introspection */
 /**
  * TpBaseConnectionClass::fill_contact_attributes:
@@ -1052,7 +1032,9 @@ tp_base_connection_get_connection_property (GObject *object,
         break;
 
       case DBUSPROP_INTERFACES:
-        g_value_set_boxed (value, tp_base_connection_get_interfaces (self));
+        g_value_take_boxed (value,
+            _tp_g_dbus_object_dup_interface_names (G_DBUS_OBJECT (self),
+              TP_IFACE_CONNECTION, TP_IFACE_CONNECTION_INTERFACE_REQUESTS));
         break;
 
       case DBUSPROP_RCCS:
@@ -1083,14 +1065,13 @@ tp_base_connection_class_init (TpBaseConnectionClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   g_type_class_add_private (klass, sizeof (TpBaseConnectionPrivate));
+  object_class->constructed = tp_base_connection_constructed;
   object_class->dispose = tp_base_connection_dispose;
   object_class->finalize = tp_base_connection_finalize;
   object_class->constructor = tp_base_connection_constructor;
   object_class->get_property = tp_base_connection_get_property;
   object_class->set_property = tp_base_connection_set_property;
 
-  klass->get_interfaces_always_present =
-    tp_base_connection_get_interfaces_always_present;
   klass->fill_contact_attributes = _tp_base_connection_fill_contact_attributes;
 
   /**
@@ -1552,14 +1533,6 @@ tp_base_connection_disconnect (TpSvcConnection *iface,
       TP_CONNECTION_STATUS_REASON_REQUESTED);
 }
 
-static const gchar * const *
-tp_base_connection_get_interfaces (TpBaseConnection *self)
-{
-  g_return_val_if_fail (TP_IS_BASE_CONNECTION (self), NULL);
-
-  return (const gchar * const *)(self->priv->interfaces->data);
-}
-
 /**
  * tp_base_connection_get_status:
  * @self: the connection
@@ -1997,37 +1970,6 @@ tp_base_connection_change_status (TpBaseConnection *self,
   g_object_unref (self);
 }
 
-
-/**
- * tp_base_connection_add_interfaces: (skip)
- * @self: A TpBaseConnection in state #TP_INTERNAL_CONNECTION_STATUS_NEW
- *  or #TP_CONNECTION_STATUS_CONNECTING
- * @interfaces: A %NULL-terminated array of D-Bus interface names, which
- *  must remain valid at least until the connection enters state
- *  #TP_CONNECTION_STATUS_DISCONNECTED (in practice, you should either
- *  use static strings, or use strdup'd strings and free them in the dispose
- *  callback).
- *
- * Add some interfaces to the list supported by this Connection. If you're
- * going to call this function at all, you must do so before moving to state
- * CONNECTED (or DISCONNECTED); if you don't call it, only the set of
- * interfaces always present (@get_interfaces_always_present in
- * #TpBaseConnectionClass) will be supported.
- */
-void
-tp_base_connection_add_interfaces (TpBaseConnection *self,
-                                   const gchar **interfaces)
-{
-  TpBaseConnectionPrivate *priv = self->priv;
-
-  g_return_if_fail (TP_IS_BASE_CONNECTION (self));
-  g_return_if_fail (priv->status != TP_CONNECTION_STATUS_CONNECTED);
-  g_return_if_fail (priv->status != TP_CONNECTION_STATUS_DISCONNECTED);
-
-  for (; interfaces != NULL && *interfaces != NULL; interfaces++)
-    g_array_append_val (priv->interfaces, *interfaces);
-}
-
 static guint
 get_interest_count (GHashTable *table,
     GQuark q)
diff --git a/telepathy-glib/base-connection.h b/telepathy-glib/base-connection.h
index d972032..b3a8b94 100644
--- a/telepathy-glib/base-connection.h
+++ b/telepathy-glib/base-connection.h
@@ -56,18 +56,15 @@ typedef GPtrArray *(*TpBaseConnectionCreateChannelManagersImpl) (
 typedef gchar *(*TpBaseConnectionGetUniqueConnectionNameImpl) (
     TpBaseConnection *self);
 
-typedef GPtrArray *(*TpBaseConnectionGetInterfacesImpl) (
-    TpBaseConnection *self);
-
 struct _TpBaseConnection {
     /*<private>*/
-    GObject parent;
+    GDBusObjectSkeleton parent;
 
     TpBaseConnectionPrivate *priv;
 };
 
 struct _TpBaseConnectionClass {
-    GObjectClass parent_class;
+    GDBusObjectSkeletonClass parent_class;
 
 #ifdef __GI_SCANNER__
     /*<private>*/
@@ -87,13 +84,8 @@ struct _TpBaseConnectionClass {
 
     TpBaseConnectionStartConnectingImpl start_connecting;
 
-    /*<private>*/
-    const gchar **_TP_SEAL (interfaces_always_present);
-    /*<public>*/
     TpBaseConnectionCreateChannelManagersImpl create_channel_managers;
 
-    TpBaseConnectionGetInterfacesImpl get_interfaces_always_present;
-
     void (*fill_contact_attributes) (TpBaseConnection *self,
         const gchar *dbus_interface,
         TpHandle contact,
@@ -154,9 +146,6 @@ void tp_base_connection_set_self_handle (TpBaseConnection *self,
 
 void tp_base_connection_finish_shutdown (TpBaseConnection *self);
 
-void tp_base_connection_add_interfaces (TpBaseConnection *self,
-    const gchar **interfaces);
-
 typedef struct _TpChannelManagerIter TpChannelManagerIter;
 
 struct _TpChannelManagerIter {
diff --git a/telepathy-glib/versions/main-1.0.abi b/telepathy-glib/versions/main-1.0.abi
index f404e2d..a5f7147 100644
--- a/telepathy-glib/versions/main-1.0.abi
+++ b/telepathy-glib/versions/main-1.0.abi
@@ -218,7 +218,6 @@ tp_base_client_take_handler_filter
 tp_base_client_take_observer_filter
 tp_base_client_unregister
 tp_base_connection_add_client_interest
-tp_base_connection_add_interfaces
 tp_base_connection_add_possible_client_interest
 tp_base_connection_change_status
 tp_base_connection_channel_manager_iter_init
diff --git a/tests/dbus/connection-balance.c b/tests/dbus/connection-balance.c
index d5502b2..da274fa 100644
--- a/tests/dbus/connection-balance.c
+++ b/tests/dbus/connection-balance.c
@@ -18,6 +18,7 @@
 #include <telepathy-glib/interfaces.h>
 #include <telepathy-glib/proxy-subclass.h>
 #include <telepathy-glib/svc-connection.h>
+#include <telepathy-glib/svc-interface.h>
 #include <telepathy-glib/value-array.h>
 
 #include <dbus/dbus-glib.h>
@@ -83,24 +84,27 @@ balanced_connection_init (BalancedConnection *self)
 {
 }
 
-static GPtrArray *
-get_interfaces (TpBaseConnection *base)
+static void
+balanced_connection_constructed (GObject *object)
 {
-  GPtrArray *interfaces;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      balanced_connection_parent_class)->get_interfaces_always_present (base);
-
-  g_ptr_array_add (interfaces, TP_IFACE_CONNECTION_INTERFACE_BALANCE1);
-
-  return interfaces;
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (object);
+  GDBusInterfaceSkeleton *iface;
+  void (*parent_impl) (GObject *) =
+    G_OBJECT_CLASS (balanced_connection_parent_class)->constructed;
+
+  if (parent_impl != NULL)
+    parent_impl (object);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_BALANCE1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
 }
 
 static void
 balanced_connection_class_init (BalancedConnectionClass *cls)
 {
   GObjectClass *object_class = (GObjectClass *) cls;
-  TpBaseConnectionClass *base_class = TP_BASE_CONNECTION_CLASS (cls);
 
   static TpDBusPropertiesMixinPropImpl balance_props[] = {
         { "AccountBalance", "account-balance", NULL },
@@ -108,10 +112,9 @@ balanced_connection_class_init (BalancedConnectionClass *cls)
         { NULL }
   };
 
+  object_class->constructed = balanced_connection_constructed;
   object_class->get_property = balanced_connection_get_property;
 
-  base_class->get_interfaces_always_present = get_interfaces;
-
   g_object_class_install_property (object_class, PROP_ACCOUNT_BALANCE,
       g_param_spec_boxed ("account-balance", "", "",
         TP_STRUCT_TYPE_CURRENCY_AMOUNT,
diff --git a/tests/dbus/proxy-preparation.c b/tests/dbus/proxy-preparation.c
index db969ba..6fccfbb 100644
--- a/tests/dbus/proxy-preparation.c
+++ b/tests/dbus/proxy-preparation.c
@@ -11,6 +11,7 @@
 
 #include <telepathy-glib/cli-connection.h>
 #include <telepathy-glib/telepathy-glib.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
 
 #include "tests/lib/util.h"
 #include "tests/lib/simple-account.h"
@@ -386,7 +387,7 @@ test_interface_later (Test *test,
 {
   GQuark features[] = { TP_TESTS_MY_CONN_PROXY_FEATURE_INTERFACE_LATER, 0 };
   GQuark connected[] = { TP_CONNECTION_FEATURE_CONNECTED, 0 };
-  const gchar *interfaces[] = { TP_TESTS_MY_CONN_PROXY_IFACE_LATER, NULL };
+  GDBusInterfaceSkeleton *iface;
 
   /* We need a not yet connected connection */
   recreate_connection (test);
@@ -404,7 +405,11 @@ test_interface_later (Test *test,
   tp_cli_connection_call_connect (test->connection, -1, NULL, NULL, NULL, NULL);
 
   /* While connecting the interface is added */
-  tp_base_connection_add_interfaces (test->base_connection, interfaces);
+  iface = tp_svc_interface_skeleton_new (test->base_connection,
+      TP_TESTS_TYPE_SVC_CONNECTION_INTERFACE_LATER);
+  g_dbus_object_skeleton_add_interface (
+      G_DBUS_OBJECT_SKELETON (test->base_connection), iface);
+  g_object_unref (iface);
 
   /* Wait that CONNECTED is announced */
   tp_proxy_prepare_async (test->my_conn, connected, prepare_cb, test);
diff --git a/tests/lib/contacts-conn.c b/tests/lib/contacts-conn.c
index 79a5c4b..092ae97 100644
--- a/tests/lib/contacts-conn.c
+++ b/tests/lib/contacts-conn.c
@@ -19,6 +19,7 @@
 #include <telepathy-glib/telepathy-glib-dbus.h>
 
 #include "debug.h"
+#include "my-conn-proxy.h"
 
 static void init_aliasing (gpointer, gpointer);
 static void init_avatars (gpointer, gpointer);
@@ -46,6 +47,12 @@ G_DEFINE_TYPE_WITH_CODE (TpTestsContactsConnection,
       tp_base_contact_list_mixin_groups_iface_init);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_CLIENT_TYPES1,
       NULL);
+    /* We don't really implement this one, but the proxy-preparation test
+     * wants to be able to add interfaces at runtime like Gabble does.
+     * It can be any interface we don't really need (implementation detail:
+     * it's PowerSaving1). */
+    G_IMPLEMENT_INTERFACE (TP_TESTS_TYPE_SVC_CONNECTION_INTERFACE_LATER,
+      NULL);
     );
 
 /* type definition stuff */
@@ -360,12 +367,59 @@ static void
 constructed (GObject *object)
 {
   TpTestsContactsConnection *self = TP_TESTS_CONTACTS_CONNECTION (object);
+  GDBusObjectSkeleton *skel = G_DBUS_OBJECT_SKELETON (object);
+  GDBusInterfaceSkeleton *iface;
   void (*parent_impl) (GObject *) =
     G_OBJECT_CLASS (tp_tests_contacts_connection_parent_class)->constructed;
 
   if (parent_impl != NULL)
     parent_impl (object);
 
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_ALIASING1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_AVATARS1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CLIENT_TYPES1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_CAPABILITIES1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_GROUPS1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_LIST1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_INFO1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_LOCATION1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
+  iface = tp_svc_interface_skeleton_new (skel,
+      TP_TYPE_SVC_CONNECTION_INTERFACE_PRESENCE1);
+  g_dbus_object_skeleton_add_interface (skel, iface);
+  g_object_unref (iface);
+
   self->priv->list_manager = g_object_new (TP_TESTS_TYPE_CONTACT_LIST_MANAGER,
       "connection", self, NULL);
 
@@ -439,32 +493,6 @@ create_channel_managers (TpBaseConnection *conn)
   return g_ptr_array_new ();
 }
 
-static GPtrArray *
-tp_tests_contacts_get_interfaces_always_present (TpBaseConnection *base)
-{
-  GPtrArray *interfaces;
-  static const gchar *interfaces_always_present[] = {
-      TP_IFACE_CONNECTION_INTERFACE_ALIASING1,
-      TP_IFACE_CONNECTION_INTERFACE_AVATARS1,
-      TP_IFACE_CONNECTION_INTERFACE_CONTACT_LIST1,
-      TP_IFACE_CONNECTION_INTERFACE_CONTACT_GROUPS1,
-      TP_IFACE_CONNECTION_INTERFACE_PRESENCE1,
-      TP_IFACE_CONNECTION_INTERFACE_LOCATION1,
-      TP_IFACE_CONNECTION_INTERFACE_CLIENT_TYPES1,
-      TP_IFACE_CONNECTION_INTERFACE_CONTACT_CAPABILITIES1,
-      TP_IFACE_CONNECTION_INTERFACE_CONTACT_INFO1,
-      NULL };
-  guint i;
-
-  interfaces = TP_BASE_CONNECTION_CLASS (
-      tp_tests_contacts_connection_parent_class)->get_interfaces_always_present (base);
-
-  for (i = 0; interfaces_always_present[i] != NULL; i++)
-    g_ptr_array_add (interfaces, (gchar *) interfaces_always_present[i]);
-
-  return interfaces;
-}
-
 enum
 {
   ALIASING_DP_ALIAS_FLAGS,
@@ -523,7 +551,6 @@ tp_tests_contacts_connection_class_init (TpTestsContactsConnectionClass *klass)
   object_class->finalize = finalize;
   g_type_class_add_private (klass, sizeof (TpTestsContactsConnectionPrivate));
 
-  base_class->get_interfaces_always_present = tp_tests_contacts_get_interfaces_always_present;
   base_class->create_channel_managers = create_channel_managers;
   base_class->fill_contact_attributes =
     tp_tests_contacts_connection_fill_contact_attributes;
diff --git a/tests/lib/my-conn-proxy.c b/tests/lib/my-conn-proxy.c
index 0d7723c..4df30a1 100644
--- a/tests/lib/my-conn-proxy.c
+++ b/tests/lib/my-conn-proxy.c
@@ -13,6 +13,7 @@
 #include "my-conn-proxy.h"
 
 #include <telepathy-glib/telepathy-glib.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
 
 G_DEFINE_TYPE  (TpTestsMyConnProxy, tp_tests_my_conn_proxy,
     TP_TYPE_CONNECTION)
diff --git a/tests/lib/my-conn-proxy.h b/tests/lib/my-conn-proxy.h
index 64a6ebe..e667c72 100644
--- a/tests/lib/my-conn-proxy.h
+++ b/tests/lib/my-conn-proxy.h
@@ -110,7 +110,11 @@ GQuark tp_tests_my_conn_proxy_get_feature_quark_retry_dep (void) G_GNUC_CONST;
   (tp_tests_my_conn_proxy_get_feature_quark_before_connected ())
 GQuark tp_tests_my_conn_proxy_get_feature_quark_before_connected (void) G_GNUC_CONST;
 
-#define TP_TESTS_MY_CONN_PROXY_IFACE_LATER "im.telepathy.v1.Tests.Connection.Interface.Later"
+#define TP_TESTS_MY_CONN_PROXY_IFACE_LATER \
+  TP_IFACE_CONNECTION_INTERFACE_POWER_SAVING1
+
+#define TP_TESTS_TYPE_SVC_CONNECTION_INTERFACE_LATER \
+  TP_TYPE_SVC_CONNECTION_INTERFACE_POWER_SAVING1
 
 /* Need the interface TP_TESTS_MY_CONN_PROXY_IFACE_LATER to be prepared but
  * this interface is not in the initial set of interfaces of the connection.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-telepathy/telepathy-glib-1.git



More information about the Pkg-telepathy-commits mailing list