/* * simple-account-manager.c - a simple account manager service. * * Copyright (C) 2007-2012 Collabora Ltd. * Copyright (C) 2007-2008 Nokia Corporation * * 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 "config.h" #include "simple-account-manager.h" #include #include static void account_manager_iface_init (gpointer, gpointer); G_DEFINE_TYPE_WITH_CODE (TpTestsSimpleAccountManager, tp_tests_simple_account_manager, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_ACCOUNT_MANAGER, account_manager_iface_init); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, tp_dbus_properties_mixin_iface_init) ) /* TP_IFACE_ACCOUNT_MANAGER is implied */ static const char *ACCOUNT_MANAGER_INTERFACES[] = { NULL }; enum { PROP_0, PROP_INTERFACES, PROP_VALID_ACCOUNTS, PROP_INVALID_ACCOUNTS, }; struct _TpTestsSimpleAccountManagerPrivate { GPtrArray *valid_accounts; GPtrArray *invalid_accounts; }; static void tp_tests_simple_account_manager_create_account (TpSvcAccountManager *svc, const gchar *in_Connection_Manager, const gchar *in_Protocol, const gchar *in_Display_Name, GHashTable *in_Parameters, GHashTable *in_Properties, DBusGMethodInvocation *context) { TpTestsSimpleAccountManager *self = (TpTestsSimpleAccountManager *) svc; const gchar *out = TP_ACCOUNT_OBJECT_PATH_BASE "gabble/jabber/lospolloshermanos"; /* if we have fail=yes as a parameter, make the call fail */ if (!tp_strdiff (tp_asv_get_string (in_Parameters, "fail"), "yes")) { GError e = { TP_ERROR, TP_ERROR_INVALID_ARGUMENT, "loldongs" }; dbus_g_method_return_error (context, &e); return; } self->create_cm = g_strdup (in_Connection_Manager); self->create_protocol = g_strdup (in_Protocol); self->create_display_name = g_strdup (in_Display_Name); self->create_parameters = g_hash_table_ref (in_Parameters); self->create_properties = g_hash_table_ref (in_Properties); tp_svc_account_manager_return_from_create_account (context, out); } static void account_manager_iface_init (gpointer klass, gpointer unused G_GNUC_UNUSED) { #define IMPLEMENT(x) tp_svc_account_manager_implement_##x (\ klass, tp_tests_simple_account_manager_##x) IMPLEMENT (create_account); #undef IMPLEMENT } static void tp_tests_simple_account_manager_init (TpTestsSimpleAccountManager *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, TP_TESTS_TYPE_SIMPLE_ACCOUNT_MANAGER, TpTestsSimpleAccountManagerPrivate); self->priv->valid_accounts = g_ptr_array_new_with_free_func (g_free); self->priv->invalid_accounts = g_ptr_array_new_with_free_func (g_free); } static void tp_tests_simple_account_manager_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *spec) { TpTestsSimpleAccountManager *self = SIMPLE_ACCOUNT_MANAGER (object); switch (property_id) { case PROP_INTERFACES: g_value_set_boxed (value, ACCOUNT_MANAGER_INTERFACES); break; case PROP_VALID_ACCOUNTS: g_value_set_boxed (value, self->priv->valid_accounts); break; case PROP_INVALID_ACCOUNTS: g_value_set_boxed (value, self->priv->invalid_accounts); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, spec); break; } } static void tp_tests_simple_account_manager_finalize (GObject *object) { TpTestsSimpleAccountManager *self = SIMPLE_ACCOUNT_MANAGER (object); g_ptr_array_unref (self->priv->valid_accounts); g_ptr_array_unref (self->priv->invalid_accounts); tp_clear_pointer (&self->create_cm, g_free); tp_clear_pointer (&self->create_protocol, g_free); tp_clear_pointer (&self->create_display_name, g_free); tp_clear_pointer (&self->create_parameters, g_hash_table_unref); tp_clear_pointer (&self->create_properties, g_hash_table_unref); G_OBJECT_CLASS (tp_tests_simple_account_manager_parent_class)->finalize ( object); } /** * This class currently only provides the minimum for * tp_account_manager_prepare to succeed. This turns out to be only a working * Properties.GetAll(). If we wanted later to check the case where * tp_account_prepare succeeds, we would need to implement an account object * too. */ static void tp_tests_simple_account_manager_class_init ( TpTestsSimpleAccountManagerClass *klass) { GObjectClass *object_class = (GObjectClass *) klass; GParamSpec *param_spec; static TpDBusPropertiesMixinPropImpl am_props[] = { { "Interfaces", "interfaces", NULL }, { "ValidAccounts", "valid-accounts", NULL }, { "InvalidAccounts", "invalid-accounts", NULL }, /* { "SupportedAccountProperties", "supported-account-properties", NULL }, */ { NULL } }; static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { { TP_IFACE_ACCOUNT_MANAGER, tp_dbus_properties_mixin_getter_gobject_properties, NULL, am_props }, { NULL }, }; g_type_class_add_private (klass, sizeof (TpTestsSimpleAccountManagerPrivate)); object_class->finalize = tp_tests_simple_account_manager_finalize; object_class->get_property = tp_tests_simple_account_manager_get_property; param_spec = g_param_spec_boxed ("interfaces", "Extra D-Bus interfaces", "In this case we only implement AccountManager, 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 ("valid-accounts", "Valid accounts", "The accounts which are valid on this account. This may be a lie.", TP_ARRAY_TYPE_OBJECT_PATH_LIST, G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_VALID_ACCOUNTS, param_spec); param_spec = g_param_spec_boxed ("invalid-accounts", "Invalid accounts", "The accounts which are invalid on this account. This may be a lie.", TP_ARRAY_TYPE_OBJECT_PATH_LIST, G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_INVALID_ACCOUNTS, param_spec); klass->dbus_props_class.interfaces = prop_interfaces; tp_dbus_properties_mixin_class_init (object_class, G_STRUCT_OFFSET (TpTestsSimpleAccountManagerClass, dbus_props_class)); } static void remove_from_array (GPtrArray *array, const gchar *str) { guint i; for (i = 0; i < array->len; i++) if (!tp_strdiff (str, g_ptr_array_index (array, i))) { g_ptr_array_remove_index_fast (array, i); return; } } void tp_tests_simple_account_manager_add_account ( TpTestsSimpleAccountManager *self, const gchar *object_path, gboolean valid) { remove_from_array (self->priv->valid_accounts, object_path); remove_from_array (self->priv->valid_accounts, object_path); if (valid) g_ptr_array_add (self->priv->valid_accounts, g_strdup (object_path)); else g_ptr_array_add (self->priv->invalid_accounts, g_strdup (object_path)); tp_svc_account_manager_emit_account_validity_changed (self, object_path, valid); } void tp_tests_simple_account_manager_remove_account ( TpTestsSimpleAccountManager *self, const gchar *object_path) { remove_from_array (self->priv->valid_accounts, object_path); remove_from_array (self->priv->valid_accounts, object_path); tp_svc_account_manager_emit_account_removed (self, object_path); }