]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-individual-manager.c
Merge branch 'folks-async-and-prepare'
[empathy.git] / libempathy / empathy-individual-manager.c
index de296cd8095fefb214f5af901db1f28b6ccbf662..55541b29955a7c9e997acd2bdaacf47346d0ef3f 100644 (file)
@@ -92,13 +92,17 @@ individual_notify_is_favourite_cb (FolksIndividual *individual,
 }
 
 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);
@@ -106,19 +110,7 @@ aggregator_individuals_added_cb (FolksIndividualAggregator *aggregator,
           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);
@@ -126,9 +118,10 @@ aggregator_individuals_removed_cb (FolksIndividualAggregator *aggregator,
           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
@@ -233,10 +226,9 @@ empathy_individual_manager_init (EmpathyIndividualManager *self)
   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 *
@@ -291,8 +283,12 @@ aggregator_add_persona_from_details_cb (GObject *source,
       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
@@ -314,14 +310,14 @@ empathy_individual_manager_add_from_contact (EmpathyIndividualManager *self,
   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,
@@ -330,6 +326,23 @@ empathy_individual_manager_add_from_contact (EmpathyIndividualManager *self,
   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.
@@ -350,14 +363,33 @@ empathy_individual_manager_remove (EmpathyIndividualManager *self,
       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