diff options
Diffstat (limited to 'qt4/tests/lib/glib/simple-channel-dispatch-operation.c')
-rw-r--r-- | qt4/tests/lib/glib/simple-channel-dispatch-operation.c | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/qt4/tests/lib/glib/simple-channel-dispatch-operation.c b/qt4/tests/lib/glib/simple-channel-dispatch-operation.c new file mode 100644 index 000000000..c74ff773f --- /dev/null +++ b/qt4/tests/lib/glib/simple-channel-dispatch-operation.c @@ -0,0 +1,297 @@ +/* + * simple-channel-dispatch-operation.c - a simple channel dispatch operation + * service. + * + * Copyright © 2010 Collabora Ltd. <http://www.collabora.co.uk/> + * + * Copying and distribution of this file, with or without modification, + * are permitted in any medium without royalty provided the copyright + * notice and this notice are preserved. + */ + +#include "simple-channel-dispatch-operation.h" + +#include <telepathy-glib/channel.h> +#include <telepathy-glib/dbus.h> +#include <telepathy-glib/defs.h> +#include <telepathy-glib/enums.h> +#include <telepathy-glib/gtypes.h> +#include <telepathy-glib/interfaces.h> +#include <telepathy-glib/util.h> +#include <telepathy-glib/svc-generic.h> +#include <telepathy-glib/svc-channel-dispatch-operation.h> + +static void channel_dispatch_operation_iface_init (gpointer, gpointer); + +G_DEFINE_TYPE_WITH_CODE (TpTestsSimpleChannelDispatchOperation, + tp_tests_simple_channel_dispatch_operation, + G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_DISPATCH_OPERATION, + channel_dispatch_operation_iface_init); + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, + tp_dbus_properties_mixin_iface_init) + ) + +/* TP_IFACE_CHANNEL_DISPATCH_OPERATION is implied */ +static const char *CHANNEL_DISPATCH_OPERATION_INTERFACES[] = { NULL }; + +static const gchar *CHANNEL_DISPATCH_OPERATION_POSSIBLE_HANDLERS[] = { + TP_CLIENT_BUS_NAME_BASE ".Badger", NULL, }; + +enum +{ + PROP_0, + PROP_INTERFACES, + PROP_CONNECTION, + PROP_ACCOUNT, + PROP_CHANNELS, + PROP_POSSIBLE_HANDLERS, +}; + +struct _SimpleChannelDispatchOperationPrivate +{ + gchar *conn_path; + gchar *account_path; + /* Array of TpChannel */ + GPtrArray *channels; +}; + +static void +tp_tests_simple_channel_dispatch_operation_handle_with ( + TpSvcChannelDispatchOperation *iface, + const gchar *handler, + DBusGMethodInvocation *context) +{ + if (!tp_strdiff (handler, "FAIL")) + { + GError error = { TP_ERRORS, TP_ERROR_INVALID_ARGUMENT, "Nope" }; + + dbus_g_method_return_error (context, &error); + return; + } + + dbus_g_method_return (context); +} + +static void +tp_tests_simple_channel_dispatch_operation_claim ( + TpSvcChannelDispatchOperation *iface, + DBusGMethodInvocation *context) +{ + dbus_g_method_return (context); +} + +static void +tp_tests_simple_channel_dispatch_operation_handle_with_time ( + TpSvcChannelDispatchOperation *iface, + const gchar *handler, + gint64 user_action_timestamp, + DBusGMethodInvocation *context) +{ + dbus_g_method_return (context); +} + +static void +channel_dispatch_operation_iface_init (gpointer klass, + gpointer unused G_GNUC_UNUSED) +{ +#define IMPLEMENT(x) tp_svc_channel_dispatch_operation_implement_##x (\ + klass, tp_tests_simple_channel_dispatch_operation_##x) + IMPLEMENT(handle_with); + IMPLEMENT(claim); + IMPLEMENT(handle_with_time); +#undef IMPLEMENT +} + + +static void +tp_tests_simple_channel_dispatch_operation_init (TpTestsSimpleChannelDispatchOperation *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + TP_TESTS_TYPE_SIMPLE_CHANNEL_DISPATCH_OPERATION, + TpTestsSimpleChannelDispatchOperationPrivate); + + self->priv->channels = g_ptr_array_new_with_free_func ( + (GDestroyNotify) g_object_unref); +} + +static void +tp_tests_simple_channel_dispatch_operation_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *spec) +{ + TpTestsSimpleChannelDispatchOperation *self = + TP_TESTS_SIMPLE_CHANNEL_DISPATCH_OPERATION (object); + + switch (property_id) { + case PROP_INTERFACES: + g_value_set_boxed (value, CHANNEL_DISPATCH_OPERATION_INTERFACES); + break; + + case PROP_ACCOUNT: + g_value_set_boxed (value, self->priv->account_path); + break; + + case PROP_CONNECTION: + g_value_set_boxed (value, self->priv->conn_path); + break; + + case PROP_CHANNELS: + { + GPtrArray *arr = g_ptr_array_new (); + guint i; + + for (i = 0; i < self->priv->channels->len; i++) + { + TpChannel *channel = g_ptr_array_index (self->priv->channels, i); + + g_ptr_array_add (arr, + tp_value_array_build (2, + DBUS_TYPE_G_OBJECT_PATH, tp_proxy_get_object_path (channel), + TP_HASH_TYPE_STRING_VARIANT_MAP, + tp_channel_borrow_immutable_properties (channel), + G_TYPE_INVALID)); + } + + g_value_take_boxed (value, arr); + } + break; + + case PROP_POSSIBLE_HANDLERS: + g_value_set_boxed (value, CHANNEL_DISPATCH_OPERATION_POSSIBLE_HANDLERS); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, spec); + break; + } +} + +static void +tp_tests_simple_channel_dispatch_operation_finalize (GObject *object) +{ + TpTestsSimpleChannelDispatchOperation *self = + TP_TESTS_SIMPLE_CHANNEL_DISPATCH_OPERATION (object); + void (*finalize) (GObject *) = + G_OBJECT_CLASS (tp_tests_simple_channel_dispatch_operation_parent_class)->finalize; + + g_free (self->priv->conn_path); + g_free (self->priv->account_path); + g_ptr_array_free (self->priv->channels, TRUE); + + if (finalize != NULL) + finalize (object); +} + +/** + * This class currently only provides the minimum for + * tp_channel_dispatch_operation_prepare to succeed. This turns out to be only a working + * Properties.GetAll(). + */ +static void +tp_tests_simple_channel_dispatch_operation_class_init (TpTestsSimpleChannelDispatchOperationClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GParamSpec *param_spec; + + static TpDBusPropertiesMixinPropImpl a_props[] = { + { "Interfaces", "interfaces", NULL }, + { "Connection", "connection", NULL }, + { "Account", "account", NULL }, + { "Channels", "channels", NULL }, + { "PossibleHandlers", "possible-handlers", NULL }, + { NULL } + }; + + static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { + { TP_IFACE_CHANNEL_DISPATCH_OPERATION, + tp_dbus_properties_mixin_getter_gobject_properties, + NULL, + a_props + }, + { NULL }, + }; + + g_type_class_add_private (klass, sizeof (TpTestsSimpleChannelDispatchOperationPrivate)); + object_class->get_property = tp_tests_simple_channel_dispatch_operation_get_property; + object_class->finalize = tp_tests_simple_channel_dispatch_operation_finalize; + + param_spec = g_param_spec_boxed ("interfaces", "Extra D-Bus interfaces", + "In this case we only implement ChannelDispatchOperation, so none.", + G_TYPE_STRV, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_INTERFACES, param_spec); + + param_spec = g_param_spec_boxed ("connection", "connection path", + "Connection path", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + + param_spec = g_param_spec_boxed ("account", "account path", + "Account path", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_ACCOUNT, param_spec); + + param_spec = g_param_spec_boxed ("channels", "channel paths", + "Channel paths", + TP_ARRAY_TYPE_CHANNEL_DETAILS_LIST, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CHANNELS, param_spec); + + param_spec = g_param_spec_boxed ("possible-handlers", "possible handlers", + "possible handles", + G_TYPE_STRV, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_POSSIBLE_HANDLERS, + param_spec); + + klass->dbus_props_class.interfaces = prop_interfaces; + tp_dbus_properties_mixin_class_init (object_class, + G_STRUCT_OFFSET (TpTestsSimpleChannelDispatchOperationClass, dbus_props_class)); +} + +void +tp_tests_simple_channel_dispatch_operation_set_conn_path ( + TpTestsSimpleChannelDispatchOperation *self, + const gchar *conn_path) +{ + self->priv->conn_path = g_strdup (conn_path); +} + +void +tp_tests_simple_channel_dispatch_operation_add_channel ( + TpTestsSimpleChannelDispatchOperation *self, + TpChannel *chan) +{ + g_ptr_array_add (self->priv->channels, g_object_ref (chan)); +} + +void +tp_tests_simple_channel_dispatch_operation_lost_channel ( + TpTestsSimpleChannelDispatchOperation *self, + TpChannel *chan) +{ + const gchar *path = tp_proxy_get_object_path (chan); + + g_ptr_array_remove (self->priv->channels, chan); + + tp_svc_channel_dispatch_operation_emit_channel_lost (self, path, + TP_ERROR_STR_NOT_AVAILABLE, "Badger"); + + if (self->priv->channels->len == 0) + { + /* We removed the last channel; fire Finished */ + tp_svc_channel_dispatch_operation_emit_finished (self); + } +} + +void +tp_tests_simple_channel_dispatch_operation_set_account_path ( + TpTestsSimpleChannelDispatchOperation *self, + const gchar *account_path) +{ + self->priv->account_path = g_strdup (account_path); +} |