diff options
Diffstat (limited to 'mail/em-account-editor.c')
-rw-r--r-- | mail/em-account-editor.c | 5834 |
1 files changed, 0 insertions, 5834 deletions
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c deleted file mode 100644 index 8919c0cef4..0000000000 --- a/mail/em-account-editor.c +++ /dev/null @@ -1,5834 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Dan Winship <danw@ximian.com> - * Jeffrey Stedfast <fejj@ximian.com> - * Michael Zucchi <notzed@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -/* - * work before merge can occur: - * - * verify behaviour. - * work out what to do with the startup assistant. - * - * also need to work out: - * how to remove unecessary items from a service url once - * configured (removing settings from other types). - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <glib/gi18n.h> -#include <glib/gstdio.h> - -#include <string.h> -#include <stdarg.h> - -#include <libedataserverui/e-client-utils.h> -#include <libedataserverui/e-passwords.h> - -#include <shell/e-shell.h> - -#include <e-util/e-util.h> -#include <libevolution-utils/e-alert-dialog.h> -#include <e-util/e-dialog-utils.h> -#include <e-util/e-util-private.h> - -#include <libemail-utils/e-account-utils.h> -#include <libemail-utils/e-signature-list.h> -#include <libemail-utils/e-signature-utils.h> -#include <libemail-utils/mail-mt.h> - -#include <libemail-engine/e-mail-folder-utils.h> -#include <libemail-engine/mail-ops.h> - -#include <widgets/misc/e-auth-combo-box.h> -#include <widgets/misc/e-signature-editor.h> -#include <widgets/misc/e-port-entry.h> - -#include "e-mail-account-store.h" -#include "e-mail-backend.h" -#include "e-mail-junk-options.h" -#include "e-mail-ui-session.h" -#include "em-account-editor.h" -#include "em-config.h" -#include "em-folder-selection-button.h" -#include "em-utils.h" -#include "mail-guess-servers.h" -#include "mail-send-recv.h" - -#if defined (HAVE_NSS) && defined (ENABLE_SMIME) -#include <smime/gui/e-cert-selector.h> -#endif - -#define EM_ACCOUNT_EDITOR_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), EM_TYPE_ACCOUNT_EDITOR, EMAccountEditorPrivate)) - -/* Option widgets whose sensitivity depends on another widget, such - * as a checkbox being active, are indented to the right slightly for - * better visual clarity. This specifies how far to the right. */ -#define INDENT_MARGIN 24 - -#define EM_ACCOUNT_EDITOR_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), EM_TYPE_ACCOUNT_EDITOR, EMAccountEditorPrivate)) - -#define d(x) - -/* econfig item for the extra config hings */ -struct _receive_options_item { - EMConfigItem item; - - /* Only CAMEL_PROVIDER_CONF_ENTRYs GtkEntrys are stored here. - * The auto-detect camel provider code will probably be removed */ - GHashTable *extra_table; -}; - -typedef struct _EMAccountEditorService { - EMAccountEditor *emae; /* parent pointer, for callbacks */ - - /* NOTE: keep all widgets together, first frame last check_dialog */ - GtkWidget *frame; - GtkWidget *container; - - GtkComboBox *providers; - - GtkLabel *description; - GtkLabel *hostlabel; - GtkEntry *hostname; - GtkLabel *portlabel; - EPortEntry *port; - GtkLabel *userlabel; - GtkEntry *username; - GtkLabel *pathlabel; - GtkWidget *pathentry; - - GtkWidget *ssl_frame; - GtkComboBox *use_ssl; - GtkWidget *ssl_hbox; - GtkWidget *no_ssl; - - GtkWidget *auth_frame; - GtkComboBox *authtype; - - GtkWidget *authitem; - GtkToggleButton *remember; - GtkButton *check_supported; - GtkToggleButton *needs_auth; - gboolean requires_auth; - - GCancellable *checking; - GtkWidget *check_dialog; - - const gchar *protocol; - CamelProviderType type; - CamelSettings *settings; - - gboolean visible_auth; - gboolean visible_host; - gboolean visible_path; - gboolean visible_port; - gboolean visible_user; -} EMAccountEditorService; - -struct _EMAccountEditorPrivate { - - EMailBackend *backend; - EAccount *modified_account; - EAccount *original_account; - gboolean new_account; - - struct _EMConfig *config; - GList *providers; - - /* signatures */ - GtkComboBox *signatures_dropdown; - guint sig_added_id; - guint sig_removed_id; - guint sig_changed_id; - const gchar *sig_uid; - - /* incoming mail */ - EMAccountEditorService source; - - /* extra incoming config */ - CamelProvider *extra_provider; - GSList *extra_items; /* this is freed by the econfig automatically */ - - /* outgoing mail */ - EMAccountEditorService transport; - - /* account management */ - GtkEntry *identity_entries[5]; - GtkToggleButton *default_account; - GtkWidget *management_frame; - - /* special folders */ - GtkButton *drafts_folder_button; - GtkButton *sent_folder_button; - GtkToggleButton *trash_folder_check; - GtkButton *trash_folder_button; - GtkToggleButton *junk_folder_check; - GtkButton *junk_folder_button; - GtkButton *restore_folders_button; - - /* Security */ - GtkEntry *pgp_key; - GtkToggleButton *pgp_encrypt_to_self; - GtkToggleButton *pgp_always_sign; - GtkToggleButton *pgp_no_imip_sign; - GtkToggleButton *pgp_always_trust; - - GtkToggleButton *smime_sign_default; - GtkEntry *smime_sign_key; - GtkButton *smime_sign_key_select; - GtkButton *smime_sign_key_clear; - GtkButton *smime_sign_select; - GtkToggleButton *smime_encrypt_default; - GtkToggleButton *smime_encrypt_to_self; - GtkEntry *smime_encrypt_key; - GtkButton *smime_encrypt_key_select; - GtkButton *smime_encrypt_key_clear; - - /* Review */ - GtkLabel *review_name; - GtkLabel *review_email; - GtkLabel *send_name; - GtkLabel *send_stype; - GtkLabel *send_saddress; - GtkLabel *send_encryption; - GtkLabel *receive_name; - GtkLabel *receive_stype; - GtkLabel *receive_saddress; - GtkLabel *receive_encryption; - GtkWidget *review_box; - - /* google and yahoo specific data*/ - gboolean is_gmail; - gboolean is_yahoo; - - GtkWidget *calendar; - GtkWidget *tasks; - GtkWidget *gcontacts; - GtkWidget *info_label; - - GtkWidget *account_label; - GtkWidget *gmail_link; - GtkWidget *yahoo_cal_box; - GtkWidget *yahoo_cal_entry; - - /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/ - GHashTable *widgets; - - /* for assistant page preparation */ - guint identity_set : 1; - guint receive_set : 1; - guint receive_opt_set : 1; - guint send_set : 1; - guint review_set : 1; - - ServerData *selected_server; -}; - -enum { - PROP_0, - PROP_BACKEND, - PROP_MODIFIED_ACCOUNT, - PROP_ORIGINAL_ACCOUNT, - PROP_STORE_PROVIDER, - PROP_STORE_REQUIRES_AUTH, - PROP_STORE_SETTINGS, - PROP_STORE_VISIBLE_AUTH, - PROP_STORE_VISIBLE_HOST, - PROP_STORE_VISIBLE_PATH, - PROP_STORE_VISIBLE_PORT, - PROP_STORE_VISIBLE_USER, - PROP_TRANSPORT_PROVIDER, - PROP_TRANSPORT_REQUIRES_AUTH, - PROP_TRANSPORT_SETTINGS, - PROP_TRANSPORT_VISIBLE_AUTH, - PROP_TRANSPORT_VISIBLE_HOST, - PROP_TRANSPORT_VISIBLE_PATH, - PROP_TRANSPORT_VISIBLE_PORT, - PROP_TRANSPORT_VISIBLE_USER -}; - -static void em_account_editor_construct (EMAccountEditor *emae, EMAccountEditorType type, const gchar *id); -static void emae_account_folder_changed (EMFolderSelectionButton *folder, EMAccountEditor *emae); - -G_DEFINE_TYPE (EMAccountEditor, em_account_editor, G_TYPE_OBJECT) - -static void -emae_config_gone_cb (gpointer pemae, - GObject *pconfig) -{ - EMAccountEditor *emae = pemae; - struct _EMConfig *config = (struct _EMConfig *) pconfig; - - if (!emae) - return; - - if (emae->config == config) - emae->config = NULL; - - if (emae->priv && emae->priv->config == config) - emae->priv->config = NULL; -} - -static void -emae_config_target_changed_cb (EMAccountEditor *emae) -{ - e_config_target_changed ( - (EConfig *) emae->config, - E_CONFIG_TARGET_CHANGED_STATE); -} - -static gint -emae_provider_compare (const CamelProvider *p1, - const CamelProvider *p2) -{ - /* The "none" provider comes first. */ - if (g_strcmp0 (p1->protocol, "none") == 0) - return -1; - if (g_strcmp0 (p2->protocol, "none") == 0) - return 1; - - /* Then sort remote providers before local providers. */ - if (p1->flags & CAMEL_PROVIDER_IS_REMOTE) { - if (p2->flags & CAMEL_PROVIDER_IS_REMOTE) - return 0; - return -1; - } else { - if (p2->flags & CAMEL_PROVIDER_IS_REMOTE) - return 1; - return 0; - } -} - -static GList * -emae_list_providers (void) -{ - GList *list, *link; - GQueue trash = G_QUEUE_INIT; - - list = camel_provider_list (TRUE); - list = g_list_sort (list, (GCompareFunc) emae_provider_compare); - - /* Keep only providers with a "mail" or "news" domain. */ - - for (link = list; link != NULL; link = g_list_next (link)) { - CamelProvider *provider = link->data; - gboolean mail_or_news_domain; - - mail_or_news_domain = - (g_strcmp0 (provider->domain, "mail") == 0) || - (g_strcmp0 (provider->domain, "news") == 0); - - if (mail_or_news_domain) - continue; - - g_queue_push_tail (&trash, link); - } - - while ((link = g_queue_pop_head (&trash)) != NULL) - list = g_list_remove_link (list, link); - - return list; -} - -static void -emae_set_original_account (EMAccountEditor *emae, - EAccount *original_account) -{ - EAccount *modified_account; - - g_return_if_fail (emae->priv->original_account == NULL); - - /* Editing an existing account. */ - if (original_account != NULL) { - gchar *xml; - - xml = e_account_to_xml (original_account); - modified_account = e_account_new_from_xml (xml); - g_free (xml); - - g_object_ref (original_account); - if (emae->type != EMAE_PAGES) - emae->do_signature = TRUE; - - /* thus the emae_setup_service() will pick protocols from the account */ - emae->priv->source.protocol = NULL; - emae->priv->transport.protocol = NULL; - - /* Creating a new account. */ - } else { - modified_account = e_account_new (); - modified_account->enabled = TRUE; - emae->priv->new_account = TRUE; - } - - emae->priv->original_account = original_account; - emae->priv->modified_account = modified_account; -} - -static void -emae_set_backend (EMAccountEditor *emae, - EMailBackend *backend) -{ - g_return_if_fail (E_IS_MAIL_BACKEND (backend)); - g_return_if_fail (emae->priv->backend == NULL); - - emae->priv->backend = g_object_ref (backend); -} - -static CamelProvider * -emae_get_store_provider (EMAccountEditor *emae) -{ - CamelProvider *provider = NULL; - const gchar *protocol; - - protocol = emae->priv->source.protocol; - - if (protocol != NULL) - provider = camel_provider_get (protocol, NULL); - - return provider; -} - -static gboolean -emae_get_store_requires_auth (EMAccountEditor *emae) -{ - return emae->priv->source.requires_auth; -} - -static void -emae_set_store_requires_auth (EMAccountEditor *emae, - gboolean requires_auth) -{ - emae->priv->source.requires_auth = requires_auth; - - g_object_notify (G_OBJECT (emae), "store-requires-auth"); -} - -static CamelSettings * -emae_get_store_settings (EMAccountEditor *emae) -{ - return emae->priv->source.settings; -} - -static void -emae_set_store_settings (EMAccountEditor *emae, - CamelSettings *settings) -{ - if (settings != NULL) - g_object_ref (settings); - - if (emae->priv->source.settings != NULL) { - g_signal_handlers_disconnect_by_func ( - emae->priv->source.settings, - emae_config_target_changed_cb, emae); - g_object_unref (emae->priv->source.settings); - } - - emae->priv->source.settings = settings; - - g_object_notify (G_OBJECT (emae), "store-settings"); -} - -static gboolean -emae_get_store_visible_auth (EMAccountEditor *emae) -{ - return emae->priv->source.visible_auth; -} - -static void -emae_set_store_visible_auth (EMAccountEditor *emae, - gboolean visible_auth) -{ - emae->priv->source.visible_auth = visible_auth; - - g_object_notify (G_OBJECT (emae), "store-visible-auth"); -} - -static gboolean -emae_get_store_visible_host (EMAccountEditor *emae) -{ - return emae->priv->source.visible_host; -} - -static void -emae_set_store_visible_host (EMAccountEditor *emae, - gboolean visible_host) -{ - emae->priv->source.visible_host = visible_host; - - g_object_notify (G_OBJECT (emae), "store-visible-host"); -} - -static gboolean -emae_get_store_visible_path (EMAccountEditor *emae) -{ - return emae->priv->source.visible_path; -} - -static void -emae_set_store_visible_path (EMAccountEditor *emae, - gboolean visible_path) -{ - emae->priv->source.visible_path = visible_path; - - g_object_notify (G_OBJECT (emae), "store-visible-path"); -} - -static gboolean -emae_get_store_visible_port (EMAccountEditor *emae) -{ - return emae->priv->source.visible_port; -} - -static void -emae_set_store_visible_port (EMAccountEditor *emae, - gboolean visible_port) -{ - emae->priv->source.visible_port = visible_port; - - g_object_notify (G_OBJECT (emae), "store-visible-port"); -} - -static gboolean -emae_get_store_visible_user (EMAccountEditor *emae) -{ - return emae->priv->source.visible_user; -} - -static void -emae_set_store_visible_user (EMAccountEditor *emae, - gboolean visible_user) -{ - emae->priv->source.visible_user = visible_user; - - g_object_notify (G_OBJECT (emae), "store-visible-user"); -} - -static CamelProvider * -emae_get_transport_provider (EMAccountEditor *emae) -{ - CamelProvider *provider = NULL; - const gchar *protocol; - - protocol = emae->priv->transport.protocol; - - if (protocol != NULL) - provider = camel_provider_get (protocol, NULL); - - return provider; -} - -static gboolean -emae_get_transport_requires_auth (EMAccountEditor *emae) -{ - return emae->priv->transport.requires_auth; -} - -static void -emae_set_transport_requires_auth (EMAccountEditor *emae, - gboolean requires_auth) -{ - emae->priv->transport.requires_auth = requires_auth; - - g_object_notify (G_OBJECT (emae), "transport-requires-auth"); -} - -static CamelSettings * -emae_get_transport_settings (EMAccountEditor *emae) -{ - return emae->priv->transport.settings; -} - -static void -emae_set_transport_settings (EMAccountEditor *emae, - CamelSettings *settings) -{ - if (settings != NULL) - g_object_ref (settings); - - if (emae->priv->transport.settings != NULL) { - g_signal_handlers_disconnect_by_func ( - emae->priv->transport.settings, - emae_config_target_changed_cb, emae); - g_object_unref (emae->priv->transport.settings); - } - - emae->priv->transport.settings = settings; - - g_object_notify (G_OBJECT (emae), "transport-settings"); -} - -static gboolean -emae_get_transport_visible_auth (EMAccountEditor *emae) -{ - return emae->priv->transport.visible_auth; -} - -static void -emae_set_transport_visible_auth (EMAccountEditor *emae, - gboolean visible_auth) -{ - emae->priv->transport.visible_auth = visible_auth; - - g_object_notify (G_OBJECT (emae), "transport-visible-auth"); -} - -static gboolean -emae_get_transport_visible_host (EMAccountEditor *emae) -{ - return emae->priv->transport.visible_host; -} - -static void -emae_set_transport_visible_host (EMAccountEditor *emae, - gboolean visible_host) -{ - emae->priv->transport.visible_host = visible_host; - - g_object_notify (G_OBJECT (emae), "transport-visible-host"); -} - -static gboolean -emae_get_transport_visible_path (EMAccountEditor *emae) -{ - return emae->priv->transport.visible_path; -} - -static void -emae_set_transport_visible_path (EMAccountEditor *emae, - gboolean visible_path) -{ - emae->priv->transport.visible_path = visible_path; - - g_object_notify (G_OBJECT (emae), "transport-visible-path"); -} - -static gboolean -emae_get_transport_visible_port (EMAccountEditor *emae) -{ - return emae->priv->transport.visible_port; -} - -static void -emae_set_transport_visible_port (EMAccountEditor *emae, - gboolean visible_port) -{ - emae->priv->transport.visible_port = visible_port; - - g_object_notify (G_OBJECT (emae), "transport-visible-port"); -} - -static gboolean -emae_get_transport_visible_user (EMAccountEditor *emae) -{ - return emae->priv->transport.visible_user; -} - -static void -emae_set_transport_visible_user (EMAccountEditor *emae, - gboolean visible_user) -{ - emae->priv->transport.visible_user = visible_user; - - g_object_notify (G_OBJECT (emae), "transport-visible-user"); -} - -static void -emae_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_BACKEND: - emae_set_backend ( - EM_ACCOUNT_EDITOR (object), - g_value_get_object (value)); - return; - - case PROP_ORIGINAL_ACCOUNT: - emae_set_original_account ( - EM_ACCOUNT_EDITOR (object), - g_value_get_object (value)); - return; - - case PROP_STORE_REQUIRES_AUTH: - emae_set_store_requires_auth ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_STORE_SETTINGS: - emae_set_store_settings ( - EM_ACCOUNT_EDITOR (object), - g_value_get_object (value)); - return; - - case PROP_STORE_VISIBLE_AUTH: - emae_set_store_visible_auth ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_STORE_VISIBLE_HOST: - emae_set_store_visible_host ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_STORE_VISIBLE_PATH: - emae_set_store_visible_path ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_STORE_VISIBLE_PORT: - emae_set_store_visible_port ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_STORE_VISIBLE_USER: - emae_set_store_visible_user ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_REQUIRES_AUTH: - emae_set_transport_requires_auth ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_SETTINGS: - emae_set_transport_settings ( - EM_ACCOUNT_EDITOR (object), - g_value_get_object (value)); - return; - - case PROP_TRANSPORT_VISIBLE_AUTH: - emae_set_transport_visible_auth ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_VISIBLE_HOST: - emae_set_transport_visible_host ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_VISIBLE_PATH: - emae_set_transport_visible_path ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_VISIBLE_PORT: - emae_set_transport_visible_port ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - - case PROP_TRANSPORT_VISIBLE_USER: - emae_set_transport_visible_user ( - EM_ACCOUNT_EDITOR (object), - g_value_get_boolean (value)); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -emae_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_BACKEND: - g_value_set_object ( - value, - em_account_editor_get_backend ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_MODIFIED_ACCOUNT: - g_value_set_object ( - value, - em_account_editor_get_modified_account ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_ORIGINAL_ACCOUNT: - g_value_set_object ( - value, - em_account_editor_get_original_account ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_PROVIDER: - g_value_set_pointer ( - value, - emae_get_store_provider ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_REQUIRES_AUTH: - g_value_set_boolean ( - value, - emae_get_store_requires_auth ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_SETTINGS: - g_value_set_object ( - value, - emae_get_store_settings ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_VISIBLE_AUTH: - g_value_set_boolean ( - value, - emae_get_store_visible_auth ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_VISIBLE_HOST: - g_value_set_boolean ( - value, - emae_get_store_visible_host ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_VISIBLE_PATH: - g_value_set_boolean ( - value, - emae_get_store_visible_path ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_VISIBLE_PORT: - g_value_set_boolean ( - value, - emae_get_store_visible_port ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_STORE_VISIBLE_USER: - g_value_set_boolean ( - value, - emae_get_store_visible_user ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_PROVIDER: - g_value_set_pointer ( - value, - emae_get_transport_provider ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_REQUIRES_AUTH: - g_value_set_boolean ( - value, - emae_get_transport_requires_auth ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_SETTINGS: - g_value_set_object ( - value, - emae_get_transport_settings ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_VISIBLE_AUTH: - g_value_set_boolean ( - value, - emae_get_transport_visible_auth ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_VISIBLE_HOST: - g_value_set_boolean ( - value, - emae_get_transport_visible_host ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_VISIBLE_PATH: - g_value_set_boolean ( - value, - emae_get_transport_visible_path ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_VISIBLE_PORT: - g_value_set_boolean ( - value, - emae_get_transport_visible_port ( - EM_ACCOUNT_EDITOR (object))); - return; - - case PROP_TRANSPORT_VISIBLE_USER: - g_value_set_boolean ( - value, - emae_get_transport_visible_user ( - EM_ACCOUNT_EDITOR (object))); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -emae_dispose (GObject *object) -{ - EMAccountEditorPrivate *priv; - - priv = EM_ACCOUNT_EDITOR_GET_PRIVATE (object); - - if (priv->backend != NULL) { - g_object_unref (priv->backend); - priv->backend = NULL; - } - - if (priv->modified_account != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->modified_account, - emae_config_target_changed_cb, object); - g_object_unref (priv->modified_account); - priv->modified_account = NULL; - } - - if (priv->original_account != NULL) { - g_object_unref (priv->original_account); - priv->original_account = NULL; - } - - if (priv->source.settings != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->source.settings, - emae_config_target_changed_cb, object); - g_object_unref (priv->source.settings); - priv->source.settings = NULL; - } - - if (priv->transport.settings != NULL) { - g_signal_handlers_disconnect_by_func ( - priv->transport.settings, - emae_config_target_changed_cb, object); - g_object_unref (priv->transport.settings); - priv->transport.settings = NULL; - } - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (em_account_editor_parent_class)->dispose (object); -} - -static void -emae_finalize (GObject *object) -{ - EMAccountEditor *emae = EM_ACCOUNT_EDITOR (object); - EMAccountEditorPrivate *priv = emae->priv; - - if (priv->config) - g_object_weak_unref ((GObject *) priv->config, emae_config_gone_cb, emae); - - if (priv->sig_added_id) { - ESignatureList *signatures; - - signatures = e_get_signature_list (); - g_signal_handler_disconnect (signatures, priv->sig_added_id); - g_signal_handler_disconnect (signatures, priv->sig_removed_id); - g_signal_handler_disconnect (signatures, priv->sig_changed_id); - } - - g_list_free (priv->providers); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (em_account_editor_parent_class)->finalize (object); -} - -static void -emae_constructed (GObject *object) -{ - EMAccountEditor *emae; - - emae = EM_ACCOUNT_EDITOR (object); - - /* Chain up to parent's constructed() method. */ - G_OBJECT_CLASS (em_account_editor_parent_class)->constructed (object); - - emae->priv->providers = emae_list_providers (); - - /* Set some defaults on the new account before we get started. */ - if (emae->priv->new_account) { - EMailBackend *backend; - EMailSession *session; - - backend = em_account_editor_get_backend (emae); - session = e_mail_backend_get_session (backend); - - /* Pick local Drafts folder. */ - e_account_set_string ( - emae->priv->modified_account, - E_ACCOUNT_DRAFTS_FOLDER_URI, - e_mail_session_get_local_folder_uri ( - session, E_MAIL_LOCAL_FOLDER_DRAFTS)); - - /* Pick local Sent folder. */ - e_account_set_string ( - emae->priv->modified_account, - E_ACCOUNT_SENT_FOLDER_URI, - e_mail_session_get_local_folder_uri ( - session, E_MAIL_LOCAL_FOLDER_SENT)); - - /* Encrypt to self by default. */ - e_account_set_bool ( - emae->priv->modified_account, - E_ACCOUNT_PGP_ENCRYPT_TO_SELF, TRUE); - e_account_set_bool ( - emae->priv->modified_account, - E_ACCOUNT_SMIME_ENCRYPT_TO_SELF, TRUE); - } - - g_signal_connect_swapped ( - emae->priv->modified_account, "changed", - G_CALLBACK (emae_config_target_changed_cb), emae); -} - -static void -em_account_editor_class_init (EMAccountEditorClass *class) -{ - GObjectClass *object_class; - - g_type_class_add_private (class, sizeof (EMAccountEditorPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->set_property = emae_set_property; - object_class->get_property = emae_get_property; - object_class->dispose = emae_dispose; - object_class->finalize = emae_finalize; - object_class->constructed = emae_constructed; - - g_object_class_install_property ( - object_class, - PROP_BACKEND, - g_param_spec_object ( - "backend", - "Mail Backend", - NULL, - E_TYPE_MAIL_BACKEND, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_MODIFIED_ACCOUNT, - g_param_spec_object ( - "modified-account", - "Modified Account", - NULL, - E_TYPE_ACCOUNT, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_ORIGINAL_ACCOUNT, - g_param_spec_object ( - "original-account", - "Original Account", - NULL, - E_TYPE_ACCOUNT, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_PROVIDER, - g_param_spec_pointer ( - "store-provider", - "Store Provider", - "CamelProvider for the storage service", - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_REQUIRES_AUTH, - g_param_spec_boolean ( - "store-requires-auth", - "Store Requires Auth", - "Storage service requires authentication", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_SETTINGS, - g_param_spec_object ( - "store-settings", - "Store Settings", - "CamelSettings for the storage service", - CAMEL_TYPE_SETTINGS, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_VISIBLE_AUTH, - g_param_spec_boolean ( - "store-visible-auth", - "Store Visible Auth", - "Show auth widgets for the storage service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_VISIBLE_HOST, - g_param_spec_boolean ( - "store-visible-host", - "Store Visible Host", - "Show host widgets for the storage service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_VISIBLE_PATH, - g_param_spec_boolean ( - "store-visible-path", - "Store Visible Path", - "Show path widgets for the storage service", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_VISIBLE_PORT, - g_param_spec_boolean ( - "store-visible-port", - "Store Visible Port", - "Show port widgets for the storage service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STORE_VISIBLE_USER, - g_param_spec_boolean ( - "store-visible-user", - "Store Visible User", - "Show user widgets for the storage service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_PROVIDER, - g_param_spec_pointer ( - "transport-provider", - "Transport Provider", - "CamelProvider for the transport service", - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_REQUIRES_AUTH, - g_param_spec_boolean ( - "transport-requires-auth", - "Transport Requires Auth", - "Transport service requires authentication", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_SETTINGS, - g_param_spec_object ( - "transport-settings", - "Transport Settings", - "CamelSettings for the transport service", - CAMEL_TYPE_SETTINGS, - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_VISIBLE_AUTH, - g_param_spec_boolean ( - "transport-visible-auth", - "Transport Visible Auth", - "Show auth widgets for the transport service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_VISIBLE_HOST, - g_param_spec_boolean ( - "transport-visible-host", - "Transport Visible Host", - "Show host widgets for the transport service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_VISIBLE_PATH, - g_param_spec_boolean ( - "transport-visible-path", - "Transport Visible Path", - "Show path widgets for the transport service", - FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_VISIBLE_PORT, - g_param_spec_boolean ( - "transport-visible-port", - "Transport Visible Port", - "Show port widgets for the transport service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_TRANSPORT_VISIBLE_USER, - g_param_spec_boolean ( - "transport-visible-user", - "Transport Visible User", - "Show user widgets for the transport service", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -} - -static void -em_account_editor_init (EMAccountEditor *emae) -{ - emae->priv = EM_ACCOUNT_EDITOR_GET_PRIVATE (emae); - - emae->priv->selected_server = NULL; - emae->priv->source.emae = emae; - emae->priv->transport.emae = emae; - emae->priv->widgets = g_hash_table_new (g_str_hash, g_str_equal); - - /* Pick default storage and transport protocols. */ - emae->priv->source.protocol = "imapx"; - emae->priv->transport.protocol = "smtp"; - - emae->priv->is_gmail = FALSE; - emae->priv->is_yahoo = FALSE; -} - -/** - * em_account_editor_new: - * @account: - * @type: - * - * Create a new account editor. If @account is NULL then this is to - * create a new account, else @account is copied to a working - * structure and is for editing an existing account. - * - * Return value: - **/ -EMAccountEditor * -em_account_editor_new (EAccount *account, - EMAccountEditorType type, - EMailBackend *backend, - const gchar *id) -{ - EMAccountEditor *emae; - - g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); - - emae = g_object_new ( - EM_TYPE_ACCOUNT_EDITOR, - "original-account", account, - "backend", backend, NULL); - - em_account_editor_construct (emae, type, id); - - return emae; -} - -/** - * em_account_editor_new_for_pages: - * @account: - * @type: - * - * Create a new account editor. If @account is NULL then this is to - * create a new account, else @account is copied to a working - * structure and is for editing an existing account. - * - * Return value: - **/ -EMAccountEditor * -em_account_editor_new_for_pages (EAccount *account, - EMAccountEditorType type, - EMailBackend *backend, - const gchar *id, - GtkWidget **pages) -{ - EMAccountEditor *emae; - - g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); - - emae = g_object_new ( - EM_TYPE_ACCOUNT_EDITOR, - "original-account", account, - "backend", backend, NULL); - - emae->pages = pages; - em_account_editor_construct (emae, type, id); - - return emae; -} - -EMailBackend * -em_account_editor_get_backend (EMAccountEditor *emae) -{ - g_return_val_if_fail (EM_IS_ACCOUNT_EDITOR (emae), NULL); - - return emae->priv->backend; -} - -EAccount * -em_account_editor_get_modified_account (EMAccountEditor *emae) -{ - g_return_val_if_fail (EM_IS_ACCOUNT_EDITOR (emae), NULL); - - return emae->priv->modified_account; -} - -EAccount * -em_account_editor_get_original_account (EMAccountEditor *emae) -{ - g_return_val_if_fail (EM_IS_ACCOUNT_EDITOR (emae), NULL); - - return emae->priv->original_account; -} - -/* ********************************************************************** */ - -static gboolean -is_email (const gchar *address) -{ - /* This is supposed to check if the address's domain could be - * an FQDN but alas, it's not worth the pain and suffering. */ - const gchar *at; - - at = strchr (address, '@'); - /* make sure we have an '@' and that it's not the first or last gchar */ - if (!at || at == address || *(at + 1) == '\0') - return FALSE; - - return TRUE; -} - -static CamelURL * -emae_account_url (EMAccountEditor *emae, - gint urlid) -{ - EAccount *account; - CamelURL *url = NULL; - const gchar *uri; - - account = em_account_editor_get_modified_account (emae); - uri = e_account_get_string (account, urlid); - - /* XXX Stupid hack for these stupid transport-only accounts. - * We've been saving these as invalid URI strings all this - * time; no protocol, just "//...". Catch it and fix it. */ - if (uri != NULL && g_str_has_prefix (uri, "//")) - return camel_url_new ("none:", NULL); - - if (uri != NULL && *uri != '\0') - url = camel_url_new (uri, NULL); - - if (url == NULL) { - url = camel_url_new ("dummy:", NULL); - camel_url_set_protocol (url, NULL); - } - - return url; -} - -/* ********************************************************************** */ - -static void -default_folders_clicked (GtkButton *button, - gpointer user_data) -{ - EMAccountEditor *emae = user_data; - EMFolderSelectionButton *folder_button; - EMailBackend *backend; - EMailSession *session; - const gchar *folder_uri; - - backend = em_account_editor_get_backend (emae); - session = e_mail_backend_get_session (backend); - - folder_button = - EM_FOLDER_SELECTION_BUTTON ( - emae->priv->drafts_folder_button); - folder_uri = e_mail_session_get_local_folder_uri ( - session, E_MAIL_LOCAL_FOLDER_DRAFTS); - em_folder_selection_button_set_folder_uri (folder_button, folder_uri); - emae_account_folder_changed (folder_button, emae); - - folder_button = - EM_FOLDER_SELECTION_BUTTON ( - emae->priv->sent_folder_button); - folder_uri = e_mail_session_get_local_folder_uri ( - session, E_MAIL_LOCAL_FOLDER_SENT); - em_folder_selection_button_set_folder_uri (folder_button, folder_uri); - emae_account_folder_changed (folder_button, emae); - - gtk_toggle_button_set_active (emae->priv->trash_folder_check, FALSE); - gtk_toggle_button_set_active (emae->priv->junk_folder_check, FALSE); -} - -/* The camel provider auto-detect interface should be deprecated. - * But it still needs to be replaced with something of similar functionality. - * Just using the normal econfig plugin mechanism should be adequate. */ -static void -emae_auto_detect_free (gpointer key, - gpointer value, - gpointer user_data) -{ - g_free (key); - g_free (value); -} - -static void -emae_auto_detect (EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - EMAccountEditorService *service = &priv->source; - CamelProvider *provider; - GHashTable *auto_detected; - GSList *l; - CamelProviderConfEntry *entries; - gchar *value; - gint i; - CamelURL *url; - - provider = camel_provider_get (service->protocol, NULL); - - if (provider == NULL || provider->extra_conf == NULL) - return; - - entries = provider->extra_conf; - - d (printf ("Running auto-detect\n")); - - url = emae_account_url (emae, E_ACCOUNT_SOURCE_URL); - camel_provider_auto_detect (provider, url, &auto_detected, NULL); - camel_url_free (url); - - if (auto_detected == NULL) { - d (printf (" no values detected\n")); - return; - } - - for (i = 0; entries[i].type != CAMEL_PROVIDER_CONF_END; i++) { - struct _receive_options_item *item; - GtkWidget *w; - - if (entries[i].name == NULL - || (value = g_hash_table_lookup (auto_detected, entries[i].name)) == NULL) - continue; - - /* only 2 providers use this, and they only do it for 3 entries only */ - g_return_if_fail (entries[i].type == CAMEL_PROVIDER_CONF_ENTRY); - - w = NULL; - for (l = emae->priv->extra_items; l; l = g_slist_next (l)) { - item = l->data; - if (item->extra_table && (w = g_hash_table_lookup (item->extra_table, entries[i].name))) - break; - } - - gtk_entry_set_text ((GtkEntry *)w, value?value:""); - } - - g_hash_table_foreach (auto_detected, emae_auto_detect_free, NULL); - g_hash_table_destroy (auto_detected); -} - -static void -emae_signature_added (ESignatureList *signatures, - ESignature *sig, - EMAccountEditor *emae) -{ - GtkTreeModel *model; - GtkTreeIter iter; - const gchar *name; - const gchar *uid; - - name = e_signature_get_name (sig); - uid = e_signature_get_uid (sig); - - model = gtk_combo_box_get_model (emae->priv->signatures_dropdown); - - gtk_list_store_append ((GtkListStore *) model, &iter); - gtk_list_store_set ((GtkListStore *) model, &iter, 0, name, 1, uid, -1); - - gtk_combo_box_set_active ( - emae->priv->signatures_dropdown, - gtk_tree_model_iter_n_children (model, NULL) - 1); -} - -static gint -emae_signature_get_iter (EMAccountEditor *emae, - ESignature *sig, - GtkTreeModel **modelp, - GtkTreeIter *iter) -{ - GtkTreeModel *model; - gint found = 0; - - model = gtk_combo_box_get_model (emae->priv->signatures_dropdown); - *modelp = model; - if (!gtk_tree_model_get_iter_first (model, iter)) - return FALSE; - - do { - const gchar *signature_uid; - gchar *uid; - - signature_uid = e_signature_get_uid (sig); - - gtk_tree_model_get (model, iter, 1, &uid, -1); - if (uid && !strcmp (uid, signature_uid)) - found = TRUE; - g_free (uid); - } while (!found && gtk_tree_model_iter_next (model, iter)); - - return found; -} - -static void -emae_signature_removed (ESignatureList *signatures, - ESignature *sig, - EMAccountEditor *emae) -{ - GtkTreeIter iter; - GtkTreeModel *model; - - if (emae_signature_get_iter (emae, sig, &model, &iter)) - gtk_list_store_remove ((GtkListStore *) model, &iter); -} - -static void -emae_signature_changed (ESignatureList *signatures, - ESignature *sig, - EMAccountEditor *emae) -{ - GtkTreeIter iter; - GtkTreeModel *model; - const gchar *name; - - name = e_signature_get_name (sig); - - if (emae_signature_get_iter (emae, sig, &model, &iter)) - gtk_list_store_set ((GtkListStore *) model, &iter, 0, name, -1); -} - -static void -emae_signaturetype_changed (GtkComboBox *dropdown, - EMAccountEditor *emae) -{ - EAccount *account; - gint id = gtk_combo_box_get_active (dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - gchar *uid = NULL; - - account = em_account_editor_get_modified_account (emae); - - if (id != -1) { - model = gtk_combo_box_get_model (dropdown); - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) - gtk_tree_model_get (model, &iter, 1, &uid, -1); - } - - e_account_set_string (account, E_ACCOUNT_ID_SIGNATURE, uid); - g_free (uid); -} - -static void -emae_signature_new (GtkWidget *widget, - EMAccountEditor *emae) -{ - GtkWidget *editor; - gpointer parent; - - parent = gtk_widget_get_toplevel (widget); - parent = gtk_widget_is_toplevel (parent) ? parent : NULL; - - editor = e_signature_editor_new (); - gtk_window_set_transient_for (GTK_WINDOW (editor), parent); - gtk_widget_show (editor); -} - -static GtkWidget * -emae_setup_signatures (EMAccountEditor *emae, - GtkBuilder *builder) -{ - EMAccountEditorPrivate *p = emae->priv; - EAccount *account; - GtkComboBox *dropdown = (GtkComboBox *)e_builder_get_widget (builder, "signature_dropdown"); - GtkCellRenderer *cell = gtk_cell_renderer_text_new (); - GtkListStore *store; - gint i, active = 0; - GtkTreeIter iter; - ESignatureList *signatures; - EIterator *it; - const gchar *current; - GtkWidget *button; - - account = em_account_editor_get_modified_account (emae); - current = e_account_get_string (account, E_ACCOUNT_ID_SIGNATURE); - - emae->priv->signatures_dropdown = dropdown; - gtk_widget_show ((GtkWidget *) dropdown); - - store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - - gtk_list_store_append (store, &iter); - /* Translators: "None" as an option for a default signature of an account, part of "Signature: None" */ - gtk_list_store_set (store, &iter, 0, C_("mail-signature", "None"), 1, NULL, -1); - - signatures = e_get_signature_list (); - - if (p->sig_added_id == 0) { - p->sig_added_id = g_signal_connect ( - signatures, "signature-added", - G_CALLBACK (emae_signature_added), emae); - p->sig_removed_id = g_signal_connect ( - signatures, "signature-removed", - G_CALLBACK (emae_signature_removed), emae); - p->sig_changed_id = g_signal_connect ( - signatures, "signature-changed", - G_CALLBACK (emae_signature_changed), emae); - } - - /* we need to count the 'none' entry before using the index */ - i = 1; - it = e_list_get_iterator ((EList *) signatures); - while (e_iterator_is_valid (it)) { - ESignature *sig = (ESignature *) e_iterator_get (it); - const gchar *name; - const gchar *uid; - - name = e_signature_get_name (sig); - uid = e_signature_get_uid (sig); - - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, name, 1, uid, -1); - - if (current && !strcmp (current, uid)) - active = i; - - e_iterator_next (it); - i++; - } - g_object_unref (it); - - gtk_cell_layout_pack_start ((GtkCellLayout *) dropdown, cell, TRUE); - gtk_cell_layout_set_attributes ((GtkCellLayout *)dropdown, cell, "text", 0, NULL); - - gtk_combo_box_set_model (dropdown, (GtkTreeModel *) store); - gtk_combo_box_set_active (dropdown, active); - - g_signal_connect ( - dropdown, "changed", - G_CALLBACK (emae_signaturetype_changed), emae); - - button = e_builder_get_widget (builder, "sigAddNew"); - g_signal_connect ( - button, "clicked", - G_CALLBACK (emae_signature_new), emae); - - return (GtkWidget *) dropdown; -} - -static void -emae_receipt_policy_changed (GtkComboBox *dropdown, - EMAccountEditor *emae) -{ - EAccount *account; - gint id = gtk_combo_box_get_active (dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - EAccountReceiptPolicy policy; - - account = em_account_editor_get_modified_account (emae); - - if (id != -1) { - model = gtk_combo_box_get_model (dropdown); - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) { - gtk_tree_model_get (model, &iter, 1, &policy, -1); - e_account_set_int (account, E_ACCOUNT_RECEIPT_POLICY, policy); - } - } -} - -static GtkWidget * -emae_setup_receipt_policy (EMAccountEditor *emae, - GtkBuilder *builder) -{ - EAccount *account; - GtkComboBox *dropdown = (GtkComboBox *)e_builder_get_widget (builder, "receipt_policy_dropdown"); - GtkListStore *store; - GtkCellRenderer *cell; - gint i = 0, active = 0; - GtkTreeIter iter; - EAccountReceiptPolicy current; - static struct { - EAccountReceiptPolicy policy; - const gchar *label; - } receipt_policies[] = { - { E_ACCOUNT_RECEIPT_NEVER, N_("Never") }, - { E_ACCOUNT_RECEIPT_ALWAYS, N_("Always") }, - { E_ACCOUNT_RECEIPT_ASK, N_("Ask for each message") } - }; - - account = em_account_editor_get_modified_account (emae); - current = account->receipt_policy; - - gtk_widget_show ((GtkWidget *) dropdown); - - store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); - - for (i = 0; i < 3; ++i) { - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, - 0, _(receipt_policies[i].label), - 1, receipt_policies[i].policy, - -1); - if (current == receipt_policies[i].policy) - active = i; - } - - gtk_combo_box_set_model (dropdown, (GtkTreeModel *) store); - - cell = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (dropdown), cell, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (dropdown), cell, "text", 0, NULL); - - gtk_combo_box_set_active (dropdown, active); - - g_signal_connect ( - dropdown, "changed", - G_CALLBACK (emae_receipt_policy_changed), emae); - - return (GtkWidget *) dropdown; -} - -static void -emae_account_entry_changed (GtkEntry *entry, - EMAccountEditor *emae) -{ - EAccount *account; - gchar *text; - gpointer data; - - account = em_account_editor_get_modified_account (emae); - data = g_object_get_data (G_OBJECT (entry), "account-item"); - text = g_strdup (gtk_entry_get_text (entry)); - - g_strstrip (text); - - e_account_set_string (account, GPOINTER_TO_INT (data), text); - - g_free (text); -} - -static GtkEntry * -emae_account_entry (EMAccountEditor *emae, - const gchar *name, - gint item, - GtkBuilder *builder) -{ - EAccount *account; - GtkEntry *entry; - const gchar *text; - - account = em_account_editor_get_modified_account (emae); - entry = (GtkEntry *) e_builder_get_widget (builder, name); - text = e_account_get_string (account, item); - if (text) - gtk_entry_set_text (entry, text); - g_object_set_data ((GObject *)entry, "account-item", GINT_TO_POINTER(item)); - g_signal_connect ( - entry, "changed", - G_CALLBACK (emae_account_entry_changed), emae); - - return entry; -} - -static void -emae_account_toggle_changed (GtkToggleButton *toggle, - EMAccountEditor *emae) -{ - EAccount *account; - gboolean active; - gpointer data; - - account = em_account_editor_get_modified_account (emae); - data = g_object_get_data (G_OBJECT (toggle), "account-item"); - active = gtk_toggle_button_get_active (toggle); - - e_account_set_bool (account, GPOINTER_TO_INT (data), active); -} - -static void -emae_account_toggle_widget (EMAccountEditor *emae, - GtkToggleButton *toggle, - gint item) -{ - EAccount *account; - gboolean active; - - account = em_account_editor_get_modified_account (emae); - - active = e_account_get_bool (account, item); - gtk_toggle_button_set_active (toggle, active); - - g_object_set_data ( - G_OBJECT (toggle), "account-item", - GINT_TO_POINTER (item)); - - g_signal_connect ( - toggle, "toggled", - G_CALLBACK (emae_account_toggle_changed), emae); -} - -static GtkToggleButton * -emae_account_toggle (EMAccountEditor *emae, - const gchar *name, - gint item, - GtkBuilder *builder) -{ - GtkToggleButton *toggle; - - toggle = (GtkToggleButton *) e_builder_get_widget (builder, name); - emae_account_toggle_widget (emae, toggle, item); - - return toggle; -} - -static void -emae_account_spinint_changed (GtkSpinButton *spin, - EMAccountEditor *emae) -{ - EAccount *account; - gpointer data; - gint value; - - account = em_account_editor_get_modified_account (emae); - data = g_object_get_data (G_OBJECT (spin), "account-item"); - value = gtk_spin_button_get_value (spin); - - e_account_set_int (account, GPOINTER_TO_INT (data), value); -} - -static void -emae_account_spinint_widget (EMAccountEditor *emae, - GtkSpinButton *spin, - gint item) -{ - EAccount *account; - gint v_int; - - account = em_account_editor_get_modified_account (emae); - - v_int = e_account_get_int (account, item); - gtk_spin_button_set_value (spin, v_int); - - g_object_set_data ( - G_OBJECT (spin), "account-item", - GINT_TO_POINTER (item)); - - g_signal_connect ( - spin, "value-changed", - G_CALLBACK (emae_account_spinint_changed), emae); -} - -static void -emae_account_folder_changed (EMFolderSelectionButton *folder, - EMAccountEditor *emae) -{ - EAccount *account; - gpointer data; - const gchar *selection; - - account = em_account_editor_get_modified_account (emae); - data = g_object_get_data (G_OBJECT (folder), "account-item"); - selection = em_folder_selection_button_get_folder_uri (folder); - - e_account_set_string (account, GPOINTER_TO_INT (data), selection); -} - -static EMFolderSelectionButton * -emae_account_folder (EMAccountEditor *emae, - const gchar *name, - gint item, - gint deffolder, - GtkBuilder *builder) -{ - EAccount *account; - EMFolderSelectionButton *folder; - EMailBackend *backend; - EMailSession *session; - const gchar *uri; - - account = em_account_editor_get_modified_account (emae); - backend = em_account_editor_get_backend (emae); - session = e_mail_backend_get_session (backend); - - folder = (EMFolderSelectionButton *) e_builder_get_widget (builder, name); - em_folder_selection_button_set_session (folder, session); - - uri = e_account_get_string (account, item); - if (uri != NULL) { - em_folder_selection_button_set_folder_uri (folder, uri); - } else { - uri = e_mail_session_get_local_folder_uri (session, deffolder); - em_folder_selection_button_set_folder_uri (folder, uri); - } - - g_object_set_data ((GObject *)folder, "account-item", GINT_TO_POINTER(item)); - g_object_set_data ((GObject *)folder, "folder-default", GINT_TO_POINTER(deffolder)); - g_signal_connect ( - folder, "selected", - G_CALLBACK (emae_account_folder_changed), emae); - gtk_widget_show ((GtkWidget *) folder); - - return folder; -} - -#if defined (HAVE_NSS) && defined (ENABLE_SMIME) -static void -smime_changed (EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - gint act; - const gchar *tmp; - - tmp = gtk_entry_get_text (priv->smime_sign_key); - act = tmp && tmp[0]; - gtk_widget_set_sensitive ((GtkWidget *) priv->smime_sign_key_clear, act); - gtk_widget_set_sensitive ((GtkWidget *) priv->smime_sign_default, act); - if (!act) - gtk_toggle_button_set_active (priv->smime_sign_default, FALSE); - - tmp = gtk_entry_get_text (priv->smime_encrypt_key); - act = tmp && tmp[0]; - gtk_widget_set_sensitive ((GtkWidget *) priv->smime_encrypt_key_clear, act); - gtk_widget_set_sensitive ((GtkWidget *) priv->smime_encrypt_default, act); - gtk_widget_set_sensitive ((GtkWidget *) priv->smime_encrypt_to_self, act); - if (!act) { - gtk_toggle_button_set_active (priv->smime_encrypt_default, FALSE); - } -} - -static void -smime_sign_key_selected (GtkWidget *dialog, - const gchar *key, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - - if (key != NULL) { - gtk_entry_set_text (priv->smime_sign_key, key); - smime_changed (emae); - } - - gtk_widget_destroy (dialog); -} - -static void -smime_sign_key_select (GtkWidget *button, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - GtkWidget *w; - - w = e_cert_selector_new (E_CERT_SELECTOR_SIGNER, gtk_entry_get_text (priv->smime_sign_key)); - gtk_window_set_modal ((GtkWindow *) w, TRUE); - gtk_window_set_transient_for ((GtkWindow *) w, (GtkWindow *) gtk_widget_get_toplevel (button)); - g_signal_connect ( - w, "selected", - G_CALLBACK (smime_sign_key_selected), emae); - gtk_widget_show (w); -} - -static void -smime_sign_key_clear (GtkWidget *w, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - - gtk_entry_set_text (priv->smime_sign_key, ""); - smime_changed (emae); -} - -static void -smime_encrypt_key_selected (GtkWidget *dialog, - const gchar *key, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - - if (key != NULL) { - gtk_entry_set_text (priv->smime_encrypt_key, key); - smime_changed (emae); - } - - gtk_widget_destroy (dialog); -} - -static void -smime_encrypt_key_select (GtkWidget *button, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - GtkWidget *w; - - w = e_cert_selector_new (E_CERT_SELECTOR_RECIPIENT, gtk_entry_get_text (priv->smime_encrypt_key)); - gtk_window_set_modal ((GtkWindow *) w, TRUE); - gtk_window_set_transient_for ((GtkWindow *) w, (GtkWindow *) gtk_widget_get_toplevel (button)); - g_signal_connect ( - w, "selected", - G_CALLBACK (smime_encrypt_key_selected), emae); - gtk_widget_show (w); -} - -static void -smime_encrypt_key_clear (GtkWidget *w, - EMAccountEditor *emae) -{ - EMAccountEditorPrivate *priv = emae->priv; - - gtk_entry_set_text (priv->smime_encrypt_key, ""); - smime_changed (emae); -} -#endif - -/* This is used to map each of the two services in a typical account to - * the widgets that represent each service. i.e. the receiving (source) - * service, and the sending (transport) service. It is used throughout - * the following code to drive each page. */ -static struct _service_info { - gint account_uri_key; - gint save_passwd_key; - - const gchar *frame; - const gchar *type_dropdown; - - const gchar *container; - const gchar *description; - const gchar *hostname; - const gchar *hostlabel; - const gchar *port; - const gchar *portlabel; - const gchar *username; - const gchar *userlabel; - const gchar *path; - const gchar *pathlabel; - const gchar *pathentry; - - const gchar *security_frame; - const gchar *ssl_hbox; - const gchar *use_ssl; - const gchar *ssl_disabled; - - const gchar *needs_auth; - const gchar *auth_frame; - - const gchar *authtype; - const gchar *authtype_check; - - const gchar *remember_password; - -} emae_service_info[CAMEL_NUM_PROVIDER_TYPES] = { - - { E_ACCOUNT_SOURCE_URL, - E_ACCOUNT_SOURCE_SAVE_PASSWD, - - "source-config-section", - "source_type_dropdown", - - "vboxSourceBorder", - "source_description", - "source_host", - "source_host_label", - "source_port", - "source_port_label", - "source_user", - "source_user_label", - "source_path", - "source_path_label", - "source_path_entry", - - "source-security-section", - "source_ssl_hbox", - "source_use_ssl", - "source_ssl_disabled", - - NULL, - "source-auth-section", - - "source_auth_dropdown", - "source_check_supported", - - "source_remember_password" - }, - - { E_ACCOUNT_TRANSPORT_URL, - E_ACCOUNT_TRANSPORT_SAVE_PASSWD, - - "transport-server-section", - "transport_type_dropdown", - - "vboxTransportBorder", - "transport_description", - "transport_host", - "transport_host_label", - "transport_port", - "transport_port_label", - "transport_user", - "transport_user_label", - NULL, - NULL, - NULL, - - "transport-security-section", - "transport_ssl_hbox", - "transport_use_ssl", - "transport_ssl_disabled", - - "transport_needs_auth", - "transport-auth-section", - - "transport_auth_dropdown", - "transport_check_supported", - - "transport_remember_password" - } -}; - -static void -emae_file_chooser_changed (GtkFileChooser *file_chooser, - EMAccountEditorService *service) -{ - CamelLocalSettings *local_settings; - const gchar *filename; - - local_settings = CAMEL_LOCAL_SETTINGS (service->settings); - filename = gtk_file_chooser_get_filename (file_chooser); - camel_local_settings_set_path (local_settings, filename); -} - -static void -emae_ensure_auth_mechanism (CamelProvider *provider, - CamelSettings *settings) -{ - CamelServiceAuthType *auth_type; - const gchar *auth_mechanism; - - auth_mechanism = - camel_network_settings_get_auth_mechanism ( - CAMEL_NETWORK_SETTINGS (settings)); - - /* If a mechanism name is already set, we're fine. */ - if (auth_mechanism != NULL) - return; - - /* Check that the CamelProvider defines some auth mechanisms. - * If not, it's reasonable to leave the mechanism name unset. */ - if (provider->authtypes == NULL) - return; - - /* No authentication mechanism has been chosen, so we'll choose - * one from the CamelProvider's list of available mechanisms. */ - - auth_type = provider->authtypes->data; - auth_mechanism = auth_type->authproto; - - camel_network_settings_set_auth_mechanism ( - CAMEL_NETWORK_SETTINGS (settings), auth_mechanism); -} - -static void -emae_setup_settings (EMAccountEditorService *service) -{ - CamelServiceClass *class; - CamelProvider *provider; - CamelSettings *settings = NULL; - GType service_type; - GType settings_type; - CamelURL *url; - - provider = camel_provider_get (service->protocol, NULL); - g_return_if_fail (provider != NULL); - - service_type = provider->object_types[service->type]; - g_return_if_fail (g_type_is_a (service_type, CAMEL_TYPE_SERVICE)); - - class = g_type_class_ref (service_type); - settings_type = class->settings_type; - g_type_class_unref (class); - - url = emae_account_url ( - service->emae, - emae_service_info[service->type].account_uri_key); - - /* Destroy any old CamelSettings instances. - * Changing CamelProviders invalidates them. */ - - if (service->settings != NULL) - camel_settings_save_to_url (service->settings, url); - - if (g_type_is_a (settings_type, CAMEL_TYPE_SETTINGS)) { - settings = g_object_new (settings_type, NULL); - camel_settings_load_from_url (settings, url); - - g_signal_connect_swapped ( - settings, "notify", - G_CALLBACK (emae_config_target_changed_cb), - service->emae); - } - - camel_url_free (url); - - if (CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) { - emae_set_store_settings (service->emae, settings); - emae_set_transport_settings (service->emae, settings); - - } else if (service->type == CAMEL_PROVIDER_STORE) { - emae_set_store_settings (service->emae, settings); - - } else if (service->type == CAMEL_PROVIDER_TRANSPORT) { - emae_set_transport_settings (service->emae, settings); - } - - if (CAMEL_IS_NETWORK_SETTINGS (settings)) { - CamelNetworkSettings *network_settings; - guint16 port; - - network_settings = CAMEL_NETWORK_SETTINGS (settings); - - /* remember port number as set before binding properties, - * because changes in auth-mechanism combo can reset the port, - * thus effectively lost it, when set to other known value */ - port = camel_network_settings_get_port (network_settings); - - /* Even if the service does not need to authenticate, we - * still need to initialize the auth mechanism combo box. - * So if CamelSettings does not already have a mechanism - * name set, choose one from the CamelProvider's list of - * available auth mechanisms. Later in emae_commit(), - * if need be, we'll revert the setting back to NULL. */ - emae_ensure_auth_mechanism (provider, settings); - - g_object_bind_property ( - settings, "auth-mechanism", - service->authtype, "active-id", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - settings, "host", - service->hostname, "text", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - g_object_bind_property_full ( - settings, "security-method", - service->use_ssl, "active-id", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE, - e_binding_transform_enum_value_to_nick, - e_binding_transform_enum_nick_to_value, - NULL, (GDestroyNotify) NULL); - - g_object_bind_property ( - settings, "port", - service->port, "port", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - settings, "security-method", - service->port, "security-method", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - settings, "user", - service->username, "text", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - /* restore previously saved port, if set */ - if (port > 0) - camel_network_settings_set_port (network_settings, port); - } - - if (CAMEL_IS_LOCAL_SETTINGS (settings)) { - const gchar *path; - - path = camel_local_settings_get_path ( - CAMEL_LOCAL_SETTINGS (settings)); - if (path != NULL && *path != '\0') - gtk_file_chooser_set_filename ( - GTK_FILE_CHOOSER (service->pathentry), path); - } - - g_object_unref (settings); -} - -static void -emae_service_provider_changed (EMAccountEditorService *service) -{ - EConfig *config; - EMConfigTargetSettings *target; - CamelProvider *provider = NULL; - const gchar *description; - - if (service->protocol != NULL) - provider = camel_provider_get (service->protocol, NULL); - - description = (provider != NULL) ? provider->description : ""; - gtk_label_set_text (service->description, description); - - if (provider != NULL) { - gboolean visible_auth; - gboolean visible_host; - gboolean visible_path; - gboolean visible_port; - gboolean visible_user; - gboolean visible_ssl; - gboolean allows; - gboolean hidden; - - emae_setup_settings (service); - - gtk_widget_show (service->frame); - - allows = CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH); - hidden = CAMEL_PROVIDER_HIDDEN (provider, CAMEL_URL_PART_AUTH); - visible_auth = (allows && !hidden); - - allows = CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_HOST); - hidden = CAMEL_PROVIDER_HIDDEN (provider, CAMEL_URL_PART_HOST); - visible_host = (allows && !hidden); - - allows = CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_PATH); - hidden = CAMEL_PROVIDER_HIDDEN (provider, CAMEL_URL_PART_PATH); - visible_path = (allows && !hidden); - - allows = CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_PORT); - hidden = CAMEL_PROVIDER_HIDDEN (provider, CAMEL_URL_PART_PORT); - visible_port = (allows && !hidden); - - allows = CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_USER); - hidden = CAMEL_PROVIDER_HIDDEN (provider, CAMEL_URL_PART_USER); - visible_user = (allows && !hidden); - - switch (service->type) { - case CAMEL_PROVIDER_STORE: - g_object_set ( - service->emae, - "store-visible-auth", visible_auth, - "store-visible-host", visible_host, - "store-visible-path", visible_path, - "store-visible-port", visible_port, - "store-visible-user", visible_user, - NULL); - break; - - case CAMEL_PROVIDER_TRANSPORT: - g_object_set ( - service->emae, - "transport-visible-auth", visible_auth, - "transport-visible-host", visible_host, - "transport-visible-path", visible_path, - "transport-visible-port", visible_port, - "transport-visible-user", visible_user, - NULL); - break; - - default: - g_warn_if_reached (); - } - - if (CAMEL_PROVIDER_ALLOWS (provider, CAMEL_URL_PART_AUTH)) { - if (service->needs_auth && !CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_AUTH)) - gtk_widget_show ((GtkWidget *) service->needs_auth); - } else { - if (service->needs_auth) - gtk_widget_hide ((GtkWidget *) service->needs_auth); - } -#ifdef HAVE_SSL - visible_ssl = - (provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL); - gtk_widget_set_visible (service->ssl_frame, visible_ssl); - gtk_widget_set_visible (service->ssl_hbox, visible_ssl); - gtk_widget_hide (service->no_ssl); -#else - gtk_widget_hide (service->ssl_hbox); - gtk_widget_show (service->no_ssl); -#endif - } else { - gtk_widget_hide (service->frame); - gtk_widget_hide (service->auth_frame); - gtk_widget_hide (service->ssl_frame); - } - - /* Update the EConfigTarget so it has the latest CamelSettings. */ - - config = E_CONFIG (service->emae->priv->config); - target = (EMConfigTargetSettings *) config->target; - - em_config_target_update_settings ( - config, target, - service->emae->priv->modified_account->id->address, - service->emae->priv->source.protocol, - service->emae->priv->source.settings, - service->emae->priv->transport.protocol, - service->emae->priv->transport.settings); -} - -static void -emae_provider_changed (GtkComboBox *combo_box, - EMAccountEditorService *service) -{ - const gchar *active_protocol; - - active_protocol = gtk_combo_box_get_active_id (combo_box); - - if (g_strcmp0 (active_protocol, service->protocol) == 0) - return; - - service->protocol = active_protocol; - - switch (service->type) { - case CAMEL_PROVIDER_STORE: - g_object_notify ( - G_OBJECT (service->emae), - "store-provider"); - break; - case CAMEL_PROVIDER_TRANSPORT: - g_object_notify ( - G_OBJECT (service->emae), - "transport-provider"); - break; - default: - g_warn_if_reached (); - } - - emae_service_provider_changed (service); - - e_config_target_changed ( - (EConfig *) service->emae->priv->config, - E_CONFIG_TARGET_CHANGED_REBUILD); -} - -static void -emae_refresh_providers (EMAccountEditor *emae, - EMAccountEditorService *service) -{ - GtkComboBoxText *combo_box; - GList *link; - - combo_box = GTK_COMBO_BOX_TEXT (service->providers); - - g_signal_handlers_block_by_func ( - combo_box, emae_provider_changed, service); - - gtk_combo_box_text_remove_all (combo_box); - - for (link = emae->priv->providers; link != NULL; link = link->next) { - CamelProvider *provider = link->data; - - /* FIXME This expression is awesomely unreadable! */ - if (!(provider->object_types[service->type] - && (service->type != CAMEL_PROVIDER_STORE || - (provider->flags & CAMEL_PROVIDER_IS_SOURCE) != 0)) - /* hardcode not showing providers who's transport is done in the store */ - || (service->type == CAMEL_PROVIDER_TRANSPORT - && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider))) - continue; - - gtk_combo_box_text_append ( - combo_box, - provider->protocol, - provider->name); - } - - g_signal_handlers_unblock_by_func ( - combo_box, emae_provider_changed, service); - - gtk_combo_box_set_active_id ( - GTK_COMBO_BOX (combo_box), service->protocol); - - /* make sure at least something is selected; - * this applies for cases when user changed from provider which was - * store and transport together, to a store provider only (like from - * exchange to imap provider), which left unselected transport type - */ - if (gtk_combo_box_get_active (GTK_COMBO_BOX (combo_box)) == -1) - gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0); -} - -static void -emae_authtype_changed (GtkComboBox *combo_box, - EMAccountEditorService *service) -{ - CamelServiceAuthType *authtype = NULL; - const gchar *mechanism; - gboolean sensitive = FALSE; - - mechanism = gtk_combo_box_get_active_id (combo_box); - - if (mechanism != NULL && *mechanism != '\0') { - authtype = camel_sasl_authtype (mechanism); - g_warn_if_fail (authtype != NULL); - } - - sensitive = (authtype == NULL) || (authtype->need_password); - gtk_widget_set_sensitive (GTK_WIDGET (service->remember), sensitive); -} - -static void emae_check_authtype (GtkWidget *w, EMAccountEditorService *service); - -static void -emae_check_authtype_done (CamelService *camel_service, - GAsyncResult *result, - EMAccountEditorService *service) -{ - EMailBackend *backend; - EMailSession *session; - GtkWidget *editor; - GList *available_authtypes; - GError *error = NULL; - - available_authtypes = camel_service_query_auth_types_finish ( - camel_service, result, &error); - - editor = NULL; - if (service->emae && service->emae->config && E_IS_CONFIG (service->emae->config)) - editor = E_CONFIG (service->emae->config)->window; - - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_warn_if_fail (available_authtypes == NULL); - g_error_free (error); - - } else if (error != NULL) { - g_warn_if_fail (available_authtypes == NULL); - if (service->check_dialog) - e_alert_run_dialog_for_args ( - GTK_WINDOW (service->check_dialog), - "mail:checking-service-error", - error->message, NULL); - g_error_free (error); - - } else { - e_auth_combo_box_update_available ( - E_AUTH_COMBO_BOX (service->authtype), - available_authtypes); - g_list_free (available_authtypes); - } - - if (service->check_dialog) { - g_object_weak_unref (G_OBJECT (service->check_dialog), (GWeakNotify) g_nullify_pointer, &service->check_dialog); - gtk_widget_destroy (service->check_dialog); - } - service->check_dialog = NULL; - - if (editor != NULL) - gtk_widget_set_sensitive (editor, TRUE); - - backend = em_account_editor_get_backend (service->emae); - session = e_mail_backend_get_session (backend); - - /* drop the temporary CamelService */ - camel_session_remove_service ( - CAMEL_SESSION (session), camel_service); - - g_object_unref (service->emae); -} - -static void -emae_check_authtype_response (GtkDialog *dialog, - gint button, - GCancellable *cancellable) -{ - g_cancellable_cancel (cancellable); -} - -static void -emae_check_authtype (GtkWidget *w, - EMAccountEditorService *service) -{ - CamelService *camel_service; - EMailBackend *backend; - EMailSession *session; - GtkWidget *editor; - gpointer parent; - gchar *uid; - GError *error = NULL; - - editor = E_CONFIG (service->emae->config)->window; - - backend = em_account_editor_get_backend (service->emae); - session = e_mail_backend_get_session (backend); - - uid = g_strdup_printf ("emae-check-authtype-%p", service); - - /* to test on actual data, not on previously used */ - camel_service = camel_session_add_service ( - CAMEL_SESSION (session), uid, - service->protocol, service->type, &error); - - g_free (uid); - - if (camel_service != NULL && service->settings != NULL) - camel_service_set_settings (camel_service, service->settings); - - if (editor != NULL) - parent = gtk_widget_get_toplevel (editor); - else - parent = gtk_widget_get_toplevel (w); - - if (error) { - e_alert_run_dialog_for_args ( - parent, "mail:checking-service-error", - error->message, NULL); - g_clear_error (&error); - return; - } - - g_return_if_fail (CAMEL_IS_SERVICE (camel_service)); - - if (service->checking != NULL) { - g_cancellable_cancel (service->checking); - g_object_unref (service->checking); - } - - service->checking = g_cancellable_new (); - - service->check_dialog = e_alert_dialog_new_for_args ( - parent, "mail:checking-service", NULL); - g_object_weak_ref (G_OBJECT (service->check_dialog), (GWeakNotify) g_nullify_pointer, &service->check_dialog); - - g_object_ref (service->emae); - - camel_service_query_auth_types ( - camel_service, G_PRIORITY_DEFAULT, - service->checking, (GAsyncReadyCallback) - emae_check_authtype_done, service); - - g_signal_connect ( - service->check_dialog, "response", - G_CALLBACK (emae_check_authtype_response), - service->checking); - - gtk_widget_show (service->check_dialog); - - if (editor != NULL) - gtk_widget_set_sensitive (editor, FALSE); -} - -static void -emae_setup_service (EMAccountEditor *emae, - EMAccountEditorService *service, - GtkBuilder *builder) -{ - struct _service_info *info = &emae_service_info[service->type]; - gboolean requires_auth; - CamelProvider *provider = NULL; - CamelURL *url; - - url = emae_account_url (emae, info->account_uri_key); - - if (!service->protocol) { - /* GtkComboBox internalizes ID strings, which for the provider - * combo box are protocol names. So we'll do the same here. */ - if (url != NULL && url->protocol != NULL) - service->protocol = g_intern_string (url->protocol); - - if (!service->protocol) - service->protocol = "none"; - } - - requires_auth = url && url->authmech != NULL; - - camel_url_free (url); - - if (service->protocol != NULL) - provider = camel_provider_get (service->protocol, NULL); - - /* Extract all widgets we need from the builder file. */ - - service->frame = e_builder_get_widget (builder, info->frame); - service->container = e_builder_get_widget (builder, info->container); - service->description = GTK_LABEL (e_builder_get_widget (builder, info->description)); - service->hostname = GTK_ENTRY (e_builder_get_widget (builder, info->hostname)); - service->hostlabel = (GtkLabel *) e_builder_get_widget (builder, info->hostlabel); - service->port = E_PORT_ENTRY (e_builder_get_widget (builder, info->port)); - service->portlabel = (GtkLabel *) e_builder_get_widget (builder, info->portlabel); - service->username = GTK_ENTRY (e_builder_get_widget (builder, info->username)); - service->userlabel = (GtkLabel *) e_builder_get_widget (builder, info->userlabel); - if (info->pathentry) { - service->pathlabel = (GtkLabel *) e_builder_get_widget (builder, info->pathlabel); - service->pathentry = e_builder_get_widget (builder, info->pathentry); - } - - service->ssl_frame = e_builder_get_widget (builder, info->security_frame); - gtk_widget_hide (service->ssl_frame); - service->ssl_hbox = e_builder_get_widget (builder, info->ssl_hbox); - service->use_ssl = (GtkComboBox *) e_builder_get_widget (builder, info->use_ssl); - service->no_ssl = e_builder_get_widget (builder, info->ssl_disabled); - - service->auth_frame = e_builder_get_widget (builder, info->auth_frame); - service->check_supported = (GtkButton *) e_builder_get_widget (builder, info->authtype_check); - service->authtype = (GtkComboBox *) e_builder_get_widget (builder, info->authtype); - service->providers = (GtkComboBox *) e_builder_get_widget (builder, info->type_dropdown); - - /* XXX GtkComboBoxText, when loaded from a GtkBuilder file, - * needs further manual configuration to be fully usable. - * Particularly the ID column has to be set explicitly. - * https://bugzilla.gnome.org/show_bug.cgi?id=612396#c53 */ - g_object_set ( - service->providers, - "entry-text-column", 0, - "id-column", 1, NULL); - - service->remember = emae_account_toggle (emae, info->remember_password, info->save_passwd_key, builder); - - if (info->needs_auth) { - service->needs_auth = (GtkToggleButton *) e_builder_get_widget (builder, info->needs_auth); - } else { - service->needs_auth = NULL; - } - - g_signal_connect ( - service->providers, "changed", - G_CALLBACK (emae_provider_changed), service); - - if (GTK_IS_FILE_CHOOSER (service->pathentry)) - g_signal_connect ( - service->pathentry, "selection-changed", - G_CALLBACK (emae_file_chooser_changed), service); - - g_signal_connect ( - service->authtype, "changed", - G_CALLBACK (emae_authtype_changed), service); - - g_signal_connect ( - service->check_supported, "clicked", - G_CALLBACK (emae_check_authtype), service); - - switch (service->type) { - case CAMEL_PROVIDER_STORE: - g_object_bind_property ( - emae, "store-provider", - service->authtype, "provider", - G_BINDING_SYNC_CREATE); - - if (service->needs_auth != NULL) { - g_object_set (emae, "store-requires-auth", requires_auth, NULL); - g_object_bind_property ( - emae, "store-requires-auth", - service->needs_auth, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - g_object_bind_property ( - emae, "store-requires-auth", - service->auth_frame, "sensitive", - G_BINDING_SYNC_CREATE); - } - - g_object_bind_property ( - emae, "store-visible-auth", - service->auth_frame, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-host", - service->hostname, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-host", - service->hostlabel, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-path", - service->pathentry, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-path", - service->pathlabel, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-port", - service->port, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-port", - service->portlabel, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-user", - service->username, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "store-visible-user", - service->userlabel, "visible", - G_BINDING_SYNC_CREATE); - - break; - - case CAMEL_PROVIDER_TRANSPORT: - g_object_bind_property ( - emae, "transport-provider", - service->authtype, "provider", - G_BINDING_SYNC_CREATE); - - if (service->needs_auth != NULL) { - g_object_set (emae, "transport-requires-auth", requires_auth, NULL); - g_object_bind_property ( - emae, "transport-requires-auth", - service->needs_auth, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - g_object_bind_property ( - emae, "transport-requires-auth", - service->auth_frame, "sensitive", - G_BINDING_SYNC_CREATE); - } - - g_object_bind_property ( - emae, "transport-visible-auth", - service->auth_frame, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-host", - service->hostname, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-host", - service->hostlabel, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-port", - service->port, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-port", - service->portlabel, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-user", - service->username, "visible", - G_BINDING_SYNC_CREATE); - - g_object_bind_property ( - emae, "transport-visible-user", - service->userlabel, "visible", - G_BINDING_SYNC_CREATE); - - break; - - default: - g_warn_if_reached (); - } - - if (service->pathentry) { - GtkFileChooserAction action; - gboolean need_path_dir; - const gchar *label; - - need_path_dir = - (provider == NULL) || - ((provider->url_flags & CAMEL_URL_NEED_PATH_DIR) != 0); - - if (need_path_dir) { - action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; - label = _("_Path:"); - } else { - action = GTK_FILE_CHOOSER_ACTION_OPEN; - label = _("Fil_e:"); - } - - if (service->pathlabel) - gtk_label_set_text_with_mnemonic ( - GTK_LABEL (service->pathlabel), label); - - if (action != gtk_file_chooser_get_action (GTK_FILE_CHOOSER (service->pathentry))) - gtk_file_chooser_set_action (GTK_FILE_CHOOSER (service->pathentry), action); - } - - /* old authtype will be destroyed when we exit */ - emae_refresh_providers (emae, service); - - if (provider != NULL && provider->port_entries) { - e_port_entry_set_camel_entries ( - service->port, provider->port_entries); - - /* update also port in settings, because it's not bind yet */ - if (service->settings && CAMEL_IS_NETWORK_SETTINGS (service->settings)) { - camel_network_settings_set_port ( - CAMEL_NETWORK_SETTINGS (service->settings), - e_port_entry_get_port (service->port)); - } - } - - emae_service_provider_changed (service); -} - -static GtkWidget * -emae_create_basic_assistant_page (EMAccountEditor *emae, - GtkAssistant *assistant, - const gchar *page_id, - gint position) -{ - const gchar *title = NULL, *label = NULL; - GtkAssistantPageType page_type = GTK_ASSISTANT_PAGE_CONTENT; - GtkWidget *vbox, *lbl; - gboolean fill_space = FALSE; - - g_return_val_if_fail (page_id != NULL, NULL); - - if (g_ascii_strcasecmp (page_id, "start_page") == 0) { - page_type = GTK_ASSISTANT_PAGE_INTRO; - fill_space = TRUE; - title = _("Mail Configuration"); - label = _("Welcome to the Evolution Mail Configuration Assistant.\n\nClick \"Continue\" to begin."); - } else if (g_ascii_strcasecmp (page_id, "identity_page") == 0) { - title = _("Identity"); - label = _("Please enter your name and email address below. The \"optional\" fields below do not need to be filled in, unless you wish to include this information in email you send."); - } else if (g_ascii_strcasecmp (page_id, "source_page") == 0) { - title = _("Receiving Email"); - label = _("Please configure the following account settings."); - } else if (g_ascii_strcasecmp (page_id, "transport_page") == 0) { - title = _("Sending Email"); - label = _("Please enter information about the way you will send mail. If you are not sure, ask your system administrator or Internet Service Provider."); - } else if (g_ascii_strcasecmp (page_id, "review_page") == 0) { - title = _("Account Summary"); - label = _("This is a summary of the settings which will be used to access your mail."); - } else if (g_ascii_strcasecmp (page_id, "finish_page") == 0) { - page_type = GTK_ASSISTANT_PAGE_CONFIRM; - fill_space = TRUE; - title = _("Done"); - label = _("Congratulations, your mail configuration is complete.\n\nYou are now ready to send and receive email using Evolution.\n\nClick \"Apply\" to save your settings."); - } else { - g_return_val_if_reached (NULL); - } - - vbox = gtk_vbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); - gtk_widget_show (vbox); - - lbl = gtk_label_new (label); - gtk_label_set_line_wrap (GTK_LABEL (lbl), TRUE); - gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (vbox), lbl, fill_space, fill_space, 0); - gtk_widget_show (lbl); - - if (g_ascii_strcasecmp (page_id, "start_page") == 0) - g_hash_table_insert (emae->priv->widgets, (gchar *)"start_page_label", lbl); - - gtk_assistant_insert_page (assistant, vbox, position); - gtk_assistant_set_page_title (assistant, vbox, title); - gtk_assistant_set_page_type (assistant, vbox, page_type); - - return vbox; -} - -/* do not re-order these, the order is used by various code to look up emae->priv->identity_entries[] */ -static struct { - const gchar *name; - gint item; -} emae_identity_entries[] = { - { "management_name", E_ACCOUNT_NAME }, - { "identity_full_name", E_ACCOUNT_ID_NAME }, - { "identity_address", E_ACCOUNT_ID_ADDRESS }, - { "identity_reply_to", E_ACCOUNT_ID_REPLY_TO }, - { "identity_organization", E_ACCOUNT_ID_ORGANIZATION }, -}; - -static void -emae_queue_widgets (EMAccountEditor *emae, - GtkBuilder *builder, - const gchar *first, - ...) -{ - va_list ap; - - va_start (ap, first); - while (first) { - g_hash_table_insert (emae->priv->widgets, (gchar *) first, e_builder_get_widget (builder, first)); - first = va_arg (ap, const gchar *); - } - va_end (ap); -} - -static GtkWidget * -emae_identity_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *priv = emae->priv; - EAccount *account; - gint i; - GtkWidget *w; - GtkBuilder *builder; - - if (old && emae->type == EMAE_PAGES) - return old; - - account = em_account_editor_get_modified_account (emae); - - /* Make sure our custom widget classes are registered with - * GType before we load the GtkBuilder definition file. */ - E_TYPE_MAIL_JUNK_OPTIONS; - EM_TYPE_FOLDER_SELECTION_BUTTON; - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - /* Management & Identity fields, in the assistant the management frame is relocated to the last page later on */ - for (i = 0; i < G_N_ELEMENTS (emae_identity_entries); i++) - priv->identity_entries[i] = emae_account_entry (emae, emae_identity_entries[i].name, emae_identity_entries[i].item, builder); - - priv->management_frame = e_builder_get_widget (builder, "management-section"); - - priv->default_account = GTK_TOGGLE_BUTTON (e_builder_get_widget (builder, "management_default")); - if (!e_get_default_account () - || (account == e_get_default_account ()) - || (GPOINTER_TO_INT(g_object_get_data (G_OBJECT (account), "default_flagged"))) ) - gtk_toggle_button_set_active (priv->default_account, TRUE); - - if (emae->do_signature) { - emae_setup_signatures (emae, builder); - } else { - /* TODO: this could/should probably be neater */ - gtk_widget_hide (e_builder_get_widget (builder, "sigLabel")); -#if 0 - gtk_widget_hide (e_builder_get_widget (builder, "sigOption")); -#endif - gtk_widget_hide (e_builder_get_widget (builder, "signature_dropdown")); - gtk_widget_hide (e_builder_get_widget (builder, "sigAddNew")); - } - - w = e_builder_get_widget (builder, item->label); - if (emae->type == EMAE_PAGES) { - GtkWidget *page = emae_create_basic_assistant_page (emae, GTK_ASSISTANT (parent), "identity_page", position); - - gtk_box_pack_start ((GtkBox *) emae->pages[0], w, TRUE, TRUE, 0); - w = page; - } else if (((EConfig *) priv->config)->type == E_CONFIG_ASSISTANT) { - GtkWidget *page; - - page = emae_create_basic_assistant_page ( - emae, GTK_ASSISTANT (parent), - "identity_page", position); - - gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - - w = page; - } else { - gtk_notebook_insert_page ( - GTK_NOTEBOOK (parent), w, - gtk_label_new (_("Identity")), - position); - gtk_container_child_set ( - GTK_CONTAINER (parent), w, - "tab-fill", FALSE, "tab-expand", FALSE, NULL); - } - - emae_queue_widgets ( - emae, builder, - "account_vbox", - "identity-required-table", - "identity-optional-table", - "identity-optional-section", - "identity_address", - NULL); - - g_object_unref (builder); - - return w; -} - -static GtkWidget * -emae_receive_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *priv = emae->priv; - GtkWidget *w; - GtkBuilder *builder; - - /*if (old) - return old;*/ - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - priv->source.type = CAMEL_PROVIDER_STORE; - emae_setup_service (emae, &priv->source, builder); - - w = e_builder_get_widget (builder, item->label); - if (emae->type == EMAE_PAGES) { - GtkWidget *page = emae_create_basic_assistant_page (emae, GTK_ASSISTANT (parent), "source_page", position); - GtkWidget *vbox, *child; - - child = (GtkWidget *)g_object_get_data ((GObject *)emae->pages[1], "old-child"); - if (child) - gtk_container_remove ((GtkContainer *) emae->pages[1], child); - - vbox = gtk_vbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); - gtk_widget_show (vbox); - gtk_box_pack_start ((GtkBox *) vbox, w, TRUE, TRUE, 0); - g_object_set_data ((GObject *)emae->pages[1], "old-child", vbox); - gtk_box_pack_start ((GtkBox *) emae->pages[1], vbox, TRUE, TRUE, 0); - - w = page; - } else if (((EConfig *) priv->config)->type == E_CONFIG_ASSISTANT) { - GtkWidget *page; - - page = emae_create_basic_assistant_page ( - emae, GTK_ASSISTANT (parent), - "source_page", position); - - gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - - w = page; - } else { - gtk_notebook_insert_page ( - GTK_NOTEBOOK (parent), w, - gtk_label_new (_("Receiving Email")), - position); - gtk_container_child_set ( - GTK_CONTAINER (parent), w, - "tab-fill", FALSE, "tab-expand", FALSE, NULL); - } - - emae_queue_widgets ( - emae, builder, - "source-type-table", - "source-config-table", - "source-security-vbox", - "source-auth-vbox", - NULL); - - g_object_unref (builder); - - return w; -} - -static void -emae_set_option_dependency (EMAccountEditorService *service, - CamelProviderConfEntry *conf, - GtkWidget *widget) -{ - if (conf->depname != NULL) { - const gchar *depname = conf->depname; - - if (*depname == '!') - depname++; - - g_object_bind_property ( - service->settings, depname, - widget, "sensitive", - G_BINDING_SYNC_CREATE | - (depname == conf->depname ? 0 : G_BINDING_INVERT_BOOLEAN)); - gtk_widget_set_margin_left (widget, INDENT_MARGIN); - } -} - -static GtkWidget * -emae_option_toggle (EMAccountEditorService *service, - CamelProviderConfEntry *conf) -{ - GtkWidget *widget; - - widget = gtk_check_button_new_with_mnemonic (conf->text); - - g_object_bind_property ( - service->settings, conf->name, - widget, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - emae_set_option_dependency (service, conf, widget); - - return widget; -} - -static GtkWidget * -emae_option_entry (EMAccountEditorService *service, - CamelProviderConfEntry *conf, - GtkLabel *label_for_mnemonic) -{ - GtkWidget *widget; - - widget = gtk_entry_new (); - gtk_label_set_mnemonic_widget (label_for_mnemonic, widget); - - g_object_bind_property ( - service->settings, conf->name, - widget, "text", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - emae_set_option_dependency (service, conf, widget); - - g_object_bind_property ( - widget, "sensitive", - label_for_mnemonic, "sensitive", - G_BINDING_SYNC_CREATE); - - return widget; -} - -static GtkWidget * -emae_option_checkspin (EMAccountEditorService *service, - CamelProviderConfEntry *conf) -{ - GObjectClass *class; - GParamSpec *pspec; - GParamSpec *use_pspec; - GtkAdjustment *adjustment; - GtkWidget *hbox, *spin; - GtkWidget *prefix; - gchar *use_property_name; - gchar *pre, *post; - - /* The conf->name property (e.g. "foo") should be numeric for the - * spin button. If a "use" boolean property exists (e.g. "use-foo") - * then a checkbox is also shown. */ - - g_return_val_if_fail (conf->name != NULL, NULL); - - class = G_OBJECT_GET_CLASS (service->settings); - pspec = g_object_class_find_property (class, conf->name); - g_return_val_if_fail (pspec != NULL, NULL); - - use_property_name = g_strconcat ("use-", conf->name, NULL); - use_pspec = g_object_class_find_property (class, use_property_name); - if (use_pspec != NULL && use_pspec->value_type != G_TYPE_BOOLEAN) - use_pspec = NULL; - g_free (use_property_name); - - /* Make sure we can convert to and from doubles. */ - g_return_val_if_fail ( - g_value_type_transformable ( - pspec->value_type, G_TYPE_DOUBLE), NULL); - g_return_val_if_fail ( - g_value_type_transformable ( - G_TYPE_DOUBLE, pspec->value_type), NULL); - - if (G_IS_PARAM_SPEC_CHAR (pspec)) { - GParamSpecChar *pspec_char; - pspec_char = G_PARAM_SPEC_CHAR (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_char->default_value, - (gdouble) pspec_char->minimum, - (gdouble) pspec_char->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_UCHAR (pspec)) { - GParamSpecUChar *pspec_uchar; - pspec_uchar = G_PARAM_SPEC_UCHAR (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_uchar->default_value, - (gdouble) pspec_uchar->minimum, - (gdouble) pspec_uchar->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_INT (pspec)) { - GParamSpecInt *pspec_int; - pspec_int = G_PARAM_SPEC_INT (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_int->default_value, - (gdouble) pspec_int->minimum, - (gdouble) pspec_int->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_UINT (pspec)) { - GParamSpecUInt *pspec_uint; - pspec_uint = G_PARAM_SPEC_UINT (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_uint->default_value, - (gdouble) pspec_uint->minimum, - (gdouble) pspec_uint->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_LONG (pspec)) { - GParamSpecLong *pspec_long; - pspec_long = G_PARAM_SPEC_LONG (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_long->default_value, - (gdouble) pspec_long->minimum, - (gdouble) pspec_long->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_ULONG (pspec)) { - GParamSpecULong *pspec_ulong; - pspec_ulong = G_PARAM_SPEC_ULONG (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_ulong->default_value, - (gdouble) pspec_ulong->minimum, - (gdouble) pspec_ulong->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_FLOAT (pspec)) { - GParamSpecFloat *pspec_float; - pspec_float = G_PARAM_SPEC_FLOAT (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_float->default_value, - (gdouble) pspec_float->minimum, - (gdouble) pspec_float->maximum, - 1.0, 1.0, 0.0); - - } else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) { - GParamSpecDouble *pspec_double; - pspec_double = G_PARAM_SPEC_DOUBLE (pspec); - adjustment = gtk_adjustment_new ( - (gdouble) pspec_double->default_value, - (gdouble) pspec_double->minimum, - (gdouble) pspec_double->maximum, - 1.0, 1.0, 0.0); - - } else - g_return_val_if_reached (NULL); - - pre = g_alloca (strlen (conf->text) + 1); - strcpy (pre, conf->text); - post = strstr (pre, "%s"); - if (post != NULL) { - *post = '\0'; - post += 2; - } - - hbox = gtk_hbox_new (FALSE, 3); - - if (use_pspec != NULL) { - prefix = gtk_check_button_new_with_mnemonic (pre); - - g_object_bind_property ( - service->settings, use_pspec->name, - prefix, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - } else { - prefix = gtk_label_new_with_mnemonic (pre); - } - gtk_box_pack_start (GTK_BOX (hbox), prefix, FALSE, TRUE, 0); - gtk_widget_show (prefix); - - spin = gtk_spin_button_new (adjustment, 1.0, 0); - gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, TRUE, 0); - gtk_widget_show (spin); - - g_object_bind_property ( - service->settings, conf->name, - spin, "value", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - if (use_pspec != NULL) - g_object_bind_property ( - prefix, "active", - spin, "sensitive", - G_BINDING_SYNC_CREATE); - - if (post != NULL) { - GtkWidget *label = gtk_label_new_with_mnemonic (post); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), prefix); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); - gtk_widget_show (label); - } - - emae_set_option_dependency (service, conf, hbox); - - return hbox; -} - -/* 'values' is in format "nick0:caption0:nick1:caption1:...nickN:captionN" - * where 'nick' is the nickname of a GEnumValue belonging to a GEnumClass - * determined by the type of the GObject property named "name". */ -static GtkWidget * -emae_option_options (EMAccountEditorService *service, - CamelProviderConfEntry *conf, - GtkLabel *label) -{ - CamelProvider *provider; - GtkWidget *widget; - GtkListStore *store; - GtkTreeIter iter; - const gchar *p; - GtkCellRenderer *renderer; - - provider = camel_provider_get (service->protocol, NULL); - g_return_val_if_fail (provider != NULL, NULL); - - /* nick and caption */ - store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - - p = conf->value; - while (p != NULL) { - const gchar *nick; - const gchar *caption; - gchar *vl, *cp; - - nick = p; - caption = strchr (p, ':'); - if (caption) { - caption++; - } else { - g_warning (G_STRLOC ": expected ':' not found at '%s'", p); - break; - } - p = strchr (caption, ':'); - - vl = g_strndup (nick, caption - nick - 1); - if (p) { - p++; - cp = g_strndup (caption, p - caption - 1); - } else - cp = g_strdup (caption); - - gtk_list_store_append (store, &iter); - gtk_list_store_set ( - store, &iter, 0, vl, 1, dgettext ( - provider->translation_domain, cp), -1); - - g_free (vl); - g_free (cp); - } - - widget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); - gtk_combo_box_set_id_column (GTK_COMBO_BOX (widget), 0); - gtk_widget_show (widget); - - g_object_bind_property_full ( - service->settings, conf->name, - widget, "active-id", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE, - e_binding_transform_enum_value_to_nick, - e_binding_transform_enum_nick_to_value, - NULL, (GDestroyNotify) NULL); - - renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE); - gtk_cell_layout_set_attributes ( - GTK_CELL_LAYOUT (widget), renderer, "text", 1, NULL); - - gtk_label_set_mnemonic_widget (label, widget); - - return widget; -} - -static GtkWidget * -emae_receive_options_item (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - CamelProvider *provider; - GtkWidget *w, *box, *spin; - guint row; - - provider = emae_get_store_provider (emae); - - if (provider == NULL || provider->extra_conf == NULL) - return NULL; - - if (old) { - if (emae->type == EMAE_PAGES) { - GtkWidget *box = gtk_hbox_new (FALSE, 12); - gtk_widget_reparent (old, box); - gtk_widget_show (box); - gtk_box_set_child_packing ((GtkBox *) box, old, TRUE, TRUE, 12, GTK_PACK_START); - gtk_box_pack_end ((GtkBox *) emae->pages[2], box, FALSE, FALSE, 0); - } - return old; - } - - if (emae->type == EMAE_PAGES) { - GtkWidget *box = gtk_hbox_new (FALSE, 12); - gtk_widget_reparent (parent, box); - gtk_widget_show (box); - gtk_box_set_child_packing ((GtkBox *) box, parent, TRUE, TRUE, 12, GTK_PACK_START); - gtk_box_pack_start ((GtkBox *) emae->pages[2], box, FALSE, FALSE, 0); - } - - /* We have to add the automatic mail check item with the rest of the receive options */ - g_object_get (parent, "n-rows", &row, NULL); - - box = gtk_hbox_new (FALSE, 4); - w = gtk_check_button_new_with_mnemonic (_("Check for _new messages every")); - emae_account_toggle_widget (emae, (GtkToggleButton *) w, E_ACCOUNT_SOURCE_AUTO_CHECK); - gtk_box_pack_start ((GtkBox *) box, w, FALSE, FALSE, 0); - - spin = gtk_spin_button_new_with_range (1.0, 1440.0, 1.0); - emae_account_spinint_widget (emae, (GtkSpinButton *) spin, E_ACCOUNT_SOURCE_AUTO_CHECK_TIME); - gtk_box_pack_start ((GtkBox *) box, spin, FALSE, TRUE, 0); - - w = gtk_label_new_with_mnemonic (_("minu_tes")); - gtk_label_set_mnemonic_widget (GTK_LABEL (w), spin); - gtk_box_pack_start ((GtkBox *) box, w, FALSE, FALSE, 0); - - gtk_widget_show_all (box); - - gtk_table_attach ((GtkTable *) parent, box, 0, 2, row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - - return box; -} - -static GtkWidget * -emae_receive_options_extra_item (EConfig *ec, - EConfigItem *eitem, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorService *service; - struct _receive_options_item *item = (struct _receive_options_item *) eitem; - GtkWidget *box; - GtkWidget *widget; - GtkLabel *label; - GtkTable *table; - CamelProvider *provider; - CamelProviderConfEntry *entries; - guint row; - GHashTable *extra; - const gchar *section_name; - gint ii; - - service = &emae->priv->source; - section_name = eitem->user_data; - - provider = emae_get_store_provider (emae); - - if (provider == NULL || provider->extra_conf == NULL) - return NULL; - - entries = provider->extra_conf; - - if (emae->type == EMAE_PAGES) { - GtkWidget *box; - - box = gtk_hbox_new (FALSE, 12); - gtk_widget_reparent (parent, box); - gtk_widget_show (box); - gtk_box_set_child_packing ( - GTK_BOX (box), parent, - TRUE, TRUE, 12, GTK_PACK_START); - gtk_box_pack_start ( - GTK_BOX (emae->pages[2]), box, FALSE, FALSE, 0); - } - - for (ii = 0; entries && entries[ii].type != CAMEL_PROVIDER_CONF_END; ii++) - if (entries[ii].type == CAMEL_PROVIDER_CONF_SECTION_START - && g_strcmp0 (entries[ii].name, section_name) == 0) - goto section; - - return NULL; - -section: - d (printf ("Building extra section '%s'\n", eitem->path)); - widget = NULL; - item->extra_table = g_hash_table_new (g_str_hash, g_str_equal); - extra = g_hash_table_new (g_str_hash, g_str_equal); - - table = GTK_TABLE (parent); - g_object_get (table, "n-rows", &row, NULL); - - for (; entries[ii].type != CAMEL_PROVIDER_CONF_END && entries[ii].type != CAMEL_PROVIDER_CONF_SECTION_END; ii++) { - switch (entries[ii].type) { - case CAMEL_PROVIDER_CONF_SECTION_START: - case CAMEL_PROVIDER_CONF_SECTION_END: - break; - - case CAMEL_PROVIDER_CONF_LABEL: - /* FIXME This is a hack for exchange connector, - * labels should be removed from confentry. */ - if (!strcmp (entries[ii].name, "hostname")) - label = emae->priv->source.hostlabel; - else if (!strcmp (entries[ii].name, "username")) - label = emae->priv->source.userlabel; - else - label = NULL; - - if (label != NULL) - gtk_label_set_text_with_mnemonic ( - label, entries[ii].text); - break; - - case CAMEL_PROVIDER_CONF_CHECKBOX: - widget = emae_option_toggle (service, &entries[ii]); - gtk_table_attach ( - table, widget, 0, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - gtk_widget_show (widget); - - g_hash_table_insert ( - extra, (gpointer) entries[ii].name, widget); - - row++; - - /* HACK: keep_on_server is stored in the e-account, - * but is displayed as a properly on the uri, make - * sure they track/match here. */ - if (strcmp (entries[ii].name, "keep-on-server") == 0) - emae_account_toggle_widget ( - emae, (GtkToggleButton *) widget, - E_ACCOUNT_SOURCE_KEEP_ON_SERVER); - break; - - case CAMEL_PROVIDER_CONF_ENTRY: - widget = gtk_label_new_with_mnemonic (entries[ii].text); - gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); - gtk_table_attach ( - table, widget, 0, 1, - row, row + 1, GTK_FILL, 0, 0, 0); - gtk_widget_show (widget); - - label = GTK_LABEL (widget); - - widget = emae_option_entry ( - service, &entries[ii], label); - gtk_table_attach ( - table, widget, 1, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - gtk_widget_show (widget); - - row++; - - /* FIXME This is another hack for - * exchange/groupwise connector. */ - g_hash_table_insert ( - item->extra_table, - (gpointer) entries[ii].name, widget); - break; - - case CAMEL_PROVIDER_CONF_CHECKSPIN: - widget = emae_option_checkspin (service, &entries[ii]); - gtk_table_attach ( - table, widget, 0, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - gtk_widget_show (widget); - row++; - break; - - case CAMEL_PROVIDER_CONF_OPTIONS: - box = gtk_hbox_new (FALSE, 4); - gtk_table_attach ( - table, box, 0, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - gtk_widget_show (box); - - widget = gtk_label_new_with_mnemonic (entries[ii].text); - gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); - gtk_box_pack_start ( - GTK_BOX (box), widget, FALSE, FALSE, 0); - gtk_widget_show (widget); - - label = GTK_LABEL (widget); - - widget = emae_option_options ( - service, &entries[ii], label); - gtk_box_pack_start ( - GTK_BOX (box), widget, FALSE, FALSE, 0); - gtk_widget_show (widget); - - row++; - break; - - default: - break; - } - } - - if (widget != NULL) - gtk_widget_show (widget); - - return widget; -} - -static GtkWidget * -emae_send_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *priv = emae->priv; - CamelProvider *provider; - GtkWidget *w; - GtkBuilder *builder; - - provider = emae_get_store_provider (emae); - - /* no transport options page at all for these types of providers */ - if (provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) { - memset (&priv->transport.frame, 0, ((gchar *) &priv->transport.check_dialog) - ((gchar *) &priv->transport.frame)); - priv->transport.protocol = provider->protocol; - return NULL; - } - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - /* Transport */ - priv->transport.type = CAMEL_PROVIDER_TRANSPORT; - emae_setup_service (emae, &priv->transport, builder); - - w = e_builder_get_widget (builder, item->label); - if (emae->type == EMAE_PAGES) { - GtkWidget *page = emae_create_basic_assistant_page (emae, GTK_ASSISTANT (parent), "transport_page", position); - GtkWidget *vbox, *child; - - child = (GtkWidget *)g_object_get_data ((GObject *)emae->pages[3], "old-child"); - if (child) - gtk_container_remove ((GtkContainer *) emae->pages[3], child); - - vbox = gtk_vbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); - gtk_widget_show (vbox); - gtk_box_pack_start ((GtkBox *) vbox, w, TRUE, TRUE, 0); - g_object_set_data ((GObject *)emae->pages[3], "old-child", vbox); - - gtk_box_pack_start ((GtkBox *) emae->pages[3], vbox, TRUE, TRUE, 0); - - w = page; - } else if (((EConfig *) priv->config)->type == E_CONFIG_ASSISTANT) { - GtkWidget *page; - - page = emae_create_basic_assistant_page ( - emae, GTK_ASSISTANT (parent), - "transport_page", position); - - gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - - w = page; - } else { - gtk_notebook_insert_page ( - GTK_NOTEBOOK (parent), w, - gtk_label_new (_("Sending Email")), - position); - gtk_container_child_set ( - GTK_CONTAINER (parent), w, - "tab-fill", FALSE, "tab-expand", FALSE, NULL); - } - - emae_queue_widgets ( - emae, builder, - "transport-type-table", - "transport-server-table", - "transport-security-table", - "transport-auth-table", - NULL); - - g_object_unref (builder); - - return w; -} - -static void -emae_real_url_toggled (GtkToggleButton *check, - EMFolderSelectionButton *button) -{ - if (!gtk_toggle_button_get_active (check)) - em_folder_selection_button_set_folder_uri (button, ""); -} - -static void -set_real_folder_path (GtkButton *folder_button, - CamelSettings *settings, - const gchar *settings_prop, - EAccount *account) -{ - gchar *path = NULL, *uri; - gchar *encoded_name; - gchar *encoded_uid; - const gchar *folder_name; - - g_return_if_fail (folder_button != NULL); - g_return_if_fail (settings != NULL); - g_return_if_fail (settings_prop != NULL); - g_return_if_fail (account != NULL); - - g_object_get (G_OBJECT (settings), settings_prop, &path, NULL); - - if (!path || !*path) { - g_free (path); - return; - } - - folder_name = path; - - /* Skip the leading slash, if present. */ - if (*folder_name == '/') - folder_name++; - - encoded_uid = camel_url_encode (account->uid, ":;@/"); - encoded_name = camel_url_encode (folder_name, "#"); - - uri = g_strdup_printf ("folder://%s/%s", encoded_uid, encoded_name); - - g_free (encoded_uid); - g_free (encoded_name); - g_free (path); - - em_folder_selection_button_set_folder_uri (EM_FOLDER_SELECTION_BUTTON (folder_button), uri); - - g_free (uri); -} - -static void -update_real_folder_cb (GtkButton *folder_button, - GParamSpec *par_spec, - EMAccountEditor *emae) -{ - EMFolderSelectionButton *sel_button; - CamelSettings *settings; - const gchar *prop_name = NULL; - const gchar *folder_uri; - gchar *path = NULL; - - g_return_if_fail (folder_button != NULL); - g_return_if_fail (emae != NULL); - g_return_if_fail (emae->priv != NULL); - - settings = emae->priv->source.settings; - if (folder_button == emae->priv->trash_folder_button) - prop_name = "real-trash-path"; - else if (folder_button == emae->priv->junk_folder_button) - prop_name = "real-junk-path"; - - g_return_if_fail (prop_name != NULL); - - sel_button = EM_FOLDER_SELECTION_BUTTON (folder_button); - g_return_if_fail (sel_button != NULL); - - folder_uri = em_folder_selection_button_get_folder_uri (sel_button); - if (folder_uri && *folder_uri) { - EMailSession *session; - - session = em_folder_selection_button_get_session (sel_button); - if (!e_mail_folder_uri_parse (CAMEL_SESSION (session), folder_uri, NULL, &path, NULL)) - path = NULL; - } - - g_object_set (G_OBJECT (settings), prop_name, path, NULL); - g_free (path); -} - -static GtkWidget * -emae_defaults_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *priv = emae->priv; - EMFolderSelectionButton *button; - CamelProviderFlags flags; - CamelProvider *provider; - CamelSettings *settings; - CamelStore *store = NULL; - EMailBackend *backend; - EMailSession *session; - EAccount *account; - GtkWidget *widget; - GtkBuilder *builder; - GParamSpec *pspec; - gboolean visible; - - /*if (old) - return old;*/ - if (((EConfig *) priv->config)->type == E_CONFIG_ASSISTANT && emae->type != EMAE_PAGES) - return NULL; - - account = em_account_editor_get_modified_account (emae); - backend = em_account_editor_get_backend (emae); - - session = e_mail_backend_get_session (backend); - - if (account != NULL) { - CamelService *service; - - service = camel_session_get_service ( - CAMEL_SESSION (session), account->uid); - - if (CAMEL_IS_STORE (service)) - store = CAMEL_STORE (service); - } - - provider = emae_get_store_provider (emae); - settings = emae->priv->source.settings; - - /* Make sure we have a valid EMailBackend. */ - g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - /* Special folders */ - button = emae_account_folder ( - emae, "drafts_button", - E_ACCOUNT_DRAFTS_FOLDER_URI, - E_MAIL_LOCAL_FOLDER_DRAFTS, builder); - priv->drafts_folder_button = GTK_BUTTON (button); - - button = emae_account_folder ( - emae, "sent_button", - E_ACCOUNT_SENT_FOLDER_URI, - E_MAIL_LOCAL_FOLDER_SENT, builder); - priv->sent_folder_button = GTK_BUTTON (button); - - widget = e_builder_get_widget (builder, "trash_folder_check"); - priv->trash_folder_check = GTK_TOGGLE_BUTTON (widget); - - widget = e_builder_get_widget (builder, "trash_folder_butt"); - button = EM_FOLDER_SELECTION_BUTTON (widget); - em_folder_selection_button_set_session (button, session); - em_folder_selection_button_set_store (button, store); - priv->trash_folder_button = GTK_BUTTON (button); - - g_signal_connect ( - priv->trash_folder_check, "toggled", - G_CALLBACK (emae_real_url_toggled), - priv->trash_folder_button); - - g_object_bind_property ( - priv->trash_folder_check, "active", - priv->trash_folder_button, "sensitive", - G_BINDING_SYNC_CREATE); - - if (settings != NULL) - pspec = g_object_class_find_property ( - G_OBJECT_GET_CLASS (settings), - "use-real-trash-path"); - else - pspec = NULL; - - if (pspec != NULL) - g_object_bind_property ( - settings, "use-real-trash-path", - priv->trash_folder_check, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - if (settings != NULL) - pspec = g_object_class_find_property ( - G_OBJECT_GET_CLASS (settings), - "real-trash-path"); - else - pspec = NULL; - - if (pspec != NULL) { - set_real_folder_path ( - priv->trash_folder_button, - settings, "real-trash-path", account); - g_signal_connect ( - priv->trash_folder_button, "notify::folder-uri", - G_CALLBACK (update_real_folder_cb), emae); - } - - flags = CAMEL_PROVIDER_ALLOW_REAL_TRASH_FOLDER; - visible = - (provider != NULL) && - ((provider->flags & flags) != 0); - widget = GTK_WIDGET (priv->trash_folder_check); - gtk_widget_set_visible (widget, visible); - widget = GTK_WIDGET (priv->trash_folder_button); - gtk_widget_set_visible (widget, visible); - - widget = e_builder_get_widget (builder, "junk_folder_check"); - priv->junk_folder_check = GTK_TOGGLE_BUTTON (widget); - - widget = e_builder_get_widget (builder, "junk_folder_butt"); - button = EM_FOLDER_SELECTION_BUTTON (widget); - em_folder_selection_button_set_session (button, session); - em_folder_selection_button_set_store (button, store); - priv->junk_folder_button = GTK_BUTTON (button); - - g_signal_connect ( - priv->junk_folder_check, "toggled", - G_CALLBACK (emae_real_url_toggled), - priv->junk_folder_button); - - g_object_bind_property ( - priv->junk_folder_check, "active", - priv->junk_folder_button, "sensitive", - G_BINDING_SYNC_CREATE); - - if (settings != NULL) - pspec = g_object_class_find_property ( - G_OBJECT_GET_CLASS (settings), - "use-real-junk-path"); - else - pspec = NULL; - - if (pspec != NULL) - g_object_bind_property ( - settings, "use-real-junk-path", - priv->junk_folder_check, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - if (settings != NULL) - pspec = g_object_class_find_property ( - G_OBJECT_GET_CLASS (settings), - "real-junk-path"); - else - pspec = NULL; - - if (pspec != NULL) { - set_real_folder_path ( - priv->junk_folder_button, - settings, "real-junk-path", account); - g_signal_connect ( - priv->junk_folder_button, "notify::folder-uri", - G_CALLBACK (update_real_folder_cb), emae); - } - - flags = CAMEL_PROVIDER_ALLOW_REAL_JUNK_FOLDER; - visible = - (provider != NULL) && - ((provider->flags & flags) != 0); - widget = GTK_WIDGET (priv->junk_folder_check); - gtk_widget_set_visible (widget, visible); - widget = GTK_WIDGET (priv->junk_folder_button); - gtk_widget_set_visible (widget, visible); - - /* Special Folders "Reset Defaults" button */ - priv->restore_folders_button = (GtkButton *)e_builder_get_widget (builder, "default_folders_button"); - g_signal_connect ( - priv->restore_folders_button, "clicked", - G_CALLBACK (default_folders_clicked), emae); - - /* Always Cc/Bcc */ - emae_account_toggle (emae, "always_cc", E_ACCOUNT_CC_ALWAYS, builder); - emae_account_entry (emae, "cc_addrs", E_ACCOUNT_CC_ADDRS, builder); - emae_account_toggle (emae, "always_bcc", E_ACCOUNT_BCC_ALWAYS, builder); - emae_account_entry (emae, "bcc_addrs", E_ACCOUNT_BCC_ADDRS, builder); - - gtk_widget_set_sensitive ( - GTK_WIDGET (priv->sent_folder_button), - (provider ? !(provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER) : TRUE)); - - gtk_widget_set_sensitive ( - GTK_WIDGET (priv->restore_folders_button), - (provider && !(provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER))); - - /* Receipt policy */ - emae_setup_receipt_policy (emae, builder); - - widget = e_builder_get_widget (builder, item->label); - if (emae->type == EMAE_PAGES) { - gtk_box_pack_start ((GtkBox *) emae->pages[4], widget, TRUE, TRUE, 0); - gtk_widget_show (widget); - } else { - gtk_notebook_insert_page ( - GTK_NOTEBOOK (parent), widget, - gtk_label_new (_("Defaults")), - position); - gtk_container_child_set ( - GTK_CONTAINER (parent), widget, - "tab-fill", FALSE, "tab-expand", FALSE, NULL); - } - - emae_queue_widgets ( - emae, builder, - "special-folders-table", - "composing-messages-table", - NULL); - - g_object_unref (builder); - - return widget; -} - -static void -emae_account_hash_algo_combo_changed_cb (GtkComboBox *combobox, - EMAccountEditor *emae) -{ - EAccount *account; - gpointer data; - const gchar *text = NULL; - - account = em_account_editor_get_modified_account (emae); - data = g_object_get_data (G_OBJECT (combobox), "account-item"); - - switch (gtk_combo_box_get_active (combobox)) { - case 1: text = "sha1"; - break; - case 2: text = "sha256"; - break; - case 3: - text = "sha384"; - break; - case 4: - text = "sha512"; - break; - } - - e_account_set_string (account, GPOINTER_TO_INT (data), text); -} - -static GtkComboBox * -emae_account_hash_algo_combo (EMAccountEditor *emae, - const gchar *name, - gint item, - GtkBuilder *builder) -{ - EAccount *account; - GtkComboBox *combobox; - const gchar *text; - gint index = 0; - - account = em_account_editor_get_modified_account (emae); - combobox = GTK_COMBO_BOX (e_builder_get_widget (builder, name)); - g_return_val_if_fail (combobox != NULL, NULL); - - text = e_account_get_string (account, item); - if (text) { - if (g_ascii_strcasecmp (text, "sha1") == 0) - index = 1; - else if (g_ascii_strcasecmp (text, "sha256") == 0) - index = 2; - else if (g_ascii_strcasecmp (text, "sha384") == 0) - index = 3; - else if (g_ascii_strcasecmp (text, "sha512") == 0) - index = 4; - } - - gtk_combo_box_set_active (combobox, index); - - g_object_set_data (G_OBJECT (combobox), "account-item", GINT_TO_POINTER (item)); - g_signal_connect ( - combobox, "changed", - G_CALLBACK (emae_account_hash_algo_combo_changed_cb), emae); - - return combobox; -} - -static GtkWidget * -emae_security_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; -#if defined (HAVE_NSS) && defined (ENABLE_SMIME) - EMAccountEditorPrivate *priv = emae->priv; -#endif - GtkWidget *w; - GtkBuilder *builder; - - /*if (old) - return old;*/ - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - /* Security */ - emae_account_entry (emae, "pgp_key", E_ACCOUNT_PGP_KEY, builder); - emae_account_hash_algo_combo (emae, "pgp_hash_algo", E_ACCOUNT_PGP_HASH_ALGORITHM, builder); - emae_account_toggle (emae, "pgp_encrypt_to_self", E_ACCOUNT_PGP_ENCRYPT_TO_SELF, builder); - emae_account_toggle (emae, "pgp_always_sign", E_ACCOUNT_PGP_ALWAYS_SIGN, builder); - emae_account_toggle (emae, "pgp_no_imip_sign", E_ACCOUNT_PGP_NO_IMIP_SIGN, builder); - emae_account_toggle (emae, "pgp_always_trust", E_ACCOUNT_PGP_ALWAYS_TRUST, builder); - -#if defined (HAVE_NSS) && defined (ENABLE_SMIME) - /* TODO: this should handle its entry separately? */ - priv->smime_sign_key = emae_account_entry (emae, "smime_sign_key", E_ACCOUNT_SMIME_SIGN_KEY, builder); - priv->smime_sign_key_select = (GtkButton *)e_builder_get_widget (builder, "smime_sign_key_select"); - priv->smime_sign_key_clear = (GtkButton *)e_builder_get_widget (builder, "smime_sign_key_clear"); - g_signal_connect ( - priv->smime_sign_key_select, "clicked", - G_CALLBACK (smime_sign_key_select), emae); - g_signal_connect ( - priv->smime_sign_key_clear, "clicked", - G_CALLBACK (smime_sign_key_clear), emae); - - emae_account_hash_algo_combo (emae, "smime_hash_algo", E_ACCOUNT_SMIME_HASH_ALGORITHM, builder); - priv->smime_sign_default = emae_account_toggle (emae, "smime_sign_default", E_ACCOUNT_SMIME_SIGN_DEFAULT, builder); - - priv->smime_encrypt_key = emae_account_entry (emae, "smime_encrypt_key", E_ACCOUNT_SMIME_ENCRYPT_KEY, builder); - priv->smime_encrypt_key_select = (GtkButton *)e_builder_get_widget (builder, "smime_encrypt_key_select"); - priv->smime_encrypt_key_clear = (GtkButton *)e_builder_get_widget (builder, "smime_encrypt_key_clear"); - g_signal_connect ( - priv->smime_encrypt_key_select, "clicked", - G_CALLBACK (smime_encrypt_key_select), emae); - g_signal_connect ( - priv->smime_encrypt_key_clear, "clicked", - G_CALLBACK (smime_encrypt_key_clear), emae); - - priv->smime_encrypt_default = emae_account_toggle (emae, "smime_encrypt_default", E_ACCOUNT_SMIME_ENCRYPT_DEFAULT, builder); - priv->smime_encrypt_to_self = emae_account_toggle (emae, "smime_encrypt_to_self", E_ACCOUNT_SMIME_ENCRYPT_TO_SELF, builder); - smime_changed (emae); -#else - { - /* Since we don't have NSS, hide the S/MIME config options */ - GtkWidget *frame; - - frame = e_builder_get_widget (builder, "smime_vbox"); - gtk_widget_destroy (frame); - } -#endif /* HAVE_NSS */ - - w = e_builder_get_widget (builder, item->label); - gtk_notebook_insert_page ( - GTK_NOTEBOOK (parent), w, - gtk_label_new (_("Security")), - position); - gtk_container_child_set ( - GTK_CONTAINER (parent), w, - "tab-fill", FALSE, "tab-expand", FALSE, NULL); - - g_object_unref (builder); - - return w; -} - -/* - * Allow some level of post creation customisation in plugins. - */ -GtkWidget * -em_account_editor_get_widget (EMAccountEditor *emae, - const gchar *name) -{ - GtkWidget *wid; - - wid = g_hash_table_lookup (emae->priv->widgets, name); - if (wid) - return wid; - - g_warning ("Mail account widget '%s' not found", name); - - return NULL; -} - -static GtkWidget * -emae_widget_glade (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - return em_account_editor_get_widget (data, item->label); -} - -/* plugin meta-data for "org.gnome.evolution.mail.config.accountEditor" */ -static EMConfigItem emae_editor_items[] = { - { E_CONFIG_BOOK, (gchar *) "" }, - { E_CONFIG_PAGE, (gchar *) "00.identity", (gchar *) "vboxIdentityBorder", emae_identity_page }, - { E_CONFIG_SECTION, (gchar *) "00.identity/00.name", (gchar *) "account_vbox", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/10.required", (gchar *) "identity-required-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/20.info", (gchar *) "identity-optional-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "10.receive", (gchar *) "vboxSourceBorder", emae_receive_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/00.type", (gchar *) "source-type-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/10.config", (gchar *) "source-config-table", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "source-security-vbox", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "source-auth-vbox", emae_widget_glade }, - - /* Most sections for this is auto-generated from the camel config */ - { E_CONFIG_PAGE, (gchar *) "20.receive_options", (gchar *) N_("Receiving Options"), }, - { E_CONFIG_SECTION_TABLE, (gchar *) "20.receive_options/10.mailcheck", (gchar *) N_("Checking for New Messages"), }, - { E_CONFIG_ITEM_TABLE, (gchar *) "20.receive_options/10.mailcheck/00.autocheck", NULL, emae_receive_options_item, }, - - { E_CONFIG_PAGE, (gchar *) "30.send", (gchar *) "vboxTransportBorder", emae_send_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/00.type", (gchar *) "transport-type-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/10.config", (gchar *) "transport-server-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/20.security", (gchar *) "transport-security-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/30.auth", (gchar *) "transport-auth-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "40.defaults", (gchar *) "vboxFoldersBorder", emae_defaults_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/00.folders", (gchar *) "special-folders-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/10.composing", (gchar *) "composing-messages-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "50.security", (gchar *) "vboxSecurityBorder", emae_security_page }, - /* 1x1 table (!) not vbox: { E_CONFIG_SECTION, "50.security/00.gpg", "table19", emae_widget_glade }, */ - /* table not vbox: { E_CONFIG_SECTION, "50.security/10.smime", "smime_table", emae_widget_glade }, */ - { 0 }, -}; -static gboolean emae_editor_items_translated = FALSE; - -static GtkWidget * -emae_review_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *priv = emae->priv; - GtkWidget *w; - GtkBuilder *builder; - - builder = gtk_builder_new (); - e_load_ui_builder_definition (builder, "mail-config.ui"); - - priv->review_name = (GtkLabel*) e_builder_get_widget (builder, "personal-name-entry"); - priv->review_email = (GtkLabel*) e_builder_get_widget (builder, "personal-email-entry"); - priv->receive_stype = (GtkLabel*) e_builder_get_widget (builder, "receive_server_type"); - priv->send_stype = (GtkLabel*) e_builder_get_widget (builder, "send_server_type"); - priv->receive_saddress = (GtkLabel*) e_builder_get_widget (builder, "receive_server_address"); - priv->send_saddress = (GtkLabel*) e_builder_get_widget (builder, "send_server_address"); - priv->receive_name = (GtkLabel*) e_builder_get_widget (builder, "receive_username"); - priv->send_name = (GtkLabel*) e_builder_get_widget (builder, "send_username"); - priv->receive_encryption = (GtkLabel*) e_builder_get_widget (builder, "receive_encryption"); - priv->send_encryption = (GtkLabel*) e_builder_get_widget (builder, "send_encryption"); - - w = e_builder_get_widget (builder, item->label); - priv->review_box = gtk_vbox_new (FALSE, 2); - gtk_widget_show (priv->review_box); - if (((EConfig *) priv->config)->type == E_CONFIG_ASSISTANT) { - GtkWidget *page; - - page = emae_create_basic_assistant_page ( - emae, GTK_ASSISTANT (parent), - "review_page", position); - - gtk_box_pack_start (GTK_BOX (page), w, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (page), priv->review_box, FALSE, FALSE, 0); - gtk_widget_reparent (priv->management_frame, page); - - w = page; - } - - return w; -} - -static GtkWidget * -emae_widget_assistant_page (EConfig *ec, - EConfigItem *item, - GtkWidget *parent, - GtkWidget *old, - gint position, - gpointer data) -{ - EMAccountEditor *emae = (EMAccountEditor *) data; - - if (emae->type == EMAE_PAGES) - return NULL; - - return emae_create_basic_assistant_page ( - emae, GTK_ASSISTANT (parent), item->label, position); -} - -/* plugin meta-data for "org.gnome.evolution.mail.config.accountAssistant" */ -static EMConfigItem emae_assistant_items[] = { - { E_CONFIG_ASSISTANT, (gchar *) "" }, - { E_CONFIG_PAGE_START, (gchar *) "0.start", (gchar *) "start_page", emae_widget_assistant_page }, - - { E_CONFIG_PAGE, (gchar *) "00.identity", (gchar *) "vboxIdentityBorder", emae_identity_page }, - { E_CONFIG_SECTION, (gchar *) "00.identity/00.name", (gchar *) "account_vbox", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/10.required", (gchar *) "identity-required-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "00.identity/20.info", (gchar *) "identity-optional-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "10.receive", (gchar *) "vboxSourceBorder", emae_receive_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/00.type", (gchar *) "source-type-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "10.receive/10.config", (gchar *) "source-config-table", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "source-security-vbox", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "source-auth-vbox", emae_widget_glade }, - - /* Most sections for this is auto-generated fromt the camel config */ - { E_CONFIG_PAGE, (gchar *) "20.receive_options", (gchar *) N_("Receiving Options"), }, - { E_CONFIG_SECTION_TABLE, (gchar *) "20.receive_options/10.mailcheck", (gchar *) N_("Checking for New Messages"), }, - { E_CONFIG_ITEM_TABLE, (gchar *) "20.receive_options/10.mailcheck/00.autocheck", NULL, emae_receive_options_item, }, - - { E_CONFIG_PAGE, (gchar *) "30.send", (gchar *) "vboxTransportBorder", emae_send_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/00.type", (gchar *) "transport-type-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/10.config", (gchar *) "transport-server-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/20.security", (gchar *) "transport-security-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "30.send/30.auth", (gchar *) "transport-auth-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "40.defaults", (gchar *) "vboxFoldersBorder", emae_defaults_page }, - { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/00.folders", (gchar *) "special-folders-table", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/10.composing", (gchar *) "composing-messages-table", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "50.review", (gchar *) "vboxReviewBorder", emae_review_page }, - - { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_assistant_page }, - { 0 }, -}; -static gboolean emae_assistant_items_translated = FALSE; - -static void -emae_free (EConfig *ec, - GSList *items, - gpointer data) -{ - g_slist_free (items); -} - -static void -emae_free_auto (EConfig *ec, - GSList *items, - gpointer data) -{ - GSList *l, *n; - - for (l = items; l;) { - struct _receive_options_item *item = l->data; - - n = g_slist_next (l); - g_free (item->item.path); - if (item->extra_table) - g_hash_table_destroy (item->extra_table); - g_free (item); - g_slist_free_1 (l); - l = n; - } -} - -static gboolean -emae_check_service_complete (EMAccountEditor *emae, - EMAccountEditorService *service) -{ - CamelProvider *provider = NULL; - const gchar *host = NULL; - const gchar *path = NULL; - const gchar *user = NULL; - gboolean have_host; - gboolean have_path; - gboolean have_user; - gboolean need_auth; - gboolean need_host; - gboolean need_path; - gboolean need_port; - gboolean need_user; - - if (service->protocol != NULL) - provider = camel_provider_get (service->protocol, NULL); - - if (provider == NULL) - return TRUE; - - if (CAMEL_IS_NETWORK_SETTINGS (service->settings)) { - CamelNetworkSettings *network_settings; - - network_settings = CAMEL_NETWORK_SETTINGS (service->settings); - host = camel_network_settings_get_host (network_settings); - user = camel_network_settings_get_user (network_settings); - } - - if (CAMEL_IS_LOCAL_SETTINGS (service->settings)) { - CamelLocalSettings *local_settings; - - local_settings = CAMEL_LOCAL_SETTINGS (service->settings); - path = camel_local_settings_get_path (local_settings); - } - - need_auth = CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_AUTH); - need_host = CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_HOST); - need_path = CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_PATH); - need_port = CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_PORT); - need_user = CAMEL_PROVIDER_NEEDS (provider, CAMEL_URL_PART_USER); - - have_host = (host != NULL && *host != '\0'); - have_path = (path != NULL && *path != '\0'); - have_user = (user != NULL && *user != '\0'); - - if (need_host && !have_host) - return FALSE; - - if (need_port && !e_port_entry_is_valid (service->port)) - return FALSE; - - /* We only need the user if the service needs auth as well, i think */ - if (need_auth || service->requires_auth) - if (need_user && !have_user) - return FALSE; - - if (need_path && !have_path) - return FALSE; - - return TRUE; -} - -static ServerData * -emae_check_servers (const gchar *email) -{ - ServerData *sdata = g_new0 (ServerData, 1); - EmailProvider *provider = g_new0 (EmailProvider, 1); - gchar *dupe = g_strdup (email); - gchar *tmp; - - /* FIXME: Find a way to free the provider once given to account settings. */ - provider->email = (gchar *) email; - tmp = strchr (email, '@'); - tmp++; - provider->domain = tmp; - tmp = strchr (dupe, '@'); - *tmp = 0; - provider->username = (gchar *) g_quark_to_string (g_quark_from_string (dupe)); - g_free (dupe); - - if (!mail_guess_servers (provider)) { - g_free (provider); - g_free (sdata); - return NULL; - } - /*printf("Recv: %s\n%s(%s), %s by %s \n Send: %s\n%s(%s), %s by %s\n via %s to %s\n", - provider->recv_type, provider->recv_hostname, provider->recv_port, provider->recv_username, provider->recv_auth, - provider->send_type, provider->send_hostname, provider->send_port, provider->send_username, provider->send_auth, - provider->recv_socket_type, provider->send_socket_type); */ - - sdata->recv = provider->recv_hostname; - sdata->recv_port = provider->recv_port; - sdata->send = provider->send_hostname; - sdata->send_port = provider->send_port; - if (strcmp (provider->recv_type, "pop3") == 0) - sdata->proto = g_strdup ("pop"); - else if (strcmp (provider->recv_type, "imap") == 0) - sdata->proto = g_strdup ("imapx"); - else - sdata->proto = provider->recv_type; - if (provider->recv_socket_type) { - CamelNetworkSecurityMethod method; - - if (g_ascii_strcasecmp (provider->recv_socket_type, "SSL") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT; - else if (g_ascii_strcasecmp (provider->recv_socket_type, "secure") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT; - else if (g_ascii_strcasecmp (provider->recv_socket_type, "STARTTLS") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT; - else if (g_ascii_strcasecmp (provider->recv_socket_type, "TLS") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT; - else - method = CAMEL_NETWORK_SECURITY_METHOD_NONE; - - sdata->security_method = method; - sdata->recv_security_method = method; - } - - if (provider->send_socket_type) { - CamelNetworkSecurityMethod method; - - if (g_ascii_strcasecmp (provider->send_socket_type, "SSL") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT; - else if (g_ascii_strcasecmp (provider->send_socket_type, "secure") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT; - else if (g_ascii_strcasecmp (provider->send_socket_type, "STARTTLS") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT; - else if (g_ascii_strcasecmp (provider->send_socket_type, "TLS") == 0) - method = CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT; - else - method = CAMEL_NETWORK_SECURITY_METHOD_NONE; - - sdata->send_security_method = method; - } - - sdata->send_auth = g_ascii_strup (provider->send_auth, -1); - sdata->recv_auth = g_ascii_strup (provider->recv_auth, -1); - sdata->send_user = provider->send_username; - sdata->recv_user = provider->recv_username; - - g_free (provider); - - return sdata; -} - -static void -emae_destroy_widget (GtkWidget *widget) -{ - if (widget && GTK_IS_WIDGET (widget)) { - gtk_widget_destroy (widget); - widget = NULL; - } -} - -static gboolean -emae_display_name_in_use (EMAccountEditor *emae, - const gchar *display_name) -{ - EAccount *account; - EAccount *original_account; - - /* XXX Trivial for now, less so when we dump EAccount. */ - - account = e_get_account_by_name (display_name); - original_account = em_account_editor_get_original_account (emae); - - return (account != NULL && account != original_account); -} - -static void -emae_init_receive_page_for_new_account (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *address; - gchar *user; - - account = em_account_editor_get_modified_account (emae); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - - /* Extract an initial username from the email address. */ - user = g_strdup (address); - if (user != NULL) { - gchar *cp = strchr (user, '@'); - if (cp != NULL) - *cp = '\0'; - } - - gtk_entry_set_text (emae->priv->source.username, user); - - g_free (user); -} - -static void -emae_init_receive_page_for_server_data (EMAccountEditor *emae) -{ - ServerData *sdata; - CamelNetworkSecurityMethod method; - gint port = 0; - - sdata = emae->priv->selected_server; - g_return_if_fail (sdata != NULL); - - if (sdata->recv_user == NULL) { - ; /* do nothing */ - } else if (*sdata->recv_user == '\0') { - ; /* do nothing */ - } else if (strcmp (sdata->recv_user, "@") == 0) { - ; /* do nothing */ - } else { - gtk_entry_set_text ( - emae->priv->source.username, - sdata->recv_user); - } - - if (sdata->recv_security_method != CAMEL_NETWORK_SECURITY_METHOD_NONE) - method = sdata->recv_security_method; - else - method = sdata->security_method; - - g_object_set ( - emae->priv->source.settings, - "security-method", method, NULL); - - emae->priv->source.protocol = sdata->proto; - - if (sdata->recv_port != NULL && *sdata->recv_port != '\0') - port = (gint) strtol (sdata->recv_port, NULL, 10); - - if (port > 0) - e_port_entry_set_port (emae->priv->source.port, port); - - gtk_toggle_button_set_active (emae->priv->source.remember, TRUE); - gtk_entry_set_text (emae->priv->source.hostname, sdata->recv); - - if (sdata->recv_auth != NULL && *sdata->recv_auth != '\0') - gtk_combo_box_set_active_id ( - emae->priv->source.authtype, - sdata->recv_auth); -} - -static void -emae_init_send_page_for_new_account (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *address; - gchar *user; - - account = em_account_editor_get_modified_account (emae); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - - /* Extract an initial username from the email address. */ - user = g_strdup (address); - if (user != NULL) { - gchar *cp = strchr (user, '@'); - if (cp != NULL) - *cp = '\0'; - } - - gtk_entry_set_text (emae->priv->transport.username, user); - - g_free (user); -} - -static void -emae_init_send_page_for_server_data (EMAccountEditor *emae) -{ - ServerData *sdata; - CamelNetworkSecurityMethod method; - gint port = 0; - - sdata = emae->priv->selected_server; - g_return_if_fail (sdata != NULL); - - if (sdata->recv_user == NULL) { - ; /* do nothing */ - } else if (*sdata->recv_user == '\0') { - ; /* do nothing */ - } else if (strcmp (sdata->recv_user, "@") == 0) { - ; /* do nothing */ - } else { - gtk_entry_set_text ( - emae->priv->transport.username, - sdata->send_user); - } - - if (sdata->recv_security_method != CAMEL_NETWORK_SECURITY_METHOD_NONE) - method = sdata->recv_security_method; - else - method = sdata->security_method; - - g_object_set ( - emae->priv->transport.settings, - "security-method", method, NULL); - - emae->priv->transport.protocol = "smtp"; - - if (sdata->recv_port != NULL && *sdata->recv_port != '\0') - port = (gint) strtol (sdata->recv_port, NULL, 10); - - if (port > 0) - e_port_entry_set_port (emae->priv->source.port, port); - - gtk_toggle_button_set_active (emae->priv->transport.remember, TRUE); - gtk_toggle_button_set_active (emae->priv->transport.needs_auth, TRUE); - gtk_entry_set_text (emae->priv->transport.hostname, sdata->send); - - if (sdata->send_auth != NULL && *sdata->send_auth != '\0') - gtk_combo_box_set_active_id ( - emae->priv->source.authtype, - sdata->send_auth); - else - emae_authtype_changed ( - emae->priv->transport.authtype, - &emae->priv->transport); -} - -static void -emae_init_review_page (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *address; - gchar *display_name; - gint ii = 1; - - account = em_account_editor_get_modified_account (emae); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - - display_name = g_strdup (address); - - /* Use the email address as the initial display name for the - * mail account. If necessary, append a number to the display - * name to make it unique among other mail accounts. */ - while (emae_display_name_in_use (emae, display_name)) { - g_free (display_name); - display_name = g_strdup_printf ("%s (%d)", address, ii++); - } - - gtk_entry_set_text (emae->priv->identity_entries[0], display_name); - - g_free (display_name); -} - -static void -emae_update_review_page (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *name; - const gchar *address; - - account = em_account_editor_get_modified_account (emae); - name = e_account_get_string (account, E_ACCOUNT_ID_NAME); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - - gtk_label_set_text (emae->priv->review_name, name); - gtk_label_set_text (emae->priv->review_email, address); - - if (CAMEL_IS_NETWORK_SETTINGS (emae->priv->source.settings)) { - CamelNetworkSecurityMethod method; - const gchar *encryption; - const gchar *protocol; - gchar *host = NULL; - gchar *user = NULL; - - protocol = emae->priv->source.protocol; - - g_object_get ( - emae->priv->source.settings, - "host", &host, "user", &user, - "security-method", &method, NULL); - - switch (method) { - case CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT: - encryption = _("Always (SSL)"); - break; - case CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT: - encryption = _("When possible (TLS)"); - break; - default: - encryption = _("Never"); - break; - } - - gtk_label_set_text (emae->priv->receive_stype, protocol); - gtk_label_set_text (emae->priv->receive_saddress, host); - gtk_label_set_text (emae->priv->receive_name, user); - gtk_label_set_text (emae->priv->receive_encryption, encryption); - - g_free (host); - g_free (user); - } - - if (CAMEL_IS_NETWORK_SETTINGS (emae->priv->transport.settings)) { - CamelNetworkSecurityMethod method; - const gchar *encryption; - const gchar *protocol; - gchar *host = NULL; - gchar *user = NULL; - - protocol = emae->priv->transport.protocol; - - g_object_get ( - emae->priv->transport.settings, - "host", &host, "user", &user, - "security-method", &method, NULL); - - switch (method) { - case CAMEL_NETWORK_SECURITY_METHOD_SSL_ON_ALTERNATE_PORT: - encryption = _("Always (SSL)"); - break; - case CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT: - encryption = _("When possible (TLS)"); - break; - default: - encryption = _("Never"); - break; - } - - gtk_label_set_text (emae->priv->send_stype, protocol); - gtk_label_set_text (emae->priv->send_saddress, host); - gtk_label_set_text (emae->priv->send_name, user); - gtk_label_set_text (emae->priv->send_encryption, encryption); - - g_free (host); - g_free (user); - } -} - -static void -emae_update_review_page_for_google (EMAccountEditor *emae) -{ - GtkWidget *container; - GtkWidget *widget; - gchar *markup; - gboolean can_contacts, can_calendar; - - can_contacts = !emae->priv->gcontacts || - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (emae->priv->gcontacts)); - can_calendar = !emae->priv->calendar || - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (emae->priv->calendar)); - - emae_destroy_widget (emae->priv->gcontacts); - emae_destroy_widget (emae->priv->calendar); - emae_destroy_widget (emae->priv->account_label); - emae_destroy_widget (emae->priv->gmail_link); - - container = emae->priv->review_box; - - widget = gtk_label_new (NULL); - markup = g_markup_printf_escaped ( - "<span size=\"large\" weight=\"bold\">%s</span>", - _("Google account settings:")); - gtk_label_set_markup (GTK_LABEL (widget), markup); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->account_label = widget; - gtk_widget_show (widget); - g_free (markup); - - widget = gtk_check_button_new_with_mnemonic ( - _("Setup Google con_tacts with Evolution")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), can_contacts); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->gcontacts = widget; - gtk_widget_show (widget); - - widget = gtk_check_button_new_with_mnemonic ( - _("Setup Google ca_lendar with Evolution")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), can_calendar); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->calendar = widget; - gtk_widget_show (widget); - - widget = gtk_link_button_new_with_label ( - "https://mail.google.com/mail/?ui=2&shva=1#settings/fwdandpop", - _("You may need to enable IMAP access.")); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->gmail_link = widget; - gtk_widget_show (widget); -} - -static void -emae_update_review_page_for_yahoo (EMAccountEditor *emae) -{ - EAccount *account; - GtkWidget *container; - GtkWidget *widget; - GtkWidget *label; - gchar *markup; - gchar *name = NULL; - gboolean can_calendar, can_tasks; - - if (emae->priv->yahoo_cal_entry) { - name = g_strdup (gtk_entry_get_text (GTK_ENTRY (emae->priv->yahoo_cal_entry))); - } else { - account = em_account_editor_get_modified_account (emae); - name = g_strdup (e_account_get_string (account, E_ACCOUNT_ID_NAME)); - - g_strdelimit (name, " ", '_'); - } - - can_calendar = !emae->priv->calendar || - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (emae->priv->calendar)); - can_tasks = !emae->priv->tasks || - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (emae->priv->tasks)); - - emae_destroy_widget (emae->priv->calendar); - emae_destroy_widget (emae->priv->tasks); - emae_destroy_widget (emae->priv->info_label); - emae_destroy_widget (emae->priv->yahoo_cal_entry); - emae_destroy_widget (emae->priv->account_label); - emae_destroy_widget (emae->priv->yahoo_cal_box); - - container = emae->priv->review_box; - - widget = gtk_label_new (NULL); - markup = g_markup_printf_escaped ( - "<span size=\"large\" weight=\"bold\">%s</span>", - _("Yahoo! account settings:")); - gtk_label_set_markup (GTK_LABEL (widget), markup); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->account_label = widget; - gtk_widget_show (widget); - g_free (markup); - - widget = gtk_check_button_new_with_mnemonic ( - _("Setup _Yahoo! calendar with Evolution")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), can_calendar); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->calendar = widget; - gtk_widget_show (widget); - - widget = gtk_check_button_new_with_mnemonic ( - _("Setup Yahoo! _tasks with Evolution")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), can_tasks); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->tasks = widget; - gtk_widget_show (widget); - - widget = gtk_label_new ( - _("Yahoo! calendars are named as firstname_lastname. We have " - "tried to form the calendar name. Please confirm and " - "re-enter the calendar name, if it is not correct, or " - "change it later in calendar Properties.")); - gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); - gtk_label_set_line_wrap_mode (GTK_LABEL (widget), PANGO_WRAP_WORD); - gtk_label_set_selectable (GTK_LABEL (widget), TRUE); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->info_label = widget; - gtk_widget_show (widget); - - widget = gtk_hbox_new (FALSE, 12); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->yahoo_cal_box = widget; - gtk_widget_show (widget); - - container = widget; - - widget = gtk_label_new_with_mnemonic ( - _("Yahoo! Calen_dar name:")); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - gtk_widget_show (widget); - - label = widget; - - widget = gtk_entry_new (); - gtk_entry_set_text (GTK_ENTRY (widget), name); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - emae->priv->yahoo_cal_entry = widget; - gtk_widget_show (widget); - - g_free (name); -} - -static gboolean -emae_check_identity_complete (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *name; - const gchar *address; - const gchar *reply_to; - - account = em_account_editor_get_modified_account (emae); - - name = e_account_get_string (account, E_ACCOUNT_ID_NAME); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - reply_to = e_account_get_string (account, E_ACCOUNT_ID_REPLY_TO); - - if (name == NULL || *name == '\0') - return FALSE; - - if (address == NULL || !is_email (address)) - return FALSE; - - /* An empty reply_to string is allowed. */ - if (reply_to != NULL && *reply_to != '\0' && !is_email (reply_to)) - return FALSE; - - return TRUE; -} - -static gboolean -emae_check_review_complete (EMAccountEditor *emae) -{ - EAccount *account; - const gchar *display_name; - - account = em_account_editor_get_modified_account (emae); - display_name = e_account_get_string (account, E_ACCOUNT_NAME); - - if (display_name == NULL || *display_name == '\0') - return FALSE; - - if (emae_display_name_in_use (emae, display_name)) - return FALSE; - - return TRUE; -} - -static gboolean -emae_check_complete (EConfig *ec, - const gchar *pageid, - gpointer data) -{ - EMAccountEditor *emae = data; - EAccount *account; - enum _e_config_t config_type; - gboolean refresh = FALSE; - gboolean new_account; - const gchar *address; - gchar *host = NULL; - gboolean ok = TRUE; - - config_type = ((EConfig *) emae->priv->config)->type; - new_account = (em_account_editor_get_original_account (emae) == NULL); - - account = em_account_editor_get_modified_account (emae); - address = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); - - if (CAMEL_IS_NETWORK_SETTINGS (emae->priv->source.settings)) - host = camel_network_settings_dup_host ( - CAMEL_NETWORK_SETTINGS (emae->priv->source.settings)); - - /* We use the page-check of various pages to 'prepare' or - * pre-load their values, only in the assistant. */ - - if (pageid == NULL || config_type != E_CONFIG_ASSISTANT) - goto skip_prepare; - - if (strcmp (pageid, "10.receive") == 0) { - if (!emae->priv->receive_set) { - - /* FIXME Do this asynchronously! */ - emae->priv->selected_server = - emae_check_servers (address); - - if (new_account) { - emae_init_receive_page_for_new_account (emae); - refresh = TRUE; - } - if (emae->priv->selected_server != NULL) - emae_init_receive_page_for_server_data (emae); - - emae->priv->receive_set = TRUE; - } - - } else if (strcmp (pageid, "30.send") == 0) { - if (!emae->priv->send_set) { - if (new_account) - emae_init_send_page_for_new_account (emae); - if (emae->priv->selected_server != NULL) { - emae_init_send_page_for_server_data (emae); - refresh = TRUE; - } - - emae->priv->send_set = TRUE; - } - - } else if (strcmp (pageid, "20.receive_options") == 0) { - if (!emae->priv->receive_opt_set) { - CamelProvider *provider; - - provider = emae_get_store_provider (emae); - - if (provider != NULL - && emae->priv->extra_provider != provider) { - emae->priv->extra_provider = provider; - emae_auto_detect (emae); - } - - emae->priv->receive_opt_set = TRUE; - } - - /* Review page is only shown in the assistant. */ - } else if (strcmp (pageid, "50.review") == 0) { - if (!emae->priv->review_set) { - emae_init_review_page (emae); - emae->priv->review_set = TRUE; - } - - emae_update_review_page (emae); - - /* Google and Yahoo get special treatment. */ - - emae->priv->is_gmail = FALSE; - emae->priv->is_yahoo = FALSE; - - if (e_util_utf8_strstrcase (host, "gmail")) { - emae->priv->is_gmail = TRUE; - emae_update_review_page_for_google (emae); - - } else if (e_util_utf8_strstrcase (host, "googlemail")) { - emae->priv->is_gmail = TRUE; - emae_update_review_page_for_google (emae); - - } else if (e_util_utf8_strstrcase (host, "yahoo.")) { - emae->priv->is_yahoo = TRUE; - emae_update_review_page_for_yahoo (emae); - - } else if (e_util_utf8_strstrcase (host, "ymail.")) { - emae->priv->is_yahoo = TRUE; - emae_update_review_page_for_yahoo (emae); - - } else if (e_util_utf8_strstrcase (host, "rocketmail.")) { - emae->priv->is_yahoo = TRUE; - emae_update_review_page_for_yahoo (emae); - } - } - -skip_prepare: - /* - * Setting a flag on the Account if it is marked as default. It is - * done in this way instead of using a temporary variable so as to - * keep track of which account is marked as default in case of - * editing multiple accounts at a time. - */ - if (gtk_toggle_button_get_active (emae->priv->default_account)) - g_object_set_data (G_OBJECT (account), "default_flagged", GINT_TO_POINTER(1)); - - if (ok && (pageid == NULL || strcmp (pageid, "00.identity") == 0)) - ok = emae_check_identity_complete (emae); - - if (ok && (pageid == NULL || strcmp (pageid, "10.receive") == 0)) { - if (emae->type != EMAE_NOTEBOOK && refresh) { - emae_refresh_providers ( - emae, &emae->priv->source); - emae_provider_changed ( - emae->priv->source.providers, - &emae->priv->source); - } - ok = emae_check_service_complete (emae, &emae->priv->source); - } - - if (ok && (pageid == NULL || strcmp (pageid, "30.send") == 0)) { - CamelProvider *provider; - - provider = emae_get_store_provider (emae); - if (!provider || !CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) { - if (emae->type != EMAE_NOTEBOOK && refresh) { - emae_refresh_providers ( - emae, &emae->priv->transport); - emae_provider_changed ( - emae->priv->transport.providers, - &emae->priv->transport); - } - ok = emae_check_service_complete ( - emae, &emae->priv->transport); - } - } - - if (ok && (pageid == NULL || strcmp (pageid, "50.review") == 0)) - ok = emae_check_review_complete (emae); - - g_free (host); - - return ok; -} - -gboolean -em_account_editor_check (EMAccountEditor *emae, - const gchar *page) -{ - return emae_check_complete ((EConfig *) emae->config, page, emae); -} - -static void -forget_password_if_needed (EAccount *original_account, - EAccount *modified_account, - e_account_item_t save_pass_itm, - e_account_item_t url_itm) -{ - const gchar *orig_url, *modif_url; - - g_return_if_fail (original_account != NULL); - g_return_if_fail (modified_account != NULL); - - orig_url = e_account_get_string (original_account, url_itm); - modif_url = e_account_get_string (modified_account, url_itm); - - if (orig_url && !*orig_url) - orig_url = NULL; - - if (modif_url && !*modif_url) - modif_url = NULL; - - if ((e_account_get_bool (original_account, save_pass_itm) != e_account_get_bool (modified_account, save_pass_itm) - && !e_account_get_bool (modified_account, save_pass_itm) && orig_url) || - (orig_url && !modif_url)) { - CamelURL *url; - gchar *url_str; - - url = camel_url_new (orig_url, NULL); - if (!url) - return; - - url_str = camel_url_to_string (url, CAMEL_URL_HIDE_PARAMS); - if (url_str) - e_passwords_forget_password (NULL, url_str); - - g_free (url_str); - camel_url_free (url); - } -} - -#define CALENDAR_CALDAV_URI "caldav://%s@www.google.com/calendar/dav/%s/events" -#define GMAIL_CALENDAR_LOCATION "://www.google.com/calendar/feeds/" -#define CALENDAR_DEFAULT_PATH "/private/full" -#define SELECTED_CALENDARS "selected-calendars" -#define YAHOO_CALENDAR_LOCATION "%s@caldav.calendar.yahoo.com/dav/%s/Calendar/%s" - -static gchar * -sanitize_user_mail (const gchar *user) -{ - if (!user) - return NULL; - - if (strstr (user, "%40") != NULL) { - return g_strdup (user); - } else if (!is_email (user)) { - return g_strconcat (user, "%40gmail.com", NULL); - } else { - gchar *tmp = g_malloc0 (sizeof (gchar) * (1 + strlen (user) + 2)); - gchar *at = strchr (user, '@'); - - strncpy (tmp, user, at - user); - strcat (tmp, "%40"); - strcat (tmp, at + 1); - - return tmp; - } -} - -static void -setup_google_addressbook (EMAccountEditor *emae) -{ - ESourceList *slist = NULL; - ESourceGroup *sgrp; - GSList *sources; - gboolean source_already_exists = FALSE; - CamelURL *url; - gchar * username; - EAccount *modified_account; - GError *error = NULL; - - if (!e_client_utils_get_sources (&slist, E_CLIENT_SOURCE_TYPE_CONTACTS, &error) || !slist) { - g_debug ("%s: Failed to get list of sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); - g_clear_error (&error); - return; - } - - modified_account = em_account_editor_get_modified_account (emae); - sgrp = e_source_list_ensure_group (slist, _("Google"), "google://", TRUE); - url = emae_account_url (emae, E_ACCOUNT_SOURCE_URL); - username = g_strdup (url->user); - - sources = e_source_group_peek_sources (sgrp); - for (; sources; sources = sources->next) { - ESource *existing = (ESource *) sources->data; - if (!g_strcmp0 (e_source_peek_relative_uri (existing), username)) { - source_already_exists = TRUE; - break; - } - } - - if (!source_already_exists) { - ESource *abook; - - abook = e_source_new (e_account_get_string (modified_account, E_ACCOUNT_NAME), ""); - e_source_set_property (abook, "default", "true"); - e_source_set_property (abook, "offline_sync", "1"); - e_source_set_property (abook, "auth", "plain/password"); - e_source_set_property (abook, "use-ssl", "true"); - e_source_set_property (abook, "remember_password", "true"); - e_source_set_property (abook, "refresh-interval", "86400"); - e_source_set_property (abook, "completion", "true"); - e_source_set_property (abook, "username", username); - - e_source_group_add_source (sgrp, abook, -1); - e_source_set_relative_uri (abook, username); - e_source_list_sync (slist, NULL); - - g_object_unref (abook); - } - - g_free (username); - g_object_unref (sgrp); - g_object_unref (slist); -} - -static void -setup_google_calendar (EMAccountEditor *emae, - EClientSourceType source_type) -{ - ESourceList *slist = NULL; - ESourceGroup *sgrp; - ESource *calendar; - gchar *sanitize_uname, *username; - gchar *abs_uri, *rel_uri; - gchar **ids; - gint i; - GPtrArray *array; - CamelURL *url; - GSettings *settings; - EAccount *modified_account; - GError *error = NULL; - - if (!e_client_utils_get_sources (&slist, source_type, &error) || !slist) { - g_debug ("%s: Failed to get list of sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); - g_clear_error (&error); - return; - } - - modified_account = em_account_editor_get_modified_account (emae); - sgrp = e_source_list_ensure_group (slist, _("Google"), "google://", TRUE); - url = emae_account_url (emae, E_ACCOUNT_SOURCE_URL); - username = g_strdup (url->user); - - calendar = e_source_new (e_account_get_string (modified_account, E_ACCOUNT_NAME), ""); - e_source_set_property (calendar, "ssl", "1"); - e_source_set_property (calendar, "refresh", "30"); - e_source_set_property (calendar, "auth", "1"); - e_source_set_property (calendar, "offline_sync", "1"); - e_source_set_property (calendar, "username", username); - e_source_set_property (calendar, "setup-username", username); - e_source_set_property (calendar, "default", "true"); - e_source_set_property (calendar, "alarm", "true"); - e_source_set_readonly (calendar, FALSE); - - if (source_type != E_CLIENT_SOURCE_TYPE_CONTACTS) - e_source_set_color_spec (calendar, "#CE9687"); - - e_source_group_add_source (sgrp, calendar, -1); - - sanitize_uname = sanitize_user_mail (username); - - abs_uri = g_strdup_printf (CALENDAR_CALDAV_URI, sanitize_uname, username); - e_source_set_absolute_uri (calendar, abs_uri); - - rel_uri = g_strconcat ("https", GMAIL_CALENDAR_LOCATION, sanitize_uname, CALENDAR_DEFAULT_PATH, NULL); - e_source_set_relative_uri (calendar, rel_uri); - - e_source_list_sync (slist, NULL); - - settings = g_settings_new ("org.gnome.evolution.calendar"); - ids = g_settings_get_strv (settings, SELECTED_CALENDARS); - array = g_ptr_array_new (); - for (i = 0; ids[i] != NULL; i++) - g_ptr_array_add (array, ids[i]); - g_ptr_array_add (array, (gpointer) e_source_get_uid (calendar)); - g_ptr_array_add (array, NULL); - g_settings_set_strv ( - settings, SELECTED_CALENDARS, - (const gchar * const *) array->pdata); - - g_strfreev (ids); - g_ptr_array_free (array, TRUE); - g_object_unref (settings); - g_free (username); - g_free (abs_uri); - g_free (rel_uri); - g_free (sanitize_uname); - g_object_unref (calendar); - g_object_unref (sgrp); - g_object_unref (slist); -} - -static void -setup_yahoo_calendar (EMAccountEditor *emae, - EClientSourceType source_type) -{ - ESourceList *slist = NULL; - ESourceGroup *sgrp; - ESource *calendar; - gchar *sanitize_uname; - gchar *abs_uri, *rel_uri; - const gchar *email; - GSettings *settings; - gchar **ids; - gint i; - GPtrArray *array; - EAccount *modified_account; - GError *error = NULL; - - if (!e_client_utils_get_sources (&slist, source_type, &error) || !slist) { - g_debug ("%s: Failed to get list of sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); - g_clear_error (&error); - return; - } - - modified_account = em_account_editor_get_modified_account (emae); - email = e_account_get_string (modified_account, E_ACCOUNT_ID_ADDRESS); - sgrp = e_source_list_ensure_group (slist, _("CalDAV"), "caldav://", TRUE); - - calendar = e_source_new (e_account_get_string (modified_account, E_ACCOUNT_NAME), ""); - e_source_set_property (calendar, "ssl", "1"); - e_source_set_property (calendar, "refresh", "30"); - e_source_set_property (calendar, "refresh-type", "0"); - e_source_set_property (calendar, "auth", "1"); - e_source_set_property (calendar, "offline_sync", "1"); - e_source_set_property (calendar, "username", email); - e_source_set_property (calendar, "default", "true"); - e_source_set_property (calendar, "alarm", "true"); - e_source_set_readonly (calendar, FALSE); - - if (source_type != E_CLIENT_SOURCE_TYPE_CONTACTS) - e_source_set_color_spec (calendar, "#87CE8C"); - - sanitize_uname = sanitize_user_mail (email); - - abs_uri = g_strdup_printf ("caldav://%s@caldav.calendar.yahoo.com/dav/%s/Calendar/%s", - sanitize_uname, email, gtk_entry_get_text ((GtkEntry *) emae->priv->yahoo_cal_entry)); - rel_uri = g_strdup_printf (YAHOO_CALENDAR_LOCATION, sanitize_uname, email, gtk_entry_get_text ((GtkEntry *) emae->priv->yahoo_cal_entry)); - e_source_set_relative_uri (calendar, rel_uri); - - e_source_group_add_source (sgrp, calendar, -1); - e_source_list_sync (slist, NULL); - - settings = g_settings_new ("org.gnome.evolution.calendar"); - ids = g_settings_get_strv (settings, SELECTED_CALENDARS); - array = g_ptr_array_new (); - for (i = 0; ids[i] != NULL; i++) - g_ptr_array_add (array, ids[i]); - g_ptr_array_add (array, (gpointer) e_source_get_uid (calendar)); - g_ptr_array_add (array, NULL); - g_settings_set_strv ( - settings, SELECTED_CALENDARS, - (const gchar * const *) array->pdata); - - g_strfreev (ids); - g_ptr_array_free (array, TRUE); - g_object_unref (settings); - g_free (abs_uri); - g_free (rel_uri); - g_free (sanitize_uname); - g_object_unref (calendar); - g_object_unref (sgrp); - g_object_unref (slist); -} - -static void -copy_param (GQuark key_id, - gpointer data, - gpointer user_data) -{ - GData **copy = user_data; - - g_datalist_id_set_data_full (copy, key_id, g_strdup (data), g_free); -} - -static void -copy_original_url_parameters (CamelURL *copy_to_url, - const gchar *copy_from) -{ - CamelURL *url; - - g_return_if_fail (copy_to_url != NULL); - - if (!copy_from || !*copy_from) - return; - - url = camel_url_new (copy_from, NULL); - if (!url) - return; - - if (url->params) - g_datalist_foreach (&url->params, copy_param, ©_to_url->params); - - camel_url_free (url); -} - -static void -emae_commit (EConfig *ec, - EMAccountEditor *emae) -{ - EAccountList *accounts = e_get_account_list (); - EAccount *account; - EAccount *modified_account; - EAccount *original_account; - CamelProvider *provider; - CamelSettings *settings; - CamelURL *url; - const gchar *protocol; - gboolean requires_auth; - - modified_account = em_account_editor_get_modified_account (emae); - original_account = em_account_editor_get_original_account (emae); - provider = emae_get_store_provider (emae); - - /* check for google and yahoo specific settings */ - if (!original_account && emae->priv->is_gmail) { - if (gtk_toggle_button_get_active ((GtkToggleButton *) emae->priv->gcontacts)) - setup_google_addressbook (emae); - if (gtk_toggle_button_get_active ((GtkToggleButton *) emae->priv->calendar)) - setup_google_calendar (emae, E_CLIENT_SOURCE_TYPE_EVENTS); - } else if (!original_account && emae->priv->is_yahoo) { - if (gtk_toggle_button_get_active ((GtkToggleButton *) emae->priv->calendar)) - setup_yahoo_calendar (emae, E_CLIENT_SOURCE_TYPE_EVENTS); - if (gtk_toggle_button_get_active ((GtkToggleButton *) emae->priv->tasks)) - setup_yahoo_calendar (emae, E_CLIENT_SOURCE_TYPE_TASKS); - } - - /* Do some last minute tweaking. */ - - settings = emae->priv->source.settings; - requires_auth = emae_get_store_requires_auth (emae); - - /* Override the selected authentication mechanism name if - * authentication is not required for the storage service. */ - if (CAMEL_IS_NETWORK_SETTINGS (settings) && !requires_auth) - g_object_set (settings, "auth-mechanism", NULL, NULL); - - settings = emae->priv->transport.settings; - requires_auth = emae_get_transport_requires_auth (emae); - - /* Override the selected authentication mechanism name if - * authentication is not required for the transport service. */ - if (CAMEL_IS_NETWORK_SETTINGS (settings) && !requires_auth) - g_object_set (settings, "auth-mechanism", NULL, NULL); - - /* Dump the storage service settings to a URL string. */ - - url = camel_url_new ("dummy://", NULL); - - protocol = emae->priv->source.protocol; - settings = emae->priv->source.settings; - - if (g_strcmp0 (protocol, "none") == 0) { - g_free (modified_account->source->url); - modified_account->source->url = g_strdup (""); - } else { - if (protocol != NULL) - camel_url_set_protocol (url, protocol); - - /* the CamelSaslXOAUTH stores its data into parameters - * unknown to settings, thus copy these first and overwrite - * those known during save */ - copy_original_url_parameters (url, modified_account->source->url); - - if (settings != NULL) - camel_settings_save_to_url (settings, url); - - g_free (modified_account->source->url); - modified_account->source->url = camel_url_to_string (url, 0); - } - - camel_url_free (url); - - /* Dump the transport service settings to a URL string. */ - - url = camel_url_new ("dummy://", NULL); - - if (!provider || !CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT (provider)) - protocol = emae->priv->transport.protocol; - - settings = emae->priv->transport.settings; - - if (protocol != NULL) - camel_url_set_protocol (url, protocol); - - /* the CamelSaslXOAUTH stores its data into parameters - * unknown to settings, thus copy these first and overwrite - * those known during save */ - copy_original_url_parameters (url, modified_account->transport->url); - - if (settings != NULL) - camel_settings_save_to_url (settings, url); - - g_free (modified_account->transport->url); - modified_account->transport->url = camel_url_to_string (url, 0); - - camel_url_free (url); - - if (original_account != NULL) { - forget_password_if_needed (original_account, modified_account, E_ACCOUNT_SOURCE_SAVE_PASSWD, E_ACCOUNT_SOURCE_URL); - forget_password_if_needed (original_account, modified_account, E_ACCOUNT_TRANSPORT_SAVE_PASSWD, E_ACCOUNT_TRANSPORT_URL); - - e_account_import (original_account, modified_account); - account = original_account; - e_account_list_change (accounts, account); - } else { - e_account_list_add (accounts, modified_account); - account = modified_account; - } - - if (gtk_toggle_button_get_active (emae->priv->default_account)) { - EMailBackend *backend; - EMailSession *session; - EMailAccountStore *store; - CamelService *service; - - backend = em_account_editor_get_backend (emae); - session = e_mail_backend_get_session (backend); - - service = camel_session_get_service ( - CAMEL_SESSION (session), account->uid); - - store = e_mail_ui_session_get_account_store (E_MAIL_UI_SESSION (session)); - e_mail_account_store_set_default_service (store, service); - } - - e_account_list_save (accounts); -} - -void -em_account_editor_commit (EMAccountEditor *emae) -{ - emae_commit (E_CONFIG (emae->config), emae); -} - -static void -em_account_editor_construct (EMAccountEditor *emae, - EMAccountEditorType type, - const gchar *id) -{ - EMAccountEditorPrivate *priv = emae->priv; - gint i, index; - GSList *l; - GList *prov; - EMConfig *ec; - EMConfigTargetSettings *target; - GHashTable *have; - EConfigItem *items; - - emae->type = type; - - if (type == EMAE_NOTEBOOK) { - ec = em_config_new (E_CONFIG_BOOK, id); - items = emae_editor_items; - if (!emae_editor_items_translated) { - for (i = 0; items[i].path; i++) { - if (items[i].label) - items[i].label = gettext (items[i].label); - } - emae_editor_items_translated = TRUE; - } - } else { - ec = em_config_new (E_CONFIG_ASSISTANT, id); - items = emae_assistant_items; - if (!emae_assistant_items_translated) { - for (i = 0; items[i].path; i++) { - if (items[i].label) - items[i].label = _(items[i].label); - } - emae_assistant_items_translated = TRUE; - } - } - - /* Connect "after" to let plugins go first. */ - g_signal_connect_after ( - ec, "commit", - G_CALLBACK (emae_commit), emae); - - g_object_weak_ref (G_OBJECT (ec), emae_config_gone_cb, emae); - - emae->config = priv->config = ec; - l = NULL; - for (i = 0; items[i].path; i++) - l = g_slist_prepend (l, &items[i]); - e_config_add_items ((EConfig *) ec, l, emae_free, emae); - - /* This is kinda yuck, we're dynamically mapping from the 'old style' extensibility api to the new one */ - l = NULL; - have = g_hash_table_new (g_str_hash, g_str_equal); - index = 20; - for (prov = priv->providers; prov; prov = g_list_next (prov)) { - CamelProviderConfEntry *entries = ((CamelProvider *) prov->data)->extra_conf; - - for (i = 0; entries && entries[i].type != CAMEL_PROVIDER_CONF_END; i++) { - struct _receive_options_item *item; - const gchar *name = entries[i].name; - gint myindex = index; - - if (entries[i].type != CAMEL_PROVIDER_CONF_SECTION_START - || name == NULL - || g_hash_table_lookup (have, name)) - continue; - - /* override mailcheck since we also insert our own mailcheck item at this index */ - if (name && !strcmp (name, "mailcheck")) - myindex = 10; - - item = g_malloc0 (sizeof (*item)); - item->item.type = E_CONFIG_SECTION_TABLE; - item->item.path = g_strdup_printf ("20.receive_options/%02d.%s", myindex, name?name:"unnamed"); - item->item.label = g_strdup (entries[i].text); - - l = g_slist_prepend (l, item); - - item = g_malloc0 (sizeof (*item)); - item->item.type = E_CONFIG_ITEM_TABLE; - item->item.path = g_strdup_printf ("20.receive_options/%02d.%s/80.camelitem", myindex, name?name:"unnamed"); - item->item.factory = emae_receive_options_extra_item; - item->item.user_data = g_strdup (entries[i].name); - - l = g_slist_prepend (l, item); - - index += 10; - g_hash_table_insert (have, (gpointer) entries[i].name, have); - } - } - g_hash_table_destroy (have); - e_config_add_items ((EConfig *) ec, l, emae_free_auto, emae); - priv->extra_items = l; - - e_config_add_page_check ((EConfig *) ec, NULL, emae_check_complete, emae); - - target = em_config_target_new_settings ( - ec, - emae->priv->modified_account->id->address, - emae->priv->source.protocol, - emae->priv->source.settings, - emae->priv->transport.protocol, - emae->priv->transport.settings); - e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); -} - |