diff options
author | David Zeuthen <davidz@redhat.com> | 2011-05-20 15:55:07 -0400 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2011-05-20 15:55:07 -0400 |
commit | 1f2c074e3705b933784d09ca8b7b26762874b9aa (patch) | |
tree | 2f8079c5358f36faf48e349cb000b92ade545036 | |
parent | ee3381207ddc9dc8e42507f9357981adcec297d1 (diff) |
GoaProvider: Add a show_account vfunc and use it
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r-- | data/dbus-interfaces.xml | 7 | ||||
-rw-r--r-- | doc/goa-sections.txt | 6 | ||||
-rw-r--r-- | src/goabackend/goafacebookprovider.c | 21 | ||||
-rw-r--r-- | src/goabackend/goagenericmailprovider.c | 29 | ||||
-rw-r--r-- | src/goabackend/goagoogleprovider.c | 23 | ||||
-rw-r--r-- | src/goabackend/goaprovider.c | 149 | ||||
-rw-r--r-- | src/goabackend/goaprovider.h | 16 | ||||
-rw-r--r-- | src/goabackend/goatwitterprovider.c | 22 | ||||
-rw-r--r-- | src/goabackend/goayahooprovider.c | 22 | ||||
-rw-r--r-- | src/panel/goapanel.c | 93 |
10 files changed, 297 insertions, 91 deletions
diff --git a/data/dbus-interfaces.xml b/data/dbus-interfaces.xml index e288ce1..f734e1a 100644 --- a/data/dbus-interfaces.xml +++ b/data/dbus-interfaces.xml @@ -325,6 +325,13 @@ <method name="CreateMonitor"> <arg name="monitor_object" type="o" direction="out"/> </method> + + <!-- EmailAddress: + The email address for the account or blank if there is no + such address or if it isnt' known or isn't in a standard + format. + --> + <property name="EmailAddress" type="s" access="read"/> </interface> <!-- diff --git a/doc/goa-sections.txt b/doc/goa-sections.txt index 7f62c67..f8a50f5 100644 --- a/doc/goa-sections.txt +++ b/doc/goa-sections.txt @@ -49,7 +49,6 @@ GoaObject GoaObjectIface goa_object_get_manager goa_object_get_account -goa_object_get_generic_mail_account goa_object_get_google_account goa_object_get_facebook_account goa_object_get_yahoo_account @@ -61,7 +60,6 @@ goa_object_get_mail goa_object_get_mail_monitor goa_object_peek_manager goa_object_peek_account -goa_object_peek_generic_mail_account goa_object_peek_google_account goa_object_peek_facebook_account goa_object_peek_yahoo_account @@ -79,7 +77,6 @@ GoaObjectSkeletonClass goa_object_skeleton_new goa_object_skeleton_set_manager goa_object_skeleton_set_account -goa_object_skeleton_set_generic_mail_account goa_object_skeleton_set_google_account goa_object_skeleton_set_facebook_account goa_object_skeleton_set_yahoo_account @@ -543,6 +540,7 @@ goa_provider_get_name goa_provider_build_object goa_provider_add_account goa_provider_refresh_account +goa_provider_show_account goa_provider_store_credentials_sync goa_provider_lookup_credentials_sync goa_provider_ensure_credentials @@ -672,6 +670,8 @@ goa_mail_call_create_monitor goa_mail_call_create_monitor_finish goa_mail_call_create_monitor_sync goa_mail_complete_create_monitor +goa_mail_get_email_address +goa_mail_set_email_address GoaMailProxy GoaMailProxyClass goa_mail_proxy_new diff --git a/src/goabackend/goafacebookprovider.c b/src/goabackend/goafacebookprovider.c index bf39d16..7a9c972 100644 --- a/src/goabackend/goafacebookprovider.c +++ b/src/goabackend/goafacebookprovider.c @@ -280,6 +280,26 @@ get_use_external_browser (GoaOAuth2Provider *provider) /* ---------------------------------------------------------------------------------------------------- */ static void +show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaFacebookAccount *fbaccount; + + /* Chain up */ + GOA_PROVIDER_CLASS (goa_facebook_provider_parent_class)->show_account (provider, client, object, vbox, table); + + fbaccount = goa_object_get_facebook_account (object); + goa_util_add_row (table, + _("User Name"), + goa_facebook_account_get_user_name (fbaccount)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void goa_facebook_provider_init (GoaFacebookProvider *client) { } @@ -294,6 +314,7 @@ goa_facebook_provider_class_init (GoaFacebookProviderClass *klass) provider_class->get_provider_type = get_provider_type; provider_class->get_name = get_name; provider_class->build_object = build_object; + provider_class->show_account = show_account; oauth2_class = GOA_OAUTH2_PROVIDER_CLASS (klass); oauth2_class->get_authorization_uri = get_authorization_uri; diff --git a/src/goabackend/goagenericmailprovider.c b/src/goabackend/goagenericmailprovider.c index 4078a32..a2ba39c 100644 --- a/src/goabackend/goagenericmailprovider.c +++ b/src/goabackend/goagenericmailprovider.c @@ -102,6 +102,7 @@ build_object (GoaProvider *provider, gboolean imap_ignore_bad_tls; gchar *imap_user_name; gchar *imap_password; + gchar *email_address; account = NULL; mail = NULL; @@ -109,6 +110,7 @@ build_object (GoaProvider *provider, imap_host_and_port = NULL; imap_user_name = NULL; imap_password = NULL; + email_address = NULL; ret = FALSE; /* Chain up */ @@ -122,6 +124,7 @@ build_object (GoaProvider *provider, account = goa_object_get_account (GOA_OBJECT (object)); /* mail */ + email_address = g_key_file_get_string (key_file, group, "EmailAddress", NULL); imap_host_and_port = g_key_file_get_string (key_file, group, "ImapHost", NULL); imap_use_tls = g_key_file_get_boolean (key_file, group, "ImapUseTls", NULL); imap_ignore_bad_tls = g_key_file_get_boolean (key_file, group, "ImapIgnoreBadTls", NULL); @@ -147,6 +150,8 @@ build_object (GoaProvider *provider, goa_object_skeleton_set_mail (object, NULL); } + /* TODO: support substitutions a'la ${USERNAME}@redhat.com for e.g. system-wide .conf files */ + goa_mail_set_email_address (mail, email_address); password_based = goa_object_get_password_based (GOA_OBJECT (object)); if (password_based == NULL) @@ -165,6 +170,7 @@ build_object (GoaProvider *provider, ret = TRUE; out: + g_free (email_address); if (password_based != NULL) g_object_unref (password_based); if (mail != NULL) @@ -754,6 +760,8 @@ add_account (GoaProvider *_provider, * waiting for this to complete */ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}")); + g_variant_builder_add (&builder, "{ss}", "EmailAddress", + gtk_entry_get_text (GTK_ENTRY (data.intro_address_entry))); g_variant_builder_add (&builder, "{ss}", "ImapHost", gtk_entry_get_text (GTK_ENTRY (data.imap_server_entry))); g_variant_builder_add (&builder, "{ss}", "ImapUserName", @@ -809,6 +817,26 @@ add_account (GoaProvider *_provider, /* ---------------------------------------------------------------------------------------------------- */ static void +show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaMail *mail; + + /* Chain up */ + GOA_PROVIDER_CLASS (goa_generic_mail_provider_parent_class)->show_account (provider, client, object, vbox, table); + + mail = goa_object_get_mail (object); + goa_util_add_row (table, + _("Email Address"), + goa_mail_get_email_address (mail)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void goa_generic_mail_provider_init (GoaGenericMailProvider *provider) { } @@ -823,6 +851,7 @@ goa_generic_mail_provider_class_init (GoaGenericMailProviderClass *klass) provider_class->get_name = get_name; provider_class->add_account = add_account; provider_class->build_object = build_object; + provider_class->show_account = show_account; provider_class->ensure_credentials_sync = ensure_credentials_sync; } diff --git a/src/goabackend/goagoogleprovider.c b/src/goabackend/goagoogleprovider.c index 6822d61..faf85a0 100644 --- a/src/goabackend/goagoogleprovider.c +++ b/src/goabackend/goagoogleprovider.c @@ -298,6 +298,8 @@ build_object (GoaProvider *provider, goa_object_skeleton_set_mail (object, mail); g_object_unref (auth); g_free (request_uri); + + goa_mail_set_email_address (mail, email_address); } ret = TRUE; @@ -324,6 +326,26 @@ get_use_external_browser (GoaOAuthProvider *provider) /* ---------------------------------------------------------------------------------------------------- */ static void +show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaGoogleAccount *gaccount; + + /* Chain up */ + GOA_PROVIDER_CLASS (goa_google_provider_parent_class)->show_account (provider, client, object, vbox, table); + + gaccount = goa_object_get_google_account (object); + goa_util_add_row (table, + _("Email Address"), + goa_google_account_get_email_address (gaccount)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void goa_google_provider_init (GoaGoogleProvider *client) { } @@ -338,6 +360,7 @@ goa_google_provider_class_init (GoaGoogleProviderClass *klass) provider_class->get_provider_type = get_provider_type; provider_class->get_name = get_name; provider_class->build_object = build_object; + provider_class->show_account = show_account; oauth_class = GOA_OAUTH_PROVIDER_CLASS (klass); oauth_class->get_identity_sync = get_identity_sync; diff --git a/src/goabackend/goaprovider.c b/src/goabackend/goaprovider.c index 8c2101e..e8fc210 100644 --- a/src/goabackend/goaprovider.c +++ b/src/goabackend/goaprovider.c @@ -31,6 +31,8 @@ #include "goatwitterprovider.h" #include "goagenericmailprovider.h" +#include "goaeditablelabel.h" + /** * SECTION:goaprovider * @title: GoaProvider @@ -51,6 +53,12 @@ static gboolean goa_provider_build_object_real (GoaProvider *provider, const gchar *group, GError **error); +static void goa_provider_show_account_real (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table); + G_DEFINE_ABSTRACT_TYPE (GoaProvider, goa_provider, G_TYPE_OBJECT); static void @@ -63,6 +71,7 @@ goa_provider_class_init (GoaProviderClass *klass) { klass->build_object = goa_provider_build_object_real; klass->ensure_credentials_sync = goa_provider_ensure_credentials_sync_real; + klass->show_account = goa_provider_show_account_real; } /** @@ -208,6 +217,146 @@ goa_provider_refresh_account (GoaProvider *provider, /* ---------------------------------------------------------------------------------------------------- */ /** + * goa_provider_show_account: + * @provider: A #GoaProvider. + * @client: A #GoaClient. + * @object: A #GoaObject with a #GoaAccount interface. + * @dialog: A #GtkDialog. + * @vbox: A vertically oriented #GtkBox to put content in. + * @table: A table which is the first element of vbox. + * + * Method used to add widgets in the control panel for the account + * represented by @object. + * + * This is a virtual method with an implementation that adds widgets + * for editing the name and the icon. A subclass should chain up + * (before adding their own widgets to @vbox and @table) if they want + * to expose such functionality. + */ +void +goa_provider_show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + g_return_if_fail (GOA_IS_PROVIDER (provider)); + g_return_if_fail (GOA_IS_CLIENT (client)); + g_return_if_fail (GOA_IS_OBJECT (object) && goa_object_peek_account (object) != NULL); + g_return_if_fail (GTK_IS_BOX (vbox)); + g_return_if_fail (GTK_IS_TABLE (table)); + + GOA_PROVIDER_GET_CLASS (provider)->show_account (provider, client, object, vbox, table); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * goa_util_add_row_widget: + * @table: A #GtkTable. + * @label_text: The text to insert on the left side. + * @widget: A widget to insert on the right side. + * + * Utility function to add @label_text and @widget to @table. + */ +void +goa_util_add_row_widget (GtkTable *table, + const gchar *label_text, + GtkWidget *widget) +{ + GtkWidget *label; + gchar *s; + guint num_rows; + + g_return_if_fail (GTK_IS_TABLE (table)); + g_return_if_fail (label_text != NULL); + g_return_if_fail (GTK_IS_WIDGET (widget)); + + s = g_strdup_printf ("<span foreground=\"#555555\">%s</span>", label_text); + + gtk_table_get_size (table, &num_rows, NULL); + + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), s); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (table, label, + 0, 1, + num_rows, num_rows + 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach (table, widget, + 1, 2, + num_rows, num_rows + 1, + GTK_FILL, GTK_FILL, 0, 0); + + g_free (s); +} + +/** + * goa_util_add_row: + * @table: A #GtkTable. + * @label_text: The text to insert on the left side. + * @value_markup: The markup to insert on the right side. + * + * Utility function to add @label_text and @value_text to @table. + */ +void +goa_util_add_row (GtkTable *table, + const gchar *label_text, + const gchar *value_markup) +{ + GtkWidget *label; + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), value_markup); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_selectable (GTK_LABEL (label), TRUE); + goa_util_add_row_widget (table, label_text, label); +} + +static void +on_name_editing_done (GoaEditableLabel *editable_label, + gpointer user_data) +{ + GoaObject *object = GOA_OBJECT (user_data); + GoaAccount *account; + + account = goa_object_peek_account (object); + goa_account_call_set_name (account, + goa_editable_label_get_text (editable_label), + NULL, /* GCancellable */ + NULL, NULL); /* callback, user_data */ +} + +static void +goa_provider_show_account_real (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaAccount *account; + GtkWidget *elabel; + guint num_rows; + + account = goa_object_peek_account (object); + + gtk_table_get_size (table, &num_rows, NULL); + + elabel = goa_editable_label_new (); + goa_editable_label_set_text (GOA_EDITABLE_LABEL (elabel), goa_account_get_name (account)); + goa_editable_label_set_editable (GOA_EDITABLE_LABEL (elabel), TRUE); + goa_editable_label_set_scale (GOA_EDITABLE_LABEL (elabel), 1.2); + goa_editable_label_set_weight (GOA_EDITABLE_LABEL (elabel), 700); + g_signal_connect (elabel, "editing-done", G_CALLBACK (on_name_editing_done), object); + + gtk_table_attach (table, elabel, + 1, 2, + num_rows, num_rows + 1, + GTK_FILL, GTK_FILL, 0, 0); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** * goa_provider_build_object: * @provider: A #GoaProvider. * @object: The #GoaObjectSkeleton that is being built. diff --git a/src/goabackend/goaprovider.h b/src/goabackend/goaprovider.h index d0b84de..454fbf5 100644 --- a/src/goabackend/goaprovider.h +++ b/src/goabackend/goaprovider.h @@ -95,6 +95,11 @@ struct _GoaProviderClass gint *out_expires_in, GCancellable *cancellable, GError **error); + void (*show_account) (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table); /*< private >*/ /* Padding for future expansion */ @@ -114,6 +119,11 @@ gboolean goa_provider_refresh_account (GoaProvider *provid GoaObject *object, GtkWindow *parent, GError **error); +void goa_provider_show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table); gboolean goa_provider_build_object (GoaProvider *provider, GoaObjectSkeleton *object, GKeyFile *key_file, @@ -143,6 +153,12 @@ gboolean goa_provider_ensure_credentials_sync (GoaProvider *provid GCancellable *cancellable, GError **error); +void goa_util_add_row_widget (GtkTable *table, + const gchar *label_text, + GtkWidget *widget); +void goa_util_add_row (GtkTable *table, + const gchar *label_text, + const gchar *value_markup); /** * GOA_PROVIDER_EXTENSION_POINT_NAME: diff --git a/src/goabackend/goatwitterprovider.c b/src/goabackend/goatwitterprovider.c index 48c16aa..12c1fe4 100644 --- a/src/goabackend/goatwitterprovider.c +++ b/src/goabackend/goatwitterprovider.c @@ -304,6 +304,27 @@ get_use_external_browser (GoaOAuthProvider *provider) /* ---------------------------------------------------------------------------------------------------- */ static void +show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaTwitterAccount *taccount; + + /* Chain up */ + GOA_PROVIDER_CLASS (goa_twitter_provider_parent_class)->show_account (provider, client, object, vbox, table); + + /* TODO: look up screenname */ + taccount = goa_object_get_twitter_account (object); + goa_util_add_row (table, + _("Account Number"), + goa_twitter_account_get_id (taccount)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void goa_twitter_provider_init (GoaTwitterProvider *client) { } @@ -318,6 +339,7 @@ goa_twitter_provider_class_init (GoaTwitterProviderClass *klass) provider_class->get_provider_type = get_provider_type; provider_class->get_name = get_name; provider_class->build_object = build_object; + provider_class->show_account = show_account; oauth_class = GOA_OAUTH_PROVIDER_CLASS (klass); oauth_class->get_identity_sync = get_identity_sync; diff --git a/src/goabackend/goayahooprovider.c b/src/goabackend/goayahooprovider.c index 604fc89..d001ee6 100644 --- a/src/goabackend/goayahooprovider.c +++ b/src/goabackend/goayahooprovider.c @@ -342,6 +342,27 @@ get_use_external_browser (GoaOAuthProvider *provider) /* ---------------------------------------------------------------------------------------------------- */ static void +show_account (GoaProvider *provider, + GoaClient *client, + GoaObject *object, + GtkBox *vbox, + GtkTable *table) +{ + GoaYahooAccount *taccount; + + /* Chain up */ + GOA_PROVIDER_CLASS (goa_yahoo_provider_parent_class)->show_account (provider, client, object, vbox, table); + + /* TODO: look up email address / screenname */ + taccount = goa_object_get_yahoo_account (object); + goa_util_add_row (table, + _("GUID"), + goa_yahoo_account_get_guid (taccount)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void goa_yahoo_provider_init (GoaYahooProvider *client) { } @@ -356,6 +377,7 @@ goa_yahoo_provider_class_init (GoaYahooProviderClass *klass) provider_class->get_provider_type = get_provider_type; provider_class->get_name = get_name; provider_class->build_object = build_object; + provider_class->show_account = show_account; oauth_class = GOA_OAUTH_PROVIDER_CLASS (klass); oauth_class->get_identity_sync = get_identity_sync; diff --git a/src/panel/goapanel.c b/src/panel/goapanel.c index 0c4f38d..22265a4 100644 --- a/src/panel/goapanel.c +++ b/src/panel/goapanel.c @@ -262,28 +262,6 @@ show_page_nothing_selected (GoaPanel *panel) } static void -add_row (GtkWidget *table, - guint row, - const gchar *key, - const gchar *value) -{ - GtkWidget *label; - - label = gtk_label_new (key); - gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, - 0, 1, - row, row + 1, - GTK_FILL, GTK_FILL, 0, 0); - label = gtk_label_new (value); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, - 1, 2, - row, row + 1, - GTK_FILL, GTK_FILL, 0, 0); -} - -static void on_info_bar_response (GtkInfoBar *info_bar, gint response_id, gpointer user_data) @@ -343,33 +321,6 @@ on_info_bar_response (GtkInfoBar *info_bar, } static void -on_name_editing_done (GoaEditableLabel *editable_label, - gpointer user_data) -{ - GoaPanel *panel = GOA_PANEL (user_data); - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (panel->accounts_treeview)), - NULL, - &iter)) - { - GoaObject *object; - GoaAccount *account; - - gtk_tree_model_get (GTK_TREE_MODEL (panel->accounts_model), - &iter, - GOA_PANEL_ACCOUNTS_MODEL_COLUMN_OBJECT, &object, - -1); - - account = goa_object_peek_account (object); - goa_account_call_set_name (account, - goa_editable_label_get_text (editable_label), - NULL, /* GCancellable */ - NULL, NULL); /* callback, user_data */ - } -} - -static void show_page_account (GoaPanel *panel, GoaObject *object) { @@ -378,16 +329,10 @@ show_page_account (GoaPanel *panel, GtkWidget *table; GtkWidget *bar; GtkWidget *label; - GtkWidget *editable_label; - guint row; GoaProvider *provider; GoaAccount *account; - GoaGoogleAccount *gaccount; - GoaFacebookAccount *fbaccount; const gchar *provider_type; - gchar *s; - row = 0; provider = NULL; show_page (panel, 1); @@ -399,8 +344,6 @@ show_page_account (GoaPanel *panel, g_list_free (children); account = goa_object_peek_account (object); - gaccount = goa_object_peek_google_account (object); - fbaccount = goa_object_peek_facebook_account (object); provider_type = goa_account_get_provider_type (account); provider = goa_provider_get_for_provider_type (provider_type); @@ -421,39 +364,13 @@ show_page_account (GoaPanel *panel, gtk_table_set_col_spacings (GTK_TABLE (table), 10); gtk_box_pack_start (GTK_BOX (panel->accounts_vbox), table, FALSE, TRUE, 0); - editable_label = goa_editable_label_new (); - goa_editable_label_set_text (GOA_EDITABLE_LABEL (editable_label), goa_account_get_name (account)); - goa_editable_label_set_editable (GOA_EDITABLE_LABEL (editable_label), TRUE); - goa_editable_label_set_scale (GOA_EDITABLE_LABEL (editable_label), 1.2); - goa_editable_label_set_weight (GOA_EDITABLE_LABEL (editable_label), 700); - g_signal_connect (editable_label, "editing-done", G_CALLBACK (on_name_editing_done), panel); - gtk_table_attach (GTK_TABLE (table), editable_label, - 1, 2, - row, row + 1, - GTK_FILL, GTK_FILL, 0, 0); - row++; - if (provider != NULL) { - s = g_strdup (goa_provider_get_name (provider)); - } - else - { - /* Translators: Shown as "Account Type" when the UI doesn't support the provider type. - * The %s is the provider type (e.g. 'google'). - */ - s = g_strdup_printf (_("%s (Unsupported)"), provider_type); - } - add_row (table, row++, _("Account Type"), s); - g_free (s); - - if (gaccount != NULL) - { - add_row (table, row++, _("Email Address"), goa_google_account_get_email_address (gaccount)); - } - if (fbaccount != NULL) - { - add_row (table, row++, _("User Name"), goa_facebook_account_get_user_name (fbaccount)); + goa_provider_show_account (provider, + panel->client, + object, + GTK_BOX (panel->accounts_vbox), + GTK_TABLE (table)); } gtk_widget_show_all (panel->accounts_vbox); |