diff options
-rw-r--r-- | telepathy-glib/Makefile.am | 2 | ||||
-rw-r--r-- | telepathy-glib/base-connection.c | 154 | ||||
-rw-r--r-- | telepathy-glib/channel-manager-request-internal.h | 3 | ||||
-rw-r--r-- | telepathy-glib/channel-manager-request.c | 13 |
4 files changed, 76 insertions, 96 deletions
diff --git a/telepathy-glib/Makefile.am b/telepathy-glib/Makefile.am index 578f7be38..d759a9410 100644 --- a/telepathy-glib/Makefile.am +++ b/telepathy-glib/Makefile.am @@ -350,6 +350,8 @@ libtelepathy_glib_main_internal_la_SOURCES = \ gdbus_codegen = \ _gdbus/Connection.c \ _gdbus/Connection.h \ + _gdbus/Connection_Interface_Requests.c \ + _gdbus/Connection_Interface_Requests.h \ $(NULL) _gdbus/%.c: _gdbus/%-stamp diff --git a/telepathy-glib/base-connection.c b/telepathy-glib/base-connection.c index 9a5b24431..bdcfdcd81 100644 --- a/telepathy-glib/base-connection.c +++ b/telepathy-glib/base-connection.c @@ -208,7 +208,6 @@ #include <telepathy-glib/channel-manager.h> #include <telepathy-glib/channel-manager-request-internal.h> #include <telepathy-glib/connection-manager.h> -#include <telepathy-glib/dbus-properties-mixin.h> #include <telepathy-glib/dbus.h> #include <telepathy-glib/dbus-internal.h> #include <telepathy-glib/exportable-channel.h> @@ -222,18 +221,14 @@ #include <telepathy-glib/value-array.h> #include <telepathy-glib/_gdbus/Connection.h> +#include <telepathy-glib/_gdbus/Connection_Interface_Requests.h> #define DEBUG_FLAG TP_DEBUG_CONNECTION #include "telepathy-glib/debug-internal.h" #include "telepathy-glib/variant-util-internal.h" -static void requests_iface_init (gpointer, gpointer); - -G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TpBaseConnection, - tp_base_connection, - G_TYPE_DBUS_OBJECT_SKELETON, - G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_REQUESTS, - requests_iface_init)) +G_DEFINE_ABSTRACT_TYPE (TpBaseConnection, tp_base_connection, + G_TYPE_DBUS_OBJECT_SKELETON) enum { @@ -272,7 +267,9 @@ static guint signals[N_SIGNALS] = {0}; } G_STMT_END static void update_rcc_property (TpBaseConnection *self); +static void update_channels_property (TpBaseConnection *self); static void conn_skeleton_init (TpBaseConnection *self); +static void requests_skeleton_init (TpBaseConnection *self); static void channel_request_cancel (gpointer data, @@ -328,6 +325,7 @@ struct _TpBaseConnectionPrivate gchar *account_path_suffix; _TpGDBusConnection *connection_skeleton; + _TpGDBusConnectionInterfaceRequests *requests_skeleton; }; typedef struct @@ -499,6 +497,7 @@ tp_base_connection_dispose (GObject *object) tp_clear_object (priv->handles + i); g_clear_object (&self->priv->connection_skeleton); + g_clear_object (&self->priv->requests_skeleton); if (G_OBJECT_CLASS (tp_base_connection_parent_class)->dispose) G_OBJECT_CLASS (tp_base_connection_parent_class)->dispose (object); @@ -644,7 +643,6 @@ manager_new_channel_cb (TpChannelManager *manager, { gchar *path; GVariant *variant; - GHashTable *props; g_assert (TP_IS_CHANNEL_MANAGER (manager)); g_assert (TP_IS_BASE_CONNECTION (self)); @@ -657,12 +655,11 @@ manager_new_channel_cb (TpChannelManager *manager, "channel-properties", &variant, NULL); - props = tp_asv_from_vardict (variant); - tp_svc_connection_interface_requests_emit_new_channel (self, - path, props); + update_channels_property (self); + _tp_gdbus_connection_interface_requests_emit_new_channel ( + self->priv->requests_skeleton, path, variant); g_free (path); - g_hash_table_unref (props); g_variant_unref (variant); } @@ -716,7 +713,9 @@ manager_channel_closed_cb (TpChannelManager *manager, g_assert (path != NULL); g_assert (TP_IS_BASE_CONNECTION (self)); - tp_svc_connection_interface_requests_emit_channel_closed (self, path); + update_channels_property (self); + _tp_gdbus_connection_interface_requests_emit_channel_closed ( + self->priv->requests_skeleton, path); } /* @@ -780,22 +779,6 @@ tp_base_connection_interface_changed_cb (TpBaseConnection *self, } } -static void -object_skeleton_take_interface (GDBusObjectSkeleton *skel, - GDBusInterfaceSkeleton *iface) -{ - g_dbus_object_skeleton_add_interface (skel, iface); - g_object_unref (iface); -} - -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 * tp_base_connection_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params) @@ -864,12 +847,15 @@ tp_base_connection_constructed (GObject *object) TP_CONNECTION_STATUS_DISCONNECTED); conn_skeleton_init (self); + self->priv->requests_skeleton = + _tp_gdbus_connection_interface_requests_skeleton_new (); + g_dbus_object_skeleton_add_interface (skel, + G_DBUS_INTERFACE_SKELETON (self->priv->requests_skeleton)); + requests_skeleton_init (self); + /* Set the initial RCC, it won't be definitive until status is CONNECTED */ update_rcc_property (self); - 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)); @@ -941,6 +927,20 @@ conn_requests_get_channel_details (TpBaseConnection *self) return details; } +static void +update_channels_property (TpBaseConnection *self) +{ + GPtrArray *channels; + GValue value = G_VALUE_INIT; + + channels = conn_requests_get_channel_details (self); + g_print ("update Channels to %d\n", channels->len); + g_value_init (&value, TP_ARRAY_TYPE_CHANNEL_DETAILS_LIST); + g_value_take_boxed (&value, channels); + _tp_gdbus_connection_interface_requests_set_channels ( + self->priv->requests_skeleton, dbus_g_value_build_g_variant (&value)); + g_value_unset (&value); +} static void get_requestables_foreach (TpChannelManager *manager, @@ -994,27 +994,6 @@ update_rcc_property (TpBaseConnection *self) g_value_unset (&value); } -static void -conn_requests_get_dbus_property (GObject *object, - GQuark interface, - GQuark name, - GValue *value, - gpointer unused G_GNUC_UNUSED) -{ - TpBaseConnection *self = TP_BASE_CONNECTION (object); - - g_return_if_fail (interface == TP_IFACE_QUARK_CONNECTION_INTERFACE_REQUESTS); - - if (name == g_quark_from_static_string ("Channels")) - { - g_value_take_boxed (value, conn_requests_get_channel_details (self)); - } - else - { - g_return_if_reached (); - } -} - /* this is not really gtk-doc - it's for gobject-introspection */ /** * TpBaseConnectionClass::fill_contact_attributes: @@ -1059,10 +1038,6 @@ _tp_base_connection_fill_contact_attributes (TpBaseConnection *self, static void tp_base_connection_class_init (TpBaseConnectionClass *klass) { - static TpDBusPropertiesMixinPropImpl requests_properties[] = { - { "Channels", NULL, NULL }, - { NULL } - }; GParamSpec *param_spec; GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -1258,12 +1233,6 @@ tp_base_connection_class_init (TpBaseConnectionClass *klass) 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); - - tp_dbus_properties_mixin_class_init (object_class, 0); - tp_dbus_properties_mixin_implement_interface (object_class, - TP_IFACE_QUARK_CONNECTION_INTERFACE_REQUESTS, - conn_requests_get_dbus_property, NULL, - requests_properties); } static void @@ -2294,17 +2263,20 @@ static void conn_requests_offer_request (TpBaseConnection *self, static void conn_requests_requestotron (TpBaseConnection *self, - GHashTable *requested_properties, + GVariant *requested_properties, TpChannelManagerRequestMethod method, GDBusMethodInvocation *context) { + GHashTable *asv; + TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED (self, context); /* Call the first function in the chain handling incoming requests; it will * call the next steps. */ - conn_requests_check_basic_properties (self, requested_properties, method, - context); + asv = tp_asv_from_vardict (requested_properties); + conn_requests_check_basic_properties (self, asv, method, context); + g_hash_table_unref (asv); } @@ -2535,7 +2507,8 @@ conn_requests_offer_request (TpBaseConnection *self, g_assert_not_reached (); } - request = _tp_channel_manager_request_new (context, method, + request = _tp_channel_manager_request_new (context, + self->priv->requests_skeleton, method, type, target_entity_type, target_handle); g_ptr_array_add (priv->channel_requests, request); @@ -2556,42 +2529,41 @@ conn_requests_offer_request (TpBaseConnection *self, } -static void -conn_requests_create_channel (TpSvcConnectionInterfaceRequests *svc, - GHashTable *requested_properties, - GDBusMethodInvocation *context) +static gboolean +conn_requests_create_channel (_TpGDBusConnectionInterfaceRequests *skeleton, + GDBusMethodInvocation *context, + GVariant *requested_properties, + TpBaseConnection *self) { - TpBaseConnection *self = TP_BASE_CONNECTION (svc); - conn_requests_requestotron (self, requested_properties, TP_CHANNEL_MANAGER_REQUEST_METHOD_CREATE_CHANNEL, context); + return TRUE; } -static void -conn_requests_ensure_channel (TpSvcConnectionInterfaceRequests *svc, - GHashTable *requested_properties, - GDBusMethodInvocation *context) +static gboolean +conn_requests_ensure_channel (_TpGDBusConnectionInterfaceRequests *skeleton, + GDBusMethodInvocation *context, + GVariant *requested_properties, + TpBaseConnection *self) { - TpBaseConnection *self = TP_BASE_CONNECTION (svc); - conn_requests_requestotron (self, requested_properties, TP_CHANNEL_MANAGER_REQUEST_METHOD_ENSURE_CHANNEL, context); + return TRUE; } static void -requests_iface_init (gpointer g_iface, - gpointer iface_data G_GNUC_UNUSED) -{ - TpSvcConnectionInterfaceRequestsClass *iface = g_iface; - -#define IMPLEMENT(x) \ - tp_svc_connection_interface_requests_implement_##x (\ - iface, conn_requests_##x) - IMPLEMENT (create_channel); - IMPLEMENT (ensure_channel); -#undef IMPLEMENT +requests_skeleton_init (TpBaseConnection *self) +{ + g_signal_connect_object (self->priv->requests_skeleton, + "handle-create-channel", + G_CALLBACK (conn_requests_create_channel), + self, 0); + g_signal_connect_object (self->priv->requests_skeleton, + "handle-ensure-channel", + G_CALLBACK (conn_requests_ensure_channel), + self, 0); } diff --git a/telepathy-glib/channel-manager-request-internal.h b/telepathy-glib/channel-manager-request-internal.h index 36154161a..d0c3dcfa6 100644 --- a/telepathy-glib/channel-manager-request-internal.h +++ b/telepathy-glib/channel-manager-request-internal.h @@ -24,6 +24,7 @@ #include <glib-object.h> +#include <telepathy-glib/_gdbus/Connection_Interface_Requests.h> #include <telepathy-glib/telepathy-glib.h> G_BEGIN_DECLS @@ -46,6 +47,7 @@ struct _TpChannelManagerRequest GObject parent; GDBusMethodInvocation *context; + _TpGDBusConnectionInterfaceRequests *skeleton; TpChannelManagerRequestMethod method; gchar *channel_type; @@ -85,6 +87,7 @@ GType tp_channel_manager_request_get_type (void); TpChannelManagerRequest * _tp_channel_manager_request_new ( GDBusMethodInvocation *context, + _TpGDBusConnectionInterfaceRequests *skeleton, TpChannelManagerRequestMethod method, const char *channel_type, TpEntityType entity_type, diff --git a/telepathy-glib/channel-manager-request.c b/telepathy-glib/channel-manager-request.c index 65b9ddcbd..9776b53d2 100644 --- a/telepathy-glib/channel-manager-request.c +++ b/telepathy-glib/channel-manager-request.c @@ -75,6 +75,7 @@ tp_channel_manager_request_finalize (GObject *object) self->handle); g_free (self->channel_type); + g_object_unref (self->skeleton); chain_up (object); } @@ -96,6 +97,7 @@ tp_channel_manager_request_init (TpChannelManagerRequest *self) TpChannelManagerRequest * _tp_channel_manager_request_new ( GDBusMethodInvocation *context, + _TpGDBusConnectionInterfaceRequests *skeleton, TpChannelManagerRequestMethod method, const char *channel_type, TpEntityType entity_type, @@ -111,6 +113,7 @@ _tp_channel_manager_request_new ( NULL); result->context = context; + result->skeleton = g_object_ref (skeleton); result->method = method; result->channel_type = g_strdup (channel_type); result->entity_type = entity_type; @@ -160,14 +163,14 @@ _tp_channel_manager_request_satisfy (TpChannelManagerRequest *self, switch (self->method) { case TP_CHANNEL_MANAGER_REQUEST_METHOD_CREATE_CHANNEL: - g_dbus_method_invocation_return_value (self->context, - g_variant_new ("(o@a{sv})", object_path, properties)); + _tp_gdbus_connection_interface_requests_complete_create_channel ( + self->skeleton, self->context, object_path, properties); break; case TP_CHANNEL_MANAGER_REQUEST_METHOD_ENSURE_CHANNEL: - g_dbus_method_invocation_return_value (self->context, - g_variant_new ("(bo@a{sv})", self->yours, object_path, - properties)); + _tp_gdbus_connection_interface_requests_complete_ensure_channel ( + self->skeleton, self->context, self->yours, object_path, + properties); break; default: |