summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2014-05-09 16:23:55 +0200
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-09-17 14:00:00 +0100
commit01c2d1fc7c7fa6924bf3b547944f8f9a89b675c1 (patch)
treef787b981fdb06254a927e4a85fcb5608a2a5b085
parent800e05976ddc6d2124117aeb35ba9141219b7d8d (diff)
downloadtelepathy-glib-01c2d1fc7c7fa6924bf3b547944f8f9a89b675c1.tar.gz
base-client: use gdbus-codegen's skeleton to implement Client
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=77882 Reviewed-by: Xavier Claessens Reviewed-by: Simon McVittie
-rw-r--r--telepathy-glib/Makefile.am2
-rw-r--r--telepathy-glib/base-client.c66
2 files changed, 36 insertions, 32 deletions
diff --git a/telepathy-glib/Makefile.am b/telepathy-glib/Makefile.am
index 84ab59e8d..7c93ac23f 100644
--- a/telepathy-glib/Makefile.am
+++ b/telepathy-glib/Makefile.am
@@ -355,6 +355,8 @@ gdbus_codegen = \
_gdbus/Connection_Interface_Presence1.h \
_gdbus/Connection_Interface_Requests.c \
_gdbus/Connection_Interface_Requests.h \
+ _gdbus/Client.c \
+ _gdbus/Client.h \
$(NULL)
_gdbus/%.c: _gdbus/%-stamp
diff --git a/telepathy-glib/base-client.c b/telepathy-glib/base-client.c
index 25c5e535d..01bf19f69 100644
--- a/telepathy-glib/base-client.c
+++ b/telepathy-glib/base-client.c
@@ -193,6 +193,8 @@
#include <telepathy-glib/util.h>
#include <telepathy-glib/value-array.h>
+#include <telepathy-glib/_gdbus/Client.h>
+
#define DEBUG_FLAG TP_DEBUG_CLIENT
#include "telepathy-glib/connection-internal.h"
#include "telepathy-glib/debug-internal.h"
@@ -207,7 +209,6 @@ static void requests_iface_init (gpointer, gpointer);
G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TpBaseClient, tp_base_client,
G_TYPE_DBUS_OBJECT_SKELETON,
- G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CLIENT, NULL);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CLIENT_OBSERVER, observer_iface_init);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CLIENT_APPROVER, approver_iface_init);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CLIENT_HANDLER, handler_iface_init);
@@ -271,6 +272,8 @@ struct _TpBaseClientPrivate
TpBaseClientDelegatedChannelsCb delegated_channels_cb;
gpointer delegated_channels_data;
GDestroyNotify delegated_channels_destroy;
+
+ _TpGDBusClient *client_skeleton;
};
/*
@@ -471,6 +474,7 @@ tp_base_client_set_observer_recover (TpBaseClient *self,
self->priv->flags |= CLIENT_IS_OBSERVER;
self->priv->flags &= ~CLIENT_OBSERVER_RECOVER;
}
+
}
/**
@@ -916,6 +920,26 @@ clients_quark (void)
return q;
}
+static void
+update_interfaces (TpBaseClient *self)
+{
+ GPtrArray *arr = g_ptr_array_new ();
+
+ if (self->priv->flags & CLIENT_IS_OBSERVER)
+ g_ptr_array_add (arr, TP_IFACE_CLIENT_OBSERVER);
+ if (self->priv->flags & CLIENT_IS_APPROVER)
+ g_ptr_array_add (arr, TP_IFACE_CLIENT_APPROVER);
+ if (self->priv->flags & CLIENT_IS_HANDLER)
+ g_ptr_array_add (arr, TP_IFACE_CLIENT_HANDLER);
+ if (self->priv->flags & CLIENT_HANDLER_WANTS_REQUESTS)
+ g_ptr_array_add (arr, TP_IFACE_CLIENT_INTERFACE_REQUESTS);
+
+ g_ptr_array_add (arr, NULL);
+ _tp_gdbus_client_set_interfaces (self->priv->client_skeleton,
+ (const gchar * const *) arr->pdata);
+ g_ptr_array_unref (arr);
+}
+
/**
* tp_base_client_register:
* @self: a #TpBaseClient, which must not have been registered with
@@ -946,6 +970,8 @@ tp_base_client_register (TpBaseClient *self,
DEBUG ("request name %s", self->priv->bus_name);
+ update_interfaces (self);
+
if (!tp_dbus_connection_try_register_object (self->priv->dbus,
self->priv->object_path, G_OBJECT (self), error))
{
@@ -1067,6 +1093,8 @@ tp_base_client_init (TpBaseClient *self)
self->priv->my_chans = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, g_object_unref);
+
+ self->priv->client_skeleton = _tp_gdbus_client_skeleton_new ();
}
static void
@@ -1099,6 +1127,8 @@ tp_base_client_dispose (GObject *object)
self->priv->delegated_channels_destroy = NULL;
}
+ g_clear_object (&self->priv->client_skeleton);
+
if (dispose != NULL)
dispose (object);
}
@@ -1220,7 +1250,9 @@ tp_base_client_constructed (GObject *object)
if (chain_up != NULL)
chain_up (object);
- object_skeleton_take_svc_interface (skel, TP_TYPE_SVC_CLIENT);
+ g_dbus_object_skeleton_add_interface (skel,
+ G_DBUS_INTERFACE_SKELETON (self->priv->client_skeleton));
+
object_skeleton_take_svc_interface (skel, TP_TYPE_SVC_CLIENT_OBSERVER);
object_skeleton_take_svc_interface (skel, TP_TYPE_SVC_CLIENT_APPROVER);
object_skeleton_take_svc_interface (skel, TP_TYPE_SVC_CLIENT_HANDLER);
@@ -1263,7 +1295,6 @@ tp_base_client_constructed (GObject *object)
}
typedef enum {
- DP_INTERFACES,
DP_APPROVER_CHANNEL_FILTER,
DP_HANDLER_CHANNEL_FILTER,
DP_BYPASS_APPROVAL,
@@ -1286,28 +1317,6 @@ tp_base_client_get_dbus_properties (GObject *object,
switch (which)
{
- case DP_INTERFACES:
- {
- GPtrArray *arr = g_ptr_array_sized_new (5);
-
- if (self->priv->flags & CLIENT_IS_OBSERVER)
- g_ptr_array_add (arr, g_strdup (TP_IFACE_CLIENT_OBSERVER));
-
- if (self->priv->flags & CLIENT_IS_APPROVER)
- g_ptr_array_add (arr, g_strdup (TP_IFACE_CLIENT_APPROVER));
-
- if (self->priv->flags & CLIENT_IS_HANDLER)
- g_ptr_array_add (arr, g_strdup (TP_IFACE_CLIENT_HANDLER));
-
- if (self->priv->flags & CLIENT_HANDLER_WANTS_REQUESTS)
- g_ptr_array_add (arr, g_strdup (
- TP_IFACE_CLIENT_INTERFACE_REQUESTS));
-
- g_ptr_array_add (arr, NULL);
- g_value_take_boxed (value, g_ptr_array_free (arr, FALSE));
- }
- break;
-
case DP_OBSERVER_CHANNEL_FILTER:
g_value_set_boxed (value, self->priv->observer_filters);
break;
@@ -1364,10 +1373,6 @@ static void
tp_base_client_class_init (TpBaseClientClass *cls)
{
GParamSpec *param_spec;
- static TpDBusPropertiesMixinPropImpl client_properties[] = {
- { "Interfaces", GINT_TO_POINTER (DP_INTERFACES) },
- { NULL }
- };
static TpDBusPropertiesMixinPropImpl handler_properties[] = {
{ "HandlerChannelFilter",
GINT_TO_POINTER (DP_HANDLER_CHANNEL_FILTER) },
@@ -1514,9 +1519,6 @@ tp_base_client_class_init (TpBaseClientClass *cls)
TP_TYPE_CHANNEL_REQUEST, G_TYPE_STRING, G_TYPE_STRING);
tp_dbus_properties_mixin_implement_interface (object_class,
- TP_IFACE_QUARK_CLIENT, tp_base_client_get_dbus_properties,
- NULL, client_properties);
- tp_dbus_properties_mixin_implement_interface (object_class,
TP_IFACE_QUARK_CLIENT_OBSERVER, tp_base_client_get_dbus_properties,
NULL, observer_properties);
tp_dbus_properties_mixin_implement_interface (object_class,