]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-individual-information-dialog.c
don't pass a GError when first trying to start gnome-contacts
[empathy.git] / libempathy-gtk / empathy-individual-information-dialog.c
index e14293d455ebdee0237f296fa2b7a3d66a4d579e..baa1e4c0409e45acd57f996b31aae1a8a66a0a60 100644 (file)
  *          Travis Reitter <travis.reitter@collabora.co.uk>
  */
 
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
+#include "config.h"
+#include "empathy-individual-information-dialog.h"
 
-#include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 
-#include <telepathy-glib/util.h>
-#include <folks/folks.h>
-#include <folks/folks-telepathy.h>
-
-#include <libempathy/empathy-individual-manager.h>
-#include <libempathy/empathy-utils.h>
-
-#include "empathy-individual-information-dialog.h"
+#include "empathy-individual-manager.h"
 #include "empathy-individual-widget.h"
+#include "empathy-pkg-kit.h"
 #include "empathy-ui-utils.h"
+#include "empathy-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
+#include "empathy-debug.h"
 
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualInformationDialog)
 typedef struct {
@@ -129,19 +124,26 @@ static void
 set_label_visibility (EmpathyIndividualInformationDialog *dialog)
 {
   EmpathyIndividualInformationDialogPriv *priv = GET_PRIV (dialog);
-  GList *personas, *l;
   guint num_personas = 0;
 
   /* Count how many Telepathy personas we have, to see whether we can
    * unlink */
   if (priv->individual != NULL)
     {
+      GeeSet *personas;
+      GeeIterator *iter;
+
       personas = folks_individual_get_personas (priv->individual);
-      for (l = personas; l != NULL; l = l->next)
+      iter = gee_iterable_iterator (GEE_ITERABLE (personas));
+      while (gee_iterator_next (iter))
         {
-          if (empathy_folks_persona_is_interesting (FOLKS_PERSONA (l->data)))
+          FolksPersona *persona = gee_iterator_get (iter);
+          if (empathy_folks_persona_is_interesting (persona))
             num_personas++;
+
+          g_clear_object (&persona);
         }
+      g_clear_object (&iter);
     }
 
   /* Only make the label visible if we have enough personas */
@@ -309,3 +311,115 @@ empathy_individual_information_dialog_init (
   g_signal_connect (dialog, "response",
       G_CALLBACK (individual_dialogs_response_cb), &information_dialogs);
 }
+
+static void
+show_gnome_contacts_error_dialog (void)
+{
+  GtkWidget *dialog;
+
+  dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+      GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+      _("gnome-contacts not installed"));
+
+  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+      _("Please install gnome-contacts to access contacts details."));
+
+  g_signal_connect_swapped (dialog, "response",
+          G_CALLBACK (gtk_widget_destroy), dialog);
+
+  gtk_widget_show (dialog);
+}
+
+static void
+start_gnome_contacts (FolksIndividual *individual,
+    gboolean try_installing);
+
+static void
+install_gnome_contacts_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  FolksIndividual *individual = user_data;
+  GError *error = NULL;
+
+  if (!empathy_pkg_kit_install_packages_finish (result, &error))
+    {
+      DEBUG ("Failed to install gnome-contacts: %s", error->message);
+      g_error_free (error);
+
+      show_gnome_contacts_error_dialog ();
+      goto out;
+    }
+
+  DEBUG ("gnome-contacts installed");
+
+  start_gnome_contacts (individual, FALSE);
+
+out:
+  g_object_unref (individual);
+}
+
+static void
+start_gnome_contacts (FolksIndividual *individual,
+    gboolean try_installing)
+{
+  gchar *args;
+  GError *error = NULL;
+
+  g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual));
+
+  args = g_strdup_printf ("-i %s", folks_individual_get_id (individual));
+
+  /* First try the old desktop name */
+  if (empathy_launch_external_app ("gnome-contacts.desktop", args, NULL))
+    goto out;
+
+  if (!empathy_launch_external_app ("org.gnome.Contacts.desktop", args, &error))
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+        {
+          if (try_installing)
+            {
+              const gchar *packages[] = { "gnome-contacts", NULL };
+
+              DEBUG ("gnome-contacts not installed; try to install it");
+
+              empathy_pkg_kit_install_packages_async (0, packages, NULL,
+                  NULL, install_gnome_contacts_cb, g_object_ref (individual));
+            }
+          else
+            {
+              show_gnome_contacts_error_dialog ();
+            }
+        }
+    }
+
+out:
+  g_free (args);
+}
+
+/* Use gnome-contacts to display @individual or fallback to
+ * EmpathyIndividualInformationDialog if user is not not in Folks.
+ */
+void
+empathy_display_individual_info (FolksIndividual *individual)
+{
+  EmpathyIndividualManager *mgr;
+
+  mgr = empathy_individual_manager_dup_singleton ();
+
+  /* Only use gnome-contacts if that's a 'real' individual we got from
+   * Folks (and so the individual manager knows about it). If not that's a
+   * MUC contact and we use the simple dialog. */
+  if (empathy_individual_manager_lookup_member (mgr,
+        folks_individual_get_id (individual)) != NULL)
+    {
+      start_gnome_contacts (individual, TRUE);
+    }
+  else
+    {
+      empathy_individual_information_dialog_show (individual, NULL);
+    }
+
+  g_object_unref (mgr);
+}