aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-12-19 19:39:01 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-12-22 17:46:19 +0800
commit4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e (patch)
tree0d960eddff976b27019394ddbf8ab99bf27fa4b8
parentea82d4be5876f8adb5d958359019d76b65669841 (diff)
downloadgsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar.gz
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar.bz2
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar.lz
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar.xz
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.tar.zst
gsoc2013-empathy-4ac8b47ea3be8a91f2ccc1c0a49aaa69e4aaed9e.zip
properly handle accounts using an external storage
-rw-r--r--libempathy-gtk/empathy-account-widget.c228
-rw-r--r--src/empathy-accounts-dialog.c112
2 files changed, 129 insertions, 211 deletions
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index abfda9f8f..71a08a983 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -1089,175 +1089,6 @@ account_widget_build_generic (EmpathyAccountWidget *self,
}
static void
-account_widget_launch_external_clicked (GtkWidget *button,
- TpAccount *account)
-{
- GdkAppLaunchContext *context = NULL;
- GdkDisplay *display;
- GAppInfo *app_info;
- GError *error = NULL;
-
- app_info = g_object_get_data (G_OBJECT (button), "app-info");
-
- g_return_if_fail (G_IS_APP_INFO (app_info));
-
- display = gdk_display_get_default ();
- context = gdk_display_get_app_launch_context (display);
-
- if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
- &error))
- {
- g_critical ("Failed to bisho: %s", error->message);
- g_clear_error (&error);
- }
-}
-
-static void
-account_widget_launch_external_clicked_meego (GtkWidget *button,
- TpAccount *account)
-{
- if (!tp_strdiff (tp_account_get_storage_provider (account),
- "com.meego.libsocialweb"))
- {
- /* we know how to handle this external provider */
- GDesktopAppInfo *desktop_info;
- GError *error = NULL;
- GdkAppLaunchContext *context = NULL;
- GdkDisplay *display;
- gchar *cmd;
- GAppInfo *app_info;
-
- desktop_info = g_desktop_app_info_new ("gnome-control-center.desktop");
- if (desktop_info == NULL)
- {
- g_critical ("Could not locate 'gnome-control-center.desktop'");
- return;
- }
-
- /* glib doesn't have API to start a desktop file with args... (#637875) */
- cmd = g_strdup_printf ("%s bisho.desktop", g_app_info_get_commandline (
- (GAppInfo *) desktop_info));
-
- app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error);
- g_free (cmd);
-
- if (app_info == NULL)
- {
- DEBUG ("Failed to create app info: %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- display = gdk_display_get_default ();
- context = gdk_display_get_app_launch_context (display);
-
- if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
- &error))
- {
- g_critical ("Failed to bisho: %s", error->message);
- g_clear_error (&error);
- }
-
-out:
- g_object_unref (desktop_info);
- tp_clear_object (&app_info);
- tp_clear_object (&context);
- }
-}
-
-static void
-account_widget_build_external (EmpathyAccountWidget *self,
- EmpathyAccountSettings *settings)
-{
- EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
- TpAccount *account = empathy_account_settings_get_account (settings);
- GtkWidget *bar, *widget;
- gchar *str;
- const gchar *provider, *name = NULL;
- GDesktopAppInfo *desktop_info = NULL;
-
- self->ui_details->widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- priv->grid_common_settings = gtk_grid_new ();
-
- provider = tp_account_get_storage_provider (account);
-
- if (!tp_strdiff (provider, "com.meego.libsocialweb"))
- {
- name = _("My Web Accounts");
- }
- else if (!tp_strdiff (provider, "org.gnome.OnlineAccounts"))
- {
- /* FIXME: we should publish the .desktop file in some general way */
- desktop_info = g_desktop_app_info_new (
- "gnome-online-accounts-panel.desktop");
-
- if (desktop_info == NULL)
- g_critical ("Could not locate 'gnome-online-accounts-panel.desktop'");
- else
- name = g_app_info_get_name (G_APP_INFO (desktop_info));
- }
-
- if (name != NULL)
- {
- str = g_strdup_printf (
- _("The account %s is edited via %s."),
- empathy_account_settings_get_display_name (settings), name);
- }
- 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);
-
- if (!tp_strdiff (provider, "com.meego.libsocialweb"))
- {
- /* we know how to handle this external provider */
- 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_meego), account);
- }
- else if (desktop_info != NULL)
- {
- /* general handler */
- str = g_strdup_printf (_("Edit %s"), name);
-
- widget = gtk_info_bar_add_button (GTK_INFO_BAR (bar),
- str, RESPONSE_LAUNCH);
-
- g_object_set_data_full (G_OBJECT (widget), "app-info",
- g_object_ref (desktop_info), g_object_unref);
-
- g_signal_connect (widget, "clicked",
- G_CALLBACK (account_widget_launch_external_clicked), account);
-
- g_free (str);
- }
-
- 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->grid_common_settings, FALSE, TRUE, 0);
-
- gtk_widget_show_all (self->ui_details->widget);
-
- tp_clear_object (&desktop_info);
-}
-
-static void
account_widget_build_salut (EmpathyAccountWidget *self,
const char *filename)
{
@@ -2067,7 +1898,6 @@ do_constructed (GObject *obj)
EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
TpAccount *account;
- TpStorageRestrictionFlags storage_restrictions;
const gchar *display_name, *default_display_name;
guint i = 0;
struct {
@@ -2087,51 +1917,35 @@ do_constructed (GObject *obj)
WIDGET (idle, irc),
WIDGET (sofiasip, sip),
};
+ const gchar *protocol, *cm_name;
account = empathy_account_settings_get_account (priv->settings);
- if (account != NULL)
- storage_restrictions = tp_account_get_storage_restrictions (account);
- else
- storage_restrictions = 0;
-
- /* Empathy can only edit accounts without the Cannot_Set_Parameters flag */
- if (storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS)
- {
- DEBUG ("Account is provided by an external storage provider");
+ cm_name = empathy_account_settings_get_cm (priv->settings);
+ protocol = empathy_account_settings_get_protocol (priv->settings);
- account_widget_build_external (self, priv->settings);
- }
- else
+ for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
{
- 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++)
+ if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
+ !tp_strdiff (widgets[i].protocol, protocol))
{
- if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
- !tp_strdiff (widgets[i].protocol, protocol))
- {
- gchar *filename;
+ 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 */
@@ -2190,9 +2004,7 @@ do_constructed (GObject *obj)
account_manager_ready_cb, self);
/* handle apply and cancel button */
- if (!priv->simple &&
- !(storage_restrictions &
- TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS))
+ if (!priv->simple)
{
GtkWidget *hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
diff --git a/src/empathy-accounts-dialog.c b/src/empathy-accounts-dialog.c
index d7b16edf2..0eb3a2a1f 100644
--- a/src/empathy-accounts-dialog.c
+++ b/src/empathy-accounts-dialog.c
@@ -32,6 +32,7 @@
#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
#include <dbus/dbus-glib.h>
+#include <gio/gdesktopappinfo.h>
#include <telepathy-glib/account-manager.h>
#include <telepathy-glib/defs.h>
@@ -595,12 +596,118 @@ account_dialog_create_edit_params_dialog (EmpathyAccountsDialog *dialog)
}
static void
+start_external_app (GAppInfo *app_info)
+{
+ GError *error = NULL;
+ GdkAppLaunchContext *context = NULL;
+ GdkDisplay *display;
+
+ display = gdk_display_get_default ();
+ context = gdk_display_get_app_launch_context (display);
+
+ if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
+ &error))
+ {
+ g_critical ("Failed to bisho: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ tp_clear_object (&context);
+}
+
+static void
+use_external_storage_provider (EmpathyAccountsDialog *self,
+ TpAccount *account)
+{
+ const gchar *provider;
+
+ provider = tp_account_get_storage_provider (account);
+ if (!tp_strdiff (provider, "com.meego.libsocialweb"))
+ {
+ GDesktopAppInfo *desktop_info;
+ gchar *cmd;
+ GAppInfo *app_info;
+ GError *error = NULL;
+
+ desktop_info = g_desktop_app_info_new ("gnome-control-center.desktop");
+ if (desktop_info == NULL)
+ {
+ g_critical ("Could not locate 'gnome-control-center.desktop'");
+ return;
+ }
+
+ /* glib doesn't have API to start a desktop file with args... (#637875) */
+ cmd = g_strdup_printf ("%s bisho.desktop", g_app_info_get_commandline (
+ (GAppInfo *) desktop_info));
+
+ app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error);
+
+ if (app_info == NULL)
+ {
+ DEBUG ("Failed to create app info: %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ start_external_app (app_info);
+ g_object_unref (app_info);
+ }
+
+ g_object_unref (desktop_info);
+ g_free (cmd);
+ return;
+ }
+ else if (!tp_strdiff (provider, "org.gnome.OnlineAccounts"))
+ {
+ GDesktopAppInfo *desktop_info;
+
+ desktop_info = g_desktop_app_info_new (
+ "gnome-online-accounts-panel.desktop");
+ if (desktop_info == NULL)
+ {
+ g_critical ("Could not locate 'gnome-online-accounts-panel.desktop'");
+ }
+ else
+ {
+ start_external_app (G_APP_INFO (desktop_info));
+ g_object_unref (desktop_info);
+ }
+
+ return;
+ }
+ else
+ {
+ DEBUG ("Don't know how to handle %s", provider);
+ return;
+ }
+}
+
+static void
account_dialow_show_edit_params_dialog (EmpathyAccountsDialog *dialog,
GtkButton *button)
{
- DEBUG ("clicked");
+ EmpathyAccountSettings *settings;
+ TpAccount *account;
+ TpStorageRestrictionFlags storage_restrictions;
- account_dialog_create_edit_params_dialog (dialog);
+ settings = accounts_dialog_model_get_selected_settings (dialog);
+
+ account = empathy_account_settings_get_account (settings);
+ g_return_if_fail (account != NULL);
+
+ storage_restrictions = tp_account_get_storage_restrictions (account);
+
+ /* Empathy can only edit accounts without the Cannot_Set_Parameters flag */
+ if (storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS)
+ {
+ DEBUG ("Account is provided by an external storage provider");
+
+ use_external_storage_provider (dialog, account);
+ }
+ else
+ {
+ account_dialog_create_edit_params_dialog (dialog);
+ }
}
static void
@@ -702,7 +809,6 @@ account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
gtk_box_pack_end (GTK_BOX (priv->dialog_content), bbox, FALSE, TRUE, 0);
gtk_widget_show (bbox);
- /* FIXME: make this handle external accounts */
button = gtk_button_new_with_mnemonic (_("_Edit Connection Parameters..."));
gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0);
gtk_widget_show (button);