]> git.0d.be Git - empathy.git/commitdiff
Support Account.Interface.Storage
authorDanielle Madeley <danielle.madeley@collabora.co.uk>
Fri, 21 May 2010 09:23:22 +0000 (19:23 +1000)
committerDanielle Madeley <danielle.madeley@collabora.co.uk>
Fri, 8 Oct 2010 01:20:18 +0000 (12:20 +1100)
Also support org.moblin.libsocialweb for Meego

configure.ac
libempathy-gtk/empathy-account-widget.c
libempathy/empathy-account-settings.c
libempathy/empathy-account-settings.h

index 8b498d97d4cfede99799d696d8d3d165db4d704b..ff16da156e997f51a165978632aaa78a59d9124a 100644 (file)
@@ -389,6 +389,7 @@ if test "x$enable_meego" != "xno"; then
     PKG_CHECK_MODULES(MEEGO,
     [
        mx-gtk-1.0
+       gio-unix-2.0
     ], have_meego="yes", have_meego="no")
 
     if test "x$have_meego" = "xyes"; then
index a32666325511cf8ca5e501061d175e461760ae36..5af18eddf960efe27e5ce0f37698bb27e7db790e 100644 (file)
@@ -32,6 +32,7 @@
 
 #ifdef HAVE_MEEGO
 #include <mx-gtk/mx-gtk.h>
+#include <gio/gdesktopappinfo.h>
 #endif /* HAVE_MEEGO */
 
 #include <libempathy/empathy-utils.h>
@@ -111,6 +112,10 @@ enum {
 
 static void account_widget_apply_and_log_in (EmpathyAccountWidget *);
 
+enum {
+  RESPONSE_LAUNCH
+};
+
 static guint signals[LAST_SIGNAL] = { 0 };
 
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyAccountWidget)
@@ -914,6 +919,97 @@ account_widget_build_generic (EmpathyAccountWidget *self,
         G_CALLBACK (account_widget_settings_ready_cb), self);
 }
 
+#ifdef HAVE_MEEGO
+static void
+account_widget_launch_external_clicked (GtkWidget *button,
+    gpointer user_data)
+{
+  GDesktopAppInfo *app_info;
+  const gchar *args[3] = { NULL, };
+  GError *error = NULL;
+
+  app_info = g_desktop_app_info_new ("gnome-control-center.desktop");
+
+  if (app_info == NULL)
+    {
+      g_critical ("Could not locate 'gnome-control-center.desktop'");
+      return;
+    }
+
+  args[0] = g_app_info_get_commandline (G_APP_INFO (app_info));
+  args[1] = "bisho.desktop";
+  args[2] = NULL;
+
+  gdk_spawn_on_screen (gtk_widget_get_screen (button),
+      NULL, (gchar **) args, NULL,
+      G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error);
+  if (error != NULL)
+    {
+      g_critical ("Failed to launch editor: %s", error->message);
+      g_clear_error (&error);
+    }
+
+  g_object_unref (app_info);
+}
+#endif /* HAVE_MEEGO */
+
+static void
+account_widget_build_external (EmpathyAccountWidget *self,
+    EmpathyAccountSettings *settings)
+{
+  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+  GtkWidget *bar, *widget;
+  gchar *str;
+
+  self->ui_details->widget = gtk_vbox_new (FALSE, 6);
+  priv->table_common_settings = gtk_table_new (1, 2, FALSE);
+
+  if (!tp_strdiff (empathy_account_settings_get_storage_provider (settings),
+        "org.moblin.libsocialweb"))
+    {
+      /* we know how to handle this external provider */
+      str = g_strdup_printf (
+          _("The account %s is edited via My Web Accounts."),
+          empathy_account_settings_get_display_name (settings));
+    }
+  else
+    {
+      str = g_strdup_printf (
+          _("The account %s cannot be edited in Empathy."),
+          empathy_account_settings_get_display_name (settings));
+    }
+
+  widget = gtk_label_new (str);
+  gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+  g_free (str);
+
+  bar = gtk_info_bar_new ();
+  gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
+  gtk_container_add (
+      GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))),
+      widget);
+  gtk_container_set_border_width (GTK_CONTAINER (bar), 6);
+
+#ifdef HAVE_MEEGO
+  if (!tp_strdiff (empathy_account_settings_get_storage_provider (settings),
+        "org.moblin.libsocialweb"))
+    {
+      widget = gtk_info_bar_add_button (GTK_INFO_BAR (bar),
+          _("Launch My Web Accounts"), RESPONSE_LAUNCH);
+
+      g_signal_connect (widget, "clicked",
+          G_CALLBACK (account_widget_launch_external_clicked), NULL);
+    }
+#endif
+
+  gtk_box_pack_start (GTK_BOX (self->ui_details->widget), bar,
+      FALSE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (self->ui_details->widget),
+      priv->table_common_settings, FALSE, TRUE, 0);
+
+  gtk_widget_show_all (self->ui_details->widget);
+}
+
 static void
 account_widget_build_salut (EmpathyAccountWidget *self,
     const char *filename)
