diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2014-04-08 10:05:27 -0400 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-04-17 14:22:29 +0100 |
commit | 54ec4fa6e6c5613cf914ceeb6e29228a52c7951e (patch) | |
tree | c6554a57112318de585d53e6d68a68d087004682 | |
parent | c443307f74a94d23d9f6f53a2df152eb39daa040 (diff) |
TpBaseContactList: Use gdbus-codegen's skeleton to implement ContactBlocking1
-rw-r--r-- | docs/reference/telepathy-glib/telepathy-glib-sections.txt | 2 | ||||
-rw-r--r-- | examples/cm/contactlist/conn.c | 9 | ||||
-rw-r--r-- | telepathy-glib/Makefile.am | 2 | ||||
-rw-r--r-- | telepathy-glib/base-contact-list.c | 235 | ||||
-rw-r--r-- | telepathy-glib/base-contact-list.h | 5 | ||||
-rw-r--r-- | telepathy-glib/handle-repo.h | 2 | ||||
-rw-r--r-- | telepathy-glib/handle-set.c | 23 | ||||
-rw-r--r-- | telepathy-glib/versions/main-1.0.abi | 2 | ||||
-rw-r--r-- | tests/lib/contacts-conn.c | 2 |
9 files changed, 105 insertions, 177 deletions
diff --git a/docs/reference/telepathy-glib/telepathy-glib-sections.txt b/docs/reference/telepathy-glib/telepathy-glib-sections.txt index c9e8664d9..4ff2d28ac 100644 --- a/docs/reference/telepathy-glib/telepathy-glib-sections.txt +++ b/docs/reference/telepathy-glib/telepathy-glib-sections.txt @@ -4933,8 +4933,6 @@ tp_svc_channel_type_server_tls_connection1_get_type <TITLE>base-contact-list</TITLE> TpBaseContactList TpBaseContactListClass -tp_base_contact_list_mixin_class_init -tp_base_contact_list_mixin_blocking_iface_init tp_base_contact_list_get_state tp_base_contact_list_get_connection tp_base_contact_list_set_list_pending diff --git a/examples/cm/contactlist/conn.c b/examples/cm/contactlist/conn.c index 4139600e0..52e058715 100644 --- a/examples/cm/contactlist/conn.c +++ b/examples/cm/contactlist/conn.c @@ -28,8 +28,6 @@ G_DEFINE_TYPE_WITH_CODE (ExampleContactListConnection, TP_TYPE_BASE_CONNECTION, G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_ALIASING1, init_aliasing); - G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_BLOCKING1, - tp_base_contact_list_mixin_blocking_iface_init); G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CONNECTION_INTERFACE_PRESENCE1, tp_presence_mixin_iface_init)) @@ -287,11 +285,6 @@ constructed (GObject *object) g_object_unref (iface); iface = tp_svc_interface_skeleton_new (skel, - TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_BLOCKING1); - g_dbus_object_skeleton_add_interface (skel, iface); - g_object_unref (iface); - - iface = tp_svc_interface_skeleton_new (skel, TP_TYPE_SVC_CONNECTION_INTERFACE_PRESENCE1); g_dbus_object_skeleton_add_interface (skel, iface); g_object_unref (iface); @@ -458,8 +451,6 @@ example_contact_list_connection_class_init ( example_contact_list_presence_statuses ()); tp_presence_mixin_init_dbus_properties (object_class); - tp_base_contact_list_mixin_class_init (base_class); - klass->properties_mixin.interfaces = prop_interfaces; tp_dbus_properties_mixin_class_init (object_class, G_STRUCT_OFFSET (ExampleContactListConnectionClass, properties_mixin)); diff --git a/telepathy-glib/Makefile.am b/telepathy-glib/Makefile.am index 96183ec59..5cb146c51 100644 --- a/telepathy-glib/Makefile.am +++ b/telepathy-glib/Makefile.am @@ -350,6 +350,8 @@ libtelepathy_glib_main_internal_la_SOURCES = \ gdbus_codegen = \ _gdbus/Connection.c \ _gdbus/Connection.h \ + _gdbus/Connection_Interface_Contact_Blocking1.c \ + _gdbus/Connection_Interface_Contact_Blocking1.h \ _gdbus/Connection_Interface_Contact_Groups1.c \ _gdbus/Connection_Interface_Contact_Groups1.h \ _gdbus/Connection_Interface_Contact_List1.c \ diff --git a/telepathy-glib/base-contact-list.c b/telepathy-glib/base-contact-list.c index b843d0cdf..6fca75d94 100644 --- a/telepathy-glib/base-contact-list.c +++ b/telepathy-glib/base-contact-list.c @@ -25,10 +25,10 @@ #include <telepathy-glib/_gdbus/Connection_Interface_Contact_List1.h> #include <telepathy-glib/_gdbus/Connection_Interface_Contact_Groups1.h> +#include <telepathy-glib/_gdbus/Connection_Interface_Contact_Blocking1.h> #include <telepathy-glib/asv.h> #include <telepathy-glib/dbus.h> -#include <telepathy-glib/dbus-properties-mixin.h> #include <telepathy-glib/handle-repo-dynamic.h> #include <telepathy-glib/handle-repo-static.h> #include <telepathy-glib/interfaces.h> @@ -278,7 +278,7 @@ struct _TpBaseContactListPrivate * the constructor and cleared when we lose @conn. */ _TpGDBusConnectionInterfaceContactList1 *contact_list_skeleton; _TpGDBusConnectionInterfaceContactGroups1 *contact_groups_skeleton; - gboolean svc_contact_blocking; + _TpGDBusConnectionInterfaceContactBlocking1 *contact_blocking_skeleton; /* TRUE if the contact list must be downloaded at connection. Default is * TRUE. */ @@ -544,10 +544,10 @@ tp_base_contact_list_free_contents (TpBaseContactList *self) self->priv->status_changed_id = 0; } - tp_clear_object (&self->priv->conn); + g_clear_object (&self->priv->conn); g_clear_object (&self->priv->contact_list_skeleton); g_clear_object (&self->priv->contact_groups_skeleton); - self->priv->svc_contact_blocking = FALSE; + g_clear_object (&self->priv->contact_blocking_skeleton); } g_clear_pointer (&self->priv->groups, g_hash_table_unref); @@ -673,6 +673,8 @@ static void _tp_base_contact_list_implement_contact_list ( TpBaseContactList *self); static void _tp_base_contact_list_implement_contact_groups ( TpBaseContactList *self); +static void _tp_base_contact_list_implement_contact_blocking ( + TpBaseContactList *self); static void tp_base_contact_list_constructed (GObject *object) @@ -695,9 +697,6 @@ tp_base_contact_list_constructed (GObject *object) /* ContactList1 iface is mandatory to implement */ _tp_base_contact_list_implement_contact_list (self); - self->priv->svc_contact_blocking = - TP_IS_SVC_CONNECTION_INTERFACE_CONTACT_BLOCKING1 (self->priv->conn); - if (TP_IS_MUTABLE_CONTACT_LIST (self)) { TpMutableContactListInterface *iface = @@ -732,6 +731,8 @@ tp_base_contact_list_constructed (GObject *object) g_return_if_fail (iface->block_contacts_finish != NULL); g_return_if_fail (iface->unblock_contacts_async != NULL); g_return_if_fail (iface->unblock_contacts_finish != NULL); + + _tp_base_contact_list_implement_contact_blocking (self); } self->priv->contact_repo = tp_base_connection_get_handles (self->priv->conn, @@ -1032,17 +1033,18 @@ tp_base_contact_list_set_list_received (TpBaseContactList *self) tp_base_contact_list_contact_blocking_changed (self, blocked); - if (self->priv->svc_contact_blocking && + if (self->priv->contact_blocking_skeleton != NULL && self->priv->blocked_contact_requests.length > 0) { - GHashTable *map = tp_handle_set_to_identifier_map (blocked); + GVariant *map = tp_handle_set_to_identifier_map (blocked); GDBusMethodInvocation *context; while ((context = g_queue_pop_head ( &self->priv->blocked_contact_requests)) != NULL) - tp_svc_connection_interface_contact_blocking1_return_from_request_blocked_contacts (context, map); - - g_hash_table_unref (map); + { + _tp_gdbus_connection_interface_contact_blocking1_complete_request_blocked_contacts ( + self->priv->contact_blocking_skeleton, context, map); + } } tp_handle_set_destroy (blocked); @@ -1295,7 +1297,7 @@ tp_base_contact_list_contact_blocking_changed (TpBaseContactList *self, TpHandleSet *changed) { TpHandleSet *now_blocked; - GHashTable *blocked_contacts, *unblocked_contacts; + GVariantBuilder blocked_contacts, unblocked_contacts; TpIntsetFastIter iter; TpHandle handle; @@ -1305,45 +1307,36 @@ tp_base_contact_list_contact_blocking_changed (TpBaseContactList *self, /* don't do anything if we're disconnecting, or if we haven't had the * initial contact list yet */ if (tp_base_contact_list_get_state (self, NULL) != - TP_CONTACT_LIST_STATE_SUCCESS) + TP_CONTACT_LIST_STATE_SUCCESS || + tp_handle_set_is_empty (changed) || + self->priv->contact_blocking_skeleton == NULL) return; g_return_if_fail (tp_base_contact_list_can_block (self)); now_blocked = tp_base_contact_list_dup_blocked_contacts (self); - blocked_contacts = g_hash_table_new (NULL, NULL); - unblocked_contacts = g_hash_table_new (NULL, NULL); - + g_variant_builder_init (&blocked_contacts, G_VARIANT_TYPE ("a{us}")); + g_variant_builder_init (&unblocked_contacts, G_VARIANT_TYPE ("a{us}")); tp_intset_fast_iter_init (&iter, tp_handle_set_peek (changed)); - while (tp_intset_fast_iter_next (&iter, &handle)) { const char *id = tp_handle_inspect (self->priv->contact_repo, handle); if (tp_handle_set_is_member (now_blocked, handle)) - { - g_hash_table_insert (blocked_contacts, GUINT_TO_POINTER (handle), - (gpointer) id); - } + g_variant_builder_add (&blocked_contacts, "{us}", handle, id); else - { - g_hash_table_insert (unblocked_contacts, GUINT_TO_POINTER (handle), - (gpointer) id); - } + g_variant_builder_add (&unblocked_contacts, "{us}", handle, id); DEBUG ("Contact %s: blocked=%c", id, tp_handle_set_is_member (now_blocked, handle) ? 'Y' : 'N'); } - if (self->priv->svc_contact_blocking && - (g_hash_table_size (blocked_contacts) > 0 || - g_hash_table_size (unblocked_contacts) > 0)) - tp_svc_connection_interface_contact_blocking1_emit_blocked_contacts_changed ( - self->priv->conn, blocked_contacts, unblocked_contacts); + _tp_gdbus_connection_interface_contact_blocking1_emit_blocked_contacts_changed ( + self->priv->contact_blocking_skeleton, + g_variant_builder_end (&blocked_contacts), + g_variant_builder_end (&unblocked_contacts)); - g_hash_table_unref (blocked_contacts); - g_hash_table_unref (unblocked_contacts); tp_handle_set_destroy (now_blocked); } @@ -4793,22 +4786,20 @@ _tp_base_contact_list_implement_contact_groups (TpBaseContactList *self) } #define ERROR_IF_BLOCKING_NOT_SUPPORTED(self, context) \ - if (!self->priv->svc_contact_blocking) \ + if (self->priv->contact_blocking_skeleton == NULL) \ { \ GError e = { TP_ERROR, TP_ERROR_NOT_IMPLEMENTED, \ "ContactBlocking is not supported on this connection" }; \ g_dbus_method_invocation_return_gerror (context, &e); \ - return; \ + return TRUE; \ } -static void +static gboolean tp_base_contact_list_mixin_request_blocked_contacts ( - TpSvcConnectionInterfaceContactBlocking1 *svc, - GDBusMethodInvocation *context) + _TpGDBusConnectionInterfaceContactBlocking1 *skeleton, + GDBusMethodInvocation *context, + TpBaseContactList *self) { - TpBaseContactList *self = g_object_get_qdata ((GObject *) svc, - BASE_CONTACT_LIST); - ERROR_IF_BLOCKING_NOT_SUPPORTED (self, context); switch (self->priv->state) @@ -4826,11 +4817,10 @@ tp_base_contact_list_mixin_request_blocked_contacts ( case TP_CONTACT_LIST_STATE_SUCCESS: { TpHandleSet *blocked = tp_base_contact_list_dup_blocked_contacts (self); - GHashTable *map = tp_handle_set_to_identifier_map (blocked); - tp_svc_connection_interface_contact_blocking1_return_from_request_blocked_contacts (context, map); + _tp_gdbus_connection_interface_contact_blocking1_complete_request_blocked_contacts ( + skeleton, context, tp_handle_set_to_identifier_map (blocked)); - g_hash_table_unref (map); tp_handle_set_destroy (blocked); break; } @@ -4841,9 +4831,11 @@ tp_base_contact_list_mixin_request_blocked_contacts ( "My internal list of blocked contacts is inconsistent! " "I apologise for any inconvenience caused." }; g_dbus_method_invocation_return_gerror (context, &broken); - g_return_if_reached (); + g_return_val_if_reached (TRUE); } } + + return TRUE; } static void @@ -4859,8 +4851,8 @@ blocked_cb ( if (tp_base_contact_list_block_contacts_with_abuse_finish (self, result, &error)) { - tp_svc_connection_interface_contact_blocking1_return_from_block_contacts ( - context); + _tp_gdbus_connection_interface_contact_blocking1_complete_block_contacts ( + self->priv->contact_blocking_skeleton, context); } else { @@ -4869,24 +4861,31 @@ blocked_cb ( } } -static void +static gboolean tp_base_contact_list_mixin_block_contacts ( - TpSvcConnectionInterfaceContactBlocking1 *svc, - const GArray *contacts_arr, + _TpGDBusConnectionInterfaceContactBlocking1 *skeleton, + GDBusMethodInvocation *context, + GVariant *contacts_variant, gboolean report_abusive, - GDBusMethodInvocation *context) + TpBaseContactList *self) { - TpBaseContactList *self = g_object_get_qdata ((GObject *) svc, - BASE_CONTACT_LIST); TpHandleSet *contacts; + GVariantIter iter; + TpHandle contact; ERROR_IF_BLOCKING_NOT_SUPPORTED (self, context); - contacts = tp_handle_set_new_from_array (self->priv->contact_repo, - contacts_arr); + contacts = tp_handle_set_new (self->priv->contact_repo); + g_variant_iter_init (&iter, contacts_variant); + while (g_variant_iter_loop (&iter, "u", &contact)) + tp_handle_set_add (contacts, contact); + tp_base_contact_list_block_contacts_with_abuse_async (self, contacts, report_abusive, blocked_cb, context); + tp_handle_set_destroy (contacts); + + return TRUE; } static void @@ -4901,7 +4900,8 @@ unblocked_cb ( if (tp_base_contact_list_unblock_contacts_finish (self, result, &error)) { - tp_svc_connection_interface_contact_blocking1_return_from_unblock_contacts (context); + _tp_gdbus_connection_interface_contact_blocking1_complete_unblock_contacts ( + self->priv->contact_blocking_skeleton, context); } else { @@ -4910,115 +4910,64 @@ unblocked_cb ( } } -static void +static gboolean tp_base_contact_list_mixin_unblock_contacts ( - TpSvcConnectionInterfaceContactBlocking1 *svc, - const GArray *contacts_arr, - GDBusMethodInvocation *context) + _TpGDBusConnectionInterfaceContactBlocking1 *skeleton, + GDBusMethodInvocation *context, + GVariant *contacts_variant, + TpBaseContactList *self) { - TpBaseContactList *self = g_object_get_qdata ((GObject *) svc, - BASE_CONTACT_LIST); TpHandleSet *contacts; + GVariantIter iter; + TpHandle contact; ERROR_IF_BLOCKING_NOT_SUPPORTED (self, context); - contacts = tp_handle_set_new_from_array (self->priv->contact_repo, - contacts_arr); + contacts = tp_handle_set_new (self->priv->contact_repo); + g_variant_iter_init (&iter, contacts_variant); + while (g_variant_iter_loop (&iter, "u", &contact)) + tp_handle_set_add (contacts, contact); + tp_base_contact_list_unblock_contacts_async (self, contacts, unblocked_cb, context); + tp_handle_set_destroy (contacts); -} -/** - * tp_base_contact_list_mixin_blocking_iface_init: - * @klass: the service-side D-Bus interface, - * a #TpSvcConnectionInterfaceContactBlocking1Class - * - * Use the #TpBaseContactList like a mixin, to implement the ContactBlocking - * D-Bus interface. - * - * This function should be passed to G_IMPLEMENT_INTERFACE() for - * #TpSvcConnectionInterfaceContactBlocking1 - * - * Since: 0.15.1 - */ -void -tp_base_contact_list_mixin_blocking_iface_init (gpointer klass) -{ -#define IMPLEMENT(x) tp_svc_connection_interface_contact_blocking1_implement_##x (\ - klass, tp_base_contact_list_mixin_##x) - IMPLEMENT (block_contacts); - IMPLEMENT (unblock_contacts); - IMPLEMENT (request_blocked_contacts); -#undef IMPLEMENT + return TRUE; } -static TpDBusPropertiesMixinPropImpl known_blocking_props[] = { - { "ContactBlockingCapabilities" }, - { NULL } -}; - static void -tp_base_contact_list_get_blocking_dbus_property (GObject *conn, - GQuark interface G_GNUC_UNUSED, - GQuark name G_GNUC_UNUSED, - GValue *value, - gpointer data) +_tp_base_contact_list_implement_contact_blocking (TpBaseContactList *self) { - TpBaseContactList *self = g_object_get_qdata (conn, BASE_CONTACT_LIST); - TpBlockableContactListInterface *iface = - TP_BLOCKABLE_CONTACT_LIST_GET_INTERFACE (self); - static GQuark contact_blocking_capabilities_q = 0; + TpBlockableContactListInterface *iface; guint flags = 0; - g_return_if_fail (TP_IS_BASE_CONTACT_LIST (self)); - g_return_if_fail (TP_IS_BLOCKABLE_CONTACT_LIST (self)); - g_return_if_fail (self->priv->conn != NULL); - - if (G_UNLIKELY (contact_blocking_capabilities_q == 0)) - contact_blocking_capabilities_q = - g_quark_from_static_string ("ContactBlockingCapabilities"); - - g_return_if_fail (name == contact_blocking_capabilities_q); + self->priv->contact_blocking_skeleton = + _tp_gdbus_connection_interface_contact_blocking1_skeleton_new (); + iface = TP_BLOCKABLE_CONTACT_LIST_GET_INTERFACE (self); if (iface->block_contacts_with_abuse_async != NULL) flags |= TP_CONTACT_BLOCKING_CAPABILITY_CAN_REPORT_ABUSIVE; - g_value_set_uint (value, flags); -} - -/** - * tp_base_contact_list_mixin_class_init: - * @cls: A subclass of #TpBaseConnection that has a #TpContactsMixinClass, - * and implements #TpSvcConnectionInterfaceContactList1 using - * #TpBaseContactList - * - * Register the #TpBaseContactList to be used like a mixin in @cls. - * Before this function is called, the #TpContactsMixin must be initialized - * with tp_contacts_mixin_class_init(). - * - * If the connection implements #TpSvcConnectionInterfaceContactGroups1, this - * function automatically sets up that interface as well as ContactList. - * In this case, when the #TpBaseContactList is created later, it must - * implement %TP_TYPE_CONTACT_GROUP_LIST. - * - * Since: 0.13.0 - */ -void -tp_base_contact_list_mixin_class_init (TpBaseConnectionClass *cls) -{ - GType type = G_OBJECT_CLASS_TYPE (cls); - GObjectClass *obj_cls = (GObjectClass *) cls; + _tp_gdbus_connection_interface_contact_blocking1_set_contact_blocking_capabilities ( + self->priv->contact_blocking_skeleton, flags); - g_return_if_fail (TP_IS_BASE_CONNECTION_CLASS (cls)); + g_signal_connect_object (self->priv->contact_blocking_skeleton, + "handle-block-contacts", + G_CALLBACK (tp_base_contact_list_mixin_block_contacts), + self, 0); + g_signal_connect_object (self->priv->contact_blocking_skeleton, + "handle-unblock-contacts", + G_CALLBACK (tp_base_contact_list_mixin_unblock_contacts), + self, 0); + g_signal_connect_object (self->priv->contact_blocking_skeleton, + "handle-request-blocked-contacts", + G_CALLBACK (tp_base_contact_list_mixin_request_blocked_contacts), + self, 0); - if (g_type_is_a (type, TP_TYPE_SVC_CONNECTION_INTERFACE_CONTACT_BLOCKING1)) - { - tp_dbus_properties_mixin_implement_interface (obj_cls, - TP_IFACE_QUARK_CONNECTION_INTERFACE_CONTACT_BLOCKING1, - tp_base_contact_list_get_blocking_dbus_property, - NULL, known_blocking_props); - } + g_dbus_object_skeleton_add_interface ( + G_DBUS_OBJECT_SKELETON (self->priv->conn), + G_DBUS_INTERFACE_SKELETON (self->priv->contact_blocking_skeleton)); } /** diff --git a/telepathy-glib/base-contact-list.h b/telepathy-glib/base-contact-list.h index d56c3baab..86ce5dd50 100644 --- a/telepathy-glib/base-contact-list.h +++ b/telepathy-glib/base-contact-list.h @@ -588,11 +588,6 @@ struct _TpMutableContactGroupListInterface { TpBaseContactListUIntFunc get_group_storage; }; -/* ---- Mixin-like functionality for our parent TpBaseConnection ---- */ - -void tp_base_contact_list_mixin_class_init (TpBaseConnectionClass *cls); -void tp_base_contact_list_mixin_blocking_iface_init (gpointer klass); - _TP_AVAILABLE_IN_1_0 gboolean tp_base_contact_list_fill_contact_attributes (TpBaseContactList *self, const gchar *dbus_interface, diff --git a/telepathy-glib/handle-repo.h b/telepathy-glib/handle-repo.h index 47ca9120f..f5364c6fb 100644 --- a/telepathy-glib/handle-repo.h +++ b/telepathy-glib/handle-repo.h @@ -138,7 +138,7 @@ gboolean tp_handle_set_is_empty (const TpHandleSet *set); int tp_handle_set_size (const TpHandleSet *set); GArray *tp_handle_set_to_array (const TpHandleSet *set) G_GNUC_WARN_UNUSED_RESULT; -GHashTable *tp_handle_set_to_identifier_map (TpHandleSet *self) +GVariant *tp_handle_set_to_identifier_map (TpHandleSet *self) G_GNUC_WARN_UNUSED_RESULT; TpHandleSet *tp_handle_set_new_from_array (TpHandleRepoIface *repo, const GArray *array) G_GNUC_WARN_UNUSED_RESULT; diff --git a/telepathy-glib/handle-set.c b/telepathy-glib/handle-set.c index d11f1d363..3ccdb497d 100644 --- a/telepathy-glib/handle-set.c +++ b/telepathy-glib/handle-set.c @@ -299,25 +299,20 @@ tp_handle_set_to_array (const TpHandleSet *set) * * Returns a dictionary mapping each handle in @self to the corresponding * identifier, as if retrieved by calling tp_handle_inspect() on each handle. - * The type of the returned value is described as - * <code>Handle_Identifier_Map</code> in the Telepathy specification. * - * Returns: (transfer full) (element-type TpHandle utf8): a map from the - * handles in @self to the corresponding identifier. + * Returns: (transfer none): a floating #GVariant of type "a{us}". */ -GHashTable * +GVariant * tp_handle_set_to_identifier_map ( TpHandleSet *self) { - /* We don't bother dupping the strings: they remain valid as long as the - * connection's alive and hence the repo exists. - */ - GHashTable *map = g_hash_table_new (NULL, NULL); + GVariantBuilder builder; TpIntsetFastIter iter; TpHandle handle; - g_return_val_if_fail (self != NULL, map); + g_return_val_if_fail (self != NULL, NULL); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{us}")); tp_intset_fast_iter_init (&iter, self->intset); while (tp_intset_fast_iter_next (&iter, &handle)) { @@ -327,12 +322,14 @@ tp_handle_set_to_identifier_map ( } else { - g_hash_table_insert (map, GUINT_TO_POINTER (handle), - (gchar *) tp_handle_inspect (self->repo, handle)); + /* We don't bother dupping the strings: they remain valid as long as + * the connection's alive and hence the repo exists. */ + g_variant_builder_add (&builder, "{u&s}", handle, + tp_handle_inspect (self->repo, handle)); } } - return map; + return g_variant_builder_end (&builder); } /** diff --git a/telepathy-glib/versions/main-1.0.abi b/telepathy-glib/versions/main-1.0.abi index 548cb77ab..c24dfbed3 100644 --- a/telepathy-glib/versions/main-1.0.abi +++ b/telepathy-glib/versions/main-1.0.abi @@ -275,8 +275,6 @@ tp_base_contact_list_groups_created tp_base_contact_list_groups_removed tp_base_contact_list_has_disjoint_groups tp_base_contact_list_is_blocked -tp_base_contact_list_mixin_blocking_iface_init -tp_base_contact_list_mixin_class_init tp_base_contact_list_normalize_group tp_base_contact_list_one_contact_changed tp_base_contact_list_one_contact_groups_changed diff --git a/tests/lib/contacts-conn.c b/tests/lib/contacts-conn.c index 938e8f12e..4a4e3dd65 100644 --- a/tests/lib/contacts-conn.c +++ b/tests/lib/contacts-conn.c @@ -567,8 +567,6 @@ tp_tests_contacts_connection_class_init (TpTestsContactsConnectionClass *klass) klass->properties_class.interfaces = prop_interfaces; tp_dbus_properties_mixin_class_init (object_class, G_STRUCT_OFFSET (TpTestsContactsConnectionClass, properties_class)); - - tp_base_contact_list_mixin_class_init (base_class); } TpTestsContactListManager * |