aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy/empathy-tp-contact-list.c75
1 files changed, 42 insertions, 33 deletions
diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index 9507f5a76..b458e1d90 100644
--- a/libempathy/empathy-tp-contact-list.c
+++ b/libempathy/empathy-tp-contact-list.c
@@ -373,45 +373,64 @@ tp_contact_list_group_add (EmpathyTpContactList *list,
}
static void
-add_to_members (EmpathyTpContactList *list,
- EmpathyContact *contact)
+got_added_members_cb (EmpathyTpContactFactory *factory,
+ guint n_contacts,
+ EmpathyContact * const * contacts,
+ guint n_failed,
+ const TpHandle *failed,
+ const GError *error,
+ gpointer user_data,
+ GObject *list)
{
EmpathyTpContactListPriv *priv = GET_PRIV (list);
- TpHandle handle;
+ guint i;
- handle = empathy_contact_get_handle (contact);
- if (g_hash_table_lookup (priv->members, GUINT_TO_POINTER (handle)))
+ if (error) {
+ DEBUG ("Error: %s", error->message);
return;
+ }
+
+ for (i = 0; i < n_contacts; i++) {
+ EmpathyContact *contact = contacts[i];
+ TpHandle handle = empathy_contact_get_handle (contact);
/* Add to the list and emit signal */
- g_hash_table_insert (priv->members, GUINT_TO_POINTER (handle),
+ g_hash_table_insert (priv->members, GUINT_TO_POINTER (handle),
g_object_ref (contact));
- g_signal_emit_by_name (list, "members-changed", contact,
+ g_signal_emit_by_name (list, "members-changed", contact,
0, 0, NULL, TRUE);
+ }
}
static void
-tp_contact_list_got_added_members_cb (EmpathyTpContactFactory *factory,
- guint n_contacts,
- EmpathyContact * const * contacts,
- guint n_failed,
- const TpHandle *failed,
- const GError *error,
- gpointer user_data,
- GObject *list)
+add_to_members (EmpathyTpContactList *list,
+ GArray *handles)
{
+ EmpathyTpContactListPriv *priv = GET_PRIV (list);
+ GArray *request;
guint i;
- if (error) {
- DEBUG ("Error: %s", error->message);
+ if (handles->len == 0)
return;
- }
- for (i = 0; i < n_contacts; i++) {
- EmpathyContact *contact = contacts[i];
+ request = g_array_new (FALSE, FALSE, sizeof (TpHandle));
+
+ for (i = 0; i < handles->len; i++) {
+ TpHandle handle = g_array_index (handles, TpHandle, i);
+
+ if (g_hash_table_lookup (priv->members, GUINT_TO_POINTER (handle)))
+ continue;
- add_to_members (EMPATHY_TP_CONTACT_LIST (list), contact);
+ g_array_append_val (request, handle);
}
+
+ if (request->len > 0) {
+ empathy_tp_contact_factory_get_from_handles (priv->factory,
+ request->len, (TpHandle *) request->data,
+ got_added_members_cb, NULL, NULL, G_OBJECT (list));
+ }
+
+ g_array_free (request, TRUE);
}
static void
@@ -605,12 +624,7 @@ tp_contact_list_subscribe_group_members_changed_cb (TpChannel *channel,
GArray *accept;
/* We now get the presence of those contacts, add them to members */
- if (added->len > 0) {
- empathy_tp_contact_factory_get_from_handles (priv->factory,
- added->len, (TpHandle *) added->data,
- tp_contact_list_got_added_members_cb, NULL, NULL,
- G_OBJECT (list));
- }
+ add_to_members (list, added);
/* Those contacts refuse to send us their presence, remove from members. */
for (i = 0; i < removed->len; i++) {
@@ -619,12 +633,7 @@ tp_contact_list_subscribe_group_members_changed_cb (TpChannel *channel,
/* We want those contacts in our contact list but we don't get their
* presence yet. Add to members anyway. */
- if (remote_pending->len > 0) {
- empathy_tp_contact_factory_get_from_handles (priv->factory,
- remote_pending->len, (TpHandle *) remote_pending->data,
- tp_contact_list_got_added_members_cb, NULL, NULL,
- G_OBJECT (list));
- }
+ add_to_members (list, remote_pending);
/* Implicitly accept pending request of contacts which are now members. */
accept = g_array_new (FALSE, FALSE, sizeof (TpHandle));