@@ -1710,7 +1806,6 @@ do_constructed (GObject *obj)
   EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
   EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   TpAccount *account;
-  const gchar *protocol, *cm_name;
   const gchar *display_name, *default_display_name;
   guint i = 0;
   struct {
@@ -1731,31 +1826,46 @@ do_constructed (GObject *obj)
     WIDGET (sofiasip, sip),
   };
 
-  cm_name = empathy_account_settings_get_cm (priv->settings);
-  protocol = empathy_account_settings_get_protocol (priv->settings);
+  account = empathy_account_settings_get_account (priv->settings);
 
-  for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
+  /* Empathy can only edit accounts without the Cannot_Set_Parameters flag */
+  if (empathy_account_settings_get_storage_restrictions (priv->settings) &
+      TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS)
+    {
+      DEBUG ("Account is provided by an external storage provider");
+
+      account_widget_build_external (self, priv->settings);
+    }
+  else
     {
-      if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
-          !tp_strdiff (widgets[i].protocol, protocol))
+      const gchar *protocol, *cm_name;
+
+      cm_name = empathy_account_settings_get_cm (priv->settings);
+      protocol = empathy_account_settings_get_protocol (priv->settings);
+
+      for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
         {
-          gchar *filename;
+          if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
+              !tp_strdiff (widgets[i].protocol, protocol))
+            {
+              gchar *filename;
 
-          filename = empathy_file_lookup (widgets[i].file,
-              "libempathy-gtk");
-          widgets[i].func (self, filename);
-          g_free (filename);
+              filename = empathy_file_lookup (widgets[i].file,
+                  "libempathy-gtk");
+              widgets[i].func (self, filename);
+              g_free (filename);
 
-          break;
+              break;
+            }
         }
-    }
 
-  if (i == G_N_ELEMENTS (widgets))
-    {
-      gchar *filename = empathy_file_lookup (
-          "empathy-account-widget-generic.ui", "libempathy-gtk");
-      account_widget_build_generic (self, filename);
-      g_free (filename);
+      if (i == G_N_ELEMENTS (widgets))
+        {
+          gchar *filename = empathy_file_lookup (
+              "empathy-account-widget-generic.ui", "libempathy-gtk");
+          account_widget_build_generic (self, filename);
+          g_free (filename);
+        }
     }
 
   /* handle default focus */
@@ -1778,7 +1888,9 @@ do_constructed (GObject *obj)
       account_manager_ready_cb, self);
 
   /* handle apply and cancel button */
-  if (!priv->simple)
+  if (!priv->simple &&
+      !(empathy_account_settings_get_storage_restrictions (priv->settings) &
+        TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS))
     {
       GtkWidget *hbox = gtk_hbox_new (TRUE, 3);
       GtkWidget *image;
@@ -1827,8 +1939,6 @@ do_constructed (GObject *obj)
         account_widget_set_control_buttons_sensitivity (self, FALSE);
     }
 
