diff options
-rw-r--r-- | examples/cm/contactlist/conn.c | 112 | ||||
-rw-r--r-- | examples/cm/contactlist/conn.h | 1 | ||||
-rw-r--r-- | telepathy-glib/connection-aliasing.c | 25 | ||||
-rw-r--r-- | telepathy-glib/contact.c | 13 | ||||
-rw-r--r-- | tests/lib/contacts-conn.c | 65 |
5 files changed, 108 insertions, 108 deletions
diff --git a/examples/cm/contactlist/conn.c b/examples/cm/contactlist/conn.c index b233b2526..caec16e7f 100644 --- a/examples/cm/contactlist/conn.c +++ b/examples/cm/contactlist/conn.c @@ -26,6 +26,8 @@ static void init_aliasing (gpointer, gpointer); G_DEFINE_TYPE_WITH_CODE (ExampleContactListConnection, example_contact_list_connection, TP_TYPE_BASE_CONNECTION, + G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, + tp_dbus_properties_mixin_iface_init); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_ALIASING, init_aliasing); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACTS, @@ -159,25 +161,15 @@ alias_updated_cb (ExampleContactList *contact_list, TpHandle contact, ExampleContactListConnection *self) { - GPtrArray *aliases; - GValueArray *pair; + GHashTable *aliases; - pair = g_value_array_new (2); - g_value_array_append (pair, NULL); - g_value_array_append (pair, NULL); - g_value_init (pair->values + 0, G_TYPE_UINT); - g_value_init (pair->values + 1, G_TYPE_STRING); - g_value_set_uint (pair->values + 0, contact); - g_value_set_string (pair->values + 1, - example_contact_list_get_alias (contact_list, contact)); - - aliases = g_ptr_array_sized_new (1); - g_ptr_array_add (aliases, pair); + aliases = g_hash_table_new (NULL, NULL); + g_hash_table_insert (aliases, GUINT_TO_POINTER (contact), + (gpointer) example_contact_list_get_alias (contact_list, contact)); tp_svc_connection_interface_aliasing_emit_aliases_changed (self, aliases); - g_ptr_array_unref (aliases); - g_value_array_free (pair); + g_hash_table_unref (aliases); } static void @@ -420,6 +412,29 @@ get_interfaces_always_present (TpBaseConnection *base) return interfaces; } +enum +{ + ALIASING_DP_ALIAS_FLAGS, +}; + +static void +aliasing_get_dbus_property (GObject *object, + GQuark interface, + GQuark name, + GValue *value, + gpointer user_data) +{ + switch (GPOINTER_TO_UINT (user_data)) + { + case ALIASING_DP_ALIAS_FLAGS: + g_value_set_uint (value, TP_CONNECTION_ALIAS_FLAG_USER_SET); + break; + + default: + g_assert_not_reached (); + } +} + static void example_contact_list_connection_class_init ( ExampleContactListConnectionClass *klass) @@ -427,6 +442,18 @@ example_contact_list_connection_class_init ( TpBaseConnectionClass *base_class = (TpBaseConnectionClass *) klass; GObjectClass *object_class = (GObjectClass *) klass; GParamSpec *param_spec; + static TpDBusPropertiesMixinPropImpl aliasing_props[] = { + { "AliasFlags", GUINT_TO_POINTER (ALIASING_DP_ALIAS_FLAGS), NULL }, + { NULL } + }; + static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { + { TP_IFACE_CONNECTION_INTERFACE_ALIASING, + aliasing_get_dbus_property, + NULL, + aliasing_props, + }, + { NULL } + }; object_class->get_property = get_property; object_class->set_property = set_property; @@ -464,57 +491,10 @@ example_contact_list_connection_class_init ( tp_presence_mixin_init_dbus_properties (object_class); tp_base_contact_list_mixin_class_init (base_class); -} - -static void -get_alias_flags (TpSvcConnectionInterfaceAliasing *aliasing, - DBusGMethodInvocation *context) -{ - TpBaseConnection *base = TP_BASE_CONNECTION (aliasing); - - TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED (base, context); - tp_svc_connection_interface_aliasing_return_from_get_alias_flags (context, - TP_CONNECTION_ALIAS_FLAG_USER_SET); -} - -static void -get_aliases (TpSvcConnectionInterfaceAliasing *aliasing, - const GArray *contacts, - DBusGMethodInvocation *context) -{ - ExampleContactListConnection *self = - EXAMPLE_CONTACT_LIST_CONNECTION (aliasing); - TpBaseConnection *base = TP_BASE_CONNECTION (aliasing); - TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (base, - TP_HANDLE_TYPE_CONTACT); - GHashTable *result; - GError *error = NULL; - guint i; - - TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED (base, context); - - if (!tp_handles_are_valid (contact_repo, contacts, FALSE, &error)) - { - dbus_g_method_return_error (context, error); - g_error_free (error); - return; - } - - result = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL); - - for (i = 0; i < contacts->len; i++) - { - TpHandle contact = g_array_index (contacts, TpHandle, i); - const gchar *alias = example_contact_list_get_alias ( - self->priv->contact_list, contact); - - g_hash_table_insert (result, GUINT_TO_POINTER (contact), - (gchar *) alias); - } - tp_svc_connection_interface_aliasing_return_from_get_aliases (context, - result); - g_hash_table_unref (result); + klass->properties_mixin.interfaces = prop_interfaces; + tp_dbus_properties_mixin_class_init (object_class, + G_STRUCT_OFFSET (ExampleContactListConnectionClass, properties_mixin)); } static void @@ -606,9 +586,7 @@ init_aliasing (gpointer iface, #define IMPLEMENT(x) tp_svc_connection_interface_aliasing_implement_##x (\ klass, x) - IMPLEMENT(get_alias_flags); IMPLEMENT(request_aliases); - IMPLEMENT(get_aliases); IMPLEMENT(set_aliases); #undef IMPLEMENT } diff --git a/examples/cm/contactlist/conn.h b/examples/cm/contactlist/conn.h index cb9b52cca..725eb507f 100644 --- a/examples/cm/contactlist/conn.h +++ b/examples/cm/contactlist/conn.h @@ -27,6 +27,7 @@ struct _ExampleContactListConnectionClass { TpBaseConnectionClass parent_class; TpPresenceMixinClass presence_mixin; TpContactsMixinClass contacts_mixin; + TpDBusPropertiesMixinClass properties_mixin; }; struct _ExampleContactListConnection { diff --git a/telepathy-glib/connection-aliasing.c b/telepathy-glib/connection-aliasing.c index f5e5f3b8e..c65b61671 100644 --- a/telepathy-glib/connection-aliasing.c +++ b/telepathy-glib/connection-aliasing.c @@ -23,6 +23,7 @@ #include "telepathy-glib/connection.h" #include <telepathy-glib/cli-connection.h> +#include <telepathy-glib/cli-misc.h> #include <telepathy-glib/dbus.h> #include <telepathy-glib/interfaces.h> @@ -73,22 +74,31 @@ tp_connection_can_set_contact_alias (TpConnection *self) } static void -get_alias_flag_cb (TpConnection *self, - TpConnectionAliasFlags flags, +get_all_cb (TpProxy *proxy, + GHashTable *properties, const GError *error, gpointer user_data, - GObject *weak_object) + GObject *object) { + TpConnection *self = (TpConnection *) proxy; GSimpleAsyncResult *result = user_data; + gboolean valid; if (error != NULL) { - DEBUG ("Failed to get AliasFlag : %s", error->message); + DEBUG ("Failed to get Aliasing properties: %s", error->message); g_simple_async_result_set_from_error (result, error); goto finally; } - self->priv->alias_flags = flags; + self->priv->alias_flags = tp_asv_get_uint32 (properties, "AliasFlags", + &valid); + if (!valid) + { + g_simple_async_result_set_error (result, + TP_ERROR, TP_ERROR_INVALID_ARGUMENT, + "Aliasing iface is missing AliasFlags property"); + } finally: g_simple_async_result_complete (result); @@ -108,6 +118,7 @@ _tp_connection_prepare_aliasing_async (TpProxy *proxy, result = g_simple_async_result_new ((GObject *) proxy, callback, user_data, _tp_connection_prepare_aliasing_async); - tp_cli_connection_interface_aliasing_call_get_alias_flags (self, -1, - get_alias_flag_cb, result, g_object_unref, G_OBJECT (self)); + tp_cli_dbus_properties_call_get_all (self, -1, + TP_IFACE_CONNECTION_INTERFACE_ALIASING, + get_all_cb, result, g_object_unref, G_OBJECT (self)); } diff --git a/telepathy-glib/contact.c b/telepathy-glib/contact.c index fcb548112..39cf2b0b3 100644 --- a/telepathy-glib/contact.c +++ b/telepathy-glib/contact.c @@ -1623,17 +1623,18 @@ tp_contact_init (TpContact *self) static void contacts_aliases_changed (TpConnection *connection, - const GPtrArray *alias_structs, + GHashTable *aliases, gpointer user_data G_GNUC_UNUSED, GObject *weak_object G_GNUC_UNUSED) { - guint i; + GHashTableIter iter; + gpointer key, value; - for (i = 0; i < alias_structs->len; i++) + g_hash_table_iter_init (&iter, aliases); + while (g_hash_table_iter_next (&iter, &key, &value)) { - GValueArray *pair = g_ptr_array_index (alias_structs, i); - TpHandle handle = g_value_get_uint (pair->values + 0); - const gchar *alias = g_value_get_string (pair->values + 1); + TpHandle handle = GPOINTER_TO_UINT (key); + const gchar *alias = value; TpContact *contact = _tp_connection_lookup_contact (connection, handle); if (contact != NULL) diff --git a/tests/lib/contacts-conn.c b/tests/lib/contacts-conn.c index 87a1bdc09..10b5c52cb 100644 --- a/tests/lib/contacts-conn.c +++ b/tests/lib/contacts-conn.c @@ -532,6 +532,29 @@ tp_tests_contacts_get_interfaces_always_present (TpBaseConnection *base) return interfaces; } +enum +{ + ALIASING_DP_ALIAS_FLAGS, +}; + +static void +aliasing_get_dbus_property (GObject *object, + GQuark interface, + GQuark name, + GValue *value, + gpointer user_data) +{ + switch (GPOINTER_TO_UINT (user_data)) + { + case ALIASING_DP_ALIAS_FLAGS: + g_value_set_uint (value, TP_CONNECTION_ALIAS_FLAG_USER_SET); + break; + + default: + g_assert_not_reached (); + } +} + static void tp_tests_contacts_connection_class_init (TpTestsContactsConnectionClass *klass) { @@ -539,12 +562,21 @@ tp_tests_contacts_connection_class_init (TpTestsContactsConnectionClass *klass) (TpBaseConnectionClass *) klass; GObjectClass *object_class = (GObjectClass *) klass; TpPresenceMixinClass *mixin_class; + static TpDBusPropertiesMixinPropImpl aliasing_props[] = { + { "AliasFlags", GUINT_TO_POINTER (ALIASING_DP_ALIAS_FLAGS), NULL }, + { NULL } + }; static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = { { TP_IFACE_CONNECTION_INTERFACE_CONTACT_INFO, conn_contact_info_properties_getter, NULL, conn_contact_info_properties, }, + { TP_IFACE_CONNECTION_INTERFACE_ALIASING, + aliasing_get_dbus_property, + NULL, + aliasing_props, + }, { NULL } }; @@ -606,34 +638,23 @@ tp_tests_contacts_connection_change_aliases (TpTestsContactsConnection *self, const TpHandle *handles, const gchar * const *aliases) { - GPtrArray *structs = g_ptr_array_sized_new (n); + GHashTable *changes = g_hash_table_new (NULL, NULL); guint i; for (i = 0; i < n; i++) { - GValueArray *pair = g_value_array_new (2); - DEBUG ("contact#%u -> %s", handles[i], aliases[i]); g_hash_table_insert (self->priv->aliases, GUINT_TO_POINTER (handles[i]), g_strdup (aliases[i])); - g_value_array_append (pair, NULL); - g_value_init (pair->values + 0, G_TYPE_UINT); - g_value_set_uint (pair->values + 0, handles[i]); - - g_value_array_append (pair, NULL); - g_value_init (pair->values + 1, G_TYPE_STRING); - g_value_set_string (pair->values + 1, aliases[i]); - - g_ptr_array_add (structs, pair); + g_hash_table_insert (changes, + GUINT_TO_POINTER (handles[i]), (gchar *) aliases[i]); } - tp_svc_connection_interface_aliasing_emit_aliases_changed (self, - structs); + tp_svc_connection_interface_aliasing_emit_aliases_changed (self, changes); - g_ptr_array_foreach (structs, (GFunc) g_value_array_free, NULL); - g_ptr_array_unref (structs); + g_hash_table_unref (changes); } void @@ -762,17 +783,6 @@ tp_tests_contacts_connection_set_default_contact_info ( } static void -my_get_alias_flags (TpSvcConnectionInterfaceAliasing *aliasing, - DBusGMethodInvocation *context) -{ - TpBaseConnection *base = TP_BASE_CONNECTION (aliasing); - - TP_BASE_CONNECTION_ERROR_IF_NOT_CONNECTED (base, context); - tp_svc_connection_interface_aliasing_return_from_get_alias_flags (context, - TP_CONNECTION_ALIAS_FLAG_USER_SET); -} - -static void my_request_aliases (TpSvcConnectionInterfaceAliasing *aliasing, const GArray *contacts, DBusGMethodInvocation *context) @@ -876,7 +886,6 @@ init_aliasing (gpointer g_iface, #define IMPLEMENT(x) tp_svc_connection_interface_aliasing_implement_##x (\ klass, my_##x) - IMPLEMENT(get_alias_flags); IMPLEMENT(request_aliases); IMPLEMENT(set_aliases); #undef IMPLEMENT |