aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/empathy-individual-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy/empathy-individual-manager.c')
-rw-r--r--libempathy/empathy-individual-manager.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/libempathy/empathy-individual-manager.c b/libempathy/empathy-individual-manager.c
index 69e62f1a7..f6aa49184 100644
--- a/libempathy/empathy-individual-manager.c
+++ b/libempathy/empathy-individual-manager.c
@@ -162,34 +162,43 @@ individual_notify_personas_cb (FolksIndividual *individual,
static void
aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
- GList *added,
- GList *removed,
+ GeeSet *added,
+ GeeSet *removed,
const char *message,
FolksPersona *actor,
guint reason,
EmpathyIndividualManager *self)
{
EmpathyIndividualManagerPriv *priv = GET_PRIV (self);
- GList *l, *added_filtered = NULL;
+ GeeIterator *iter;
+ GList *added_filtered = NULL, *removed_list = NULL;
/* Handle the removals first, as one of the added Individuals might have the
* same ID as one of the removed Individuals (due to linking). */
- for (l = removed; l; l = l->next)
+ iter = gee_iterable_iterator (GEE_ITERABLE (removed));
+ while (gee_iterator_next (iter))
{
- FolksIndividual *ind = FOLKS_INDIVIDUAL (l->data);
+ FolksIndividual *ind = gee_iterator_get (iter);
g_signal_handlers_disconnect_by_func (ind,
individual_notify_personas_cb, self);
if (g_hash_table_lookup (priv->individuals,
folks_individual_get_id (ind)) != NULL)
- remove_individual (self, ind);
+ {
+ remove_individual (self, ind);
+ removed_list = g_list_prepend (removed_list, ind);
+ }
+
+ g_clear_object (&ind);
}
+ g_clear_object (&iter);
/* Filter the individuals for ones which contain EmpathyContacts */
- for (l = added; l; l = l->next)
+ iter = gee_iterable_iterator (GEE_ITERABLE (added));
+ while (gee_iterator_next (iter))
{
- FolksIndividual *ind = FOLKS_INDIVIDUAL (l->data);
+ FolksIndividual *ind = gee_iterator_get (iter);
g_signal_connect (ind, "notify::personas",
G_CALLBACK (individual_notify_personas_cb), self);
@@ -199,7 +208,10 @@ aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
add_individual (self, ind);
added_filtered = g_list_prepend (added_filtered, ind);
}
+
+ g_clear_object (&ind);
}
+ g_clear_object (&iter);
/* Bail if we have no individuals left */
if (added_filtered == NULL && removed == NULL)
@@ -208,11 +220,12 @@ aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
added_filtered = g_list_reverse (added_filtered);
g_signal_emit (self, signals[MEMBERS_CHANGED], 0, message,
- added_filtered, removed,
+ added_filtered, removed_list,
tp_channel_group_change_reason_from_folks_groups_change_reason (reason),
TRUE);
g_list_free (added_filtered);
+ g_list_free (removed_list);
}
static void