-  account = empathy_account_settings_get_account (priv->settings);
-
   if (account != NULL)
     {
       g_signal_connect (account, "notify::enabled",
@@ -1838,15 +1948,22 @@ do_constructed (GObject *obj)
 #ifndef HAVE_MEEGO
   add_register_buttons (self, account);
 #endif /* HAVE_MEEGO */
-  add_enable_checkbox (self, account);
+
+  /* add the Enable checkbox to accounts that support it */
+  if (!(empathy_account_settings_get_storage_restrictions (priv->settings) &
+      TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED))
+    add_enable_checkbox (self, account);
 
   /* hook up to widget destruction to unref ourselves */
   g_signal_connect (self->ui_details->widget, "destroy",
       G_CALLBACK (account_widget_destroy_cb), self);
 
-  empathy_builder_unref_and_keep_widget (self->ui_details->gui,
-      self->ui_details->widget);
-  self->ui_details->gui = NULL;
+  if (self->ui_details->gui != NULL)
+    {
+      empathy_builder_unref_and_keep_widget (self->ui_details->gui,
+          self->ui_details->widget);
+      self->ui_details->gui = NULL;
+    }
 
   display_name = empathy_account_settings_get_display_name (priv->settings);
   default_display_name = empathy_account_widget_get_default_display_name (self);
index 29ff3f1b786d0698d35641e6d397363498a32e3a..1f0d35cb8ab45ccc26fca236702261a58e22384d 100644 (file)
@@ -76,6 +76,13 @@ struct _EmpathyAccountSettingsPriv
   gulong managers_ready_id;
 
   GSimpleAsyncResult *apply_result;
+
+  gboolean storage;
+  gboolean attempted_storage_properties;
+  gchar *storage_provider;
+  GValue *storage_identifier;
+  GHashTable *storage_specific_information;
+  TpStorageRestrictionFlags storage_restrictions;
 };
 
 static void
@@ -104,6 +111,9 @@ static void empathy_account_settings_managers_ready_cb (GObject *obj,
     GParamSpec *pspec, gpointer user_data);
 static void empathy_account_settings_check_readyness (
     EmpathyAccountSettings *self);
+static void empathy_account_settings_got_account_storage (TpProxy *account,
+    GHashTable *properties, const GError *error, gpointer user_data,
+    GObject *object);
 
 static void
 empathy_account_settings_set_property (GObject *object,
@@ -214,6 +224,15 @@ empathy_account_settings_constructed (GObject *object)
           empathy_account_settings_account_ready_cb, self);
       tp_g_signal_connect_object (priv->managers, "notify::ready",
         G_CALLBACK (empathy_account_settings_managers_ready_cb), object, 0);
+
+      priv->storage = tp_proxy_has_interface_by_id (priv->account,
+          TP_IFACE_QUARK_ACCOUNT_INTERFACE_STORAGE);
+
+      if (priv->storage)
+        tp_cli_dbus_properties_call_get_all (priv->account, -1,
+            TP_IFACE_ACCOUNT_INTERFACE_STORAGE,
+            empathy_account_settings_got_account_storage,
+            NULL, NULL, object);
     }
 
   if (G_OBJECT_CLASS (
@@ -350,6 +369,13 @@ empathy_account_settings_finalize (GObject *object)
   g_free (priv->service);
   g_free (priv->display_name);
   g_free (priv->icon_name);
+  g_free (priv->storage_provider);
+
+  if (priv->storage_identifier != NULL)
+    tp_g_value_slice_free (priv->storage_identifier);
+
+  if (priv->storage_specific_information != NULL)
+    g_hash_table_unref (priv->storage_specific_information);
 
   if (priv->required_params != NULL)
     g_array_free (priv->required_params, TRUE);
@@ -421,6 +447,9 @@ empathy_account_settings_check_readyness (EmpathyAccountSettings *self)
         }
     }
 
