telepathy-qt: dbus-tubes: Add basic logic for accepting and offering a tube , implementing the full interface. testAcceptTwice now passes.
Dario Freddi
drf at kemper.freedesktop.org
Tue Jul 3 15:08:43 PDT 2012
Module: telepathy-qt
Branch: master
Commit: fa5734340248052e918638a5a4f17c381eb3ed3f
URL: http://cgit.freedesktop.org/telepathy/telepathy-qt/commit/?id=fa5734340248052e918638a5a4f17c381eb3ed3f
Author: Dario Freddi <dario.freddi at collabora.com>
Date: Thu Nov 3 22:49:09 2011 +0100
dbus-tubes: Add basic logic for accepting and offering a tube, implementing the full interface. testAcceptTwice now passes.
---
tests/lib/glib/dbus-tube-chan.c | 118 +++++++++++++++++++++++++++++++++++++--
tests/lib/glib/dbus-tube-chan.h | 4 +
2 files changed, 117 insertions(+), 5 deletions(-)
diff --git a/tests/lib/glib/dbus-tube-chan.c b/tests/lib/glib/dbus-tube-chan.c
index 61c5442..e0cd80a 100644
--- a/tests/lib/glib/dbus-tube-chan.c
+++ b/tests/lib/glib/dbus-tube-chan.c
@@ -38,6 +38,8 @@ struct _TpTestsDBusTubeChannelPrivate {
GArray *supported_access_controls;
GHashTable *parameters;
+
+ gboolean close_on_accept;
};
static void
@@ -295,7 +297,21 @@ tp_tests_dbus_tube_channel_class_init (TpTestsDBusTubeChannelClass *klass)
sizeof (TpTestsDBusTubeChannelPrivate));
}
-#if 0
+static gboolean
+check_access_control (TpTestsDBusTubeChannel *self,
+ TpSocketAccessControl access_control)
+{
+ guint i;
+
+ for (i = 0; i < self->priv->supported_access_controls->len; i++)
+ {
+ if (g_array_index (self->priv->supported_access_controls, TpSocketAccessControl, i) == access_control)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
change_state (TpTestsDBusTubeChannel *self,
TpTubeChannelState state)
@@ -304,19 +320,111 @@ change_state (TpTestsDBusTubeChannel *self,
tp_svc_channel_interface_tube_emit_tube_channel_state_changed (self, state);
}
-#endif
+
+static void
+dbus_tube_offer (TpSvcChannelTypeDBusTube *iface,
+ GHashTable *parameters,
+ guint access_control,
+ DBusGMethodInvocation *context)
+{
+ TpTestsDBusTubeChannel *self = (TpTestsDBusTubeChannel *) iface;
+ GError *error = NULL;
+
+ if (self->priv->state != TP_TUBE_CHANNEL_STATE_NOT_OFFERED)
+ {
+ g_set_error (&error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
+ "Tube is not in the not offered state");
+ goto fail;
+ }
+
+ if (!check_access_control (self, access_control))
+ {
+ g_set_error (&error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
+ "Address type not supported with this access control");
+ goto fail;
+ }
+
+// self->priv->address_type = address_type;
+// self->priv->address = tp_g_value_slice_dup (address);
+// self->priv->access_control = access_control;
+
+ g_object_set (self, "parameters", parameters, NULL);
+
+ change_state (self, TP_TUBE_CHANNEL_STATE_REMOTE_PENDING);
+
+ tp_svc_channel_type_stream_tube_return_from_offer (context);
+ return;
+
+fail:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
+}
+
+static void
+dbus_tube_accept (TpSvcChannelTypeDBusTube *iface,
+ guint access_control,
+ DBusGMethodInvocation *context)
+{
+ TpTestsDBusTubeChannel *self = (TpTestsDBusTubeChannel *) iface;
+ GError *error = NULL;
+ gchar *address = NULL;
+
+ if (self->priv->state != TP_TUBE_CHANNEL_STATE_LOCAL_PENDING)
+ {
+ g_set_error (&error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
+ "Tube is not in the local pending state");
+ goto fail;
+ }
+
+ if (!check_access_control (self, access_control))
+ {
+ g_set_error (&error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
+ "Address type not supported with this access control");
+ goto fail;
+ }
+
+ if (self->priv->close_on_accept)
+ {
+ tp_base_channel_close (TP_BASE_CHANNEL (self));
+ return;
+ }
+
+// address = create_local_socket (self, address_type, access_control, &error);
+//
+// self->priv->access_control = access_control;
+// self->priv->access_control_param = tp_g_value_slice_dup (
+// access_control_param);
+
+ change_state (self, TP_TUBE_CHANNEL_STATE_OPEN);
+
+ tp_svc_channel_type_dbus_tube_return_from_accept (context, address);
+
+ g_free (address);
+ return;
+
+fail:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
+}
static void
dbus_tube_iface_init (gpointer iface,
gpointer data)
{
-#if 0
- /* TODO: implement methods */
TpSvcChannelTypeDBusTubeClass *klass = iface;
#define IMPLEMENT(x) tp_svc_channel_type_dbus_tube_implement_##x (klass, dbus_tube_##x)
+ IMPLEMENT(offer);
+ IMPLEMENT(accept);
#undef IMPLEMENT
-#endif
+}
+
+void
+tp_tests_dbus_tube_channel_set_close_on_accept (
+ TpTestsDBusTubeChannel *self,
+ gboolean close_on_accept)
+{
+ self->priv->close_on_accept = close_on_accept;
}
/* Contact DBus Tube */
diff --git a/tests/lib/glib/dbus-tube-chan.h b/tests/lib/glib/dbus-tube-chan.h
index 479f1d1..e0c25e4 100644
--- a/tests/lib/glib/dbus-tube-chan.h
+++ b/tests/lib/glib/dbus-tube-chan.h
@@ -61,6 +61,10 @@ typedef struct _TpTestsContactDBusTubeChannelClass TpTestsContactDBusTubeChannel
GType tp_tests_contact_dbus_tube_channel_get_type (void);
+void tp_tests_dbus_tube_channel_set_close_on_accept (
+ TpTestsDBusTubeChannel *self,
+ gboolean close_on_accept);
+
#define TP_TESTS_TYPE_CONTACT_DBUS_TUBE_CHANNEL \
(tp_tests_contact_dbus_tube_channel_get_type ())
#define TP_TESTS_CONTACT_DBUS_TUBE_CHANNEL(obj) \
More information about the telepathy-commits
mailing list