+static void
+individual_notify_cb (FolksIndividual *individual,
+ GParamSpec *param,
+ EmpathyRosterModelAggregator *self)
+{
+ if (!self->priv->filter_func (EMPATHY_ROSTER_MODEL (self), individual, self)
+ && g_hash_table_contains (self->priv->filtered_individuals, individual))
+ remove_from_filtered_individuals (self, individual);
+
+ if (self->priv->filter_func (EMPATHY_ROSTER_MODEL (self), individual, self)
+ && !g_hash_table_contains (self->priv->filtered_individuals, individual))
+ add_to_filtered_individuals (self, individual);
+}
+
+static void
+add_individual (EmpathyRosterModelAggregator *self,
+ FolksIndividual *individual)
+{
+ if (self->priv->filter_func != NULL)
+ {
+ tp_g_signal_connect_object (individual, "notify",
+ G_CALLBACK (individual_notify_cb), self, 0);
+
+ if (!self->priv->filter_func (EMPATHY_ROSTER_MODEL (self), individual,
+ self))
+ return;
+ }
+
+ add_to_filtered_individuals (self, individual);
+}
+
+static void
+remove_individual (EmpathyRosterModelAggregator *self,
+ FolksIndividual *individual)
+{
+ if (self->priv->filter_func != NULL)
+ g_signal_handlers_disconnect_by_func (individual,
+ individual_notify_cb, self);
+
+ if (g_hash_table_contains (self->priv->filtered_individuals,
+ individual))
+ remove_from_filtered_individuals (self, individual);
+}
+