+  if (priv->storage && !priv->attempted_storage_properties)
+    return;
+
   g_object_ref (priv->manager);
 
   priv->ready = TRUE;
@@ -456,6 +485,43 @@ empathy_account_settings_managers_ready_cb (GObject *object,
   empathy_account_settings_check_readyness (settings);
 }
 
+static void
+empathy_account_settings_got_account_storage (TpProxy *account,
+    GHashTable *properties,
+    const GError *error,
+    gpointer user_data,
+    GObject *object)
+{
+  EmpathyAccountSettingsPriv *priv = GET_PRIV (object);
+
+  priv->attempted_storage_properties = TRUE;
+
+  if (error != NULL)
+    {
+      DEBUG ("Failed to get Account.Iface.Storage properties: %s",
+          error->message);
+      return;
+    }
+
+  /* Note to the unwary, GetAll() does not returned fully-qualified property
+   * names as is common for Telepathy APIs */
+  priv->storage_provider = g_strdup (tp_asv_get_string (properties,
+        "StorageProvider"));
+
+  if (!EMP_STR_EMPTY (priv->storage_provider))
+    {
+      priv->storage_identifier = tp_g_value_slice_dup (
+          tp_asv_lookup (properties, "StorageIdentifier"));
+      priv->storage_specific_information = g_hash_table_ref (
+          tp_asv_get_boxed (properties, "StorageSpecificInformation",
+            TP_HASH_TYPE_QUALIFIED_PROPERTY_VALUE_MAP));
+      priv->storage_restrictions = tp_asv_get_uint32 (properties,
+          "StorageRestrictions", NULL);
+    }
+
+  empathy_account_settings_check_readyness (EMPATHY_ACCOUNT_SETTINGS (object));
+}
+
 EmpathyAccountSettings *
 empathy_account_settings_new (const gchar *connection_manager,
     const gchar *protocol,
@@ -1384,3 +1450,29 @@ empathy_account_settings_get_tp_protocol (EmpathyAccountSettings *self)
 
   return tp_connection_manager_get_protocol (priv->manager, priv->protocol);
 }
+
+const char *
+empathy_account_settings_get_storage_provider (EmpathyAccountSettings *self)
+{
+  return GET_PRIV (self)->storage_provider;
+}
+
+const GValue *
+empathy_account_settings_get_storage_identifier (EmpathyAccountSettings *self)
+{
+  return GET_PRIV (self)->storage_identifier;
+}
+
+GHashTable *
+empathy_account_settings_get_storage_specific_information (
+    EmpathyAccountSettings *self)
+{
+  return GET_PRIV (self)->storage_specific_information;
+}
+
+TpStorageRestrictionFlags
+empathy_account_settings_get_storage_restrictions (
+    EmpathyAccountSettings *self)
+{
+  return GET_PRIV (self)->storage_restrictions;
+}
index d3276e1a5d31cb5d8f559ce77a30b4bc411bf349..1ce3f53c075155d5d31c6df7ec9d63d819d44c05 100644 (file)
@@ -181,6 +181,16 @@ gboolean empathy_account_settings_is_valid (EmpathyAccountSettings *settings);
 const TpConnectionManagerProtocol * empathy_account_settings_get_tp_protocol (
     EmpathyAccountSettings *settings);
 
+const gchar *empathy_account_settings_get_storage_provider (
+    EmpathyAccountSettings *self);
+const GValue *empathy_account_settings_get_storage_identifier (
+    EmpathyAccountSettings *self);
+GHashTable *empathy_account_settings_get_storage_specific_information (
+    EmpathyAccountSettings *self);
+TpStorageRestrictionFlags empathy_account_settings_get_storage_restrictions (
+    EmpathyAccountSettings *self);
+
+
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_ACCOUNT_SETTINGS_H__*/