[gnome-control-center] online-accounts: Accept requests for account creation on DBus/cmdline
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] online-accounts: Accept requests for account creation on DBus/cmdline
- Date: Tue, 23 Apr 2013 16:33:09 +0000 (UTC)
commit 8762e2f8dc16e169986be7d6630e0814834c5d15
Author: Emanuele Aina <emanuele aina collabora com>
Date: Fri Mar 1 12:11:14 2013 +0100
online-accounts: Accept requests for account creation on DBus/cmdline
Also accepts additional data to pre-seed the GOA dialog, in particular
the provider name (eg. 'google') and provider-specific data encoded in a
a GVariant dict ('a{sv}') to eg. pass cookies from an existing web
session (this is only available from DBus activation).
It can be run from the command line as:
$ gnome-control-center online-accounts add google
https://bugzilla.gnome.org/show_bug.cgi?id=694315
.../cc-online-accounts-add-account-dialog.c | 33 ++++++++-
.../cc-online-accounts-add-account-dialog.h | 4 +
panels/online-accounts/cc-online-accounts-panel.c | 81 ++++++++++++++++----
3 files changed, 101 insertions(+), 17 deletions(-)
---
diff --git a/panels/online-accounts/cc-online-accounts-add-account-dialog.c
b/panels/online-accounts/cc-online-accounts-add-account-dialog.c
index 5c2e9c8..c0b0e0b 100644
--- a/panels/online-accounts/cc-online-accounts-add-account-dialog.c
+++ b/panels/online-accounts/cc-online-accounts-add-account-dialog.c
@@ -45,6 +45,7 @@ struct _GoaPanelAddAccountDialogPrivate
GError *error;
GoaClient *client;
GoaObject *object;
+ GoaProvider *provider;
GtkListStore *list_store;
GtkWidget *contacts_grid;
GtkWidget *mail_grid;
@@ -72,7 +73,8 @@ enum
G_DEFINE_TYPE (GoaPanelAddAccountDialog, goa_panel_add_account_dialog, GTK_TYPE_DIALOG)
static void
-add_account_dialog_add_account (GoaPanelAddAccountDialog *add_account, GoaProvider *provider)
+add_account_dialog_add_account (GoaPanelAddAccountDialog *add_account,
+ GoaProvider *provider)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GList *children;
@@ -91,6 +93,7 @@ add_account_dialog_add_account (GoaPanelAddAccountDialog *add_account, GoaProvid
}
g_list_free (children);
+ /* This spins gtk_dialog_run() */
priv->object = goa_provider_add_account (provider,
priv->client,
GTK_DIALOG (add_account),
@@ -111,7 +114,6 @@ list_box_child_activated_cb (GoaPanelAddAccountDialog *add_account, GtkWidget *c
}
add_account_dialog_add_account (add_account, provider);
- gtk_dialog_response (GTK_DIALOG (add_account), GTK_RESPONSE_OK);
}
static void
@@ -240,6 +242,7 @@ goa_panel_add_account_dialog_dispose (GObject *object)
g_clear_object (&priv->object);
g_clear_object (&priv->client);
+ g_clear_object (&priv->provider);
G_OBJECT_CLASS (goa_panel_add_account_dialog_parent_class)->dispose (object);
}
@@ -378,6 +381,22 @@ goa_panel_add_account_dialog_new (GoaClient *client)
}
void
+goa_panel_add_account_dialog_set_preseed_data (GoaPanelAddAccountDialog *add_account,
+ GoaProvider *provider,
+ GVariant *preseed)
+{
+ GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
+
+ g_clear_object (&priv->provider);
+
+ if (provider != NULL)
+ {
+ priv->provider = g_object_ref (provider);
+ goa_provider_set_preseed_data (provider, preseed);
+ }
+}
+
+void
goa_panel_add_account_dialog_add_provider (GoaPanelAddAccountDialog *add_account, GoaProvider *provider)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
@@ -431,6 +450,16 @@ goa_panel_add_account_dialog_add_provider (GoaPanelAddAccountDialog *add_account
}
}
+void
+goa_panel_add_account_dialog_run (GoaPanelAddAccountDialog *add_account)
+{
+ GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
+ if (priv->provider != NULL)
+ add_account_dialog_add_account (add_account, priv->provider);
+ else
+ gtk_dialog_run (GTK_DIALOG (add_account));
+}
+
GoaObject *
goa_panel_add_account_dialog_get_account (GoaPanelAddAccountDialog *add_account, GError **error)
{
diff --git a/panels/online-accounts/cc-online-accounts-add-account-dialog.h
b/panels/online-accounts/cc-online-accounts-add-account-dialog.h
index 0f503cb..9338575 100644
--- a/panels/online-accounts/cc-online-accounts-add-account-dialog.h
+++ b/panels/online-accounts/cc-online-accounts-add-account-dialog.h
@@ -54,6 +54,10 @@ GType goa_panel_add_account_dialog_get_type (void
GtkWidget *goa_panel_add_account_dialog_new (GoaClient *client);
void goa_panel_add_account_dialog_add_provider (GoaPanelAddAccountDialog
*add_account,
GoaProvider
*provider);
+void goa_panel_add_account_dialog_set_preseed_data (GoaPanelAddAccountDialog
*add_account,
+ GoaProvider
*provider,
+ GVariant
*preseed);
+void goa_panel_add_account_dialog_run (GoaPanelAddAccountDialog
*add_account);
GoaObject *goa_panel_add_account_dialog_get_account (GoaPanelAddAccountDialog
*add_account,
GError
**error);
diff --git a/panels/online-accounts/cc-online-accounts-panel.c
b/panels/online-accounts/cc-online-accounts-panel.c
index 52fb054..acaff10 100644
--- a/panels/online-accounts/cc-online-accounts-panel.c
+++ b/panels/online-accounts/cc-online-accounts-panel.c
@@ -86,6 +86,9 @@ static void on_account_changed (GoaClient *client,
static gboolean select_account_by_id (CcGoaPanel *panel,
const gchar *account_id);
+static void add_account (CcGoaPanel *panel,
+ GoaProvider *provider,
+ GVariant *preseed);
CC_PANEL_REGISTER (CcGoaPanel, cc_goa_panel);
@@ -95,6 +98,56 @@ enum {
};
static void
+command_add (CcGoaPanel *panel,
+ GVariant *parameters)
+{
+ GVariant *v, *preseed = NULL;
+ GoaProvider *provider = NULL;
+ const gchar *provider_name = NULL;
+
+ g_assert (panel != NULL);
+ g_assert (parameters != NULL);
+
+ switch (g_variant_n_children (parameters))
+ {
+ case 4:
+ g_variant_get_child (parameters, 3, "v", &preseed);
+ case 3:
+ g_variant_get_child (parameters, 2, "v", &v);
+ if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING))
+ provider_name = g_variant_get_string (v, NULL);
+ else
+ g_warning ("Wrong type for the second argument (provider name) GVariant, expected 's' but got
'%s'",
+ (gchar *)g_variant_get_type (v));
+ g_variant_unref (v);
+ case 2:
+ /* Nothing to see here, move along */
+ case 1:
+ /* No flag to handle here */
+ break;
+ default:
+ g_warning ("Unexpected parameters found, ignore request");
+ goto out;
+ }
+
+ if (provider_name != NULL)
+ {
+ provider = goa_provider_get_for_provider_type (provider_name);
+ if (provider == NULL)
+ {
+ g_warning ("Unable to get a provider for type '%s'", provider_name);
+ goto out;
+ }
+ }
+
+ add_account (panel, provider, preseed);
+
+out:
+ g_clear_object (&provider);
+ g_clear_pointer (&preseed, g_variant_unref);
+}
+
+static void
cc_goa_panel_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -122,7 +175,9 @@ cc_goa_panel_set_property (GObject *object,
g_variant_unref (v);
}
- if (first_arg != NULL)
+ if (g_strcmp0 (first_arg, "add") == 0)
+ command_add (CC_GOA_PANEL (object), parameters);
+ else if (first_arg != NULL)
select_account_by_id (CC_GOA_PANEL (object), first_arg);
return;
@@ -628,18 +683,17 @@ on_model_row_inserted (GtkTreeModel *tree_model,
/* ---------------------------------------------------------------------------------------------------- */
static void
-add_account (CcGoaPanel *panel)
+add_account (CcGoaPanel *panel,
+ GoaProvider *provider,
+ GVariant *preseed)
{
GtkWindow *parent;
GtkWidget *dialog;
- gint response;
GList *providers;
GList *l;
GoaObject *object;
GError *error;
- providers = NULL;
-
parent = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (panel))));
dialog = goa_panel_add_account_dialog_new (panel->client);
@@ -649,18 +703,16 @@ add_account (CcGoaPanel *panel)
for (l = providers; l != NULL; l = l->next)
{
GoaProvider *provider;
-
provider = GOA_PROVIDER (l->data);
+
goa_panel_add_account_dialog_add_provider (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog), provider);
}
+ goa_panel_add_account_dialog_set_preseed_data (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog),
+ provider, preseed);
+
gtk_widget_show_all (dialog);
- response = gtk_dialog_run (GTK_DIALOG (dialog));
- if (response != GTK_RESPONSE_OK)
- {
- gtk_widget_destroy (dialog);
- goto out;
- }
+ goa_panel_add_account_dialog_run (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog));
error = NULL;
object = goa_panel_add_account_dialog_get_account (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog), &error);
@@ -703,7 +755,6 @@ add_account (CcGoaPanel *panel)
g_error_free (error);
}
- out:
g_list_free_full (providers, g_object_unref);
}
@@ -714,7 +765,7 @@ on_toolbar_add_button_clicked (GtkToolButton *button,
gpointer user_data)
{
CcGoaPanel *panel = CC_GOA_PANEL (user_data);
- add_account (panel);
+ add_account (panel, NULL, NULL);
}
static void
@@ -795,5 +846,5 @@ on_add_button_clicked (GtkButton *button,
gpointer user_data)
{
CcGoaPanel *panel = CC_GOA_PANEL (user_data);
- add_account (panel);
+ add_account (panel, NULL, NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]