}
static void
-aggregator_individuals_added_cb (FolksIndividualAggregator *aggregator,
- GList *individuals,
+aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
+ GList *added,
+ GList *removed,
+ const char *message,
+ FolksPersona *actor,
+ guint reason,
EmpathyIndividualManager *self)
{
GList *l;
- for (l = individuals; l; l = l->next)
+ for (l = added; l; l = l->next)
{
g_signal_connect (l->data, "group-changed",
G_CALLBACK (individual_group_changed_cb), self);
G_CALLBACK (individual_notify_is_favourite_cb), self);
}
- /* TODO: don't hard-code the reason or message */
- g_signal_emit (self, signals[MEMBERS_CHANGED], 0, "individual(s) added",
- individuals, NULL, TP_CHANNEL_GROUP_CHANGE_REASON_NONE, TRUE);
-}
-
-static void
-aggregator_individuals_removed_cb (FolksIndividualAggregator *aggregator,
- GList *individuals,
- EmpathyIndividualManager *self)
-{
- GList *l;
-
- for (l = individuals; l; l = l->next)
+ for (l = removed; l; l = l->next)
{
g_signal_handlers_disconnect_by_func (l->data,
individual_group_changed_cb, self);
individual_notify_is_favourite_cb, self);
}
- /* TODO: don't hard-code the reason or message */
- g_signal_emit (self, signals[MEMBERS_CHANGED], 0, "individual(s) removed",
- NULL, individuals, TP_CHANNEL_GROUP_CHANGE_REASON_NONE, TRUE);
+ g_signal_emit (self, signals[MEMBERS_CHANGED], 0, message,
+ added, removed,
+ tp_chanel_group_change_reason_from_folks_groups_change_reason (reason),
+ TRUE);
}
static void
priv->contact_manager = empathy_contact_manager_dup_singleton ();
priv->aggregator = folks_individual_aggregator_new ();
- g_signal_connect (priv->aggregator, "individuals-added",
- G_CALLBACK (aggregator_individuals_added_cb), self);
- g_signal_connect (priv->aggregator, "individuals-removed",
- G_CALLBACK (aggregator_individuals_removed_cb), self);
+ g_signal_connect (priv->aggregator, "individuals-changed",
+ G_CALLBACK (aggregator_individuals_changed_cb), self);
+ folks_individual_aggregator_prepare (priv->aggregator, NULL, NULL);
}
EmpathyIndividualManager *
g_clear_error (&error);
}
+ /* Set the contact's persona */
+ empathy_contact_set_persona (contact, persona);
+
/* We can unref the contact now */
g_object_unref (contact);
+ g_object_unref (persona);
}
void
g_object_ref (contact);
DEBUG ("adding individual from contact %s (%s)",
- empathy_contact_get_id (contact), empathy_contact_get_name (contact));
+ empathy_contact_get_id (contact), empathy_contact_get_alias (contact));
account = empathy_contact_get_account (contact);
store_id = tp_proxy_get_object_path (TP_PROXY (account));
- details = g_hash_table_new (g_str_hash, g_str_equal);
- g_hash_table_insert (details, "contact",
- (gchar*) empathy_contact_get_id (contact));
+ details = tp_asv_new (
+ "contact", G_TYPE_STRING, empathy_contact_get_id (contact),
+ NULL);
folks_individual_aggregator_add_persona_from_details (
priv->aggregator, NULL, "telepathy", store_id, details,
g_hash_table_destroy (details);
}
+static void
+aggregator_remove_individual_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ FolksIndividualAggregator *aggregator = FOLKS_INDIVIDUAL_AGGREGATOR (source);
+ GError *error = NULL;
+
+ folks_individual_aggregator_remove_individual_finish (
+ aggregator, result, &error);
+ if (error != NULL)
+ {
+ g_warning ("failed to remove individual: %s", error->message);
+ g_clear_error (&error);
+ }
+}
+
/**
* Removes the inner contact from the server (and thus the Individual). Not
* meant for de-shelling inner personas from an Individual.
folks_individual_get_id (individual),
folks_individual_get_alias (individual));
- folks_individual_aggregator_remove_individual (priv->aggregator, individual);
+ folks_individual_aggregator_remove_individual (priv->aggregator, individual,
+ aggregator_remove_individual_cb, self);
}
static void
-remove_group_cb (const gchar *id, FolksIndividual *individual,
+groups_change_group_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ FolksGroups *groups = FOLKS_GROUPS (source);
+ GError *error = NULL;
+
+ folks_groups_change_group_finish (groups, result, &error);
+ if (error != NULL)
+ {
+ g_warning ("failed to change group: %s", error->message);
+ g_clear_error (&error);
+ }
+}
+
+static void
+remove_group_cb (const gchar *id,
+ FolksIndividual *individual,
const gchar *group)
{
- folks_groups_change_group (FOLKS_GROUPS (individual), group, FALSE);
+ folks_groups_change_group (FOLKS_GROUPS (individual), group, FALSE,
+ groups_change_group_cb, NULL);
}
void