diff options
Diffstat (limited to 'tests/lib/simple-account.c')
-rw-r--r-- | tests/lib/simple-account.c | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/tests/lib/simple-account.c b/tests/lib/simple-account.c new file mode 100644 index 0000000..8b25af2 --- /dev/null +++ b/tests/lib/simple-account.c @@ -0,0 +1,416 @@ +/* + * simple-account.c - a simple account service. + * + * Copyright (C) 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-account.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-account.h> + +static void account_iface_init (gpointer, gpointer); + +G_DEFINE_TYPE_WITH_CODE (TpTestsSimpleAccount, + tp_tests_simple_account, + G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_ACCOUNT, + account_iface_init); + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_ACCOUNT_INTERFACE_STORAGE, + NULL); + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, + tp_dbus_properties_mixin_iface_init) + ) + +/* TP_IFACE_ACCOUNT is implied */ +static const char *ACCOUNT_INTERFACES[] = { + TP_IFACE_ACCOUNT_INTERFACE_STORAGE, + NULL }; + +enum +{ + PROP_0, + PROP_INTERFACES, + PROP_DISPLAY_NAME, + PROP_ICON, + PROP_VALID, + PROP_ENABLED, + PROP_NICKNAME, + PROP_PARAMETERS, + PROP_AUTOMATIC_PRESENCE, + PROP_CONNECT_AUTO, + PROP_CONNECTION, + PROP_CONNECTION_STATUS, + PROP_CONNECTION_STATUS_REASON, + PROP_CURRENT_PRESENCE, + PROP_REQUESTED_PRESENCE, + PROP_NORMALIZED_NAME, + PROP_HAS_BEEN_ONLINE, + PROP_STORAGE_PROVIDER, + PROP_STORAGE_IDENTIFIER, + PROP_STORAGE_SPECIFIC_INFORMATION, + PROP_STORAGE_RESTRICTIONS +}; + +struct _TpTestsSimpleAccountPrivate +{ + gpointer unused; + GHashTable *parameters; +}; + +static void +account_iface_init (gpointer klass, + gpointer unused G_GNUC_UNUSED) +{ +#define IMPLEMENT(x) tp_svc_account_implement_##x (\ + klass, tp_tests_simple_account_##x) + /* TODO */ +#undef IMPLEMENT +} + + +static void +tp_tests_simple_account_init (TpTestsSimpleAccount *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, TP_TESTS_TYPE_SIMPLE_ACCOUNT, + TpTestsSimpleAccountPrivate); + self->priv->parameters = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, (GDestroyNotify) tp_g_value_slice_free); +} + +static gpointer +_parameters_hash_copy_key (gpointer boxed) +{ + return g_strdup (boxed); +} + +static gpointer +_parameters_hash_copy_value (gpointer boxed) +{ + GValue *ret = tp_g_value_slice_new (G_TYPE_STRING); + + g_value_copy (boxed, ret); + return ret; +} + + +static void +tp_tests_simple_account_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + TpTestsSimpleAccount *self = TP_TESTS_SIMPLE_ACCOUNT (object); + + switch (param_id) { + case PROP_PARAMETERS: + tp_g_hash_table_update (self->priv->parameters, + g_value_get_boxed (value), _parameters_hash_copy_key, + _parameters_hash_copy_value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + + +static void +tp_tests_simple_account_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *spec) +{ + TpTestsSimpleAccount *self = TP_TESTS_SIMPLE_ACCOUNT (object); + GValueArray *presence; + GValue identifier = { 0, }; + + presence = tp_value_array_build (3, + G_TYPE_UINT, TP_CONNECTION_PRESENCE_TYPE_AVAILABLE, + G_TYPE_STRING, "available", + G_TYPE_STRING, "", + G_TYPE_INVALID); + + g_value_init (&identifier, G_TYPE_STRING); + g_value_set_string (&identifier, "unique-identifier"); + + switch (property_id) { + case PROP_INTERFACES: + g_value_set_boxed (value, ACCOUNT_INTERFACES); + break; + case PROP_DISPLAY_NAME: + g_value_set_string (value, "Fake Account"); + break; + case PROP_ICON: + g_value_set_string (value, ""); + break; + case PROP_VALID: + g_value_set_boolean (value, TRUE); + break; + case PROP_ENABLED: + g_value_set_boolean (value, TRUE); + break; + case PROP_NICKNAME: + g_value_set_string (value, "badger"); + break; + case PROP_PARAMETERS: + g_value_set_boxed (value, self->priv->parameters); + break; + case PROP_AUTOMATIC_PRESENCE: + g_value_set_boxed (value, presence); + break; + case PROP_CONNECT_AUTO: + g_value_set_boolean (value, FALSE); + break; + case PROP_CONNECTION: + g_value_set_boxed (value, "/"); + break; + case PROP_CONNECTION_STATUS: + g_value_set_uint (value, TP_CONNECTION_STATUS_CONNECTED); + break; + case PROP_CONNECTION_STATUS_REASON: + g_value_set_uint (value, TP_CONNECTION_STATUS_REASON_REQUESTED); + break; + case PROP_CURRENT_PRESENCE: + g_value_set_boxed (value, presence); + break; + case PROP_REQUESTED_PRESENCE: + g_value_set_boxed (value, presence); + break; + case PROP_NORMALIZED_NAME: + g_value_set_string (value, ""); + break; + case PROP_HAS_BEEN_ONLINE: + g_value_set_boolean (value, TRUE); + break; + case PROP_STORAGE_PROVIDER: + g_value_set_string (value, "org.freedesktop.Telepathy.glib.test"); + break; + case PROP_STORAGE_IDENTIFIER: + g_value_set_boxed (value, &identifier); + break; + case PROP_STORAGE_SPECIFIC_INFORMATION: + g_value_take_boxed (value, tp_asv_new ( + "one", G_TYPE_INT, 1, + "two", G_TYPE_UINT, 2, + "marco", G_TYPE_STRING, "polo", + NULL)); + break; + case PROP_STORAGE_RESTRICTIONS: + g_value_set_uint (value, + TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED | + TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, spec); + break; + } + + g_boxed_free (TP_STRUCT_TYPE_SIMPLE_PRESENCE, presence); + g_value_unset (&identifier); +} + +/** + * This class currently only provides the minimum for + * tp_account_prepare to succeed. This turns out to be only a working + * Properties.GetAll(). + */ +static void +tp_tests_simple_account_class_init (TpTestsSimpleAccountClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GParamSpec *param_spec; + + static TpDBusPropertiesMixinPropImpl a_props[] = { + { "Interfaces", "interfaces", NULL }, + { "DisplayName", "display-name", NULL }, + { "Icon", "icon", NULL }, + { "Valid", "valid", NULL }, + { "Enabled", "enabled", NULL }, + { "Nickname", "nickname", NULL }, + { "Parameters", "parameters", NULL }, + { "AutomaticPresence", "automatic-presence", NULL }, + { "ConnectAutomatically", "connect-automatically", NULL }, + { "Connection", "connection", NULL }, + { "ConnectionStatus", "connection-status", NULL }, + { "ConnectionStatusReason", "connection-status-reason", NULL }, + { "CurrentPresence", "current-presence", NULL }, + { "RequestedPresence", "requested-presence", NULL }, + { "NormalizedName", "normalized-name", NULL }, + { "HasBeenOnline", "has-been-online", NULL }, + { NULL } + }; + + static TpDBusPropertiesMixinPropImpl ais_props[] = { + { "StorageProvider", "storage-provider", NULL }, + { "StorageIdentifier", "storage-identifier", NULL }, + { "StorageSpecificInformation", "storage-specific-information", NULL }, + { "StorageRestrictions", "storage-restrictions", NULL }, + { NULL }, + }; + + static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { + { TP_IFACE_ACCOUNT, + tp_dbus_properties_mixin_getter_gobject_properties, + NULL, + a_props + }, + { + TP_IFACE_ACCOUNT_INTERFACE_STORAGE, + tp_dbus_properties_mixin_getter_gobject_properties, + NULL, + ais_props + }, + { NULL }, + }; + + g_type_class_add_private (klass, sizeof (TpTestsSimpleAccountPrivate)); + object_class->get_property = tp_tests_simple_account_get_property; + object_class->set_property = tp_tests_simple_account_set_property; + + param_spec = g_param_spec_boxed ("interfaces", "Extra D-Bus interfaces", + "In this case we only implement Account, 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_string ("display-name", "display name", + "DisplayName property", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_DISPLAY_NAME, param_spec); + + param_spec = g_param_spec_string ("icon", "icon", + "Icon property", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_ICON, param_spec); + + param_spec = g_param_spec_boolean ("valid", "valid", + "Valid property", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_VALID, param_spec); + + param_spec = g_param_spec_boolean ("enabled", "enabled", + "Enabled property", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_ENABLED, param_spec); + + param_spec = g_param_spec_string ("nickname", "nickname", + "Nickname property", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_NICKNAME, param_spec); + + param_spec = g_param_spec_boxed ("parameters", "parameters", + "Parameters property", + TP_HASH_TYPE_STRING_VARIANT_MAP, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_PARAMETERS, param_spec); + + param_spec = g_param_spec_boxed ("automatic-presence", "automatic presence", + "AutomaticPresence property", + TP_STRUCT_TYPE_SIMPLE_PRESENCE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_AUTOMATIC_PRESENCE, + param_spec); + + param_spec = g_param_spec_boolean ("connect-automatically", + "connect automatically", "ConnectAutomatically property", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CONNECT_AUTO, param_spec); + + param_spec = g_param_spec_boxed ("connection", "connection", + "Connection property", + 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_uint ("connection-status", "connection status", + "ConnectionStatus property", + 0, NUM_TP_CONNECTION_STATUSES, TP_CONNECTION_STATUS_DISCONNECTED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CONNECTION_STATUS, + param_spec); + + param_spec = g_param_spec_uint ("connection-status-reason", + "connection status reason", "ConnectionStatusReason property", + 0, NUM_TP_CONNECTION_STATUS_REASONS, + TP_CONNECTION_STATUS_REASON_NONE_SPECIFIED, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CONNECTION_STATUS_REASON, + param_spec); + + param_spec = g_param_spec_boxed ("current-presence", "current presence", + "CurrentPresence property", + TP_STRUCT_TYPE_SIMPLE_PRESENCE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CURRENT_PRESENCE, + param_spec); + + param_spec = g_param_spec_boxed ("requested-presence", "requested presence", + "RequestedPresence property", + TP_STRUCT_TYPE_SIMPLE_PRESENCE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_REQUESTED_PRESENCE, + param_spec); + + param_spec = g_param_spec_string ("normalized-name", "normalized name", + "NormalizedName property", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_NORMALIZED_NAME, + param_spec); + + param_spec = g_param_spec_boolean ("has-been-online", "has been online", + "HasBeenOnline property", + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_HAS_BEEN_ONLINE, + param_spec); + + param_spec = g_param_spec_string ("storage-provider", "storage provider", + "StorageProvider property", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_STORAGE_PROVIDER, + param_spec); + + param_spec = g_param_spec_boxed ("storage-identifier", "storage identifier", + "StorageIdentifier property", + G_TYPE_VALUE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_STORAGE_IDENTIFIER, + param_spec); + + param_spec = g_param_spec_boxed ("storage-specific-information", + "storage specific information", "StorageSpecificInformation property", + TP_HASH_TYPE_STRING_VARIANT_MAP, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, + PROP_STORAGE_SPECIFIC_INFORMATION, param_spec); + + param_spec = g_param_spec_uint ("storage-restrictions", + "storage restrictions", "StorageRestrictions property", + 0, G_MAXUINT, 0, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_STORAGE_RESTRICTIONS, + param_spec); + + klass->dbus_props_class.interfaces = prop_interfaces; + tp_dbus_properties_mixin_class_init (object_class, + G_STRUCT_OFFSET (TpTestsSimpleAccountClass, dbus_props_class)); +} |