From cea054cd54d84479352a43bbabc19c9ce9af5efb Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 8 Aug 2008 04:26:12 +0000 Subject: Merge revisions 35747:35930 from trunk. svn path=/branches/kill-bonobo/; revision=35931 --- mail/em-account-editor.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 3885b89447..5e691c71fa 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -2020,6 +2020,96 @@ emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const char return hbox; } +static void +emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *service) +{ + const char *name = g_object_get_data (G_OBJECT (options), "option-name"); + char *value = NULL; + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + int id = gtk_combo_box_get_active (options); + + if (id != -1) { + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_combo_box_get_model (options); + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) { + gtk_tree_model_get (model, &iter, 0, &value, -1); + } + } + + camel_url_set_param (url, name, value); + emae_uri_changed (service, url); + camel_url_free (url); + g_free (value); +} + +/* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */ +static GtkWidget * +emae_option_options (EMAccountEditorService *service, CamelURL *url, const char *name, const char *values, GtkWidget *l) +{ + GtkComboBox *w; + GtkListStore *store; + GtkTreeIter iter; + const char *p, *value, *caption; + GtkCellRenderer *cell; + int active = 0; /* the first item entered is always a default item */ + int i; + const char *val = camel_url_get_param (url, name); + + w = GTK_COMBO_BOX (gtk_combo_box_new ()); + + /* value and caption */ + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + + p = values; + for (p = values, i = 0; p; i++) { + char *vl, *cp; + + value = 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 (value, caption - value - 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 (service->provider->translation_domain, cp), -1); + + if (val && g_ascii_strcasecmp (val, vl) == 0) + active = i; + + g_free (vl); + g_free (cp); + } + + gtk_combo_box_set_model (w, (GtkTreeModel *)store); + gtk_combo_box_set_active (w, i > 0 ? active : -1); + + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), cell, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), cell, "text", 1, NULL); + + gtk_widget_show (GTK_WIDGET (w)); + + gtk_label_set_mnemonic_widget (GTK_LABEL (l), GTK_WIDGET (w)); + + g_object_set_data (G_OBJECT (w), "option-name", (void *)name); + g_signal_connect (w, "changed", G_CALLBACK (emae_option_options_changed), service); + + return GTK_WIDGET (w); +} + static GtkWidget * emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) { @@ -2062,7 +2152,7 @@ emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, struct _GtkWidg { EMAccountEditor *emae = data; struct _receive_options_item *item = (struct _receive_options_item *)eitem; - GtkWidget *w, *l; + GtkWidget *w, *l, *h; CamelProviderConfEntry *entries; GtkWidget *depw; GSList *depl = NULL, *n; @@ -2151,6 +2241,20 @@ section: depl = g_slist_prepend(depl, w); row++; break; + case CAMEL_PROVIDER_CONF_OPTIONS: + h = gtk_hbox_new (FALSE, 4); + gtk_widget_show (h); + l = g_object_new (gtk_label_get_type (), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL); + gtk_widget_show (l); + w = emae_option_options (service, url, entries[i].name, entries[i].value, l); + gtk_box_pack_start (GTK_BOX (h), l, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); + gtk_table_attach ((GtkTable *)parent, h, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + if (depw) { + depl = g_slist_prepend (depl, h); + } + row++; + break; default: break; } -- cgit v1.2.3 From b2cda1d0c6d44f53f71bad9e256f41188677dfba Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 1 Oct 2008 20:56:04 +0000 Subject: Merge revisions 36016:36533 from trunk. svn path=/branches/kill-bonobo/; revision=36534 --- mail/em-account-editor.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 5e691c71fa..caa8aa50f5 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -1,25 +1,24 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * Authors: - * Dan Winship - * Jeffrey Stedfast - * Michael Zucchi - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * 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 - * General Public License for more details. + * 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 + * + * + * Authors: + * Dan Winship + * Jeffrey Stedfast + * Michael Zucchi * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ -- cgit v1.2.3 From 54b80a7271e8ce1b2f3ccc68bb553940a24b80e2 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Fri, 17 Oct 2008 03:48:03 +0000 Subject: Get the mail folder tree compiling, though I'm not yet sure why it's not showing anything. Probably something stupid. Also enabled the composer. svn path=/branches/kill-bonobo/; revision=36623 --- mail/em-account-editor.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index caa8aa50f5..62f1b89d6b 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -63,13 +63,14 @@ #include "mail-session.h" #include "mail-send-recv.h" #include "mail-signature-editor.h" -#include "mail-component.h" #include "em-utils.h" #include "em-composer-prefs.h" #include "mail-config.h" #include "mail-ops.h" #include "mail-mt.h" +#include "e-mail-shell-module.h" + #if defined (HAVE_NSS) #include "smime/gui/e-cert-selector.h" #endif @@ -447,11 +448,13 @@ default_folders_clicked (GtkButton *button, gpointer user_data) EMAccountEditor *emae = user_data; const char *uri; - uri = mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_DRAFTS); + uri = e_mail_shell_module_get_folder_uri ( + mail_shell_module, E_MAIL_FOLDER_DRAFTS); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae); - uri = mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_SENT); + uri = e_mail_shell_module_get_folder_uri ( + mail_shell_module, E_MAIL_FOLDER_SENT); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae); } @@ -462,7 +465,10 @@ GtkWidget *em_account_editor_folder_selector_button_new (char *widget_name, char GtkWidget * em_account_editor_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2) { - return (GtkWidget *)em_folder_selection_button_new(string1 ? string1 : _("Select Folder"), NULL); + EMFolderTreeModel *model; + + model = e_mail_shell_module_get_folder_tree_model (mail_shell_module); + return (GtkWidget *)em_folder_selection_button_new(model, string1 ? string1 : _("Select Folder"), NULL); } GtkWidget *em_account_editor_dropdown_new(char *widget_name, char *string1, char *string2, int int1, int int2); @@ -889,7 +895,11 @@ emae_account_folder(EMAccountEditor *emae, const char *name, int item, int deffo em_folder_selection_button_set_selection(folder, tmp); g_free(tmp); } else { - em_folder_selection_button_set_selection(folder, mail_component_get_folder_uri(NULL, deffolder)); + const gchar *uri; + + uri = e_mail_shell_module_get_folder_uri ( + mail_shell_module, deffolder); + em_folder_selection_button_set_selection(folder, uri); } g_object_set_data((GObject *)folder, "account-item", GINT_TO_POINTER(item)); @@ -2352,8 +2362,8 @@ emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st g_free (gladefile); /* Special folders */ - gui->drafts_folder_button = (GtkButton *)emae_account_folder(emae, "drafts_button", E_ACCOUNT_DRAFTS_FOLDER_URI, MAIL_COMPONENT_FOLDER_DRAFTS, xml); - gui->sent_folder_button = (GtkButton *)emae_account_folder(emae, "sent_button", E_ACCOUNT_SENT_FOLDER_URI, MAIL_COMPONENT_FOLDER_SENT, xml); + gui->drafts_folder_button = (GtkButton *)emae_account_folder(emae, "drafts_button", E_ACCOUNT_DRAFTS_FOLDER_URI, E_MAIL_FOLDER_DRAFTS, xml); + gui->sent_folder_button = (GtkButton *)emae_account_folder(emae, "sent_button", E_ACCOUNT_SENT_FOLDER_URI, E_MAIL_FOLDER_SENT, xml); /* Special Folders "Reset Defaults" button */ gui->restore_folders_button = (GtkButton *)glade_xml_get_widget (xml, "default_folders_button"); @@ -2767,6 +2777,7 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) static void add_new_store (char *uri, CamelStore *store, void *user_data) { +#if 0 /* KILL-BONOBO: Try to actually fix this? */ MailComponent *component = mail_component_peek (); EAccount *account = user_data; @@ -2774,6 +2785,7 @@ add_new_store (char *uri, CamelStore *store, void *user_data) return; mail_component_add_store (component, store, account->name); +#endif } static void @@ -2840,13 +2852,21 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account emae->do_signature = TRUE; } else { + const gchar *uri; + /* TODO: have a get_default_account thing?? */ emae->account = e_account_new(); emae->account->enabled = TRUE; - e_account_set_string(emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, - mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_DRAFTS)); - e_account_set_string(emae->account, E_ACCOUNT_SENT_FOLDER_URI, - mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_SENT)); + + uri = e_mail_shell_module_get_folder_uri ( + mail_shell_module, E_MAIL_FOLDER_DRAFTS); + e_account_set_string ( + emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, uri); + + uri = e_mail_shell_module_get_folder_uri ( + mail_shell_module, E_MAIL_FOLDER_SENT); + e_account_set_string ( + emae->account, E_ACCOUNT_SENT_FOLDER_URI, uri); } /* sort the providers, remote first */ -- cgit v1.2.3 From b7333387e8bd19299794e6485e3407d03c2eb73f Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 14 Dec 2008 02:14:41 +0000 Subject: - Fix NetworkManager connection tracking. - Implement offline preparation as an EActivity that gets broadcast in a signal to shell modules. Offline preparations are complete when the last EActivity reference is dropped. - Bind some of the composer preferences to EShellSettings properties. svn path=/branches/kill-bonobo/; revision=36875 --- mail/em-account-editor.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 62f1b89d6b..866d503292 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -661,10 +661,19 @@ emae_signaturetype_changed(GtkComboBox *dropdown, EMAccountEditor *emae) static void emae_signature_new(GtkWidget *w, EMAccountEditor *emae) { - /* TODO: why is this in composer prefs? apart from it being somewhere to put it? */ - em_composer_prefs_new_signature((GtkWindow *)gtk_widget_get_toplevel(w), - gconf_client_get_bool(mail_config_get_gconf_client(), - "/apps/evolution/mail/composer/send_html", NULL)); + EShell *shell; + EShellSettings *shell_settings; + GtkWidget *parent; + gboolean html_mode; + + shell = e_shell_get_default (); + shell_settings = e_shell_get_settings (shell); + parent = gtk_widget_get_toplevel (w); + + g_object_get ( + shell_settings, "composer-format-html", &html_mode, NULL); + + em_composer_prefs_new_signature (GTK_WINDOW (parent), html_mode); } static GtkWidget * -- cgit v1.2.3 From 8d8e4ac1c23905892a42b779188c852fdead7f5f Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 7 Jan 2009 18:23:46 +0000 Subject: Tweak the EShell API. Disable File -> Close Window when there's only one window. Replace EMMessageBrowser with EMailBrowser. svn path=/branches/kill-bonobo/; revision=37009 --- mail/em-account-editor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 866d503292..a29f408231 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -667,7 +667,7 @@ emae_signature_new(GtkWidget *w, EMAccountEditor *emae) gboolean html_mode; shell = e_shell_get_default (); - shell_settings = e_shell_get_settings (shell); + shell_settings = e_shell_get_shell_settings (shell); parent = gtk_widget_get_toplevel (w); g_object_get ( -- cgit v1.2.3 From c7d3c9f95609123035ebaa267f9d2e6ecfa8c2e8 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 12 Jan 2009 04:12:01 +0000 Subject: Merge revisions 36866:37046 from trunk. svn path=/branches/kill-bonobo/; revision=37050 --- mail/em-account-editor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index a29f408231..3174deaed9 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -2018,9 +2018,9 @@ emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const char hbox = gtk_hbox_new(FALSE, 0); check = g_object_new(gtk_check_button_get_type(), "label", pre, "use_underline", TRUE, "active", enable, NULL); - spin = gtk_spin_button_new((GtkAdjustment *)gtk_adjustment_new(def, min, max, 1, 1, 1), 1, 0); + spin = gtk_spin_button_new((GtkAdjustment *)gtk_adjustment_new(def, min, max, 1, 1, 0), 1, 0); if (post) - label = gtk_label_new(post); + label = gtk_label_new_with_mnemonic(post); gtk_box_pack_start((GtkBox *)hbox, check, FALSE, TRUE, 0); gtk_box_pack_start((GtkBox *)hbox, spin, FALSE, TRUE, 0); if (label) -- cgit v1.2.3 From bc80332460c353e391cd620f2cc51f7b56eef4de Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 26 Jan 2009 18:49:51 +0000 Subject: Miscellaneous stuff. svn path=/branches/kill-bonobo/; revision=37134 --- mail/em-account-editor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 3174deaed9..965d4807c6 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -670,8 +670,8 @@ emae_signature_new(GtkWidget *w, EMAccountEditor *emae) shell_settings = e_shell_get_shell_settings (shell); parent = gtk_widget_get_toplevel (w); - g_object_get ( - shell_settings, "composer-format-html", &html_mode, NULL); + html_mode = e_shell_settings_get_boolean ( + shell_settings, "composer-format-html"); em_composer_prefs_new_signature (GTK_WINDOW (parent), html_mode); } -- cgit v1.2.3 From e0f414941dd4e13ea074996d10606b0dae7e494b Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 26 Jan 2009 22:18:58 +0000 Subject: Split EAccountList and ESignatureList management out of the mail module. This reduces the dependency of the composer on the mail module, which is currently a circular dependency. svn path=/branches/kill-bonobo/; revision=37135 --- mail/em-account-editor.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 965d4807c6..0103242112 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -51,10 +51,11 @@ #include #include -#include #include #include "e-util/e-error.h" +#include "e-util/e-account-utils.h" +#include "e-util/e-signature-utils.h" #include "e-util/e-util-private.h" #include "em-config.h" @@ -210,7 +211,7 @@ emae_finalise(GObject *o) EMAccountEditorPrivate *p = emae->priv; if (p->sig_added_id) { - ESignatureList *signatures = mail_config_get_signatures(); + ESignatureList *signatures = e_get_signature_list (); g_signal_handler_disconnect(signatures, p->sig_added_id); g_signal_handler_disconnect(signatures, p->sig_removed_id); @@ -698,7 +699,7 @@ emae_setup_signatures(EMAccountEditor *emae, GladeXML *xml) gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, _("None"), 1, NULL, -1); - signatures = mail_config_get_signatures (); + 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); @@ -1791,8 +1792,8 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st gui->management_frame = glade_xml_get_widget(xml, "management_frame"); gui->default_account = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "management_default")); - if (!mail_config_get_default_account () - || (account == mail_config_get_default_account ()) + if (!e_get_default_account () + || (account == e_get_default_account ()) || (GPOINTER_TO_INT(g_object_get_data (G_OBJECT (emae->account), "default_flagged"))) ) gtk_toggle_button_set_active (gui->default_account, TRUE); @@ -2729,7 +2730,7 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) len = strlen(tmp); template = alloca(len + 14); strcpy(template, tmp); - while (mail_config_get_account_by_name(template)) + while (e_get_account_by_name (template)) sprintf(template + len, " (%d)", i++); gtk_entry_set_text(emae->priv->identity_entries[0], template); @@ -2773,7 +2774,7 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) if (ok && (pageid == NULL || !strcmp(pageid, "40.management"))) { ok = (tmp = e_account_get_string(emae->account, E_ACCOUNT_NAME)) && tmp[0] - && ((ea = mail_config_get_account_by_name(tmp)) == NULL + && ((ea = e_get_account_by_name (tmp)) == NULL || ea == emae->original); if (!ok) d(printf("management page incomplete\n")); @@ -2801,7 +2802,7 @@ static void emae_commit(EConfig *ec, GSList *items, void *data) { EMAccountEditor *emae = data; - EAccountList *accounts = mail_config_get_accounts(); + EAccountList *accounts = e_get_account_list (); EAccount *account; /* the mail-config*acconts* api needs a lot of work */ -- cgit v1.2.3 From de169b4feeeaf2013aa256ddf70276bacbd6542a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 10 Feb 2009 02:51:52 +0000 Subject: Rewrite the signature management UI from top to bottom. - Break the UI out of Glade and into small, manageable widgets: ESignatureEditor (moved from mail to widgets/misc) ESignatureManager ESignatureTreeView ESignatureScriptDialog - Move several signature utilities to e-util/e-signature-utils.c so they're accessible from widgets/misc without introducing circular dependences. - Have EMailShellModule listen for new GtkhtmlEditor windows (from which EMsgComposer and ESignatureEditor are derived) and configure the window with spelling and HTML editing user preferences. - Drastically simplifies em-composer-prefs.c. svn path=/branches/kill-bonobo/; revision=37239 --- mail/em-account-editor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 0103242112..a5c5d59fd8 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -63,7 +63,7 @@ #include "em-account-editor.h" #include "mail-session.h" #include "mail-send-recv.h" -#include "mail-signature-editor.h" +#include "e-signature-editor.h" #include "em-utils.h" #include "em-composer-prefs.h" #include "mail-config.h" -- cgit v1.2.3 From 16e2beab9e4d412399f495f6165d27da80cb3675 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 7 May 2009 16:38:32 -0400 Subject: Adapt mail to EShellBackend changes. Again, builds but not tested. Lots of compiler warnings to clean up, but I don't have the energy for it. This was pretty grueling. --- mail/em-account-editor.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index a5c5d59fd8..72e8881863 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -70,7 +70,7 @@ #include "mail-ops.h" #include "mail-mt.h" -#include "e-mail-shell-module.h" +#include "e-mail-shell-backend.h" #if defined (HAVE_NSS) #include "smime/gui/e-cert-selector.h" @@ -449,13 +449,13 @@ default_folders_clicked (GtkButton *button, gpointer user_data) EMAccountEditor *emae = user_data; const char *uri; - uri = e_mail_shell_module_get_folder_uri ( - mail_shell_module, E_MAIL_FOLDER_DRAFTS); + uri = e_mail_shell_backend_get_folder_uri ( + global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae); - uri = e_mail_shell_module_get_folder_uri ( - mail_shell_module, E_MAIL_FOLDER_SENT); + uri = e_mail_shell_backend_get_folder_uri ( + global_mail_shell_backend, E_MAIL_FOLDER_SENT); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae); } @@ -468,7 +468,7 @@ em_account_editor_folder_selector_button_new (char *widget_name, char *string1, { EMFolderTreeModel *model; - model = e_mail_shell_module_get_folder_tree_model (mail_shell_module); + model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend); return (GtkWidget *)em_folder_selection_button_new(model, string1 ? string1 : _("Select Folder"), NULL); } @@ -907,8 +907,8 @@ emae_account_folder(EMAccountEditor *emae, const char *name, int item, int deffo } else { const gchar *uri; - uri = e_mail_shell_module_get_folder_uri ( - mail_shell_module, deffolder); + uri = e_mail_shell_backend_get_folder_uri ( + global_mail_shell_backend, deffolder); em_folder_selection_button_set_selection(folder, uri); } @@ -2868,13 +2868,13 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account emae->account = e_account_new(); emae->account->enabled = TRUE; - uri = e_mail_shell_module_get_folder_uri ( - mail_shell_module, E_MAIL_FOLDER_DRAFTS); + uri = e_mail_shell_backend_get_folder_uri ( + global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); e_account_set_string ( emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, uri); - uri = e_mail_shell_module_get_folder_uri ( - mail_shell_module, E_MAIL_FOLDER_SENT); + uri = e_mail_shell_backend_get_folder_uri ( + global_mail_shell_backend, E_MAIL_FOLDER_SENT); e_account_set_string ( emae->account, E_ACCOUNT_SENT_FOLDER_URI, uri); } -- cgit v1.2.3 From c3205a427adcc910f0614cb83249622816440c56 Mon Sep 17 00:00:00 2001 From: Srinivasa Ragavan Date: Fri, 22 May 2009 17:30:14 +0530 Subject: Mail changes required for Anjal. --- mail/em-account-editor.c | 200 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 180 insertions(+), 20 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 72e8881863..a9ba161122 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -278,6 +278,26 @@ EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t ty 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, em_account_editor_t type, char *id, GtkWidget **pages) +{ + EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL); + emae->pages = pages; + em_account_editor_construct(emae, account, type, id); + + return emae; +} + /* ********************************************************************** */ static struct { @@ -403,7 +423,7 @@ emae_display_license(EMAccountEditor *emae, CamelProvider *prov) gtk_text_view_set_editable((GtkTextView *)w, FALSE); response = gtk_dialog_run((GtkDialog *)dialog); } else { - e_error_run((GtkWindow *)gtk_widget_get_toplevel(emae->editor), + e_error_run(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, "mail:no-load-license", prov->license_file, NULL); } @@ -1038,7 +1058,8 @@ emae_url_set_hostport(CamelURL *url, const char *txt) } g_strstrip(host); - camel_url_set_host(url, host); + if (txt && *txt) + camel_url_set_host(url, host); g_free(host); } @@ -1401,7 +1422,8 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) int active = 0, i; struct _service_info *info = &emae_service_info[service->type]; const char *uri = e_account_get_string(account, info->account_uri_key); - char *current = NULL; + char *current = NULL, *tmp; + CamelURL *url; dropdown = service->providers; gtk_widget_show((GtkWidget *)dropdown); @@ -1416,8 +1438,10 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) memcpy(current, uri, len); current[len] = 0; } + } else { + current = g_strdup("imap"); } - + store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); i = 0; @@ -1443,7 +1467,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1); - + /* find the displayed and set default */ if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) { service->provider = provider; @@ -1461,13 +1485,30 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) i++; } + + gtk_cell_layout_clear((GtkCellLayout *)dropdown); gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store); gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE); gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL); + g_signal_handlers_disconnect_by_func(dropdown, emae_provider_changed, service); gtk_combo_box_set_active(dropdown, -1); /* needed for gtkcombo bug(?) */ gtk_combo_box_set_active(dropdown, active); g_signal_connect(dropdown, "changed", G_CALLBACK(emae_provider_changed), service); + + if (!uri || (url = camel_url_new(uri, NULL)) == NULL) { + return; + } + + tmp = (char *)camel_url_get_param(url, "use_ssl"); + if (tmp == NULL) + tmp = "never"; + for (i=0;iuse_ssl, i); + break; + } + } } static void @@ -1623,11 +1664,12 @@ static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service) uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key); g_object_ref(emae); - service->check_dialog = e_error_new((GtkWindow *)gtk_widget_get_toplevel(emae->editor), + service->check_dialog = e_error_new(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, "mail:checking-service", NULL); g_signal_connect(service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service); gtk_widget_show(service->check_dialog); - gtk_widget_set_sensitive(emae->editor, FALSE); + if (emae->editor) + gtk_widget_set_sensitive(emae->editor, FALSE); service->check_id = mail_check_service(uri, service->type, emae_check_authtype_done, service); } @@ -1641,7 +1683,6 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade int i; service->provider = uri?camel_provider_get(uri, NULL):NULL; - service->frame = glade_xml_get_widget(xml, info->frame); service->container = glade_xml_get_widget(xml, info->container); service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description)); @@ -1670,8 +1711,9 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade } else gtk_entry_set_text(service->hostname, url->host); } - if (url->user) + if (url->user && *url->user) { gtk_entry_set_text(service->username, url->user); + } if (service->pathentry) { GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; @@ -1809,7 +1851,9 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -1858,7 +1902,9 @@ emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, str emae_setup_service(emae, &gui->source, xml); w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -2326,7 +2372,9 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct emae_setup_service(emae, &gui->transport, xml); w = glade_xml_get_widget(xml, item->label); - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; @@ -2341,7 +2389,7 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); + gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email"))); } @@ -2562,6 +2610,10 @@ emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *paren GladeXML *druidxml; GtkWidget *w; char *gladefile; + EMAccountEditor *emae = (EMAccountEditor *)data; + + if (emae->type == EMAE_PAGES) + return NULL; gladefile = g_build_filename (EVOLUTION_GLADEDIR, "mail-config.glade", @@ -2651,10 +2703,12 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) if (uri == NULL || (url = camel_url_new(uri, NULL)) == NULL) return FALSE; - if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST) - && (url->host == NULL || url->host[0] == 0)) - ok = FALSE; - + if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) { + if (url->host == NULL || url->host[0] == 0) + ok = FALSE; + else + gtk_entry_set_text(service->hostname, url->host); + } /* We only need the user if the service needs auth as well, i think */ if (ok && (service->needs_auth == NULL @@ -2674,6 +2728,37 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) return ok; } +enum { + GMAIL = 0, + YAHOO, + AOL +}; +struct _server_prefill { + char *key; + char *recv; + char *send; + char *proto; + char *ssl; +} mail_servers [] = { + {"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"}, + {"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"}, + {"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"}, + {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"} +}; + +static int +check_servers (char *server) +{ + int len = G_N_ELEMENTS(mail_servers), i; + + for (i=0; ipriv->receive_set) { char *user, *at; + int index; + char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL); + CamelURL *url; emae->priv->receive_set = 1; - tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); + tmp = (char *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); at = strchr(tmp, '@'); user = g_alloca(at-tmp+1); memcpy(user, tmp, at-tmp); user[at-tmp] = 0; + at++; + + index = check_servers(at); gtk_entry_set_text(emae->priv->source.username, user); gtk_entry_set_text(emae->priv->transport.username, user); + if (uri && (url = camel_url_new(uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol(url, mail_servers[index].proto); + camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].recv); + camel_url_set_user (url, user); + gtk_entry_set_text(emae->priv->source.hostname, mail_servers[index].recv); + gtk_entry_set_text(emae->priv->transport.hostname, mail_servers[index].send); + uri = camel_url_to_string(url, 0); + e_account_set_string(emae->account, E_ACCOUNT_SOURCE_URL, uri); + + g_free(uri); + camel_url_free(url); + } else { + g_warning("buz1\n"); + } + } + } else if (!strcmp(pageid, "30.send")) { + CamelURL *url; + char *at, *user; + int index; + char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); + + tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); + at = strchr(tmp, '@'); + user = g_alloca(at-tmp+1); + memcpy(user, tmp, at-tmp); + user[at-tmp] = 0; + at++; + + index = check_servers(at); + if (uri && (url = camel_url_new(uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol (url, "smtp"); + camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].send); + camel_url_set_user (url, user); + uri = camel_url_to_string(url, 0); + e_account_set_string(emae->account, E_ACCOUNT_TRANSPORT_URL, uri); + g_free(uri); + camel_url_free(url); + } else { + g_warning("buz2\n"); + } + + } else if (!strcmp(pageid, "20.receive_options")) { if (emae->priv->source.provider && emae->priv->extra_provider != emae->priv->source.provider) { @@ -2760,12 +2898,18 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } if (ok && (pageid == NULL || !strcmp(pageid, "10.receive"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers(emae, &emae->priv->source); + } ok = emae_service_complete(emae, &emae->priv->source); if (!ok) d(printf("receive page incomplete\n")); } if (ok && (pageid == NULL || !strcmp(pageid, "30.send"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers(emae, &emae->priv->transport); + } ok = emae_service_complete(emae, &emae->priv->transport); if (!ok) d(printf("send page incomplete\n")); @@ -2783,6 +2927,12 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) return ok; } +void +em_account_editor_check (EMAccountEditor *emae, const char *page) +{ + emae_check_complete((EConfig *)emae->config, page, emae); +} + /* HACK: FIXME: the component should listen to the account object directly */ static void add_new_store (char *uri, CamelStore *store, void *user_data) @@ -2831,6 +2981,12 @@ emae_commit(EConfig *ec, GSList *items, void *data) e_account_list_save(accounts); } +void +em_account_editor_commit (EMAccountEditor *emae) +{ + emae_commit ((EConfig *)emae->config, NULL, emae); +} + static void emae_editor_destroyed(GtkWidget *dialog, EMAccountEditor *emae) { @@ -2958,7 +3114,11 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account target = em_config_target_new_account(ec, emae->account); e_config_set_target((EConfig *)ec, (EConfigTarget *)target); - emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); - g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); + if (type != EMAE_PAGES) { + emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); + g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); + } else { + e_config_create_widget((EConfig *)ec); + } } -- cgit v1.2.3 From e4afd3f9fb962ea1295a0657ec9f83a427829171 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 26 May 2009 23:21:02 -0400 Subject: Remove trailing whitespace, again. --- mail/em-account-editor.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index fc61cdc84b..2b13e7e015 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -10,7 +10,7 @@ * 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 + * License along with the program; if not, see * * * Authors: @@ -1422,7 +1422,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) } else { current = g_strdup("imap"); } - + store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); i = 0; @@ -1448,7 +1448,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1); - + /* find the displayed and set default */ if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) { service->provider = provider; @@ -1480,10 +1480,10 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) if (!uri || (url = camel_url_new(uri, NULL)) == NULL) { return; } - + tmp = camel_url_get_param(url, "use_ssl"); if (tmp == NULL) - tmp = "never"; + tmp = "never"; for (i=0;iuse_ssl, i); @@ -2370,7 +2370,7 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); + gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email"))); } @@ -2687,7 +2687,7 @@ emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) { if (url->host == NULL || url->host[0] == 0) ok = FALSE; - else + else gtk_entry_set_text(service->hostname, url->host); } /* We only need the user if the service needs auth as well, i think */ @@ -2802,14 +2802,14 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } else { g_warning("buz1\n"); } - + } } else if (!strcmp(pageid, "30.send")) { CamelURL *url; char *at, *user; int index; char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); - + tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); at = strchr(tmp, '@'); user = g_alloca(at-tmp+1); @@ -2831,8 +2831,8 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } else { g_warning("buz2\n"); } - - + + } else if (!strcmp(pageid, "20.receive_options")) { if (emae->priv->source.provider && emae->priv->extra_provider != emae->priv->source.provider) { @@ -3095,5 +3095,5 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); } else { e_config_create_widget((EConfig *)ec); - } + } } -- cgit v1.2.3 From 948235c3d1076dbe6ed2e57a24c16a083bbd9f01 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 27 May 2009 10:29:19 -0400 Subject: Prefer GLib basic types over C types. --- mail/em-account-editor.c | 344 +++++++++++++++++++++++------------------------ 1 file changed, 172 insertions(+), 172 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index e5f0f98001..27c04c83fb 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -119,13 +119,13 @@ typedef struct _EMAccountEditorService { struct _GtkToggleButton *needs_auth; struct _GtkWidget *check_dialog; - int check_id; + gint check_id; GList *authtypes; /* if "Check supported" */ CamelProvider *provider; CamelProviderType type; - int auth_changed_id; + gint auth_changed_id; } EMAccountEditorService; typedef struct _EMAccountEditorPrivate { @@ -137,7 +137,7 @@ typedef struct _EMAccountEditorPrivate { guint sig_added_id; guint sig_removed_id; guint sig_changed_id; - const char *sig_uid; + const gchar *sig_uid; /* incoming mail */ EMAccountEditorService source; @@ -179,13 +179,13 @@ typedef struct _EMAccountEditorPrivate { /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/ GtkWidget *widgets[5]; - const char *widgets_name[5]; - int widgets_index; + const gchar *widgets_name[5]; + gint widgets_index; /* for druid page preparation */ - unsigned int identity_set:1; - unsigned int receive_set:1; - unsigned int management_set:1; + guint identity_set:1; + guint receive_set:1; + guint management_set:1; } EMAccountEditorPrivate; static void emae_refresh_authtype(EMAccountEditor *emae, EMAccountEditorService *service); @@ -289,7 +289,7 @@ EMAccountEditor *em_account_editor_new(EAccount *account, em_account_editor_t ty * * Return value: **/ -EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, char *id, GtkWidget **pages) +EMAccountEditor *em_account_editor_new_for_pages(EAccount *account, em_account_editor_t type, gchar *id, GtkWidget **pages) { EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL); emae->pages = pages; @@ -320,14 +320,14 @@ static struct { #define num_ssl_options (sizeof (ssl_options) / sizeof (ssl_options[0])) static gboolean -is_email (const char *address) +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 char *at; + const gchar *at; at = strchr (address, '@'); - /* make sure we have an '@' and that it's not the first or last char */ + /* make sure we have an '@' and that it's not the first or last gchar */ if (!at || at == address || *(at + 1) == '\0') return FALSE; @@ -335,10 +335,10 @@ is_email (const char *address) } static CamelURL * -emae_account_url(EMAccountEditor *emae, int urlid) +emae_account_url(EMAccountEditor *emae, gint urlid) { CamelURL *url = NULL; - const char *uri; + const gchar *uri; uri = e_account_get_string(emae->account, urlid); @@ -362,13 +362,13 @@ emae_license_state(GtkToggleButton *button, GtkDialog *dialog) } static gboolean -emae_load_text(GtkTextView *view, const char *filename) +emae_load_text(GtkTextView *view, const gchar *filename) { FILE *fd; - char filebuf[1024]; + gchar filebuf[1024]; GtkTextIter iter; GtkTextBuffer *buffer; - int count; + gint count; g_return_val_if_fail (filename != NULL , FALSE); @@ -393,9 +393,9 @@ emae_display_license(EMAccountEditor *emae, CamelProvider *prov) { GladeXML *xml; GtkWidget *w, *dialog; - char *tmp; + gchar *tmp; GtkResponseType response = GTK_RESPONSE_NONE; - char *gladefile; + gchar *gladefile; gladefile = g_build_filename (EVOLUTION_GLADEDIR, "mail-dialogs.glade", @@ -445,7 +445,7 @@ emae_check_license(EMAccountEditor *emae, CamelProvider *prov) providers_list = gconf_client_get_list (gconf, "/apps/evolution/mail/licenses", GCONF_VALUE_STRING, NULL); for (l = providers_list, accepted = FALSE; l && !accepted; l = g_slist_next(l)) - accepted = (strcmp((char *)l->data, prov->protocol) == 0); + accepted = (strcmp((gchar *)l->data, prov->protocol) == 0); if (!accepted && (accepted = emae_display_license(emae, prov)) == TRUE) { @@ -467,7 +467,7 @@ static void default_folders_clicked (GtkButton *button, gpointer user_data) { EMAccountEditor *emae = user_data; - const char *uri; + const gchar *uri; uri = e_mail_shell_backend_get_folder_uri ( global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); @@ -481,10 +481,10 @@ default_folders_clicked (GtkButton *button, gpointer user_data) } /* custom widget factories */ -GtkWidget *em_account_editor_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2); +GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); GtkWidget * -em_account_editor_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2) +em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { EMFolderTreeModel *model; @@ -492,23 +492,23 @@ em_account_editor_folder_selector_button_new (char *widget_name, char *string1, return (GtkWidget *)em_folder_selection_button_new(model, string1 ? string1 : _("Select Folder"), NULL); } -GtkWidget *em_account_editor_dropdown_new(char *widget_name, char *string1, char *string2, int int1, int int2); +GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); GtkWidget * -em_account_editor_dropdown_new(char *widget_name, char *string1, char *string2, int int1, int int2) +em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { return (GtkWidget *)gtk_combo_box_new(); } -GtkWidget *em_account_editor_ssl_selector_new(char *widget_name, char *string1, char *string2, int int1, int int2); +GtkWidget *em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); GtkWidget * -em_account_editor_ssl_selector_new(char *widget_name, char *string1, char *string2, int int1, int int2) +em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { GtkComboBox *dropdown = (GtkComboBox *)gtk_combo_box_new(); GtkCellRenderer *cell = gtk_cell_renderer_text_new(); GtkListStore *store; - int i; + gint i; GtkTreeIter iter; gtk_widget_show((GtkWidget *)dropdown); @@ -546,8 +546,8 @@ emae_auto_detect(EMAccountEditor *emae) GHashTable *auto_detected; GSList *l; CamelProviderConfEntry *entries; - char *value; - int i; + gchar *value; + gint i; CamelURL *url; if (service->provider == NULL @@ -622,7 +622,7 @@ static int emae_signature_get_iter(EMAccountEditor *emae, ESignature *sig, GtkTreeModel **modelp, GtkTreeIter *iter) { GtkTreeModel *model; - int found = 0; + gint found = 0; model = gtk_combo_box_get_model(emae->priv->signatures_dropdown); *modelp = model; @@ -630,7 +630,7 @@ emae_signature_get_iter(EMAccountEditor *emae, ESignature *sig, GtkTreeModel **m return FALSE; do { - char *uid; + gchar *uid; gtk_tree_model_get(model, iter, 1, &uid, -1); if (uid && !strcmp(uid, sig->uid)) @@ -664,10 +664,10 @@ emae_signature_changed(ESignatureList *signatures, ESignature *sig, EMAccountEdi static void emae_signaturetype_changed(GtkComboBox *dropdown, EMAccountEditor *emae) { - int id = gtk_combo_box_get_active(dropdown); + gint id = gtk_combo_box_get_active(dropdown); GtkTreeModel *model; GtkTreeIter iter; - char *uid = NULL; + gchar *uid = NULL; if (id != -1) { model = gtk_combo_box_get_model(dropdown); @@ -704,11 +704,11 @@ emae_setup_signatures(EMAccountEditor *emae, GladeXML *xml) GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "signature_dropdown"); GtkCellRenderer *cell = gtk_cell_renderer_text_new(); GtkListStore *store; - int i, active=0; + gint i, active=0; GtkTreeIter iter; ESignatureList *signatures; EIterator *it; - const char *current = e_account_get_string(emae->account, E_ACCOUNT_ID_SIGNATURE); + const gchar *current = e_account_get_string(emae->account, E_ACCOUNT_ID_SIGNATURE); GtkWidget *button; emae->priv->signatures_dropdown = dropdown; @@ -765,7 +765,7 @@ emae_setup_signatures(EMAccountEditor *emae, GladeXML *xml) static void emae_receipt_policy_changed(GtkComboBox *dropdown, EMAccountEditor *emae) { - int id = gtk_combo_box_get_active(dropdown); + gint id = gtk_combo_box_get_active(dropdown); GtkTreeModel *model; GtkTreeIter iter; EAccountReceiptPolicy policy; @@ -785,7 +785,7 @@ emae_setup_receipt_policy (EMAccountEditor *emae, GladeXML *xml) { GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "receipt_policy_dropdown"); GtkListStore *store; - int i = 0, active = 0; + gint i = 0, active = 0; GtkTreeIter iter; EAccountReceiptPolicy current = emae->account->receipt_policy; static struct { @@ -823,16 +823,16 @@ emae_setup_receipt_policy (EMAccountEditor *emae, GladeXML *xml) static void emae_account_entry_changed(GtkEntry *entry, EMAccountEditor *emae) { - int item = GPOINTER_TO_INT(g_object_get_data((GObject *)entry, "account-item")); + gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)entry, "account-item")); e_account_set_string(emae->account, item, gtk_entry_get_text(entry)); } static GtkEntry * -emae_account_entry(EMAccountEditor *emae, const char *name, int item, GladeXML *xml) +emae_account_entry(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml) { GtkEntry *entry; - const char *text; + const gchar *text; entry = (GtkEntry *)glade_xml_get_widget(xml, name); text = e_account_get_string(emae->account, item); @@ -848,13 +848,13 @@ emae_account_entry(EMAccountEditor *emae, const char *name, int item, GladeXML * static void emae_account_toggle_changed(GtkToggleButton *toggle, EMAccountEditor *emae) { - int item = GPOINTER_TO_INT(g_object_get_data((GObject *)toggle, "account-item")); + gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)toggle, "account-item")); e_account_set_bool(emae->account, item, gtk_toggle_button_get_active(toggle)); } static void -emae_account_toggle_widget(EMAccountEditor *emae, GtkToggleButton *toggle, int item) +emae_account_toggle_widget(EMAccountEditor *emae, GtkToggleButton *toggle, gint item) { gtk_toggle_button_set_active(toggle, e_account_get_bool(emae->account, item)); g_object_set_data((GObject *)toggle, "account-item", GINT_TO_POINTER(item)); @@ -863,7 +863,7 @@ emae_account_toggle_widget(EMAccountEditor *emae, GtkToggleButton *toggle, int i } static GtkToggleButton * -emae_account_toggle(EMAccountEditor *emae, const char *name, int item, GladeXML *xml) +emae_account_toggle(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml) { GtkToggleButton *toggle; @@ -876,13 +876,13 @@ emae_account_toggle(EMAccountEditor *emae, const char *name, int item, GladeXML static void emae_account_spinint_changed(GtkSpinButton *spin, EMAccountEditor *emae) { - int item = GPOINTER_TO_INT(g_object_get_data((GObject *)spin, "account-item")); + gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)spin, "account-item")); e_account_set_int(emae->account, item, gtk_spin_button_get_value(spin)); } static void -emae_account_spinint_widget(EMAccountEditor *emae, GtkSpinButton *spin, int item) +emae_account_spinint_widget(EMAccountEditor *emae, GtkSpinButton *spin, gint item) { gtk_spin_button_set_value(spin, e_account_get_int(emae->account, item)); g_object_set_data((GObject *)spin, "account-item", GINT_TO_POINTER(item)); @@ -892,7 +892,7 @@ emae_account_spinint_widget(EMAccountEditor *emae, GtkSpinButton *spin, int item #if 0 static GtkSpinButton * -emae_account_spinint(EMAccountEditor *emae, const char *name, int item) +emae_account_spinint(EMAccountEditor *emae, const gchar *name, gint item) { GtkSpinButton *spin; @@ -906,21 +906,21 @@ emae_account_spinint(EMAccountEditor *emae, const char *name, int item) static void emae_account_folder_changed(EMFolderSelectionButton *folder, EMAccountEditor *emae) { - int item = GPOINTER_TO_INT(g_object_get_data((GObject *)folder, "account-item")); + gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)folder, "account-item")); e_account_set_string(emae->account, item, em_folder_selection_button_get_selection(folder)); } static EMFolderSelectionButton * -emae_account_folder(EMAccountEditor *emae, const char *name, int item, int deffolder, GladeXML *xml) +emae_account_folder(EMAccountEditor *emae, const gchar *name, gint item, gint deffolder, GladeXML *xml) { EMFolderSelectionButton *folder; - const char *uri; + const gchar *uri; folder = (EMFolderSelectionButton *)glade_xml_get_widget(xml, name); uri = e_account_get_string(emae->account, item); if (uri) { - char *tmp = em_uri_to_camel(uri); + gchar *tmp = em_uri_to_camel(uri); em_folder_selection_button_set_selection(folder, tmp); g_free(tmp); @@ -947,8 +947,8 @@ static void smime_changed(EMAccountEditor *emae) { EMAccountEditorPrivate *gui = emae->priv; - int act; - const char *tmp; + gint act; + const gchar *tmp; tmp = gtk_entry_get_text(gui->smime_sign_key); act = tmp && tmp[0]; @@ -969,7 +969,7 @@ smime_changed(EMAccountEditor *emae) } static void -smime_sign_key_selected(GtkWidget *dialog, const char *key, EMAccountEditor *emae) +smime_sign_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) { EMAccountEditorPrivate *gui = emae->priv; @@ -1004,7 +1004,7 @@ smime_sign_key_clear(GtkWidget *w, EMAccountEditor *emae) } static void -smime_encrypt_key_selected(GtkWidget *dialog, const char *key, EMAccountEditor *emae) +smime_encrypt_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) { EMAccountEditorPrivate *gui = emae->priv; @@ -1040,10 +1040,10 @@ smime_encrypt_key_clear(GtkWidget *w, EMAccountEditor *emae) #endif static void -emae_url_set_hostport(CamelURL *url, const char *txt) +emae_url_set_hostport(CamelURL *url, const gchar *txt) { - const char *port; - char *host; + const gchar *port; + gchar *host; /* FIXME: what if this was a raw IPv6 address? */ if (txt && (port = strchr(txt, ':'))) { @@ -1069,7 +1069,7 @@ emae_url_set_hostport(CamelURL *url, const char *txt) We need our own function for host:port decoding, as above */ struct _provider_host_info { guint32 flag; - void (*setval)(CamelURL *, const char *); + void (*setval)(CamelURL *, const gchar *); glong widgets[3]; }; @@ -1146,7 +1146,7 @@ static struct _service_info { static void emae_uri_changed(EMAccountEditorService *service, CamelURL *url) { - char *uri; + gchar *uri; uri = camel_url_to_string(url, 0); @@ -1162,16 +1162,16 @@ emae_uri_changed(EMAccountEditorService *service, CamelURL *url) } static void -emae_service_url_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const char *), GtkEntry *entry) +emae_service_url_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkEntry *entry) { GtkComboBox *dropdown; - int id; + gint id; GtkTreeModel *model; GtkTreeIter iter; CamelServiceAuthType *authtype; CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - const char *text = gtk_entry_get_text(entry); + const gchar *text = gtk_entry_get_text(entry); setval(url, (text && text[0])?text:NULL); @@ -1195,16 +1195,16 @@ emae_service_url_changed(EMAccountEditorService *service, void (*setval)(CamelUR } static void -emae_service_url_path_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const char *), GtkWidget *widget) +emae_service_url_path_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkWidget *widget) { GtkComboBox *dropdown; - int id; + gint id; GtkTreeModel *model; GtkTreeIter iter; CamelServiceAuthType *authtype; CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - const char *text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); + const gchar *text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); setval(url, (text && text[0])?text:NULL); @@ -1248,10 +1248,10 @@ emae_path_changed(GtkWidget *widget, EMAccountEditorService *service) static int emae_ssl_update(EMAccountEditorService *service, CamelURL *url) { - int id = gtk_combo_box_get_active(service->use_ssl); + gint id = gtk_combo_box_get_active(service->use_ssl); GtkTreeModel *model; GtkTreeIter iter; - char *ssl; + gchar *ssl; if (id == -1) return 0; @@ -1281,12 +1281,12 @@ emae_ssl_changed(GtkComboBox *dropdown, EMAccountEditorService *service) static void emae_service_provider_changed(EMAccountEditorService *service) { - int i, j; + gint i, j; void (*show)(GtkWidget *); CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); if (service->provider) { - int enable; + gint enable; GtkWidget *dwidget = NULL; camel_url_set_protocol(url, service->provider->protocol); @@ -1308,7 +1308,7 @@ emae_service_provider_changed(EMAccountEditorService *service) for (i=0;emae_service_info[service->type].host_info[i].flag;i++) { GtkWidget *w; - int hide; + gint hide; struct _provider_host_info *info = &emae_service_info[service->type].host_info[i]; enable = CAMEL_PROVIDER_ALLOWS(service->provider, info->flag); @@ -1389,7 +1389,7 @@ emae_service_provider_changed(EMAccountEditorService *service) static void emae_provider_changed(GtkComboBox *dropdown, EMAccountEditorService *service) { - int id = gtk_combo_box_get_active(dropdown); + gint id = gtk_combo_box_get_active(dropdown); GtkTreeModel *model; GtkTreeIter iter; @@ -1419,10 +1419,10 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) GList *l; GtkCellRenderer *cell = gtk_cell_renderer_text_new(); GtkComboBox *dropdown; - int active = 0, i; + gint active = 0, i; struct _service_info *info = &emae_service_info[service->type]; - const char *uri = e_account_get_string(account, info->account_uri_key); - char *current = NULL; + const gchar *uri = e_account_get_string(account, info->account_uri_key); + gchar *current = NULL; const gchar *tmp; CamelURL *url; @@ -1430,8 +1430,8 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) gtk_widget_show((GtkWidget *)dropdown); if (uri) { - const char *colon = strchr(uri, ':'); - int len; + const gchar *colon = strchr(uri, ':'); + gint len; if (colon) { len = colon-uri; @@ -1515,7 +1515,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) static void emae_authtype_changed(GtkComboBox *dropdown, EMAccountEditorService *service) { - int id = gtk_combo_box_get_active(dropdown); + gint id = gtk_combo_box_get_active(dropdown); GtkTreeModel *model; GtkTreeIter iter; CamelServiceAuthType *authtype; @@ -1545,7 +1545,7 @@ emae_authtype_changed(GtkComboBox *dropdown, EMAccountEditorService *service) static void emae_needs_auth(GtkToggleButton *toggle, EMAccountEditorService *service) { - int need = gtk_toggle_button_get_active(toggle); + gint need = gtk_toggle_button_get_active(toggle); gtk_widget_set_sensitive(service->auth_frame, need); @@ -1569,10 +1569,10 @@ emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service) GtkListStore *store; GtkTreeIter iter; GtkComboBox *dropdown; - int active = 0; - int i; + gint active = 0; + gint i; struct _service_info *info = &emae_service_info[service->type]; - const char *uri = e_account_get_string(account, info->account_uri_key); + const gchar *uri = e_account_get_string(account, info->account_uri_key); GList *l, *ll; CamelURL *url = NULL; @@ -1587,7 +1587,7 @@ emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service) if (service->provider) { for (i=0, l=service->provider->authtypes; l; l=l->next, i++) { CamelServiceAuthType *authtype = l->data; - int avail; + gint avail; /* if we have some already shown */ if (service->authtypes) { @@ -1626,7 +1626,7 @@ emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service) camel_url_free(url); } -static void emae_check_authtype_done(const char *uri, CamelProviderType type, GList *types, void *data) +static void emae_check_authtype_done(const gchar *uri, CamelProviderType type, GList *types, gpointer data) { EMAccountEditorService *service = data; @@ -1646,7 +1646,7 @@ static void emae_check_authtype_done(const char *uri, CamelProviderType type, GL g_object_unref(service->emae); } -static void emae_check_authtype_response(GtkWidget *d, int button, EMAccountEditorService *service) +static void emae_check_authtype_response(GtkWidget *d, gint button, EMAccountEditorService *service) { mail_msg_cancel(service->check_id); gtk_widget_destroy(service->check_dialog); @@ -1659,7 +1659,7 @@ static void emae_check_authtype_response(GtkWidget *d, int button, EMAccountEdit static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service) { EMAccountEditor *emae = service->emae; - const char *uri; + const gchar *uri; /* TODO: do we need to remove the auth mechanism from the uri? */ uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key); @@ -1679,9 +1679,9 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade { struct _service_info *info = &emae_service_info[service->type]; CamelURL *url = emae_account_url(emae, info->account_uri_key); - const char *uri = e_account_get_string(emae->account, info->account_uri_key); - const char *tmp; - int i; + const gchar *uri = e_account_get_string(emae->account, info->account_uri_key); + const gchar *tmp; + gint i; service->provider = uri?camel_provider_get(uri, NULL):NULL; service->frame = glade_xml_get_widget(xml, info->frame); @@ -1705,7 +1705,7 @@ emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, Glade /* configure ui for current settings */ if (url->host) { if (url->port) { - char *host = g_strdup_printf("%s:%d", url->host, url->port); + gchar *host = g_strdup_printf("%s:%d", url->host, url->port); gtk_entry_set_text(service->hostname, host); g_free(host); @@ -1789,16 +1789,16 @@ static struct { /* its a bit obtuse, but its simple */ static void -emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const char *first, ...) +emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const gchar *first, ...) { - int i = 0; + gint i = 0; va_list ap; va_start(ap, first); while (first) { emae->priv->widgets_name[i] = first; emae->priv->widgets[i++] = glade_xml_get_widget(xml, first); - first = va_arg(ap, const char *); + first = va_arg(ap, const gchar *); } va_end(ap); @@ -1809,15 +1809,15 @@ emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const char *first, ...) } static GtkWidget * -emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; EAccount *account = emae->account; - int i; + gint i; GtkWidget *w; GladeXML *xml; - char *gladefile; + gchar *gladefile; /*if (old) return old;*/ @@ -1882,13 +1882,13 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; GtkWidget *w; GladeXML *xml; - char *gladefile; + gchar *gladefile; /*if (old) return old;*/ @@ -1935,9 +1935,9 @@ emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, str static void emae_option_toggle_changed(GtkToggleButton *toggle, EMAccountEditorService *service) { - const char *name = g_object_get_data((GObject *)toggle, "option-name"); + const gchar *name = g_object_get_data((GObject *)toggle, "option-name"); GSList *depl = g_object_get_data((GObject *)toggle, "dependent-list"); - int active = gtk_toggle_button_get_active(toggle); + gint active = gtk_toggle_button_get_active(toggle); CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); for (;depl;depl = g_slist_next(depl)) @@ -1949,13 +1949,13 @@ emae_option_toggle_changed(GtkToggleButton *toggle, EMAccountEditorService *serv } static GtkWidget * -emae_option_toggle(EMAccountEditorService *service, CamelURL *url, const char *text, const char *name, int def) +emae_option_toggle(EMAccountEditorService *service, CamelURL *url, const gchar *text, const gchar *name, gint def) { GtkWidget *w; /* FIXME: how do we get the default value ever? */ w = gtk_check_button_new_with_mnemonic(text); - g_object_set_data((GObject *)w, "option-name", (void *)name); + g_object_set_data((GObject *)w, "option-name", (gpointer)name); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), camel_url_get_param (url, name) != NULL); g_signal_connect(w, "toggled", G_CALLBACK(emae_option_toggle_changed), service); gtk_widget_show(w); @@ -1966,8 +1966,8 @@ emae_option_toggle(EMAccountEditorService *service, CamelURL *url, const char *t static void emae_option_entry_changed(GtkEntry *entry, EMAccountEditorService *service) { - const char *name = g_object_get_data((GObject *)entry, "option-name"); - const char *text = gtk_entry_get_text(entry); + const gchar *name = g_object_get_data((GObject *)entry, "option-name"); + const gchar *text = gtk_entry_get_text(entry); CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); camel_url_set_param(url, name, text && text[0]?text:NULL); @@ -1976,10 +1976,10 @@ emae_option_entry_changed(GtkEntry *entry, EMAccountEditorService *service) } static GtkWidget * -emae_option_entry(EMAccountEditorService *service, CamelURL *url, const char *name, const char *def, GtkWidget *l) +emae_option_entry(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *def, GtkWidget *l) { GtkWidget *w; - const char *val = camel_url_get_param(url, name); + const gchar *val = camel_url_get_param(url, name); if (val == NULL) { if (def) { @@ -1994,7 +1994,7 @@ emae_option_entry(EMAccountEditorService *service, CamelURL *url, const char *na "text", val, NULL); gtk_label_set_mnemonic_widget ((GtkLabel*)l, w); - g_object_set_data((GObject *)w, "option-name", (void *)name); + g_object_set_data((GObject *)w, "option-name", (gpointer)name); g_signal_connect(w, "changed", G_CALLBACK(emae_option_entry_changed), service); gtk_widget_show(w); @@ -2004,8 +2004,8 @@ emae_option_entry(EMAccountEditorService *service, CamelURL *url, const char *na static void emae_option_checkspin_changed(GtkSpinButton *spin, EMAccountEditorService *service) { - const char *name = g_object_get_data((GObject *)spin, "option-name"); - char value[16]; + const gchar *name = g_object_get_data((GObject *)spin, "option-name"); + gchar value[16]; CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); sprintf(value, "%d", gtk_spin_button_get_value_as_int(spin)); @@ -2017,7 +2017,7 @@ emae_option_checkspin_changed(GtkSpinButton *spin, EMAccountEditorService *servi static void emae_option_checkspin_check_changed(GtkToggleButton *toggle, EMAccountEditorService *service) { - const char *name = g_object_get_data((GObject *)toggle, "option-name"); + const gchar *name = g_object_get_data((GObject *)toggle, "option-name"); GtkSpinButton *spin = g_object_get_data((GObject *)toggle, "option-target"); if (gtk_toggle_button_get_active(toggle)) { @@ -2035,14 +2035,14 @@ emae_option_checkspin_check_changed(GtkToggleButton *toggle, EMAccountEditorServ /* this is a fugly api */ static GtkWidget * -emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const char *name, const char *fmt, const char *info) +emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *fmt, const gchar *info) { GtkWidget *hbox, *check, *spin, *label = NULL; double min, def, max; - char *pre, *post; - const char *val; - char on; - int enable; + gchar *pre, *post; + const gchar *val; + gchar on; + gint enable; pre = g_alloca(strlen(fmt)+1); strcpy(pre, fmt); @@ -2074,9 +2074,9 @@ emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const char if (label) gtk_box_pack_start((GtkBox *)hbox, label, FALSE, TRUE, 4); - g_object_set_data((GObject *)spin, "option-name", (void *)name); - g_object_set_data((GObject *)check, "option-name", (void *)name); - g_object_set_data((GObject *)check, "option-target", (void *)spin); + g_object_set_data((GObject *)spin, "option-name", (gpointer)name); + g_object_set_data((GObject *)check, "option-name", (gpointer)name); + g_object_set_data((GObject *)check, "option-target", (gpointer)spin); g_signal_connect(spin, "value_changed", G_CALLBACK(emae_option_checkspin_changed), service); g_signal_connect(check, "toggled", G_CALLBACK(emae_option_checkspin_check_changed), service); @@ -2089,10 +2089,10 @@ emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const char static void emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *service) { - const char *name = g_object_get_data (G_OBJECT (options), "option-name"); - char *value = NULL; + const gchar *name = g_object_get_data (G_OBJECT (options), "option-name"); + gchar *value = NULL; CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); - int id = gtk_combo_box_get_active (options); + gint id = gtk_combo_box_get_active (options); if (id != -1) { GtkTreeModel *model; @@ -2112,16 +2112,16 @@ emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *servi /* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */ static GtkWidget * -emae_option_options (EMAccountEditorService *service, CamelURL *url, const char *name, const char *values, GtkWidget *l) +emae_option_options (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *values, GtkWidget *l) { GtkComboBox *w; GtkListStore *store; GtkTreeIter iter; - const char *p, *value, *caption; + const gchar *p, *value, *caption; GtkCellRenderer *cell; - int active = 0; /* the first item entered is always a default item */ - int i; - const char *val = camel_url_get_param (url, name); + gint active = 0; /* the first item entered is always a default item */ + gint i; + const gchar *val = camel_url_get_param (url, name); w = GTK_COMBO_BOX (gtk_combo_box_new ()); @@ -2130,7 +2130,7 @@ emae_option_options (EMAccountEditorService *service, CamelURL *url, const char p = values; for (p = values, i = 0; p; i++) { - char *vl, *cp; + gchar *vl, *cp; value = p; caption = strchr (p, ':'); @@ -2170,18 +2170,18 @@ emae_option_options (EMAccountEditorService *service, CamelURL *url, const char gtk_label_set_mnemonic_widget (GTK_LABEL (l), GTK_WIDGET (w)); - g_object_set_data (G_OBJECT (w), "option-name", (void *)name); + g_object_set_data (G_OBJECT (w), "option-name", (gpointer)name); g_signal_connect (w, "changed", G_CALLBACK (emae_option_options_changed), service); return GTK_WIDGET (w); } static GtkWidget * -emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; GtkWidget *w, *box, *spin; - int row; + gint row; if (emae->priv->source.provider == NULL || emae->priv->source.provider->extra_conf == NULL) @@ -2214,7 +2214,7 @@ emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *par } static GtkWidget * -emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; struct _receive_options_item *item = (struct _receive_options_item *)eitem; @@ -2223,7 +2223,7 @@ emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, struct _GtkWidg GtkWidget *depw; GSList *depl = NULL, *n; EMAccountEditorService *service = &emae->priv->source; - int row, i; + gint row, i; GHashTable *extra; CamelURL *url; @@ -2326,7 +2326,7 @@ section: } if (depw && depl) { - int act = gtk_toggle_button_get_active((GtkToggleButton *)depw); + gint act = gtk_toggle_button_get_active((GtkToggleButton *)depw); g_object_set_data_full((GObject *)depw, "dependent-list", depl, (GDestroyNotify)g_slist_free); for (n=depl;n;n=g_slist_next(n)) @@ -2348,17 +2348,17 @@ section: } static GtkWidget * -emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; GtkWidget *w; GladeXML *xml; - char *gladefile; + gchar *gladefile; /* no transport options page at all for these types of providers */ if (gui->source.provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(gui->source.provider)) { - memset(&gui->transport.frame, 0, ((char *)&gui->transport.check_dialog)-((char *)&gui->transport.frame)); + memset(&gui->transport.frame, 0, ((gchar *)&gui->transport.check_dialog)-((gchar *)&gui->transport.frame)); return NULL; } @@ -2403,13 +2403,13 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct } static GtkWidget * -emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; GtkWidget *w; GladeXML *xml; - char *gladefile; + gchar *gladefile; /*if (old) return old;*/ @@ -2461,7 +2461,7 @@ emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; #if defined (HAVE_NSS) @@ -2469,7 +2469,7 @@ emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st #endif GtkWidget *w; GladeXML *xml; - char *gladefile; + gchar *gladefile; /*if (old) return old;*/ @@ -2525,10 +2525,10 @@ emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_widget_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_widget_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; - int i; + gint i; for (i=0;emae->priv->widgets[i];i++) if (!strcmp(emae->priv->widgets_name[i], item->label)) @@ -2576,7 +2576,7 @@ static EMConfigItem emae_editor_items[] = { static gboolean emae_editor_items_translated = FALSE; static GtkWidget * -emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -2586,7 +2586,7 @@ emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { GladeXML *druidxml; GtkWidget *page; - char *gladefile; + gchar *gladefile; gladefile = g_build_filename (EVOLUTION_GLADEDIR, "mail-config.glade", @@ -2606,11 +2606,11 @@ emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, } static GtkWidget * -emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data) +emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) { GladeXML *druidxml; GtkWidget *w; - char *gladefile; + gchar *gladefile; EMAccountEditor *emae = (EMAccountEditor *)data; if (emae->type == EMAE_PAGES) @@ -2667,13 +2667,13 @@ static EMConfigItem emae_druid_items[] = { static gboolean emae_druid_items_translated = FALSE; static void -emae_free(EConfig *ec, GSList *items, void *data) +emae_free(EConfig *ec, GSList *items, gpointer data) { g_slist_free(items); } static void -emae_free_auto(EConfig *ec, GSList *items, void *data) +emae_free_auto(EConfig *ec, GSList *items, gpointer data) { GSList *l, *n; @@ -2694,8 +2694,8 @@ static gboolean emae_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) { CamelURL *url; - int ok = TRUE; - const char *uri; + gint ok = TRUE; + const gchar *uri; if (service->provider == NULL) return TRUE; @@ -2748,9 +2748,9 @@ struct _server_prefill { }; static int -check_servers (char *server) +check_servers (gchar *server) { - int len = G_N_ELEMENTS(mail_servers), i; + gint len = G_N_ELEMENTS(mail_servers), i; for (i=0; ipriv->config)->type == E_CONFIG_DRUID) { if (!strcmp(pageid, "00.identity")) { if (!emae->priv->identity_set) { - char *uname; + gchar *uname; emae->priv->identity_set = 1; #ifndef G_OS_WIN32 @@ -2790,13 +2790,13 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } } else if (!strcmp(pageid, "10.receive")) { if (!emae->priv->receive_set) { - char *user, *at; - int index; - char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL); + gchar *user, *at; + gint index; + gchar *uri = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL); CamelURL *url; emae->priv->receive_set = 1; - tmp = (char *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); + tmp = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); at = strchr(tmp, '@'); user = g_alloca(at-tmp+1); memcpy(user, tmp, at-tmp); @@ -2826,9 +2826,9 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } } else if (!strcmp(pageid, "30.send")) { CamelURL *url; - char *at, *user; - int index; - char *uri = (char *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); + gchar *at, *user; + gint index; + gchar *uri = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); at = strchr(tmp, '@'); @@ -2860,8 +2860,8 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } } else if (!strcmp(pageid, "40.management")) { if (!emae->priv->management_set) { - char *template; - unsigned int i = 0, len; + gchar *template; + guint i = 0, len; emae->priv->management_set = 1; tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); @@ -2932,14 +2932,14 @@ emae_check_complete(EConfig *ec, const char *pageid, void *data) } void -em_account_editor_check (EMAccountEditor *emae, const char *page) +em_account_editor_check (EMAccountEditor *emae, const gchar *page) { emae_check_complete((EConfig *)emae->config, page, emae); } /* HACK: FIXME: the component should listen to the account object directly */ static void -add_new_store (char *uri, CamelStore *store, void *user_data) +add_new_store (gchar *uri, CamelStore *store, gpointer user_data) { #if 0 /* KILL-BONOBO: Try to actually fix this? */ MailComponent *component = mail_component_peek (); @@ -2953,7 +2953,7 @@ add_new_store (char *uri, CamelStore *store, void *user_data) } static void -emae_commit(EConfig *ec, GSList *items, void *data) +emae_commit(EConfig *ec, GSList *items, gpointer data) { EMAccountEditor *emae = data; EAccountList *accounts = e_get_account_list (); @@ -3002,7 +3002,7 @@ static void em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id) { EMAccountEditorPrivate *gui = emae->priv; - int i, index; + gint i, index; GSList *l; GList *prov; EMConfig *ec; @@ -3013,7 +3013,7 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account emae->type = type; emae->original = account; if (emae->original) { - char *xml; + gchar *xml; g_object_ref(emae->original); xml = e_account_to_xml(emae->original); @@ -3079,8 +3079,8 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++) { struct _receive_options_item *item; - char *name = entries[i].name; - int myindex = index; + gchar *name = entries[i].name; + gint myindex = index; if (entries[i].type != CAMEL_PROVIDER_CONF_SECTION_START || name == NULL -- cgit v1.2.3 From 433eac7844481b8ceda0bae8bf08f6bb623185b0 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 1 Jun 2009 19:09:19 -0400 Subject: More code cleanup. --- mail/em-account-editor.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 27c04c83fb..99938fadce 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -618,7 +618,7 @@ emae_signature_added(ESignatureList *signatures, ESignature *sig, EMAccountEdito gtk_combo_box_set_active(emae->priv->signatures_dropdown, gtk_tree_model_iter_n_children(model, NULL)-1); } -static int +static gint emae_signature_get_iter(EMAccountEditor *emae, ESignature *sig, GtkTreeModel **modelp, GtkTreeIter *iter) { GtkTreeModel *model; @@ -1245,7 +1245,7 @@ emae_path_changed(GtkWidget *widget, EMAccountEditorService *service) emae_service_url_path_changed(service, camel_url_set_path, widget); } -static int +static gint emae_ssl_update(EMAccountEditorService *service, CamelURL *url) { gint id = gtk_combo_box_get_active(service->use_ssl); @@ -2747,7 +2747,7 @@ struct _server_prefill { {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"} }; -static int +static gint check_servers (gchar *server) { gint len = G_N_ELEMENTS(mail_servers), i; -- cgit v1.2.3 From b0e26e9c5f13c710c7677959cc457158206befe1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Fri, 5 Jun 2009 14:48:29 +0200 Subject: Fix even more compiler warnings and disable one for format strings --- mail/em-account-editor.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 99938fadce..81c3bc634a 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -1440,7 +1440,7 @@ emae_refresh_providers(EMAccountEditor *emae, EMAccountEditorService *service) current[len] = 0; } } else { - current = g_strdup("imap"); + current = (gchar *) "imap"; } store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); @@ -2277,7 +2277,7 @@ section: case CAMEL_PROVIDER_CONF_CHECKBOX: w = emae_option_toggle(service, url, entries[i].text, entries[i].name, atoi(entries[i].value)); gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); - g_hash_table_insert(extra, entries[i].name, w); + g_hash_table_insert(extra, (gpointer)entries[i].name, w); if (depw) depl = g_slist_prepend(depl, w); row++; @@ -2298,7 +2298,7 @@ section: } row++; /* FIXME: this is another hack for exchange/groupwise connector */ - g_hash_table_insert(item->extra_table, entries[i].name, w); + g_hash_table_insert(item->extra_table, (gpointer)entries[i].name, w); break; case CAMEL_PROVIDER_CONF_CHECKSPIN: w = emae_option_checkspin(service, url, entries[i].name, entries[i].text, entries[i].value); @@ -3079,7 +3079,7 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++) { struct _receive_options_item *item; - gchar *name = entries[i].name; + const gchar *name = entries[i].name; gint myindex = index; if (entries[i].type != CAMEL_PROVIDER_CONF_SECTION_START @@ -3094,7 +3094,7 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account 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 = entries[i].text; + item->item.label = g_strdup (entries[i].text); l = g_slist_prepend(l, item); @@ -3102,12 +3102,12 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account 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 = entries[i].name; + item->item.user_data = g_strdup (entries[i].name); l = g_slist_prepend(l, item); index += 10; - g_hash_table_insert(have, entries[i].name, have); + g_hash_table_insert(have, (gpointer)entries[i].name, have); } } g_hash_table_destroy(have); -- cgit v1.2.3 From c0d998229d5a3d2b65445b9025de7b23112f4063 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 18 Jun 2009 15:26:21 -0400 Subject: Stop abusing forward declarations. --- mail/em-account-editor.c | 124 +++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 62 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 81c3bc634a..01f8b9c733 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -91,34 +91,34 @@ typedef struct _EMAccountEditorService { EMAccountEditor *emae; /* parent pointer, for callbacks */ /* NOTE: keep all widgets together, first frame last check_dialog */ - struct _GtkWidget *frame; - struct _GtkWidget *container; - - struct _GtkComboBox *providers; - - struct _GtkLabel *description; - struct _GtkLabel *hostlabel; - struct _GtkEntry *hostname; - struct _GtkLabel *userlabel; - struct _GtkEntry *username; - struct _GtkEntry *path; - struct _GtkLabel *pathlabel; - struct _GtkWidget *pathentry; - - struct _GtkWidget *ssl_frame; - struct _GtkComboBox *use_ssl; - struct _GtkWidget *ssl_hbox; - struct _GtkWidget *no_ssl; - - struct _GtkWidget *auth_frame; - struct _GtkComboBox *authtype; - - struct _GtkWidget *authitem; - struct _GtkToggleButton *remember; - struct _GtkButton *check_supported; - struct _GtkToggleButton *needs_auth; - - struct _GtkWidget *check_dialog; + GtkWidget *frame; + GtkWidget *container; + + GtkComboBox *providers; + + GtkLabel *description; + GtkLabel *hostlabel; + GtkEntry *hostname; + GtkLabel *userlabel; + GtkEntry *username; + GtkEntry *path; + 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; + + GtkWidget *check_dialog; gint check_id; GList *authtypes; /* if "Check supported" */ @@ -128,12 +128,12 @@ typedef struct _EMAccountEditorService { gint auth_changed_id; } EMAccountEditorService; -typedef struct _EMAccountEditorPrivate { +struct _EMAccountEditorPrivate { struct _EMConfig *config; GList *providers; /* signatures */ - struct _GtkComboBox *signatures_dropdown; + GtkComboBox *signatures_dropdown; guint sig_added_id; guint sig_removed_id; guint sig_changed_id; @@ -151,31 +151,31 @@ typedef struct _EMAccountEditorPrivate { /* account management */ GtkEntry *identity_entries[5]; - struct _GtkToggleButton *default_account; - struct _GtkWidget *management_frame; + GtkToggleButton *default_account; + GtkWidget *management_frame; /* special folders */ - struct _GtkButton *drafts_folder_button; - struct _GtkButton *sent_folder_button; - struct _GtkButton *restore_folders_button; + GtkButton *drafts_folder_button; + GtkButton *sent_folder_button; + GtkButton *restore_folders_button; /* Security */ - struct _GtkEntry *pgp_key; - struct _GtkToggleButton *pgp_encrypt_to_self; - struct _GtkToggleButton *pgp_always_sign; - struct _GtkToggleButton *pgp_no_imip_sign; - struct _GtkToggleButton *pgp_always_trust; - - struct _GtkToggleButton *smime_sign_default; - struct _GtkEntry *smime_sign_key; - struct _GtkButton *smime_sign_key_select; - struct _GtkButton *smime_sign_key_clear; - struct _GtkButton *smime_sign_select; - struct _GtkToggleButton *smime_encrypt_default; - struct _GtkToggleButton *smime_encrypt_to_self; - struct _GtkEntry *smime_encrypt_key; - struct _GtkButton *smime_encrypt_key_select; - struct _GtkButton *smime_encrypt_key_clear; + 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; /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/ GtkWidget *widgets[5]; @@ -186,7 +186,7 @@ typedef struct _EMAccountEditorPrivate { guint identity_set:1; guint receive_set:1; guint management_set:1; -} EMAccountEditorPrivate; +}; static void emae_refresh_authtype(EMAccountEditor *emae, EMAccountEditorService *service); static void em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id); @@ -1809,7 +1809,7 @@ emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const gchar *first, ... } static GtkWidget * -emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_identity_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -1882,7 +1882,7 @@ emae_identity_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_receive_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_receive_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -2177,7 +2177,7 @@ emae_option_options (EMAccountEditorService *service, CamelURL *url, const gchar } static GtkWidget * -emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_receive_options_item(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; GtkWidget *w, *box, *spin; @@ -2214,7 +2214,7 @@ emae_receive_options_item(EConfig *ec, EConfigItem *item, struct _GtkWidget *par } static GtkWidget * -emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_receive_options_extra_item(EConfig *ec, EConfigItem *eitem, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; struct _receive_options_item *item = (struct _receive_options_item *)eitem; @@ -2348,7 +2348,7 @@ section: } static GtkWidget * -emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_send_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -2403,7 +2403,7 @@ emae_send_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct } static GtkWidget * -emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_defaults_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -2461,7 +2461,7 @@ emae_defaults_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_security_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; #if defined (HAVE_NSS) @@ -2525,7 +2525,7 @@ emae_security_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, st } static GtkWidget * -emae_widget_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_widget_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; gint i; @@ -2576,7 +2576,7 @@ static EMConfigItem emae_editor_items[] = { static gboolean emae_editor_items_translated = FALSE; static GtkWidget * -emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_management_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { EMAccountEditor *emae = data; EMAccountEditorPrivate *gui = emae->priv; @@ -2606,7 +2606,7 @@ emae_management_page(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, } static GtkWidget * -emae_widget_druid_glade(EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, gpointer data) +emae_widget_druid_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { GladeXML *druidxml; GtkWidget *w; -- cgit v1.2.3 From 174c942e0945a2017f0c479883dce2950e42e786 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 24 Jun 2009 00:40:49 -0400 Subject: Split store and local folder management out from shell backend. --- mail/em-account-editor.c | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 5179815609..4ae929513e 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -58,6 +58,7 @@ #include "e-util/e-signature-utils.h" #include "e-util/e-util-private.h" +#include "e-mail-local.h" #include "em-config.h" #include "em-folder-selection-button.h" #include "em-account-editor.h" @@ -70,8 +71,6 @@ #include "mail-ops.h" #include "mail-mt.h" -#include "e-mail-shell-backend.h" - #if defined (HAVE_NSS) #include "smime/gui/e-cert-selector.h" #endif @@ -469,13 +468,11 @@ default_folders_clicked (GtkButton *button, gpointer user_data) EMAccountEditor *emae = user_data; const gchar *uri; - uri = e_mail_shell_backend_get_folder_uri ( - global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); + uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae); - uri = e_mail_shell_backend_get_folder_uri ( - global_mail_shell_backend, E_MAIL_FOLDER_SENT); + uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT); em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri); emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae); } @@ -486,10 +483,8 @@ GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gch GtkWidget * em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { - EMFolderTreeModel *model; - - model = e_mail_shell_backend_get_folder_tree_model (global_mail_shell_backend); - return (GtkWidget *)em_folder_selection_button_new(model, string1 ? string1 : _("Select Folder"), NULL); + return (GtkWidget *)em_folder_selection_button_new ( + string1 ? string1 : _("Select Folder"), NULL); } GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); @@ -497,7 +492,7 @@ GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gc GtkWidget * em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { - return (GtkWidget *)gtk_combo_box_new(); + return gtk_combo_box_new (); } GtkWidget *em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); @@ -927,8 +922,7 @@ emae_account_folder(EMAccountEditor *emae, const gchar *name, gint item, gint de } else { const gchar *uri; - uri = e_mail_shell_backend_get_folder_uri ( - global_mail_shell_backend, deffolder); + uri = e_mail_local_get_folder_uri (deffolder); em_folder_selection_button_set_selection(folder, uri); } @@ -3018,21 +3012,17 @@ em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account emae->do_signature = TRUE; } else { - const gchar *uri; - /* TODO: have a get_default_account thing?? */ emae->account = e_account_new(); emae->account->enabled = TRUE; - uri = e_mail_shell_backend_get_folder_uri ( - global_mail_shell_backend, E_MAIL_FOLDER_DRAFTS); e_account_set_string ( - emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, uri); + emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, + e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS)); - uri = e_mail_shell_backend_get_folder_uri ( - global_mail_shell_backend, E_MAIL_FOLDER_SENT); e_account_set_string ( - emae->account, E_ACCOUNT_SENT_FOLDER_URI, uri); + emae->account, E_ACCOUNT_SENT_FOLDER_URI, + e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT)); } /* sort the providers, remote first */ -- cgit v1.2.3 From f0d3f3afdfa314e1e8cd7d8da790878008a46aad Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 24 Jun 2009 12:59:33 -0400 Subject: Radically reorganize source code. - Collect all shell modules into a new top-level 'modules' directory: $(top_srcdir)/modules/addressbook $(top_srcdir)/modules/calendar $(top_srcdir)/modules/mail Nothing is allowed to link to these, not plugins nor other modules. THIS SOLVES BUG #571275 AND OPENS THE DOOR TO PORTING TO MAC OS X. - Mimic the libevolution-mail-shared library from master (except drop the "shared" suffix) and have libevolution-mail-importers and all mail-related plugins link to it. - Discard the a11y subdirectories and have the files live alongside their counterpart widgets. --- mail/em-account-editor.c | 3114 ---------------------------------------------- 1 file changed, 3114 deletions(-) delete mode 100644 mail/em-account-editor.c (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c deleted file mode 100644 index 4ae929513e..0000000000 --- a/mail/em-account-editor.c +++ /dev/null @@ -1,3114 +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 - * - * - * Authors: - * Dan Winship - * Jeffrey Stedfast - * Michael Zucchi - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -/* - work before merge can occur: - - verify behaviour. - work out what to do with the startup druid. - - 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 -#endif - -#include -#include - -#include -#include - -#include - -#include - -#include -#include - -#include - -#include "e-util/e-error.h" -#include "e-util/e-account-utils.h" -#include "e-util/e-signature-utils.h" -#include "e-util/e-util-private.h" - -#include "e-mail-local.h" -#include "em-config.h" -#include "em-folder-selection-button.h" -#include "em-account-editor.h" -#include "mail-session.h" -#include "mail-send-recv.h" -#include "e-signature-editor.h" -#include "em-utils.h" -#include "em-composer-prefs.h" -#include "mail-config.h" -#include "mail-ops.h" -#include "mail-mt.h" - -#if defined (HAVE_NSS) -#include "smime/gui/e-cert-selector.h" -#endif - -#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 *userlabel; - GtkEntry *username; - GtkEntry *path; - 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; - - GtkWidget *check_dialog; - gint check_id; - - GList *authtypes; /* if "Check supported" */ - CamelProvider *provider; - CamelProviderType type; - - gint auth_changed_id; -} EMAccountEditorService; - -struct _EMAccountEditorPrivate { - 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; - 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; - - /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/ - GtkWidget *widgets[5]; - const gchar *widgets_name[5]; - gint widgets_index; - - /* for druid page preparation */ - guint identity_set:1; - guint receive_set:1; - guint management_set:1; -}; - -static void emae_refresh_authtype(EMAccountEditor *emae, EMAccountEditorService *service); -static void em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id); -static void emae_account_folder_changed(EMFolderSelectionButton *folder, EMAccountEditor *emae); -static GtkVBoxClass *emae_parent; - -static void -emae_init(GObject *o) -{ - EMAccountEditor *emae = (EMAccountEditor *)o; - - emae->priv = g_malloc0(sizeof(*emae->priv)); - - emae->priv->source.emae = emae; - emae->priv->transport.emae = emae; -} - -static void -emae_finalise(GObject *o) -{ - EMAccountEditor *emae = (EMAccountEditor *)o; - EMAccountEditorPrivate *p = emae->priv; - - if (p->sig_added_id) { - ESignatureList *signatures = e_get_signature_list (); - - g_signal_handler_disconnect(signatures, p->sig_added_id); - g_signal_handler_disconnect(signatures, p->sig_removed_id); - g_signal_handler_disconnect(signatures, p->sig_changed_id); - } - - g_list_free(p->source.authtypes); - g_list_free(p->transport.authtypes); - - g_list_free(p->providers); - g_free(p); - - g_object_unref(emae->account); - if (emae->original) - g_object_unref(emae->original); - - ((GObjectClass *)emae_parent)->finalize(o); -} - -static void -emae_class_init(GObjectClass *klass) -{ - klass->finalize = emae_finalise; -} - -GType -em_account_editor_get_type(void) -{ - static GType type = 0; - - if (type == 0) { - static const GTypeInfo info = { - sizeof(EMAccountEditorClass), - NULL, NULL, - (GClassInitFunc)emae_class_init, - NULL, NULL, - sizeof(EMAccountEditor), 0, - (GInstanceInitFunc)emae_init - }; - emae_parent = g_type_class_ref(G_TYPE_OBJECT); - type = g_type_register_static(G_TYPE_OBJECT, "EMAccountEditor", &info, 0); - } - - return type; -} - -/** - * 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, em_account_editor_t type, const gchar *id) -{ - EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL); - - em_account_editor_construct(emae, account, 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, em_account_editor_t type, gchar *id, GtkWidget **pages) -{ - EMAccountEditor *emae = g_object_new(em_account_editor_get_type(), NULL); - emae->pages = pages; - em_account_editor_construct(emae, account, type, id); - - return emae; -} - -/* ********************************************************************** */ - -static struct { - const gchar *label; - const gchar *value; -} ssl_options[] = { - /* Translators: This string is a "Use secure connection" option for - the Mailer. It will not use an encrypted connection. */ - { N_("No encryption"), "never" }, - /* Translators: This string is a "Use secure connection" option for - the Mailer. TLS (Transport Layer Security) is commonly known by - this abbreviation. */ - { N_("TLS encryption"), "when-possible" }, - /* Translators: This string is a "Use secure connection" option for - the Mailer. SSL (Secure Sockets Layer) is commonly known by this - abbreviation. */ - { N_("SSL encryption"), "always" } -}; - -#define num_ssl_options (sizeof (ssl_options) / sizeof (ssl_options[0])) - -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) -{ - CamelURL *url = NULL; - const gchar *uri; - - uri = e_account_get_string(emae->account, urlid); - - if (uri && 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 -emae_license_state(GtkToggleButton *button, GtkDialog *dialog) -{ - gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_ACCEPT, - gtk_toggle_button_get_active(button)); -} - -static gboolean -emae_load_text(GtkTextView *view, const gchar *filename) -{ - FILE *fd; - gchar filebuf[1024]; - GtkTextIter iter; - GtkTextBuffer *buffer; - gint count; - - g_return_val_if_fail (filename != NULL , FALSE); - - fd = g_fopen (filename, "r"); - if (fd) { - buffer = gtk_text_buffer_new (NULL); - gtk_text_buffer_get_start_iter (buffer, &iter); - while (!feof (fd) && !ferror (fd)) { - count = fread (filebuf, 1, sizeof (filebuf), fd); - gtk_text_buffer_insert (buffer, &iter, filebuf, count); - } - - gtk_text_view_set_buffer(GTK_TEXT_VIEW (view), GTK_TEXT_BUFFER(buffer)); - fclose (fd); - } - - return fd != NULL; -} - -static gboolean -emae_display_license(EMAccountEditor *emae, CamelProvider *prov) -{ - GladeXML *xml; - GtkWidget *w, *dialog; - gchar *tmp; - GtkResponseType response = GTK_RESPONSE_NONE; - gchar *gladefile; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-dialogs.glade", - NULL); - xml = glade_xml_new (gladefile, "license_dialog", NULL); - g_free (gladefile); - - dialog = glade_xml_get_widget(xml, "license_dialog"); - gtk_dialog_set_response_sensitive((GtkDialog *)dialog, GTK_RESPONSE_ACCEPT, FALSE); - tmp = g_strdup_printf(_("%s License Agreement"), prov->license); - gtk_window_set_title((GtkWindow *)dialog, tmp); - g_free(tmp); - - g_signal_connect(glade_xml_get_widget(xml, "license_checkbutton"), - "toggled", G_CALLBACK(emae_license_state), dialog); - - tmp = g_strdup_printf(_("\nPlease read carefully the license agreement\n" - "for %s displayed below\n" - "and tick the check box for accepting it\n"), prov->license); - gtk_label_set_text((GtkLabel *)glade_xml_get_widget(xml, "license_top_label"), tmp); - g_free(tmp); - - w = glade_xml_get_widget(xml, "license_textview"); - if (emae_load_text((GtkTextView *)w, prov->license_file)) { - gtk_text_view_set_editable((GtkTextView *)w, FALSE); - response = gtk_dialog_run((GtkDialog *)dialog); - } else { - e_error_run(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, - "mail:no-load-license", prov->license_file, NULL); - } - - gtk_widget_destroy(dialog); - g_object_unref(xml); - - return (response == GTK_RESPONSE_ACCEPT); -} - -static gboolean -emae_check_license(EMAccountEditor *emae, CamelProvider *prov) -{ - gboolean accepted = TRUE; - - if (prov->flags & CAMEL_PROVIDER_HAS_LICENSE) { - GConfClient *gconf = mail_config_get_gconf_client(); - GSList *providers_list, *l; - - providers_list = gconf_client_get_list (gconf, "/apps/evolution/mail/licenses", GCONF_VALUE_STRING, NULL); - - for (l = providers_list, accepted = FALSE; l && !accepted; l = g_slist_next(l)) - accepted = (strcmp((gchar *)l->data, prov->protocol) == 0); - - if (!accepted - && (accepted = emae_display_license(emae, prov)) == TRUE) { - providers_list = g_slist_append(providers_list, g_strdup(prov->protocol)); - gconf_client_set_list(gconf, - "/apps/evolution/mail/licenses", - GCONF_VALUE_STRING, - providers_list, NULL); - } - - g_slist_foreach(providers_list, (GFunc)g_free, NULL); - g_slist_free(providers_list); - } - - return accepted; -} - -static void -default_folders_clicked (GtkButton *button, gpointer user_data) -{ - EMAccountEditor *emae = user_data; - const gchar *uri; - - uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS); - em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri); - emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae); - - uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT); - em_folder_selection_button_set_selection((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri); - emae_account_folder_changed((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae); -} - -/* custom widget factories */ -GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); - -GtkWidget * -em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) -{ - return (GtkWidget *)em_folder_selection_button_new ( - string1 ? string1 : _("Select Folder"), NULL); -} - -GtkWidget *em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); - -GtkWidget * -em_account_editor_dropdown_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) -{ - return gtk_combo_box_new (); -} - -GtkWidget *em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); - -GtkWidget * -em_account_editor_ssl_selector_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) -{ - GtkComboBox *dropdown = (GtkComboBox *)gtk_combo_box_new(); - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - GtkListStore *store; - gint i; - GtkTreeIter iter; - - gtk_widget_show((GtkWidget *)dropdown); - - store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); - - for (i=0;ipriv; - EMAccountEditorService *service = &gui->source; - GHashTable *auto_detected; - GSList *l; - CamelProviderConfEntry *entries; - gchar *value; - gint i; - CamelURL *url; - - if (service->provider == NULL - || (entries = service->provider->extra_conf) == NULL) - return; - - d(printf("Running auto-detect\n")); - - url = emae_account_url(emae, E_ACCOUNT_SOURCE_URL); - camel_provider_auto_detect(service->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 gint -provider_compare (const CamelProvider *p1, const CamelProvider *p2) -{ - /* sort providers based on "location" (ie. local or remote) */ - 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 void -emae_signature_added(ESignatureList *signatures, ESignature *sig, EMAccountEditor *emae) -{ - GtkTreeModel *model; - GtkTreeIter iter; - - 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, sig->autogen?_("Autogenerated"):sig->name, 1, sig->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 { - gchar *uid; - - gtk_tree_model_get(model, iter, 1, &uid, -1); - if (uid && !strcmp(uid, sig->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; - - if (emae_signature_get_iter(emae, sig, &model, &iter)) - gtk_list_store_set((GtkListStore *)model, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, -1); -} - -static void -emae_signaturetype_changed(GtkComboBox *dropdown, EMAccountEditor *emae) -{ - gint id = gtk_combo_box_get_active(dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - gchar *uid = NULL; - - 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(emae->account, E_ACCOUNT_ID_SIGNATURE, uid); - g_free(uid); -} - -static void -emae_signature_new(GtkWidget *w, EMAccountEditor *emae) -{ - EShell *shell; - EShellSettings *shell_settings; - GtkWidget *parent; - gboolean html_mode; - - shell = e_shell_get_default (); - shell_settings = e_shell_get_shell_settings (shell); - parent = gtk_widget_get_toplevel (w); - - html_mode = e_shell_settings_get_boolean ( - shell_settings, "composer-format-html"); - - em_composer_prefs_new_signature (GTK_WINDOW (parent), html_mode); -} - -static GtkWidget * -emae_setup_signatures(EMAccountEditor *emae, GladeXML *xml) -{ - EMAccountEditorPrivate *p = emae->priv; - GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "signature_dropdown"); - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - GtkListStore *store; - gint i, active=0; - GtkTreeIter iter; - ESignatureList *signatures; - EIterator *it; - const gchar *current = e_account_get_string(emae->account, E_ACCOUNT_ID_SIGNATURE); - GtkWidget *button; - - 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); - gtk_list_store_set(store, &iter, 0, _("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); - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1); - - if (current && !strcmp(current, sig->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); - gtk_widget_set_sensitive((GtkWidget *)dropdown, e_account_writable(emae->account, E_ACCOUNT_ID_SIGNATURE)); - - button = glade_xml_get_widget(xml, "sigAddNew"); - g_signal_connect(button, "clicked", G_CALLBACK(emae_signature_new), emae); - gtk_widget_set_sensitive(button, - gconf_client_key_is_writable(mail_config_get_gconf_client(), - "/apps/evolution/mail/signatures", NULL)); - - return (GtkWidget *)dropdown; -} - -static void -emae_receipt_policy_changed(GtkComboBox *dropdown, EMAccountEditor *emae) -{ - gint id = gtk_combo_box_get_active(dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - EAccountReceiptPolicy policy; - - 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 (emae->account, E_ACCOUNT_RECEIPT_POLICY, policy); - } - } - -} - -static GtkWidget * -emae_setup_receipt_policy (EMAccountEditor *emae, GladeXML *xml) -{ - GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget(xml, "receipt_policy_dropdown"); - GtkListStore *store; - gint i = 0, active = 0; - GtkTreeIter iter; - EAccountReceiptPolicy current = emae->account->receipt_policy; - 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") } - }; - - 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); - gtk_combo_box_set_active(dropdown, active); - - g_signal_connect(dropdown, "changed", G_CALLBACK(emae_receipt_policy_changed), emae); - gtk_widget_set_sensitive((GtkWidget *)dropdown, e_account_writable(emae->account, E_ACCOUNT_RECEIPT_POLICY)); - - return (GtkWidget *)dropdown; -} - -static void -emae_account_entry_changed(GtkEntry *entry, EMAccountEditor *emae) -{ - gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)entry, "account-item")); - - e_account_set_string(emae->account, item, gtk_entry_get_text(entry)); -} - -static GtkEntry * -emae_account_entry(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml) -{ - GtkEntry *entry; - const gchar *text; - - entry = (GtkEntry *)glade_xml_get_widget(xml, name); - text = e_account_get_string(emae->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); - gtk_widget_set_sensitive((GtkWidget *)entry, e_account_writable(emae->account, item)); - - return entry; -} - -static void -emae_account_toggle_changed(GtkToggleButton *toggle, EMAccountEditor *emae) -{ - gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)toggle, "account-item")); - - e_account_set_bool(emae->account, item, gtk_toggle_button_get_active(toggle)); -} - -static void -emae_account_toggle_widget(EMAccountEditor *emae, GtkToggleButton *toggle, gint item) -{ - gtk_toggle_button_set_active(toggle, e_account_get_bool(emae->account, item)); - g_object_set_data((GObject *)toggle, "account-item", GINT_TO_POINTER(item)); - g_signal_connect(toggle, "toggled", G_CALLBACK(emae_account_toggle_changed), emae); - gtk_widget_set_sensitive((GtkWidget *)toggle, e_account_writable(emae->account, item)); -} - -static GtkToggleButton * -emae_account_toggle(EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml) -{ - GtkToggleButton *toggle; - - toggle = (GtkToggleButton *)glade_xml_get_widget(xml, name); - emae_account_toggle_widget(emae, toggle, item); - - return toggle; -} - -static void -emae_account_spinint_changed(GtkSpinButton *spin, EMAccountEditor *emae) -{ - gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)spin, "account-item")); - - e_account_set_int(emae->account, item, gtk_spin_button_get_value(spin)); -} - -static void -emae_account_spinint_widget(EMAccountEditor *emae, GtkSpinButton *spin, gint item) -{ - gtk_spin_button_set_value(spin, e_account_get_int(emae->account, item)); - g_object_set_data((GObject *)spin, "account-item", GINT_TO_POINTER(item)); - g_signal_connect(spin, "value_changed", G_CALLBACK(emae_account_spinint_changed), emae); - gtk_widget_set_sensitive((GtkWidget *)spin, e_account_writable(emae->account, item)); -} - -#if 0 -static GtkSpinButton * -emae_account_spinint(EMAccountEditor *emae, const gchar *name, gint item) -{ - GtkSpinButton *spin; - - spin = (GtkSpinButton *)glade_xml_get_widget(emae->priv->xml, name); - emae_account_spinint_widget(emae, spin, item); - - return spin; -} -#endif - -static void -emae_account_folder_changed(EMFolderSelectionButton *folder, EMAccountEditor *emae) -{ - gint item = GPOINTER_TO_INT(g_object_get_data((GObject *)folder, "account-item")); - - e_account_set_string(emae->account, item, em_folder_selection_button_get_selection(folder)); -} - -static EMFolderSelectionButton * -emae_account_folder(EMAccountEditor *emae, const gchar *name, gint item, gint deffolder, GladeXML *xml) -{ - EMFolderSelectionButton *folder; - const gchar *uri; - - folder = (EMFolderSelectionButton *)glade_xml_get_widget(xml, name); - uri = e_account_get_string(emae->account, item); - if (uri) { - gchar *tmp = em_uri_to_camel(uri); - - em_folder_selection_button_set_selection(folder, tmp); - g_free(tmp); - } else { - const gchar *uri; - - uri = e_mail_local_get_folder_uri (deffolder); - em_folder_selection_button_set_selection(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); - - gtk_widget_set_sensitive((GtkWidget *)folder, e_account_writable(emae->account, item)); - - return folder; -} - -#if defined (HAVE_NSS) -static void -smime_changed(EMAccountEditor *emae) -{ - EMAccountEditorPrivate *gui = emae->priv; - gint act; - const gchar *tmp; - - tmp = gtk_entry_get_text(gui->smime_sign_key); - act = tmp && tmp[0]; - gtk_widget_set_sensitive((GtkWidget *)gui->smime_sign_key_clear, act); - gtk_widget_set_sensitive((GtkWidget *)gui->smime_sign_default, act); - if (!act) - gtk_toggle_button_set_active(gui->smime_sign_default, FALSE); - - tmp = gtk_entry_get_text(gui->smime_encrypt_key); - act = tmp && tmp[0]; - gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_key_clear, act); - gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_default, act); - gtk_widget_set_sensitive((GtkWidget *)gui->smime_encrypt_to_self, act); - if (!act) { - gtk_toggle_button_set_active(gui->smime_encrypt_default, FALSE); - gtk_toggle_button_set_active(gui->smime_encrypt_to_self, FALSE); - } -} - -static void -smime_sign_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) -{ - EMAccountEditorPrivate *gui = emae->priv; - - if (key != NULL) { - gtk_entry_set_text(gui->smime_sign_key, key); - smime_changed(emae); - } - - gtk_widget_destroy(dialog); -} - -static void -smime_sign_key_select(GtkWidget *button, EMAccountEditor *emae) -{ - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - - w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->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 *gui = emae->priv; - - gtk_entry_set_text(gui->smime_sign_key, ""); - smime_changed(emae); -} - -static void -smime_encrypt_key_selected(GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) -{ - EMAccountEditorPrivate *gui = emae->priv; - - if (key != NULL) { - gtk_entry_set_text(gui->smime_encrypt_key, key); - smime_changed(emae); - } - - gtk_widget_destroy(dialog); -} - -static void -smime_encrypt_key_select(GtkWidget *button, EMAccountEditor *emae) -{ - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - - w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->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 *gui = emae->priv; - - gtk_entry_set_text(gui->smime_encrypt_key, ""); - smime_changed(emae); -} -#endif - -static void -emae_url_set_hostport(CamelURL *url, const gchar *txt) -{ - const gchar *port; - gchar *host; - - /* FIXME: what if this was a raw IPv6 address? */ - if (txt && (port = strchr(txt, ':'))) { - camel_url_set_port(url, atoi(port+1)); - host = g_strdup(txt); - host[port-txt] = 0; - } else { - /* "" is converted to NULL, but if we set NULL on the url, - camel_url_to_string strips lots of details */ - host = g_strdup((txt?txt:"")); - camel_url_set_port (url, 0); - } - - g_strstrip(host); - if (txt && *txt) - camel_url_set_host(url, host); - - g_free(host); -} - -/* This is used to map a funciton which will set on the url a string value. - if widgets[0] is set, it is the entry which will be called against setval() - We need our own function for host:port decoding, as above */ -struct _provider_host_info { - guint32 flag; - void (*setval)(CamelURL *, const gchar *); - glong widgets[3]; -}; - -static struct _provider_host_info emae_source_host_info[] = { - { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, }, - { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } }, - { CAMEL_URL_PART_PATH, camel_url_set_path, { G_STRUCT_OFFSET(EMAccountEditorService, path), G_STRUCT_OFFSET(EMAccountEditorService, pathlabel), G_STRUCT_OFFSET(EMAccountEditorService, pathentry) }, }, - { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, }, - { 0 }, -}; - -static struct _provider_host_info emae_transport_host_info[] = { - { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, }, - { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } }, - { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, }, - { 0 }, -}; - -/* 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 *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; - - struct _provider_host_info *host_info; -} emae_service_info[CAMEL_NUM_PROVIDER_TYPES] = { - { E_ACCOUNT_SOURCE_URL, E_ACCOUNT_SOURCE_SAVE_PASSWD, - "source_frame", "source_type_dropdown", - "source_vbox", "source_description", "source_host", "source_host_label", "source_user", "source_user_label", "source_path", "source_path_label", "source_path_entry", - "source_security_frame", "source_ssl_hbox", "source_use_ssl", "source_ssl_disabled", - NULL, "source_auth_frame", - "source_auth_dropdown", "source_check_supported", - "source_remember_password", - emae_source_host_info, - }, - { E_ACCOUNT_TRANSPORT_URL, E_ACCOUNT_TRANSPORT_SAVE_PASSWD, - "transport_frame", "transport_type_dropdown", - "transport_vbox", "transport_description", "transport_host", "transport_host_label", "transport_user", "transport_user_label", NULL, NULL, NULL, - "transport_security_frame", "transport_ssl_hbox", "transport_use_ssl", "transport_ssl_disabled", - "transport_needs_auth", "transport_auth_frame", - "transport_auth_dropdown", "transport_check_supported", - "transport_remember_password", - emae_transport_host_info, - }, -}; - -static void -emae_uri_changed(EMAccountEditorService *service, CamelURL *url) -{ - gchar *uri; - - uri = camel_url_to_string(url, 0); - - e_account_set_string(service->emae->account, emae_service_info[service->type].account_uri_key, uri); - - /* small hack for providers which are store and transport - copy settings across */ - if (service->type == CAMEL_PROVIDER_STORE - && service->provider - && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(service->provider)) - e_account_set_string(service->emae->account, E_ACCOUNT_TRANSPORT_URL, uri); - - g_free(uri); -} - -static void -emae_service_url_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkEntry *entry) -{ - GtkComboBox *dropdown; - gint id; - GtkTreeModel *model; - GtkTreeIter iter; - CamelServiceAuthType *authtype; - - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - const gchar *text = gtk_entry_get_text(entry); - - setval(url, (text && text[0])?text:NULL); - - if (text && text[0] && setval == camel_url_set_user) { - dropdown = service->authtype; - if(dropdown) { - id = gtk_combo_box_get_active (dropdown); - 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, &authtype, -1); - if (authtype) - camel_url_set_authmech (url, authtype->authproto); - } - } - } - } - - emae_uri_changed(service, url); - camel_url_free(url); -} - -static void -emae_service_url_path_changed(EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkWidget *widget) -{ - GtkComboBox *dropdown; - gint id; - GtkTreeModel *model; - GtkTreeIter iter; - CamelServiceAuthType *authtype; - - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - const gchar *text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); - - setval(url, (text && text[0])?text:NULL); - - if (text && text[0] && setval == camel_url_set_user) { - dropdown = service->authtype; - if(dropdown) { - id = gtk_combo_box_get_active (dropdown); - 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, &authtype, -1); - if (authtype) - camel_url_set_authmech (url, authtype->authproto); - } - } - } - } - - emae_uri_changed(service, url); - camel_url_free(url); -} - -static void -emae_hostname_changed(GtkEntry *entry, EMAccountEditorService *service) -{ - emae_service_url_changed(service, emae_url_set_hostport, entry); -} - -static void -emae_username_changed(GtkEntry *entry, EMAccountEditorService *service) -{ - emae_service_url_changed(service, camel_url_set_user, entry); -} - -static void -emae_path_changed(GtkWidget *widget, EMAccountEditorService *service) -{ - emae_service_url_path_changed(service, camel_url_set_path, widget); -} - -static gint -emae_ssl_update(EMAccountEditorService *service, CamelURL *url) -{ - gint id = gtk_combo_box_get_active(service->use_ssl); - GtkTreeModel *model; - GtkTreeIter iter; - gchar *ssl; - - if (id == -1) - return 0; - - model = gtk_combo_box_get_model(service->use_ssl); - if (gtk_tree_model_iter_nth_child(model, &iter, NULL, id)) { - gtk_tree_model_get(model, &iter, 1, &ssl, -1); - if (!strcmp(ssl, "none")) - ssl = NULL; - camel_url_set_param(url, "use_ssl", ssl); - return 1; - } - - return 0; -} - -static void -emae_ssl_changed(GtkComboBox *dropdown, EMAccountEditorService *service) -{ - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - if (emae_ssl_update(service, url)) - emae_uri_changed(service, url); - camel_url_free(url); -} - -static void -emae_service_provider_changed(EMAccountEditorService *service) -{ - gint i, j; - void (*show)(GtkWidget *); - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - if (service->provider) { - gint enable; - GtkWidget *dwidget = NULL; - - camel_url_set_protocol(url, service->provider->protocol); - gtk_label_set_text(service->description, service->provider->description); - if (!emae_check_license(service->emae, service->provider)) - gtk_widget_hide(service->frame); - else - gtk_widget_show(service->frame); - - enable = e_account_writable_option(service->emae->account, service->provider->protocol, "auth"); - gtk_widget_set_sensitive((GtkWidget *)service->authtype, enable); - gtk_widget_set_sensitive((GtkWidget *)service->check_supported, enable); - - enable = e_account_writable_option(service->emae->account, service->provider->protocol, "use_ssl"); - gtk_widget_set_sensitive((GtkWidget *)service->use_ssl, enable); - - enable = e_account_writable(service->emae->account, emae_service_info[service->type].save_passwd_key); - gtk_widget_set_sensitive((GtkWidget *)service->remember, enable); - - for (i=0;emae_service_info[service->type].host_info[i].flag;i++) { - GtkWidget *w; - gint hide; - struct _provider_host_info *info = &emae_service_info[service->type].host_info[i]; - - enable = CAMEL_PROVIDER_ALLOWS(service->provider, info->flag); - hide = CAMEL_PROVIDER_HIDDEN(service->provider, info->flag); - show = (enable && !hide)?gtk_widget_show:gtk_widget_hide; - - for (j=0; j < sizeof(info->widgets)/sizeof(info->widgets[0]); j++) { - if (info->widgets[j] && (w = G_STRUCT_MEMBER(GtkWidget *, service, info->widgets[j]))) { - show(w); - if (j == 0) { - if (dwidget == NULL && enable) - dwidget = w; - - if (info->setval && !hide) - info->setval(url, enable?gtk_entry_get_text((GtkEntry *)w):NULL); - } - } - } - } - - if (dwidget) - gtk_widget_grab_focus(dwidget); - - if (CAMEL_PROVIDER_ALLOWS(service->provider, CAMEL_URL_PART_AUTH)) { - GList *ll; - - /* try to keep the authmech from the current url, or clear it */ - if (url->authmech) { - if (service->provider->authtypes) { - for (ll = service->provider->authtypes;ll;ll = g_list_next(ll)) - if (!strcmp(url->authmech, ((CamelServiceAuthType *)ll->data)->authproto)) - break; - if (ll == NULL) - camel_url_set_authmech(url, NULL); - } else { - camel_url_set_authmech(url, NULL); - } - } - - emae_refresh_authtype(service->emae, service); - if (service->needs_auth && !CAMEL_PROVIDER_NEEDS(service->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 - gtk_widget_hide(service->no_ssl); - if (service->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) { - emae_ssl_update(service, url); - show = gtk_widget_show; - } else { - camel_url_set_param(url, "use_ssl", NULL); - show = gtk_widget_hide; - } - show(service->ssl_frame); - show(service->ssl_hbox); -#else - gtk_widget_hide(service->ssl_hbox); - gtk_widget_show(service->no_ssl); - camel_url_set_param(url, "use_ssl", NULL); -#endif - } else { - camel_url_set_protocol(url, NULL); - gtk_label_set_text(service->description, ""); - gtk_widget_hide(service->frame); - gtk_widget_hide(service->auth_frame); - gtk_widget_hide(service->ssl_frame); - } - - /* FIXME: linked services? */ - /* FIXME: permissions setup */ - - emae_uri_changed(service, url); - camel_url_free(url); -} - -static void -emae_provider_changed(GtkComboBox *dropdown, EMAccountEditorService *service) -{ - gint id = gtk_combo_box_get_active(dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - - if (id == -1) - return; - - model = gtk_combo_box_get_model(dropdown); - if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, id)) - return; - - gtk_tree_model_get(model, &iter, 1, &service->provider, -1); - - g_list_free(service->authtypes); - service->authtypes = NULL; - - 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) -{ - EAccount *account = emae->account; - GtkListStore *store; - GtkTreeIter iter; - GList *l; - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - GtkComboBox *dropdown; - gint active = 0, i; - struct _service_info *info = &emae_service_info[service->type]; - const gchar *uri = e_account_get_string(account, info->account_uri_key); - gchar *current = NULL; - const gchar *tmp; - CamelURL *url; - - dropdown = service->providers; - gtk_widget_show((GtkWidget *)dropdown); - - if (uri) { - const gchar *colon = strchr(uri, ':'); - gint len; - - if (colon) { - len = colon-uri; - current = g_alloca(len+1); - memcpy(current, uri, len); - current[len] = 0; - } - } else { - current = (gchar *) "imap"; - } - - store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); - - i = 0; - - /* We just special case each type here, its just easier */ - if (service->type == CAMEL_PROVIDER_STORE) { - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, _("None"), 1, NULL, -1); - i++; - } - - for (l=emae->priv->providers; l; l=l->next) { - CamelProvider *provider = l->data; - - if (!((strcmp(provider->domain, "mail") == 0 - || strcmp (provider->domain, "news") == 0) - && 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_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, provider->name, 1, provider, -1); - - /* find the displayed and set default */ - if (i == 0 || (current && strcmp(provider->protocol, current) == 0)) { - service->provider = provider; - active = i; - - /* we need to set this value on the uri too */ - if (current == NULL) { - CamelURL *url = emae_account_url(emae, info->account_uri_key); - - camel_url_set_protocol(url, provider->protocol); - emae_uri_changed(service, url); - camel_url_free(url); - } - } - i++; - } - - - gtk_cell_layout_clear((GtkCellLayout *)dropdown); - gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store); - gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE); - gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, NULL); - - g_signal_handlers_disconnect_by_func(dropdown, emae_provider_changed, service); - gtk_combo_box_set_active(dropdown, -1); /* needed for gtkcombo bug(?) */ - gtk_combo_box_set_active(dropdown, active); - g_signal_connect(dropdown, "changed", G_CALLBACK(emae_provider_changed), service); - - if (!uri || (url = camel_url_new(uri, NULL)) == NULL) { - return; - } - - tmp = camel_url_get_param(url, "use_ssl"); - if (tmp == NULL) - tmp = "never"; - for (i=0;iuse_ssl, i); - break; - } - } -} - -static void -emae_authtype_changed(GtkComboBox *dropdown, EMAccountEditorService *service) -{ - gint id = gtk_combo_box_get_active(dropdown); - GtkTreeModel *model; - GtkTreeIter iter; - CamelServiceAuthType *authtype; - CamelURL *url; - - if (id == -1) - return; - - url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - 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, &authtype, -1); - if (authtype) - camel_url_set_authmech(url, authtype->authproto); - else - camel_url_set_authmech(url, NULL); - emae_uri_changed(service, url); - } - camel_url_free(url); - - gtk_widget_set_sensitive((GtkWidget *)service->remember, - authtype - ?(authtype->need_password && e_account_writable(service->emae->account, emae_service_info[service->type].save_passwd_key)) - :FALSE); -} - -static void -emae_needs_auth(GtkToggleButton *toggle, EMAccountEditorService *service) -{ - gint need = gtk_toggle_button_get_active(toggle); - - gtk_widget_set_sensitive(service->auth_frame, need); - - if (need) - emae_authtype_changed(service->authtype, service); - else { - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - camel_url_set_authmech(url, NULL); - emae_uri_changed(service, url); - camel_url_free(url); - } -} - -static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service); - -static void -emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service) -{ - EAccount *account = emae->account; - GtkListStore *store; - GtkTreeIter iter; - GtkComboBox *dropdown; - gint active = 0; - gint i; - struct _service_info *info = &emae_service_info[service->type]; - const gchar *uri = e_account_get_string(account, info->account_uri_key); - GList *l, *ll; - CamelURL *url = NULL; - - dropdown = service->authtype; - gtk_widget_show((GtkWidget *)dropdown); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); - - if (uri) - url = camel_url_new(uri, NULL); - - if (service->provider) { - for (i=0, l=service->provider->authtypes; l; l=l->next, i++) { - CamelServiceAuthType *authtype = l->data; - gint avail; - - /* if we have some already shown */ - if (service->authtypes) { - for (ll = service->authtypes;ll;ll = g_list_next(ll)) - if (!strcmp(authtype->authproto, ((CamelServiceAuthType *)ll->data)->authproto)) - break; - avail = ll != NULL; - } else { - avail = TRUE; - } - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, authtype->name, 1, authtype, 2, !avail, -1); - - if (url && url->authmech && !strcmp(url->authmech, authtype->authproto)) - active = i; - } - } - - gtk_combo_box_set_model(dropdown, (GtkTreeModel *)store); - gtk_combo_box_set_active(dropdown, -1); - - if (service->auth_changed_id == 0) { - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - - gtk_cell_layout_pack_start((GtkCellLayout *)dropdown, cell, TRUE); - gtk_cell_layout_set_attributes((GtkCellLayout *)dropdown, cell, "text", 0, "strikethrough", 2, NULL); - - service->auth_changed_id = g_signal_connect(dropdown, "changed", G_CALLBACK(emae_authtype_changed), service); - g_signal_connect(service->check_supported, "clicked", G_CALLBACK(emae_check_authtype), service); - } - - gtk_combo_box_set_active(dropdown, active); - - if (url) - camel_url_free(url); -} - -static void emae_check_authtype_done(const gchar *uri, CamelProviderType type, GList *types, gpointer data) -{ - EMAccountEditorService *service = data; - - if (service->check_dialog) { - if (service->authtypes) - g_list_free(service->authtypes); - - service->authtypes = g_list_copy(types); - emae_refresh_authtype(service->emae, service); - gtk_widget_destroy(service->check_dialog); - } - - if (service->emae->editor) - gtk_widget_set_sensitive(service->emae->editor, TRUE); - - service->check_id = -1; - g_object_unref(service->emae); -} - -static void emae_check_authtype_response(GtkWidget *d, gint button, EMAccountEditorService *service) -{ - mail_msg_cancel(service->check_id); - gtk_widget_destroy(service->check_dialog); - service->check_dialog = NULL; - - if (service->emae->editor) - gtk_widget_set_sensitive(service->emae->editor, TRUE); -} - -static void emae_check_authtype(GtkWidget *w, EMAccountEditorService *service) -{ - EMAccountEditor *emae = service->emae; - const gchar *uri; - - /* TODO: do we need to remove the auth mechanism from the uri? */ - uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key); - g_object_ref(emae); - - service->check_dialog = e_error_new(emae->editor ? (GtkWindow *)gtk_widget_get_toplevel(emae->editor) : NULL, - "mail:checking-service", NULL); - g_signal_connect(service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service); - gtk_widget_show(service->check_dialog); - if (emae->editor) - gtk_widget_set_sensitive(emae->editor, FALSE); - service->check_id = mail_check_service(uri, service->type, emae_check_authtype_done, service); -} - -static void -emae_setup_service(EMAccountEditor *emae, EMAccountEditorService *service, GladeXML *xml) -{ - struct _service_info *info = &emae_service_info[service->type]; - CamelURL *url = emae_account_url(emae, info->account_uri_key); - const gchar *uri = e_account_get_string(emae->account, info->account_uri_key); - const gchar *tmp; - gint i; - - service->provider = uri?camel_provider_get(uri, NULL):NULL; - service->frame = glade_xml_get_widget(xml, info->frame); - service->container = glade_xml_get_widget(xml, info->container); - service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description)); - service->hostname = GTK_ENTRY (glade_xml_get_widget (xml, info->hostname)); - service->hostlabel = (GtkLabel *)glade_xml_get_widget (xml, info->hostlabel); - service->username = GTK_ENTRY (glade_xml_get_widget (xml, info->username)); - service->userlabel = (GtkLabel *)glade_xml_get_widget (xml, info->userlabel); - if (info->pathentry) { - service->pathlabel = (GtkLabel *)glade_xml_get_widget(xml, info->pathlabel); - service->pathentry = glade_xml_get_widget(xml, info->pathentry); - } - - service->ssl_frame = glade_xml_get_widget (xml, info->security_frame); - gtk_widget_hide (service->ssl_frame); - service->ssl_hbox = glade_xml_get_widget (xml, info->ssl_hbox); - service->use_ssl = (GtkComboBox *)glade_xml_get_widget (xml, info->use_ssl); - service->no_ssl = glade_xml_get_widget (xml, info->ssl_disabled); - - /* configure ui for current settings */ - if (url->host) { - if (url->port) { - gchar *host = g_strdup_printf("%s:%d", url->host, url->port); - - gtk_entry_set_text(service->hostname, host); - g_free(host); - } else - gtk_entry_set_text(service->hostname, url->host); - } - if (url->user && *url->user) { - gtk_entry_set_text(service->username, url->user); - } - if (service->pathentry) { - GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; - - if (service->provider && (service->provider->url_flags & CAMEL_URL_NEED_PATH_DIR) == 0) - action = GTK_FILE_CHOOSER_ACTION_OPEN; - - if (action != gtk_file_chooser_get_action (GTK_FILE_CHOOSER (service->pathentry))) - gtk_file_chooser_set_action (GTK_FILE_CHOOSER (service->pathentry), action); - - if (url->path) - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (service->pathentry), url->path); - } - - tmp = camel_url_get_param(url, "use_ssl"); - if (tmp == NULL) - tmp = "never"; - - for (i=0;iuse_ssl, i); - break; - } - } - - g_signal_connect (service->hostname, "changed", G_CALLBACK (emae_hostname_changed), service); - g_signal_connect (service->username, "changed", G_CALLBACK (emae_username_changed), service); - if (service->pathentry) - g_signal_connect (GTK_FILE_CHOOSER (service->pathentry), "selection-changed", G_CALLBACK (emae_path_changed), service); - - g_signal_connect(service->use_ssl, "changed", G_CALLBACK(emae_ssl_changed), service); - - service->auth_frame = glade_xml_get_widget(xml, info->auth_frame); - service->remember = emae_account_toggle(emae, info->remember_password, info->save_passwd_key, xml); - service->check_supported = (GtkButton *)glade_xml_get_widget(xml, info->authtype_check); - service->authtype = (GtkComboBox *)glade_xml_get_widget(xml, info->authtype); - /* old authtype will be destroyed when we exit */ - service->auth_changed_id = 0; - service->providers = (GtkComboBox *)glade_xml_get_widget(xml, info->type_dropdown); - emae_refresh_providers(emae, service); - emae_refresh_authtype(emae, service); - - if (info->needs_auth) { - service->needs_auth = (GtkToggleButton *)glade_xml_get_widget (xml, info->needs_auth); - gtk_toggle_button_set_active(service->needs_auth, url->authmech != NULL); - g_signal_connect(service->needs_auth, "toggled", G_CALLBACK(emae_needs_auth), service); - emae_needs_auth(service->needs_auth, service); - } else { - service->needs_auth = NULL; - } - - if (!e_account_writable (emae->account, info->account_uri_key)) - gtk_widget_set_sensitive(service->container, FALSE); - else - gtk_widget_set_sensitive(service->container, TRUE); - - emae_service_provider_changed(service); - - camel_url_free(url); -} - -/* 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 }, -}; - -/* its a bit obtuse, but its simple */ -static void -emae_queue_widgets(EMAccountEditor *emae, GladeXML *xml, const gchar *first, ...) -{ - gint i = 0; - va_list ap; - - va_start(ap, first); - while (first) { - emae->priv->widgets_name[i] = first; - emae->priv->widgets[i++] = glade_xml_get_widget(xml, first); - first = va_arg(ap, const gchar *); - } - va_end(ap); - - g_return_if_fail(i < sizeof(emae->priv->widgets)/sizeof(emae->priv->widgets[0])); - - emae->priv->widgets[i] = NULL; - emae->priv->widgets_index = 0; -} - -static GtkWidget * -emae_identity_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *gui = emae->priv; - EAccount *account = emae->account; - gint i; - GtkWidget *w; - GladeXML *xml; - gchar *gladefile; - - /*if (old) - return old;*/ - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - xml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - /* Management & Identity fields, in the druid the management frame is relocated to the last page later on */ - for (i=0;iidentity_entries[i] = emae_account_entry(emae, emae_identity_entries[i].name, emae_identity_entries[i].item, xml); - - gui->management_frame = glade_xml_get_widget(xml, "management_frame"); - - gui->default_account = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "management_default")); - if (!e_get_default_account () - || (account == e_get_default_account ()) - || (GPOINTER_TO_INT(g_object_get_data (G_OBJECT (emae->account), "default_flagged"))) ) - gtk_toggle_button_set_active (gui->default_account, TRUE); - - if (emae->do_signature) { - emae_setup_signatures(emae, xml); - } else { - /* TODO: this could/should probably be neater */ - gtk_widget_hide(glade_xml_get_widget(xml, "sigLabel")); -#if 0 - gtk_widget_hide(glade_xml_get_widget(xml, "sigOption")); -#endif - gtk_widget_hide(glade_xml_get_widget(xml, "sigAddNew")); - } - - w = glade_xml_get_widget(xml, item->label); - if (emae->type == EMAE_PAGES) { - gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new(gladefile, "identity_page", NULL); - g_free (gladefile); - - page = glade_xml_get_widget(druidxml, "identity_page"); - - gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); - w = page; - g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); - } else { - gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Identity"))); - } - - emae_queue_widgets(emae, xml, "account_vbox", "identity_required_table", "identity_optional_table", NULL); - - g_object_unref(xml); - - return w; -} - -static GtkWidget * -emae_receive_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - GladeXML *xml; - gchar *gladefile; - - /*if (old) - return old;*/ - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - xml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - gui->source.type = CAMEL_PROVIDER_STORE; - emae_setup_service(emae, &gui->source, xml); - - w = glade_xml_get_widget(xml, item->label); - if (emae->type == EMAE_PAGES) { - gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new(gladefile, "source_page", NULL); - g_free (gladefile); - - page = glade_xml_get_widget(druidxml, "source_page"); - - gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); - w = page; - g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); - } else { - gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Receiving Email"))); - } - - emae_queue_widgets(emae, xml, "source_type_table", "table4", "vbox181", "vbox179", NULL); - - g_object_unref(xml); - - return w; -} - -static void -emae_option_toggle_changed(GtkToggleButton *toggle, EMAccountEditorService *service) -{ - const gchar *name = g_object_get_data((GObject *)toggle, "option-name"); - GSList *depl = g_object_get_data((GObject *)toggle, "dependent-list"); - gint active = gtk_toggle_button_get_active(toggle); - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - for (;depl;depl = g_slist_next(depl)) - gtk_widget_set_sensitive((GtkWidget *)depl->data, active); - - camel_url_set_param(url, name, active?"":NULL); - emae_uri_changed(service, url); - camel_url_free(url); -} - -static GtkWidget * -emae_option_toggle(EMAccountEditorService *service, CamelURL *url, const gchar *text, const gchar *name, gint def) -{ - GtkWidget *w; - - /* FIXME: how do we get the default value ever? */ - w = gtk_check_button_new_with_mnemonic(text); - g_object_set_data((GObject *)w, "option-name", (gpointer)name); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), camel_url_get_param (url, name) != NULL); - g_signal_connect(w, "toggled", G_CALLBACK(emae_option_toggle_changed), service); - gtk_widget_show(w); - - return w; -} - -static void -emae_option_entry_changed(GtkEntry *entry, EMAccountEditorService *service) -{ - const gchar *name = g_object_get_data((GObject *)entry, "option-name"); - const gchar *text = gtk_entry_get_text(entry); - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - camel_url_set_param(url, name, text && text[0]?text:NULL); - emae_uri_changed(service, url); - camel_url_free(url); -} - -static GtkWidget * -emae_option_entry(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *def, GtkWidget *l) -{ - GtkWidget *w; - const gchar *val = camel_url_get_param(url, name); - - if (val == NULL) { - if (def) { - val = def; - camel_url_set_param(url, name, val); - emae_uri_changed(service, url); - } else - val = ""; - } - - w = g_object_new(gtk_entry_get_type(), - "text", val, - NULL); - gtk_label_set_mnemonic_widget ((GtkLabel*)l, w); - g_object_set_data((GObject *)w, "option-name", (gpointer)name); - g_signal_connect(w, "changed", G_CALLBACK(emae_option_entry_changed), service); - gtk_widget_show(w); - - return w; -} - -static void -emae_option_checkspin_changed(GtkSpinButton *spin, EMAccountEditorService *service) -{ - const gchar *name = g_object_get_data((GObject *)spin, "option-name"); - gchar value[16]; - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - sprintf(value, "%d", gtk_spin_button_get_value_as_int(spin)); - camel_url_set_param(url, name, value); - emae_uri_changed(service, url); - camel_url_free(url); -} - -static void -emae_option_checkspin_check_changed(GtkToggleButton *toggle, EMAccountEditorService *service) -{ - const gchar *name = g_object_get_data((GObject *)toggle, "option-name"); - GtkSpinButton *spin = g_object_get_data((GObject *)toggle, "option-target"); - - if (gtk_toggle_button_get_active(toggle)) { - gtk_widget_set_sensitive((GtkWidget *)spin, TRUE); - emae_option_checkspin_changed(spin, service); - } else { - CamelURL *url = emae_account_url(service->emae, emae_service_info[service->type].account_uri_key); - - camel_url_set_param(url, name, NULL); - gtk_widget_set_sensitive((GtkWidget *)spin, FALSE); - emae_uri_changed(service, url); - camel_url_free(url); - } -} - -/* this is a fugly api */ -static GtkWidget * -emae_option_checkspin(EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *fmt, const gchar *info) -{ - GtkWidget *hbox, *check, *spin, *label = NULL; - double min, def, max; - gchar *pre, *post; - const gchar *val; - gchar on; - gint enable; - - pre = g_alloca(strlen(fmt)+1); - strcpy(pre, fmt); - post = strstr(pre, "%s"); - if (post) { - *post = 0; - post+=2; - } - - if (sscanf(info, "%c:%lf:%lf:%lf", &on, &min, &def, &max) != 4) { - min = 0.0; - def = 0.0; - max = 1.0; - } - - if ((enable = (val = camel_url_get_param(url, name)) != NULL) ) - def = strtod(val, NULL); - else - enable = (on == 'y'); - - hbox = gtk_hbox_new(FALSE, 0); - check = g_object_new(gtk_check_button_get_type(), "label", pre, "use_underline", TRUE, "active", enable, NULL); - - spin = gtk_spin_button_new((GtkAdjustment *)gtk_adjustment_new(def, min, max, 1, 1, 0), 1, 0); - if (post) - label = gtk_label_new_with_mnemonic(post); - gtk_box_pack_start((GtkBox *)hbox, check, FALSE, TRUE, 0); - gtk_box_pack_start((GtkBox *)hbox, spin, FALSE, TRUE, 0); - if (label) - gtk_box_pack_start((GtkBox *)hbox, label, FALSE, TRUE, 4); - - g_object_set_data((GObject *)spin, "option-name", (gpointer)name); - g_object_set_data((GObject *)check, "option-name", (gpointer)name); - g_object_set_data((GObject *)check, "option-target", (gpointer)spin); - - g_signal_connect(spin, "value_changed", G_CALLBACK(emae_option_checkspin_changed), service); - g_signal_connect(check, "toggled", G_CALLBACK(emae_option_checkspin_check_changed), service); - - gtk_widget_show_all(hbox); - - return hbox; -} - -static void -emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *service) -{ - const gchar *name = g_object_get_data (G_OBJECT (options), "option-name"); - gchar *value = NULL; - CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); - gint id = gtk_combo_box_get_active (options); - - if (id != -1) { - GtkTreeModel *model; - GtkTreeIter iter; - - model = gtk_combo_box_get_model (options); - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) { - gtk_tree_model_get (model, &iter, 0, &value, -1); - } - } - - camel_url_set_param (url, name, value); - emae_uri_changed (service, url); - camel_url_free (url); - g_free (value); -} - -/* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */ -static GtkWidget * -emae_option_options (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *values, GtkWidget *l) -{ - GtkComboBox *w; - GtkListStore *store; - GtkTreeIter iter; - const gchar *p, *value, *caption; - GtkCellRenderer *cell; - gint active = 0; /* the first item entered is always a default item */ - gint i; - const gchar *val = camel_url_get_param (url, name); - - w = GTK_COMBO_BOX (gtk_combo_box_new ()); - - /* value and caption */ - store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - - p = values; - for (p = values, i = 0; p; i++) { - gchar *vl, *cp; - - value = 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 (value, caption - value - 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 (service->provider->translation_domain, cp), -1); - - if (val && g_ascii_strcasecmp (val, vl) == 0) - active = i; - - g_free (vl); - g_free (cp); - } - - gtk_combo_box_set_model (w, (GtkTreeModel *)store); - gtk_combo_box_set_active (w, i > 0 ? active : -1); - - cell = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), cell, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), cell, "text", 1, NULL); - - gtk_widget_show (GTK_WIDGET (w)); - - gtk_label_set_mnemonic_widget (GTK_LABEL (l), GTK_WIDGET (w)); - - g_object_set_data (G_OBJECT (w), "option-name", (gpointer)name); - g_signal_connect (w, "changed", G_CALLBACK (emae_option_options_changed), service); - - return GTK_WIDGET (w); -} - -static GtkWidget * -emae_receive_options_item(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - GtkWidget *w, *box, *spin; - gint row; - - if (emae->priv->source.provider == NULL - || emae->priv->source.provider->extra_conf == NULL) - return NULL; - - if (old) - return old; - - /* We have to add the automatic mail check item with the rest of the receive options */ - row = ((GtkTable *)parent)->nrows; - - 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, gpointer data) -{ - EMAccountEditor *emae = data; - struct _receive_options_item *item = (struct _receive_options_item *)eitem; - GtkWidget *w, *l, *h; - CamelProviderConfEntry *entries; - GtkWidget *depw; - GSList *depl = NULL, *n; - EMAccountEditorService *service = &emae->priv->source; - gint row, i; - GHashTable *extra; - CamelURL *url; - - if (emae->priv->source.provider == NULL - || emae->priv->source.provider->extra_conf == NULL) - return NULL; - - entries = emae->priv->source.provider->extra_conf; - for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++) - if (entries[i].type == CAMEL_PROVIDER_CONF_SECTION_START - && entries[i].name - && strcmp(entries[i].name, eitem->user_data) == 0) - goto section; - - return NULL; -section: - d(printf("Building extra section '%s'\n", eitem->path)); - - url = emae_account_url(emae, emae_service_info[service->type].account_uri_key); - item->extra_table = g_hash_table_new(g_str_hash, g_str_equal); - extra = g_hash_table_new(g_str_hash, g_str_equal); - row = ((GtkTable *)parent)->nrows; - - for (;entries[i].type != CAMEL_PROVIDER_CONF_END && entries[i].type != CAMEL_PROVIDER_CONF_SECTION_END;i++) { - if (entries[i].depname) { - depw = g_hash_table_lookup(extra, entries[i].depname); - if (depw) - depl = g_object_steal_data((GObject *)depw, "dependent-list"); - } else - depw = NULL; - - switch (entries[i].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[i].name, "hostname")) - l = (GtkWidget *)emae->priv->source.hostlabel; - else if (!strcmp(entries[i].name, "username")) - l = (GtkWidget *)emae->priv->source.userlabel; - else - l = NULL; - - if (l) { - gtk_label_set_text_with_mnemonic((GtkLabel *)l, entries[i].text); - if (depw) - depl = g_slist_prepend(depl, l); - } - break; - case CAMEL_PROVIDER_CONF_CHECKBOX: - w = emae_option_toggle(service, url, entries[i].text, entries[i].name, atoi(entries[i].value)); - gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); - g_hash_table_insert(extra, (gpointer)entries[i].name, w); - if (depw) - depl = g_slist_prepend(depl, w); - 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[i].name, "keep_on_server")) - emae_account_toggle_widget(emae, (GtkToggleButton *)w, E_ACCOUNT_SOURCE_KEEP_ON_SERVER); - break; - case CAMEL_PROVIDER_CONF_ENTRY: - l = g_object_new(gtk_label_get_type(), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL); - gtk_widget_show(l); - w = emae_option_entry(service, url, entries[i].name, entries[i].value, l); - gtk_table_attach((GtkTable *)parent, l, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); - gtk_table_attach((GtkTable *)parent, w, 1, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); - if (depw) { - depl = g_slist_prepend(depl, w); - depl = g_slist_prepend(depl, l); - } - row++; - /* FIXME: this is another hack for exchange/groupwise connector */ - g_hash_table_insert(item->extra_table, (gpointer)entries[i].name, w); - break; - case CAMEL_PROVIDER_CONF_CHECKSPIN: - w = emae_option_checkspin(service, url, entries[i].name, entries[i].text, entries[i].value); - gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); - if (depw) - depl = g_slist_prepend(depl, w); - row++; - break; - case CAMEL_PROVIDER_CONF_OPTIONS: - h = gtk_hbox_new (FALSE, 4); - gtk_widget_show (h); - l = g_object_new (gtk_label_get_type (), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL); - gtk_widget_show (l); - w = emae_option_options (service, url, entries[i].name, entries[i].value, l); - gtk_box_pack_start (GTK_BOX (h), l, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); - gtk_table_attach ((GtkTable *)parent, h, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - if (depw) { - depl = g_slist_prepend (depl, h); - } - row++; - break; - default: - break; - } - - if (depw && depl) { - gint act = gtk_toggle_button_get_active((GtkToggleButton *)depw); - - g_object_set_data_full((GObject *)depw, "dependent-list", depl, (GDestroyNotify)g_slist_free); - for (n=depl;n;n=g_slist_next(n)) - gtk_widget_set_sensitive((GtkWidget *)n->data, act); - } - } - - camel_url_free(url); - - /* Since EConfig destroys the factory widget when it changes, we - * need to destroy our own ones as well, and add a dummy item - * so it knows this section isn't empty */ - - w = gtk_label_new(""); - gtk_widget_hide(w); - gtk_table_attach((GtkTable *)parent, w, 0, 2, row, row+1, 0, 0, 0, 0); - - return w; -} - -static GtkWidget * -emae_send_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - GladeXML *xml; - gchar *gladefile; - - /* no transport options page at all for these types of providers */ - if (gui->source.provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(gui->source.provider)) { - memset(&gui->transport.frame, 0, ((gchar *)&gui->transport.check_dialog)-((gchar *)&gui->transport.frame)); - return NULL; - } - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - xml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - /* Transport */ - gui->transport.type = CAMEL_PROVIDER_TRANSPORT; - emae_setup_service(emae, &gui->transport, xml); - - w = glade_xml_get_widget(xml, item->label); - if (emae->type == EMAE_PAGES) { - gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new(gladefile, "transport_page", NULL); - g_free (gladefile); - - page = glade_xml_get_widget(druidxml, "transport_page"); - - gtk_box_pack_start((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); - w = page; - g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); - } else { - gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Sending Email"))); - } - - emae_queue_widgets(emae, xml, "transport_type_table", "vbox12", "vbox183", "vbox61", NULL); - - g_object_unref(xml); - - return w; -} - -static GtkWidget * -emae_defaults_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - GladeXML *xml; - gchar *gladefile; - - /*if (old) - return old;*/ - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - xml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - /* Special folders */ - gui->drafts_folder_button = (GtkButton *)emae_account_folder(emae, "drafts_button", E_ACCOUNT_DRAFTS_FOLDER_URI, E_MAIL_FOLDER_DRAFTS, xml); - gui->sent_folder_button = (GtkButton *)emae_account_folder(emae, "sent_button", E_ACCOUNT_SENT_FOLDER_URI, E_MAIL_FOLDER_SENT, xml); - - /* Special Folders "Reset Defaults" button */ - gui->restore_folders_button = (GtkButton *)glade_xml_get_widget (xml, "default_folders_button"); - g_signal_connect (gui->restore_folders_button, "clicked", G_CALLBACK (default_folders_clicked), emae); - - /* Always Cc/Bcc */ - emae_account_toggle(emae, "always_cc", E_ACCOUNT_CC_ALWAYS, xml); - emae_account_entry(emae, "cc_addrs", E_ACCOUNT_CC_ADDRS, xml); - emae_account_toggle(emae, "always_bcc", E_ACCOUNT_BCC_ALWAYS, xml); - emae_account_entry(emae, "bcc_addrs", E_ACCOUNT_BCC_ADDRS, xml); - - gtk_widget_set_sensitive((GtkWidget *)gui->drafts_folder_button, e_account_writable(emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI)); - - gtk_widget_set_sensitive( (GtkWidget *)gui->sent_folder_button, - e_account_writable(emae->account, E_ACCOUNT_SENT_FOLDER_URI) - && - (emae->priv->source.provider ? !(emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER): TRUE) - ); - - gtk_widget_set_sensitive((GtkWidget *)gui->restore_folders_button, - (e_account_writable(emae->account, E_ACCOUNT_SENT_FOLDER_URI) - && ((emae->priv->source.provider && !( emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER)) - || e_account_writable(emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI)))); - - /* Receipt policy */ - emae_setup_receipt_policy (emae, xml); - - w = glade_xml_get_widget(xml, item->label); - gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Defaults"))); - - emae_queue_widgets(emae, xml, "vbox184", "table8", NULL); - - g_object_unref(xml); - - return w; -} - -static GtkWidget * -emae_security_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; -#if defined (HAVE_NSS) - EMAccountEditorPrivate *gui = emae->priv; -#endif - GtkWidget *w; - GladeXML *xml; - gchar *gladefile; - - /*if (old) - return old;*/ - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - xml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - /* Security */ - emae_account_entry(emae, "pgp_key", E_ACCOUNT_PGP_KEY, xml); - emae_account_toggle(emae, "pgp_encrypt_to_self", E_ACCOUNT_PGP_ENCRYPT_TO_SELF, xml); - emae_account_toggle(emae, "pgp_always_sign", E_ACCOUNT_PGP_ALWAYS_SIGN, xml); - emae_account_toggle(emae, "pgp_no_imip_sign", E_ACCOUNT_PGP_NO_IMIP_SIGN, xml); - emae_account_toggle(emae, "pgp_always_trust", E_ACCOUNT_PGP_ALWAYS_TRUST, xml); - -#if defined (HAVE_NSS) - /* TODO: this should handle its entry separately? */ - gui->smime_sign_key = emae_account_entry(emae, "smime_sign_key", E_ACCOUNT_SMIME_SIGN_KEY, xml); - gui->smime_sign_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_select"); - gui->smime_sign_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_clear"); - g_signal_connect(gui->smime_sign_key_select, "clicked", G_CALLBACK(smime_sign_key_select), emae); - g_signal_connect(gui->smime_sign_key_clear, "clicked", G_CALLBACK(smime_sign_key_clear), emae); - - gui->smime_sign_default = emae_account_toggle(emae, "smime_sign_default", E_ACCOUNT_SMIME_SIGN_DEFAULT, xml); - - gui->smime_encrypt_key = emae_account_entry(emae, "smime_encrypt_key", E_ACCOUNT_SMIME_ENCRYPT_KEY, xml); - gui->smime_encrypt_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_select"); - gui->smime_encrypt_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_clear"); - g_signal_connect(gui->smime_encrypt_key_select, "clicked", G_CALLBACK(smime_encrypt_key_select), emae); - g_signal_connect(gui->smime_encrypt_key_clear, "clicked", G_CALLBACK(smime_encrypt_key_clear), emae); - - gui->smime_encrypt_default = emae_account_toggle(emae, "smime_encrypt_default", E_ACCOUNT_SMIME_ENCRYPT_DEFAULT, xml); - gui->smime_encrypt_to_self = emae_account_toggle(emae, "smime_encrypt_to_self", E_ACCOUNT_SMIME_ENCRYPT_TO_SELF, xml); - smime_changed(emae); -#else - { - /* Since we don't have NSS, hide the S/MIME config options */ - GtkWidget *frame; - - frame = glade_xml_get_widget(xml, "smime_vbox"); - gtk_widget_destroy(frame); - } -#endif /* HAVE_NSS */ - - w = glade_xml_get_widget(xml, item->label); - gtk_notebook_append_page((GtkNotebook *)parent, w, gtk_label_new(_("Security"))); - - g_object_unref(xml); - - return w; -} - -static GtkWidget * -emae_widget_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - gint i; - - for (i=0;emae->priv->widgets[i];i++) - if (!strcmp(emae->priv->widgets_name[i], item->label)) - return emae->priv->widgets[i]; - - g_warning("Mail account widget '%s' not found", item->label); - - return NULL; -} - -/* 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 *) "table4", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", 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, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "40.defaults", (gchar *) "vboxFoldersBorder", emae_defaults_page }, - { E_CONFIG_SECTION, (gchar *) "40.defaults/00.folders", (gchar *) "vbox184", emae_widget_glade }, - { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/10.composing", (gchar *) "table8", 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_management_page(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - EMAccountEditor *emae = data; - EMAccountEditorPrivate *gui = emae->priv; - GtkWidget *w; - - w = gui->management_frame; - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - gchar *gladefile; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new(gladefile, "management_page", NULL); - g_free (gladefile); - - page = glade_xml_get_widget(druidxml, "management_page"); - - gtk_widget_reparent(w, ((GnomeDruidPageStandard *)page)->vbox); - w = page; - g_object_unref(druidxml); - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)page); - } - - return w; -} - -static GtkWidget * -emae_widget_druid_glade(EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) -{ - GladeXML *druidxml; - GtkWidget *w; - gchar *gladefile; - EMAccountEditor *emae = (EMAccountEditor *)data; - - if (emae->type == EMAE_PAGES) - return NULL; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new(gladefile, item->label, NULL); - g_free (gladefile); - - w = glade_xml_get_widget(druidxml, item->label); - /* i think the glade file has issues, we need to show all on at least the end page */ - gtk_widget_show_all(w); - g_object_unref(druidxml); - - gnome_druid_append_page((GnomeDruid *)parent, (GnomeDruidPage *)w); - - return w; -} - -/* plugin meta-data for "org.gnome.evolution.mail.config.accountDruid" */ -static EMConfigItem emae_druid_items[] = { - { E_CONFIG_DRUID, (gchar *) "" }, - { E_CONFIG_PAGE_START, (gchar *) "0.start", (gchar *) "start_page", emae_widget_druid_glade }, - - { 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 *) "table4", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", 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, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade }, - { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade }, - - { E_CONFIG_PAGE, (gchar *) "40.management", (gchar *) "management_frame", emae_management_page }, - - { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_druid_glade }, - { 0 }, -}; -static gboolean emae_druid_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_service_complete(EMAccountEditor *emae, EMAccountEditorService *service) -{ - CamelURL *url; - gint ok = TRUE; - const gchar *uri; - - if (service->provider == NULL) - return TRUE; - - uri = e_account_get_string(emae->account, emae_service_info[service->type].account_uri_key); - if (uri == NULL || (url = camel_url_new(uri, NULL)) == NULL) - return FALSE; - - if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) { - if (url->host == NULL || url->host[0] == 0) - ok = FALSE; - } - /* We only need the user if the service needs auth as well, i think */ - if (ok - && (service->needs_auth == NULL - || CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_AUTH) - || gtk_toggle_button_get_active(service->needs_auth)) - && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_USER) - && (url->user == NULL || url->user[0] == 0)) - ok = FALSE; - - if (ok - && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_PATH) - && (url->path == NULL || url->path[0] == 0)) - ok = FALSE; - - camel_url_free(url); - - return ok; -} - -enum { - GMAIL = 0, - YAHOO, - AOL -}; -struct _server_prefill { - const gchar *key; - const gchar *recv; - const gchar *send; - const gchar *proto; - const gchar *ssl; -} mail_servers [] = { - {"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"}, - {"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"}, - {"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"}, - {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"} -}; - -static gint -check_servers (gchar *server) -{ - gint len = G_N_ELEMENTS(mail_servers), i; - - for (i=0; ipriv->config)->type == E_CONFIG_DRUID) { - if (!strcmp(pageid, "00.identity")) { - if (!emae->priv->identity_set) { - gchar *uname; - - emae->priv->identity_set = 1; -#ifndef G_OS_WIN32 - uname = g_locale_to_utf8(g_get_real_name(), -1, NULL, NULL, NULL); -#else - uname = g_strdup(g_get_real_name()); -#endif - if (uname) { - gtk_entry_set_text(emae->priv->identity_entries[1], uname); - g_free(uname); - } - } - } else if (!strcmp(pageid, "10.receive")) { - if (!emae->priv->receive_set) { - gchar *user, *at; - gint index; - gchar *uri = g_strdup(e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL)); - CamelURL *url; - - emae->priv->receive_set = 1; - tmp = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); - at = strchr(tmp, '@'); - user = g_alloca(at-tmp+1); - memcpy(user, tmp, at-tmp); - user[at-tmp] = 0; - at++; - - index = check_servers(at); - gtk_entry_set_text(emae->priv->source.username, user); - gtk_entry_set_text(emae->priv->transport.username, user); - if (uri && (url = camel_url_new(uri, NULL)) != NULL) { - refresh = TRUE; - camel_url_set_protocol(url, mail_servers[index].proto); - camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); - camel_url_set_host (url, mail_servers[index].recv); - camel_url_set_user (url, user); - gtk_entry_set_text(emae->priv->source.hostname, mail_servers[index].recv); - gtk_entry_set_text(emae->priv->transport.hostname, mail_servers[index].send); - uri = camel_url_to_string(url, 0); - e_account_set_string(emae->account, E_ACCOUNT_SOURCE_URL, uri); - - g_free(uri); - camel_url_free(url); - } - - } - } else if (!strcmp(pageid, "30.send")) { - CamelURL *url; - gchar *at, *user; - gint index; - gchar *uri = (gchar *)e_account_get_string(emae->account, E_ACCOUNT_TRANSPORT_URL); - - tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); - at = strchr(tmp, '@'); - user = g_alloca(at-tmp+1); - memcpy(user, tmp, at-tmp); - user[at-tmp] = 0; - at++; - - index = check_servers(at); - if (uri && (url = camel_url_new(uri, NULL)) != NULL) { - refresh = TRUE; - camel_url_set_protocol (url, "smtp"); - camel_url_set_param(url, "use_ssl", mail_servers[index].ssl); - camel_url_set_host (url, mail_servers[index].send); - camel_url_set_user (url, user); - uri = camel_url_to_string(url, 0); - e_account_set_string(emae->account, E_ACCOUNT_TRANSPORT_URL, uri); - g_free(uri); - camel_url_free(url); - } else { - g_warning("buz2\n"); - } - - } else if (!strcmp(pageid, "20.receive_options")) { - if (emae->priv->source.provider - && emae->priv->extra_provider != emae->priv->source.provider) { - emae->priv->extra_provider = emae->priv->source.provider; - emae_auto_detect(emae); - } - } else if (!strcmp(pageid, "40.management")) { - if (!emae->priv->management_set) { - gchar *template; - guint i = 0, len; - - emae->priv->management_set = 1; - tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS); - len = strlen(tmp); - template = alloca(len + 14); - strcpy(template, tmp); - while (e_get_account_by_name (template)) - sprintf(template + len, " (%d)", i++); - - gtk_entry_set_text(emae->priv->identity_entries[0], template); - } - } - } - - /* - 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 (emae->account), "default_flagged", GINT_TO_POINTER(1)); - - if (pageid == NULL || !strcmp(pageid, "00.identity")) { - /* TODO: check the account name is set, and unique in the account list */ - ok = (tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_NAME)) - && tmp[0] - && (tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_ADDRESS)) - && is_email(tmp) - && ((tmp = e_account_get_string(emae->account, E_ACCOUNT_ID_REPLY_TO)) == NULL - || tmp[0] == 0 - || is_email(tmp)); - if (!ok) { - d(printf("identity incomplete\n")); - } - } - - if (ok && (pageid == NULL || !strcmp(pageid, "10.receive"))) { - if (emae->type == EMAE_PAGES && refresh) { - emae_refresh_providers(emae, &emae->priv->source); - } - ok = emae_service_complete(emae, &emae->priv->source); - if (!ok) { - d(printf("receive page incomplete\n")); - } - } - - if (ok && (pageid == NULL || !strcmp(pageid, "30.send"))) { - if (emae->type == EMAE_PAGES && refresh) { - emae_refresh_providers(emae, &emae->priv->transport); - } - ok = emae_service_complete(emae, &emae->priv->transport); - if (!ok) { - d(printf("send page incomplete\n")); - } - } - - if (ok && (pageid == NULL || !strcmp(pageid, "40.management"))) { - ok = (tmp = e_account_get_string(emae->account, E_ACCOUNT_NAME)) - && tmp[0] - && ((ea = e_get_account_by_name (tmp)) == NULL - || ea == emae->original); - if (!ok) { - d(printf("management page incomplete\n")); - } - } - - return ok; -} - -void -em_account_editor_check (EMAccountEditor *emae, const gchar *page) -{ - emae_check_complete((EConfig *)emae->config, page, emae); -} - -/* HACK: FIXME: the component should listen to the account object directly */ -static void -add_new_store (gchar *uri, CamelStore *store, gpointer user_data) -{ -#if 0 /* KILL-BONOBO: Try to actually fix this? */ - MailComponent *component = mail_component_peek (); - EAccount *account = user_data; - - if (store == NULL) - return; - - mail_component_add_store (component, store, account->name); -#endif -} - -static void -emae_commit(EConfig *ec, GSList *items, gpointer data) -{ - EMAccountEditor *emae = data; - EAccountList *accounts = e_get_account_list (); - EAccount *account; - - /* the mail-config*acconts* api needs a lot of work */ - - if (emae->original) { - d(printf("Committing account '%s'\n", e_account_get_string(emae->account, E_ACCOUNT_NAME))); - e_account_import(emae->original, emae->account); - account = emae->original; - e_account_list_change(accounts, account); - } else { - d(printf("Adding new account '%s'\n", e_account_get_string(emae->account, E_ACCOUNT_NAME))); - e_account_list_add(accounts, emae->account); - account = emae->account; - - /* HACK: this will add the account to the folder tree. - We should just be listening to the account list directly for changed events */ - if (account->enabled - && emae->priv->source.provider - && (emae->priv->source.provider->flags & CAMEL_PROVIDER_IS_STORAGE)) - mail_get_store(e_account_get_string(emae->account, E_ACCOUNT_SOURCE_URL), NULL, add_new_store, account); - } - - if (gtk_toggle_button_get_active(emae->priv->default_account)) - e_account_list_set_default(accounts, account); - - e_account_list_save(accounts); -} - -void -em_account_editor_commit (EMAccountEditor *emae) -{ - emae_commit ((EConfig *)emae->config, NULL, emae); -} - -static void -emae_editor_destroyed(GtkWidget *dialog, EMAccountEditor *emae) -{ - emae->editor = NULL; - g_object_unref(emae); -} - -static void -em_account_editor_construct(EMAccountEditor *emae, EAccount *account, em_account_editor_t type, const gchar *id) -{ - EMAccountEditorPrivate *gui = emae->priv; - gint i, index; - GSList *l; - GList *prov; - EMConfig *ec; - EMConfigTargetAccount *target; - GHashTable *have; - EConfigItem *items; - - emae->type = type; - emae->original = account; - if (emae->original) { - gchar *xml; - - g_object_ref(emae->original); - xml = e_account_to_xml(emae->original); - emae->account = e_account_new_from_xml(xml); - g_free(xml); - - emae->do_signature = TRUE; - } else { - /* TODO: have a get_default_account thing?? */ - emae->account = e_account_new(); - emae->account->enabled = TRUE; - - e_account_set_string ( - emae->account, E_ACCOUNT_DRAFTS_FOLDER_URI, - e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS)); - - e_account_set_string ( - emae->account, E_ACCOUNT_SENT_FOLDER_URI, - e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT)); - } - - /* sort the providers, remote first */ - gui->providers = g_list_sort(camel_provider_list(TRUE), (GCompareFunc)provider_compare); - - 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_DRUID, id); - items = emae_druid_items; - if (!emae_druid_items_translated) { - for (i=0;items[i].path;i++) { - if (items[i].label) - items[i].label = _(items[i].label); - } - emae_druid_items_translated = TRUE; - } - } - - emae->config = gui->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_commit, NULL, 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=gui->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, NULL, NULL, emae_free_auto, emae); - gui->extra_items = l; - - e_config_add_page_check((EConfig *)ec, NULL, emae_check_complete, emae); - - target = em_config_target_new_account(ec, emae->account); - e_config_set_target((EConfig *)ec, (EConfigTarget *)target); - - if (type != EMAE_PAGES) { - emae->editor = e_config_create_window((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); - g_signal_connect(emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); - } else { - e_config_create_widget((EConfig *)ec); - } -} -- cgit v1.2.3 From 8dc6bbd250891bcef9130a789c9b74a01be7f1cb Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 30 Jun 2009 10:47:59 -0400 Subject: Get the "startup-wizard" plugin working again. --- mail/em-account-editor.c | 3388 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3388 insertions(+) create mode 100644 mail/em-account-editor.c (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c new file mode 100644 index 0000000000..e835d28a87 --- /dev/null +++ b/mail/em-account-editor.c @@ -0,0 +1,3388 @@ +/* + * 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 + * + * + * Authors: + * Dan Winship + * Jeffrey Stedfast + * Michael Zucchi + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + +/* + work before merge can occur: + + verify behaviour. + work out what to do with the startup druid. + + 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 +#endif + +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +#include "shell/e-shell.h" +#include "e-util/e-error.h" +#include "e-util/e-account-utils.h" +#include "e-util/e-signature-list.h" +#include "e-util/e-signature-utils.h" +#include "e-util/e-util-private.h" +#include "widgets/misc/e-signature-editor.h" + +#include "e-mail-local.h" +#include "em-config.h" +#include "em-folder-selection-button.h" +#include "em-account-editor.h" +#include "mail-session.h" +#include "mail-send-recv.h" +#include "em-utils.h" +#include "mail-config.h" +#include "mail-ops.h" +#include "mail-mt.h" + +#if defined (HAVE_NSS) +#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)) + +#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 *userlabel; + GtkEntry *username; + GtkEntry *path; + 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; + + GtkWidget *check_dialog; + gint check_id; + + GList *authtypes; /* if "Check supported" */ + CamelProvider *provider; + CamelProviderType type; + + gint auth_changed_id; +} EMAccountEditorService; + +struct _EMAccountEditorPrivate { + + EAccount *modified_account; + EAccount *original_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; + 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; + + /* for e-config callbacks, each page sets up its widgets, then they are dealed out by the get_widget callback in order*/ + GtkWidget *widgets[5]; + const gchar *widgets_name[5]; + gint widgets_index; + + /* for druid page preparation */ + guint identity_set:1; + guint receive_set:1; + guint management_set:1; +}; + +enum { + PROP_0, + PROP_MODIFIED_ACCOUNT, + PROP_ORIGINAL_ACCOUNT, + PROP_SHELL +}; + +static void emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service); +static void em_account_editor_construct (EMAccountEditor *emae, EMAccountEditorType type, const gchar *id); +static void emae_account_folder_changed (EMFolderSelectionButton *folder, EMAccountEditor *emae); + +static gpointer parent_class; + +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); + emae->do_signature = TRUE; + + /* Creating a new account. */ + } else { + modified_account = e_account_new (); + modified_account->enabled = TRUE; + + e_account_set_string ( + modified_account, E_ACCOUNT_DRAFTS_FOLDER_URI, + e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS)); + + e_account_set_string ( + modified_account, E_ACCOUNT_SENT_FOLDER_URI, + e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT)); + } + + emae->priv->original_account = original_account; + emae->priv->modified_account = modified_account; +} + +static void +emae_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_ORIGINAL_ACCOUNT: + emae_set_original_account ( + EM_ACCOUNT_EDITOR (object), + g_value_get_object (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_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; + } + + 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->modified_account != NULL) { + 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; + } + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +emae_finalize (GObject *object) +{ + EMAccountEditor *emae = EM_ACCOUNT_EDITOR (object); + EMAccountEditorPrivate *priv = emae->priv; + + 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->source.authtypes); + g_list_free (priv->transport.authtypes); + + g_list_free (priv->providers); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +emae_class_init (GObjectClass *class) +{ + GObjectClass *object_class; + + parent_class = g_type_class_peek_parent (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; + + 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_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)); +} + +static void +emae_init (EMAccountEditor *emae) +{ + emae->priv = EM_ACCOUNT_EDITOR_GET_PRIVATE (emae); + + emae->priv->source.emae = emae; + emae->priv->transport.emae = emae; +} + +GType +em_account_editor_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + static const GTypeInfo type_info = { + sizeof (EMAccountEditorClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) emae_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EMAccountEditor), + 0, /* n_preallocs */ + (GInstanceInitFunc) emae_init, + NULL /* value_table */ + }; + + type = g_type_register_static ( + G_TYPE_OBJECT, "EMAccountEditor", &type_info, 0); + } + + return type; +} + +/** + * 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, + const gchar *id) +{ + EMAccountEditor *emae; + + emae = g_object_new ( + EM_TYPE_ACCOUNT_EDITOR, + "original-account", account, 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, + const gchar *id, + GtkWidget **pages) +{ + EMAccountEditor *emae; + + emae = g_object_new ( + EM_TYPE_ACCOUNT_EDITOR, + "original-account", account, NULL); + + emae->pages = pages; + em_account_editor_construct (emae, type, id); + + return emae; +} + +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 struct { + const gchar *label; + const gchar *value; +} ssl_options[] = { + /* Translators: This string is a "Use secure connection" option for + the Mailer. It will not use an encrypted connection. */ + { N_("No encryption"), "never" }, + /* Translators: This string is a "Use secure connection" option for + the Mailer. TLS (Transport Layer Security) is commonly known by + this abbreviation. */ + { N_("TLS encryption"), "when-possible" }, + /* Translators: This string is a "Use secure connection" option for + the Mailer. SSL (Secure Sockets Layer) is commonly known by this + abbreviation. */ + { N_("SSL encryption"), "always" } +}; + +#define num_ssl_options (sizeof (ssl_options) / sizeof (ssl_options[0])) + +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); + + if (uri && 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 +emae_license_state (GtkToggleButton *button, GtkDialog *dialog) +{ + gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_ACCEPT, + gtk_toggle_button_get_active (button)); +} + +static gboolean +emae_load_text (GtkTextView *view, const gchar *filename) +{ + FILE *fd; + gchar filebuf[1024]; + GtkTextIter iter; + GtkTextBuffer *buffer; + gint count; + + g_return_val_if_fail (filename != NULL , FALSE); + + fd = g_fopen (filename, "r"); + if (fd) { + buffer = gtk_text_buffer_new (NULL); + gtk_text_buffer_get_start_iter (buffer, &iter); + while (!feof (fd) && !ferror (fd)) { + count = fread (filebuf, 1, sizeof (filebuf), fd); + gtk_text_buffer_insert (buffer, &iter, filebuf, count); + } + + gtk_text_view_set_buffer (GTK_TEXT_VIEW (view), GTK_TEXT_BUFFER(buffer)); + fclose (fd); + } + + return fd != NULL; +} + +static gboolean +emae_display_license (EMAccountEditor *emae, CamelProvider *prov) +{ + GladeXML *xml; + GtkWidget *w, *dialog; + gchar *tmp; + GtkResponseType response = GTK_RESPONSE_NONE; + gchar *gladefile; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-dialogs.glade", + NULL); + xml = glade_xml_new (gladefile, "license_dialog", NULL); + g_free (gladefile); + + dialog = glade_xml_get_widget (xml, "license_dialog"); + gtk_dialog_set_response_sensitive ((GtkDialog *)dialog, GTK_RESPONSE_ACCEPT, FALSE); + tmp = g_strdup_printf (_("%s License Agreement"), prov->license); + gtk_window_set_title ((GtkWindow *)dialog, tmp); + g_free (tmp); + + g_signal_connect (glade_xml_get_widget (xml, "license_checkbutton"), + "toggled", G_CALLBACK(emae_license_state), dialog); + + tmp = g_strdup_printf (_("\nPlease read carefully the license agreement\n" + "for %s displayed below\n" + "and tick the check box for accepting it\n"), prov->license); + gtk_label_set_text ((GtkLabel *)glade_xml_get_widget (xml, "license_top_label"), tmp); + g_free (tmp); + + w = glade_xml_get_widget (xml, "license_textview"); + if (emae_load_text ((GtkTextView *)w, prov->license_file)) { + gtk_text_view_set_editable ((GtkTextView *)w, FALSE); + response = gtk_dialog_run ((GtkDialog *)dialog); + } else { + e_error_run (emae->editor ? (GtkWindow *)gtk_widget_get_toplevel (emae->editor) : NULL, + "mail:no-load-license", prov->license_file, NULL); + } + + gtk_widget_destroy (dialog); + g_object_unref (xml); + + return (response == GTK_RESPONSE_ACCEPT); +} + +static gboolean +emae_check_license (EMAccountEditor *emae, CamelProvider *prov) +{ + gboolean accepted = TRUE; + + if (prov->flags & CAMEL_PROVIDER_HAS_LICENSE) { + GConfClient *gconf = mail_config_get_gconf_client (); + GSList *providers_list, *l; + + providers_list = gconf_client_get_list (gconf, "/apps/evolution/mail/licenses", GCONF_VALUE_STRING, NULL); + + for (l = providers_list, accepted = FALSE; l && !accepted; l = g_slist_next (l)) + accepted = (strcmp ((gchar *)l->data, prov->protocol) == 0); + + if (!accepted + && (accepted = emae_display_license (emae, prov)) == TRUE) { + providers_list = g_slist_append (providers_list, g_strdup (prov->protocol)); + gconf_client_set_list (gconf, + "/apps/evolution/mail/licenses", + GCONF_VALUE_STRING, + providers_list, NULL); + } + + g_slist_foreach (providers_list, (GFunc)g_free, NULL); + g_slist_free (providers_list); + } + + return accepted; +} + +static void +default_folders_clicked (GtkButton *button, gpointer user_data) +{ + EMAccountEditor *emae = user_data; + const gchar *uri; + + uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_DRAFTS); + em_folder_selection_button_set_selection ((EMFolderSelectionButton *)emae->priv->drafts_folder_button, uri); + emae_account_folder_changed ((EMFolderSelectionButton *)emae->priv->drafts_folder_button, emae); + + uri = e_mail_local_get_folder_uri (E_MAIL_FOLDER_SENT); + em_folder_selection_button_set_selection ((EMFolderSelectionButton *)emae->priv->sent_folder_button, uri); + emae_account_folder_changed ((EMFolderSelectionButton *)emae->priv->sent_folder_button, emae); +} + +/* custom widget factories */ +GtkWidget *em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); + +GtkWidget * +em_account_editor_folder_selector_button_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) +{ + return (GtkWidget *)em_folder_selection_button_new ( + string1 ? string1 : _("Select Folder"), NULL); +} + +GtkWidget *em_account_editor_dropdown_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); + +GtkWidget * +em_account_editor_dropdown_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) +{ + return gtk_combo_box_new (); +} + +GtkWidget *em_account_editor_ssl_selector_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); + +GtkWidget * +em_account_editor_ssl_selector_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) +{ + GtkComboBox *dropdown = (GtkComboBox *)gtk_combo_box_new (); + GtkCellRenderer *cell = gtk_cell_renderer_text_new (); + GtkListStore *store; + gint i; + GtkTreeIter iter; + + gtk_widget_show ((GtkWidget *)dropdown); + + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + + for (i=0;ipriv; + EMAccountEditorService *service = &gui->source; + GHashTable *auto_detected; + GSList *l; + CamelProviderConfEntry *entries; + gchar *value; + gint i; + CamelURL *url; + + if (service->provider == NULL + || (entries = service->provider->extra_conf) == NULL) + return; + + d (printf ("Running auto-detect\n")); + + url = emae_account_url (emae, E_ACCOUNT_SOURCE_URL); + camel_provider_auto_detect (service->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 gint +provider_compare (const CamelProvider *p1, const CamelProvider *p2) +{ + /* sort providers based on "location" (ie. local or remote) */ + 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 void +emae_signature_added (ESignatureList *signatures, ESignature *sig, EMAccountEditor *emae) +{ + GtkTreeModel *model; + GtkTreeIter iter; + + 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, sig->autogen?_("Autogenerated"):sig->name, 1, sig->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 { + gchar *uid; + + gtk_tree_model_get (model, iter, 1, &uid, -1); + if (uid && !strcmp (uid, sig->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; + + if (emae_signature_get_iter (emae, sig, &model, &iter)) + gtk_list_store_set ((GtkListStore *)model, &iter, 0, sig->autogen?_("Autogenerated"):sig->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) +{ + EShell *shell; + EShellSettings *shell_settings; + GtkWidget *editor; + gboolean html_mode; + gpointer parent; + + shell = e_shell_get_default (); + shell_settings = e_shell_get_shell_settings (shell); + + parent = gtk_widget_get_toplevel (widget); + parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; + + html_mode = e_shell_settings_get_boolean ( + shell_settings, "composer-format-html"); + + editor = e_signature_editor_new (); + gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (editor), html_mode); + gtk_window_set_transient_for (GTK_WINDOW (editor), parent); + gtk_widget_show (editor); +} + +static GtkWidget * +emae_setup_signatures (EMAccountEditor *emae, GladeXML *xml) +{ + EMAccountEditorPrivate *p = emae->priv; + EAccount *account; + GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget (xml, "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); + gtk_list_store_set (store, &iter, 0, _("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); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1); + + if (current && !strcmp (current, sig->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); + gtk_widget_set_sensitive ((GtkWidget *)dropdown, e_account_writable (account, E_ACCOUNT_ID_SIGNATURE)); + + button = glade_xml_get_widget (xml, "sigAddNew"); + g_signal_connect (button, "clicked", G_CALLBACK(emae_signature_new), emae); + gtk_widget_set_sensitive (button, + gconf_client_key_is_writable (mail_config_get_gconf_client (), + "/apps/evolution/mail/signatures", NULL)); + + 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, GladeXML *xml) +{ + EAccount *account; + GtkComboBox *dropdown = (GtkComboBox *)glade_xml_get_widget (xml, "receipt_policy_dropdown"); + GtkListStore *store; + 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); + gtk_combo_box_set_active (dropdown, active); + + g_signal_connect (dropdown, "changed", G_CALLBACK(emae_receipt_policy_changed), emae); + gtk_widget_set_sensitive ((GtkWidget *)dropdown, e_account_writable (account, E_ACCOUNT_RECEIPT_POLICY)); + + return (GtkWidget *)dropdown; +} + +static void +emae_account_entry_changed (GtkEntry *entry, EMAccountEditor *emae) +{ + EAccount *account; + const gchar *text; + gpointer data; + + account = em_account_editor_get_modified_account (emae); + data = g_object_get_data (G_OBJECT (entry), "account-item"); + text = gtk_entry_get_text (entry); + + e_account_set_string (account, GPOINTER_TO_INT (data), text); +} + +static GtkEntry * +emae_account_entry (EMAccountEditor *emae, const gchar *name, gint item, GladeXML *xml) +{ + EAccount *account; + GtkEntry *entry; + const gchar *text; + + account = em_account_editor_get_modified_account (emae); + entry = (GtkEntry *)glade_xml_get_widget (xml, 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); + gtk_widget_set_sensitive ((GtkWidget *)entry, e_account_writable (account, item)); + + 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; + gboolean writable; + + account = em_account_editor_get_modified_account (emae); + + active = e_account_get_bool (account, item); + gtk_toggle_button_set_active (toggle, active); + + writable = e_account_writable (account, item); + gtk_widget_set_sensitive (GTK_WIDGET (toggle), writable); + + 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, GladeXML *xml) +{ + GtkToggleButton *toggle; + + toggle = (GtkToggleButton *)glade_xml_get_widget (xml, 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; + gboolean writable; + 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); + + writable = e_account_writable (account, item); + gtk_widget_set_sensitive (GTK_WIDGET (spin), writable); + + 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); +} + +#if 0 +static GtkSpinButton * +emae_account_spinint (EMAccountEditor *emae, const gchar *name, gint item) +{ + GtkSpinButton *spin; + + spin = (GtkSpinButton *)glade_xml_get_widget (emae->priv->xml, name); + emae_account_spinint_widget (emae, spin, item); + + return spin; +} +#endif + +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_selection (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, GladeXML *xml) +{ + EAccount *account; + EMFolderSelectionButton *folder; + const gchar *uri; + + account = em_account_editor_get_modified_account (emae); + folder = (EMFolderSelectionButton *)glade_xml_get_widget (xml, name); + uri = e_account_get_string (account, item); + if (uri) { + gchar *tmp = em_uri_to_camel (uri); + + em_folder_selection_button_set_selection (folder, tmp); + g_free (tmp); + } else { + const gchar *uri; + + uri = e_mail_local_get_folder_uri (deffolder); + em_folder_selection_button_set_selection (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); + + gtk_widget_set_sensitive ((GtkWidget *)folder, e_account_writable (account, item)); + + return folder; +} + +#if defined (HAVE_NSS) +static void +smime_changed (EMAccountEditor *emae) +{ + EMAccountEditorPrivate *gui = emae->priv; + gint act; + const gchar *tmp; + + tmp = gtk_entry_get_text (gui->smime_sign_key); + act = tmp && tmp[0]; + gtk_widget_set_sensitive ((GtkWidget *)gui->smime_sign_key_clear, act); + gtk_widget_set_sensitive ((GtkWidget *)gui->smime_sign_default, act); + if (!act) + gtk_toggle_button_set_active (gui->smime_sign_default, FALSE); + + tmp = gtk_entry_get_text (gui->smime_encrypt_key); + act = tmp && tmp[0]; + gtk_widget_set_sensitive ((GtkWidget *)gui->smime_encrypt_key_clear, act); + gtk_widget_set_sensitive ((GtkWidget *)gui->smime_encrypt_default, act); + gtk_widget_set_sensitive ((GtkWidget *)gui->smime_encrypt_to_self, act); + if (!act) { + gtk_toggle_button_set_active (gui->smime_encrypt_default, FALSE); + gtk_toggle_button_set_active (gui->smime_encrypt_to_self, FALSE); + } +} + +static void +smime_sign_key_selected (GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) +{ + EMAccountEditorPrivate *gui = emae->priv; + + if (key != NULL) { + gtk_entry_set_text (gui->smime_sign_key, key); + smime_changed (emae); + } + + gtk_widget_destroy (dialog); +} + +static void +smime_sign_key_select (GtkWidget *button, EMAccountEditor *emae) +{ + EMAccountEditorPrivate *gui = emae->priv; + GtkWidget *w; + + w = e_cert_selector_new (E_CERT_SELECTOR_SIGNER, gtk_entry_get_text (gui->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 *gui = emae->priv; + + gtk_entry_set_text (gui->smime_sign_key, ""); + smime_changed (emae); +} + +static void +smime_encrypt_key_selected (GtkWidget *dialog, const gchar *key, EMAccountEditor *emae) +{ + EMAccountEditorPrivate *gui = emae->priv; + + if (key != NULL) { + gtk_entry_set_text (gui->smime_encrypt_key, key); + smime_changed (emae); + } + + gtk_widget_destroy (dialog); +} + +static void +smime_encrypt_key_select (GtkWidget *button, EMAccountEditor *emae) +{ + EMAccountEditorPrivate *gui = emae->priv; + GtkWidget *w; + + w = e_cert_selector_new (E_CERT_SELECTOR_SIGNER, gtk_entry_get_text (gui->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 *gui = emae->priv; + + gtk_entry_set_text (gui->smime_encrypt_key, ""); + smime_changed (emae); +} +#endif + +static void +emae_url_set_hostport (CamelURL *url, const gchar *txt) +{ + const gchar *port; + gchar *host; + + /* FIXME: what if this was a raw IPv6 address? */ + if (txt && (port = strchr (txt, ':'))) { + camel_url_set_port (url, atoi (port+1)); + host = g_strdup (txt); + host[port-txt] = 0; + } else { + /* "" is converted to NULL, but if we set NULL on the url, + camel_url_to_string strips lots of details */ + host = g_strdup ((txt?txt:"")); + camel_url_set_port (url, 0); + } + + g_strstrip (host); + if (txt && *txt) + camel_url_set_host (url, host); + + g_free (host); +} + +/* This is used to map a funciton which will set on the url a string value. + if widgets[0] is set, it is the entry which will be called against setval () + We need our own function for host:port decoding, as above */ +struct _provider_host_info { + guint32 flag; + void (*setval)(CamelURL *, const gchar *); + glong widgets[3]; +}; + +static struct _provider_host_info emae_source_host_info[] = { + { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, }, + { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } }, + { CAMEL_URL_PART_PATH, camel_url_set_path, { G_STRUCT_OFFSET(EMAccountEditorService, path), G_STRUCT_OFFSET(EMAccountEditorService, pathlabel), G_STRUCT_OFFSET(EMAccountEditorService, pathentry) }, }, + { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, }, + { 0 }, +}; + +static struct _provider_host_info emae_transport_host_info[] = { + { CAMEL_URL_PART_HOST, emae_url_set_hostport, { G_STRUCT_OFFSET(EMAccountEditorService, hostname), G_STRUCT_OFFSET(EMAccountEditorService, hostlabel), }, }, + { CAMEL_URL_PART_USER, camel_url_set_user, { G_STRUCT_OFFSET(EMAccountEditorService, username), G_STRUCT_OFFSET(EMAccountEditorService, userlabel), } }, + { CAMEL_URL_PART_AUTH, NULL, { 0, G_STRUCT_OFFSET(EMAccountEditorService, auth_frame), }, }, + { 0 }, +}; + +/* 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 *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; + + struct _provider_host_info *host_info; +} emae_service_info[CAMEL_NUM_PROVIDER_TYPES] = { + { E_ACCOUNT_SOURCE_URL, E_ACCOUNT_SOURCE_SAVE_PASSWD, + "source_frame", "source_type_dropdown", + "source_vbox", "source_description", "source_host", "source_host_label", "source_user", "source_user_label", "source_path", "source_path_label", "source_path_entry", + "source_security_frame", "source_ssl_hbox", "source_use_ssl", "source_ssl_disabled", + NULL, "source_auth_frame", + "source_auth_dropdown", "source_check_supported", + "source_remember_password", + emae_source_host_info, + }, + { E_ACCOUNT_TRANSPORT_URL, E_ACCOUNT_TRANSPORT_SAVE_PASSWD, + "transport_frame", "transport_type_dropdown", + "transport_vbox", "transport_description", "transport_host", "transport_host_label", "transport_user", "transport_user_label", NULL, NULL, NULL, + "transport_security_frame", "transport_ssl_hbox", "transport_use_ssl", "transport_ssl_disabled", + "transport_needs_auth", "transport_auth_frame", + "transport_auth_dropdown", "transport_check_supported", + "transport_remember_password", + emae_transport_host_info, + }, +}; + +static void +emae_uri_changed (EMAccountEditorService *service, CamelURL *url) +{ + EAccount *account; + gchar *uri; + + account = em_account_editor_get_modified_account (service->emae); + uri = camel_url_to_string (url, 0); + + e_account_set_string (account, emae_service_info[service->type].account_uri_key, uri); + + /* small hack for providers which are store and transport - copy settings across */ + if (service->type == CAMEL_PROVIDER_STORE + && service->provider + && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(service->provider)) + e_account_set_string (account, E_ACCOUNT_TRANSPORT_URL, uri); + + g_free (uri); +} + +static void +emae_service_url_changed (EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkEntry *entry) +{ + GtkComboBox *dropdown; + gint id; + GtkTreeModel *model; + GtkTreeIter iter; + CamelServiceAuthType *authtype; + + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + const gchar *text = gtk_entry_get_text (entry); + + setval (url, (text && text[0])?text:NULL); + + if (text && text[0] && setval == camel_url_set_user) { + dropdown = service->authtype; + if (dropdown) { + id = gtk_combo_box_get_active (dropdown); + 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, &authtype, -1); + if (authtype) + camel_url_set_authmech (url, authtype->authproto); + } + } + } + } + + emae_uri_changed (service, url); + camel_url_free (url); +} + +static void +emae_service_url_path_changed (EMAccountEditorService *service, void (*setval)(CamelURL *, const gchar *), GtkWidget *widget) +{ + GtkComboBox *dropdown; + gint id; + GtkTreeModel *model; + GtkTreeIter iter; + CamelServiceAuthType *authtype; + + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + const gchar *text = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget)); + + setval (url, (text && text[0])?text:NULL); + + if (text && text[0] && setval == camel_url_set_user) { + dropdown = service->authtype; + if (dropdown) { + id = gtk_combo_box_get_active (dropdown); + 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, &authtype, -1); + if (authtype) + camel_url_set_authmech (url, authtype->authproto); + } + } + } + } + + emae_uri_changed (service, url); + camel_url_free (url); +} + +static void +emae_hostname_changed (GtkEntry *entry, EMAccountEditorService *service) +{ + emae_service_url_changed (service, emae_url_set_hostport, entry); +} + +static void +emae_username_changed (GtkEntry *entry, EMAccountEditorService *service) +{ + emae_service_url_changed (service, camel_url_set_user, entry); +} + +static void +emae_path_changed (GtkWidget *widget, EMAccountEditorService *service) +{ + emae_service_url_path_changed (service, camel_url_set_path, widget); +} + +static gint +emae_ssl_update (EMAccountEditorService *service, CamelURL *url) +{ + gint id = gtk_combo_box_get_active (service->use_ssl); + GtkTreeModel *model; + GtkTreeIter iter; + gchar *ssl; + + if (id == -1) + return 0; + + model = gtk_combo_box_get_model (service->use_ssl); + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) { + gtk_tree_model_get (model, &iter, 1, &ssl, -1); + if (!strcmp (ssl, "none")) + ssl = NULL; + camel_url_set_param (url, "use_ssl", ssl); + return 1; + } + + return 0; +} + +static void +emae_ssl_changed (GtkComboBox *dropdown, EMAccountEditorService *service) +{ + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + if (emae_ssl_update (service, url)) + emae_uri_changed (service, url); + camel_url_free (url); +} + +static void +emae_service_provider_changed (EMAccountEditorService *service) +{ + EAccount *account; + gint i, j; + void (*show)(GtkWidget *); + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + account = em_account_editor_get_modified_account (service->emae); + + if (service->provider) { + gint enable; + GtkWidget *dwidget = NULL; + + camel_url_set_protocol (url, service->provider->protocol); + gtk_label_set_text (service->description, service->provider->description); + if (!emae_check_license (service->emae, service->provider)) + gtk_widget_hide (service->frame); + else + gtk_widget_show (service->frame); + + enable = e_account_writable_option (account, service->provider->protocol, "auth"); + gtk_widget_set_sensitive ((GtkWidget *)service->authtype, enable); + gtk_widget_set_sensitive ((GtkWidget *)service->check_supported, enable); + + enable = e_account_writable_option (account, service->provider->protocol, "use_ssl"); + gtk_widget_set_sensitive ((GtkWidget *)service->use_ssl, enable); + + enable = e_account_writable (account, emae_service_info[service->type].save_passwd_key); + gtk_widget_set_sensitive ((GtkWidget *)service->remember, enable); + + for (i=0;emae_service_info[service->type].host_info[i].flag;i++) { + GtkWidget *w; + gint hide; + struct _provider_host_info *info = &emae_service_info[service->type].host_info[i]; + + enable = CAMEL_PROVIDER_ALLOWS(service->provider, info->flag); + hide = CAMEL_PROVIDER_HIDDEN(service->provider, info->flag); + show = (enable && !hide)?gtk_widget_show:gtk_widget_hide; + + for (j=0; j < sizeof (info->widgets)/sizeof (info->widgets[0]); j++) { + if (info->widgets[j] && (w = G_STRUCT_MEMBER(GtkWidget *, service, info->widgets[j]))) { + show (w); + if (j == 0) { + if (dwidget == NULL && enable) + dwidget = w; + + if (info->setval && !hide) + info->setval (url, enable?gtk_entry_get_text ((GtkEntry *)w):NULL); + } + } + } + } + + if (dwidget) + gtk_widget_grab_focus (dwidget); + + if (CAMEL_PROVIDER_ALLOWS(service->provider, CAMEL_URL_PART_AUTH)) { + GList *ll; + + /* try to keep the authmech from the current url, or clear it */ + if (url->authmech) { + if (service->provider->authtypes) { + for (ll = service->provider->authtypes;ll;ll = g_list_next (ll)) + if (!strcmp (url->authmech, ((CamelServiceAuthType *)ll->data)->authproto)) + break; + if (ll == NULL) + camel_url_set_authmech (url, NULL); + } else { + camel_url_set_authmech (url, NULL); + } + } + + emae_refresh_authtype (service->emae, service); + if (service->needs_auth && !CAMEL_PROVIDER_NEEDS(service->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 + gtk_widget_hide (service->no_ssl); + if (service->provider->flags & CAMEL_PROVIDER_SUPPORTS_SSL) { + emae_ssl_update (service, url); + show = gtk_widget_show; + } else { + camel_url_set_param (url, "use_ssl", NULL); + show = gtk_widget_hide; + } + show (service->ssl_frame); + show (service->ssl_hbox); +#else + gtk_widget_hide (service->ssl_hbox); + gtk_widget_show (service->no_ssl); + camel_url_set_param (url, "use_ssl", NULL); +#endif + } else { + camel_url_set_protocol (url, NULL); + gtk_label_set_text (service->description, ""); + gtk_widget_hide (service->frame); + gtk_widget_hide (service->auth_frame); + gtk_widget_hide (service->ssl_frame); + } + + /* FIXME: linked services? */ + /* FIXME: permissions setup */ + + emae_uri_changed (service, url); + camel_url_free (url); +} + +static void +emae_provider_changed (GtkComboBox *dropdown, EMAccountEditorService *service) +{ + gint id = gtk_combo_box_get_active (dropdown); + GtkTreeModel *model; + GtkTreeIter iter; + + if (id == -1) + return; + + model = gtk_combo_box_get_model (dropdown); + if (!gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) + return; + + gtk_tree_model_get (model, &iter, 1, &service->provider, -1); + + g_list_free (service->authtypes); + service->authtypes = NULL; + + 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) +{ + EAccount *account; + GtkListStore *store; + GtkTreeIter iter; + GList *l; + GtkCellRenderer *cell = gtk_cell_renderer_text_new (); + GtkComboBox *dropdown; + gint active = 0, i; + struct _service_info *info = &emae_service_info[service->type]; + const gchar *uri; + gchar *current = NULL; + const gchar *tmp; + CamelURL *url; + + account = em_account_editor_get_modified_account (emae); + uri = e_account_get_string (account, info->account_uri_key); + + dropdown = service->providers; + gtk_widget_show ((GtkWidget *)dropdown); + + if (uri) { + const gchar *colon = strchr (uri, ':'); + gint len; + + if (colon) { + len = colon-uri; + current = g_alloca (len+1); + memcpy (current, uri, len); + current[len] = 0; + } + } else { + current = (gchar *) "imap"; + } + + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + + i = 0; + + /* We just special case each type here, its just easier */ + if (service->type == CAMEL_PROVIDER_STORE) { + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, _("None"), 1, NULL, -1); + i++; + } + + for (l=emae->priv->providers; l; l=l->next) { + CamelProvider *provider = l->data; + + if (!((strcmp (provider->domain, "mail") == 0 + || strcmp (provider->domain, "news") == 0) + && 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_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, provider->name, 1, provider, -1); + + /* find the displayed and set default */ + if (i == 0 || (current && strcmp (provider->protocol, current) == 0)) { + service->provider = provider; + active = i; + + /* we need to set this value on the uri too */ + if (current == NULL) { + CamelURL *url = emae_account_url (emae, info->account_uri_key); + + camel_url_set_protocol (url, provider->protocol); + emae_uri_changed (service, url); + camel_url_free (url); + } + } + i++; + } + + + gtk_cell_layout_clear ((GtkCellLayout *)dropdown); + gtk_combo_box_set_model (dropdown, (GtkTreeModel *)store); + gtk_cell_layout_pack_start ((GtkCellLayout *)dropdown, cell, TRUE); + gtk_cell_layout_set_attributes ((GtkCellLayout *)dropdown, cell, "text", 0, NULL); + + g_signal_handlers_disconnect_by_func (dropdown, emae_provider_changed, service); + gtk_combo_box_set_active (dropdown, -1); /* needed for gtkcombo bug (?) */ + gtk_combo_box_set_active (dropdown, active); + g_signal_connect (dropdown, "changed", G_CALLBACK(emae_provider_changed), service); + + if (!uri || (url = camel_url_new (uri, NULL)) == NULL) { + return; + } + + tmp = camel_url_get_param (url, "use_ssl"); + if (tmp == NULL) + tmp = "never"; + for (i=0;iuse_ssl, i); + break; + } + } +} + +static void +emae_authtype_changed (GtkComboBox *dropdown, EMAccountEditorService *service) +{ + EAccount *account; + gint id = gtk_combo_box_get_active (dropdown); + GtkTreeModel *model; + GtkTreeIter iter; + CamelServiceAuthType *authtype; + CamelURL *url; + + if (id == -1) + return; + + account = em_account_editor_get_modified_account (service->emae); + + url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + 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, &authtype, -1); + if (authtype) + camel_url_set_authmech (url, authtype->authproto); + else + camel_url_set_authmech (url, NULL); + emae_uri_changed (service, url); + } + camel_url_free (url); + + gtk_widget_set_sensitive ((GtkWidget *)service->remember, + authtype + ?(authtype->need_password && e_account_writable (account, emae_service_info[service->type].save_passwd_key)) + :FALSE); +} + +static void +emae_needs_auth (GtkToggleButton *toggle, EMAccountEditorService *service) +{ + gint need = gtk_toggle_button_get_active (toggle); + + gtk_widget_set_sensitive (service->auth_frame, need); + + if (need) + emae_authtype_changed (service->authtype, service); + else { + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + camel_url_set_authmech (url, NULL); + emae_uri_changed (service, url); + camel_url_free (url); + } +} + +static void emae_check_authtype (GtkWidget *w, EMAccountEditorService *service); + +static void +emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service) +{ + EAccount *account; + GtkListStore *store; + GtkTreeIter iter; + GtkComboBox *dropdown; + gint active = 0; + gint i; + struct _service_info *info = &emae_service_info[service->type]; + const gchar *uri; + GList *l, *ll; + CamelURL *url = NULL; + + account = em_account_editor_get_modified_account (emae); + uri = e_account_get_string (account, info->account_uri_key); + + dropdown = service->authtype; + gtk_widget_show ((GtkWidget *)dropdown); + + store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); + + if (uri) + url = camel_url_new (uri, NULL); + + if (service->provider) { + for (i=0, l=service->provider->authtypes; l; l=l->next, i++) { + CamelServiceAuthType *authtype = l->data; + gint avail; + + /* if we have some already shown */ + if (service->authtypes) { + for (ll = service->authtypes;ll;ll = g_list_next (ll)) + if (!strcmp (authtype->authproto, ((CamelServiceAuthType *)ll->data)->authproto)) + break; + avail = ll != NULL; + } else { + avail = TRUE; + } + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, authtype->name, 1, authtype, 2, !avail, -1); + + if (url && url->authmech && !strcmp (url->authmech, authtype->authproto)) + active = i; + } + } + + gtk_combo_box_set_model (dropdown, (GtkTreeModel *)store); + gtk_combo_box_set_active (dropdown, -1); + + if (service->auth_changed_id == 0) { + GtkCellRenderer *cell = gtk_cell_renderer_text_new (); + + gtk_cell_layout_pack_start ((GtkCellLayout *)dropdown, cell, TRUE); + gtk_cell_layout_set_attributes ((GtkCellLayout *)dropdown, cell, "text", 0, "strikethrough", 2, NULL); + + service->auth_changed_id = g_signal_connect (dropdown, "changed", G_CALLBACK(emae_authtype_changed), service); + g_signal_connect (service->check_supported, "clicked", G_CALLBACK(emae_check_authtype), service); + } + + gtk_combo_box_set_active (dropdown, active); + + if (url) + camel_url_free (url); +} + +static void emae_check_authtype_done (const gchar *uri, CamelProviderType type, GList *types, gpointer data) +{ + EMAccountEditorService *service = data; + + if (service->check_dialog) { + if (service->authtypes) + g_list_free (service->authtypes); + + service->authtypes = g_list_copy (types); + emae_refresh_authtype (service->emae, service); + gtk_widget_destroy (service->check_dialog); + } + + if (service->emae->editor) + gtk_widget_set_sensitive (service->emae->editor, TRUE); + + service->check_id = -1; + g_object_unref (service->emae); +} + +static void emae_check_authtype_response (GtkWidget *d, gint button, EMAccountEditorService *service) +{ + mail_msg_cancel (service->check_id); + gtk_widget_destroy (service->check_dialog); + service->check_dialog = NULL; + + if (service->emae->editor) + gtk_widget_set_sensitive (service->emae->editor, TRUE); +} + +static void emae_check_authtype (GtkWidget *w, EMAccountEditorService *service) +{ + EMAccountEditor *emae = service->emae; + EAccount *account; + const gchar *uri; + + account = em_account_editor_get_modified_account (emae); + + /* TODO: do we need to remove the auth mechanism from the uri? */ + uri = e_account_get_string (account, emae_service_info[service->type].account_uri_key); + g_object_ref (emae); + + service->check_dialog = e_error_new (emae->editor ? (GtkWindow *)gtk_widget_get_toplevel (emae->editor) : NULL, + "mail:checking-service", NULL); + g_signal_connect (service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service); + gtk_widget_show (service->check_dialog); + if (emae->editor) + gtk_widget_set_sensitive (emae->editor, FALSE); + service->check_id = mail_check_service (uri, service->type, emae_check_authtype_done, service); +} + +static void +emae_setup_service (EMAccountEditor *emae, EMAccountEditorService *service, GladeXML *xml) +{ + EAccount *account; + struct _service_info *info = &emae_service_info[service->type]; + CamelURL *url = emae_account_url (emae, info->account_uri_key); + const gchar *uri; + const gchar *tmp; + gint i; + + account = em_account_editor_get_modified_account (emae); + uri = e_account_get_string (account, info->account_uri_key); + + service->provider = uri?camel_provider_get (uri, NULL):NULL; + service->frame = glade_xml_get_widget (xml, info->frame); + service->container = glade_xml_get_widget (xml, info->container); + service->description = GTK_LABEL (glade_xml_get_widget (xml, info->description)); + service->hostname = GTK_ENTRY (glade_xml_get_widget (xml, info->hostname)); + service->hostlabel = (GtkLabel *)glade_xml_get_widget (xml, info->hostlabel); + service->username = GTK_ENTRY (glade_xml_get_widget (xml, info->username)); + service->userlabel = (GtkLabel *)glade_xml_get_widget (xml, info->userlabel); + if (info->pathentry) { + service->pathlabel = (GtkLabel *)glade_xml_get_widget (xml, info->pathlabel); + service->pathentry = glade_xml_get_widget (xml, info->pathentry); + } + + service->ssl_frame = glade_xml_get_widget (xml, info->security_frame); + gtk_widget_hide (service->ssl_frame); + service->ssl_hbox = glade_xml_get_widget (xml, info->ssl_hbox); + service->use_ssl = (GtkComboBox *)glade_xml_get_widget (xml, info->use_ssl); + service->no_ssl = glade_xml_get_widget (xml, info->ssl_disabled); + + /* configure ui for current settings */ + if (url->host) { + if (url->port) { + gchar *host = g_strdup_printf ("%s:%d", url->host, url->port); + + gtk_entry_set_text (service->hostname, host); + g_free (host); + } else + gtk_entry_set_text (service->hostname, url->host); + } + if (url->user && *url->user) { + gtk_entry_set_text (service->username, url->user); + } + if (service->pathentry) { + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; + + if (service->provider && (service->provider->url_flags & CAMEL_URL_NEED_PATH_DIR) == 0) + action = GTK_FILE_CHOOSER_ACTION_OPEN; + + if (action != gtk_file_chooser_get_action (GTK_FILE_CHOOSER (service->pathentry))) + gtk_file_chooser_set_action (GTK_FILE_CHOOSER (service->pathentry), action); + + if (url->path) + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (service->pathentry), url->path); + } + + tmp = camel_url_get_param (url, "use_ssl"); + if (tmp == NULL) + tmp = "never"; + + for (i=0;iuse_ssl, i); + break; + } + } + + g_signal_connect (service->hostname, "changed", G_CALLBACK (emae_hostname_changed), service); + g_signal_connect (service->username, "changed", G_CALLBACK (emae_username_changed), service); + if (service->pathentry) + g_signal_connect (GTK_FILE_CHOOSER (service->pathentry), "selection-changed", G_CALLBACK (emae_path_changed), service); + + g_signal_connect (service->use_ssl, "changed", G_CALLBACK(emae_ssl_changed), service); + + service->auth_frame = glade_xml_get_widget (xml, info->auth_frame); + service->remember = emae_account_toggle (emae, info->remember_password, info->save_passwd_key, xml); + service->check_supported = (GtkButton *)glade_xml_get_widget (xml, info->authtype_check); + service->authtype = (GtkComboBox *)glade_xml_get_widget (xml, info->authtype); + /* old authtype will be destroyed when we exit */ + service->auth_changed_id = 0; + service->providers = (GtkComboBox *)glade_xml_get_widget (xml, info->type_dropdown); + emae_refresh_providers (emae, service); + emae_refresh_authtype (emae, service); + + if (info->needs_auth) { + service->needs_auth = (GtkToggleButton *)glade_xml_get_widget (xml, info->needs_auth); + gtk_toggle_button_set_active (service->needs_auth, url->authmech != NULL); + g_signal_connect (service->needs_auth, "toggled", G_CALLBACK(emae_needs_auth), service); + emae_needs_auth (service->needs_auth, service); + } else { + service->needs_auth = NULL; + } + + if (!e_account_writable (account, info->account_uri_key)) + gtk_widget_set_sensitive (service->container, FALSE); + else + gtk_widget_set_sensitive (service->container, TRUE); + + emae_service_provider_changed (service); + + camel_url_free (url); +} + +/* 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 }, +}; + +/* its a bit obtuse, but its simple */ +static void +emae_queue_widgets (EMAccountEditor *emae, GladeXML *xml, const gchar *first, ...) +{ + gint i = 0; + va_list ap; + + va_start (ap, first); + while (first) { + emae->priv->widgets_name[i] = first; + emae->priv->widgets[i++] = glade_xml_get_widget (xml, first); + first = va_arg (ap, const gchar *); + } + va_end (ap); + + g_return_if_fail (i < sizeof (emae->priv->widgets)/sizeof (emae->priv->widgets[0])); + + emae->priv->widgets[i] = NULL; + emae->priv->widgets_index = 0; +} + +static GtkWidget * +emae_identity_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + EMAccountEditorPrivate *gui = emae->priv; + EAccount *account; + gint i; + GtkWidget *w; + GladeXML *xml; + gchar *gladefile; + + /*if (old) + return old;*/ + + account = em_account_editor_get_modified_account (emae); + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + xml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + /* Management & Identity fields, in the druid the management frame is relocated to the last page later on */ + for (i=0;iidentity_entries[i] = emae_account_entry (emae, emae_identity_entries[i].name, emae_identity_entries[i].item, xml); + + gui->management_frame = glade_xml_get_widget (xml, "management_frame"); + + gui->default_account = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "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 (gui->default_account, TRUE); + + if (emae->do_signature) { + emae_setup_signatures (emae, xml); + } else { + /* TODO: this could/should probably be neater */ + gtk_widget_hide (glade_xml_get_widget (xml, "sigLabel")); +#if 0 + gtk_widget_hide (glade_xml_get_widget (xml, "sigOption")); +#endif + gtk_widget_hide (glade_xml_get_widget (xml, "sigAddNew")); + } + + w = glade_xml_get_widget (xml, item->label); + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + GladeXML *druidxml; + GtkWidget *page; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + druidxml = glade_xml_new (gladefile, "identity_page", NULL); + g_free (gladefile); + + page = glade_xml_get_widget (druidxml, "identity_page"); + + gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); + w = page; + g_object_unref (druidxml); + gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); + } else { + gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Identity"))); + } + + emae_queue_widgets (emae, xml, "account_vbox", "identity_required_table", "identity_optional_table", NULL); + + g_object_unref (xml); + + return w; +} + +static GtkWidget * +emae_receive_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + EMAccountEditorPrivate *gui = emae->priv; + GtkWidget *w; + GladeXML *xml; + gchar *gladefile; + + /*if (old) + return old;*/ + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + xml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + gui->source.type = CAMEL_PROVIDER_STORE; + emae_setup_service (emae, &gui->source, xml); + + w = glade_xml_get_widget (xml, item->label); + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + GladeXML *druidxml; + GtkWidget *page; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + druidxml = glade_xml_new (gladefile, "source_page", NULL); + g_free (gladefile); + + page = glade_xml_get_widget (druidxml, "source_page"); + + gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); + w = page; + g_object_unref (druidxml); + gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); + } else { + gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Receiving Email"))); + } + + emae_queue_widgets (emae, xml, "source_type_table", "table4", "vbox181", "vbox179", NULL); + + g_object_unref (xml); + + return w; +} + +static void +emae_option_toggle_changed (GtkToggleButton *toggle, EMAccountEditorService *service) +{ + const gchar *name = g_object_get_data ((GObject *)toggle, "option-name"); + GSList *depl = g_object_get_data ((GObject *)toggle, "dependent-list"); + gint active = gtk_toggle_button_get_active (toggle); + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + for (;depl;depl = g_slist_next (depl)) + gtk_widget_set_sensitive ((GtkWidget *)depl->data, active); + + camel_url_set_param (url, name, active?"":NULL); + emae_uri_changed (service, url); + camel_url_free (url); +} + +static GtkWidget * +emae_option_toggle (EMAccountEditorService *service, CamelURL *url, const gchar *text, const gchar *name, gint def) +{ + GtkWidget *w; + + /* FIXME: how do we get the default value ever? */ + w = gtk_check_button_new_with_mnemonic (text); + g_object_set_data ((GObject *)w, "option-name", (gpointer)name); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), camel_url_get_param (url, name) != NULL); + g_signal_connect (w, "toggled", G_CALLBACK(emae_option_toggle_changed), service); + gtk_widget_show (w); + + return w; +} + +static void +emae_option_entry_changed (GtkEntry *entry, EMAccountEditorService *service) +{ + const gchar *name = g_object_get_data ((GObject *)entry, "option-name"); + const gchar *text = gtk_entry_get_text (entry); + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + camel_url_set_param (url, name, text && text[0]?text:NULL); + emae_uri_changed (service, url); + camel_url_free (url); +} + +static GtkWidget * +emae_option_entry (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *def, GtkWidget *l) +{ + GtkWidget *w; + const gchar *val = camel_url_get_param (url, name); + + if (val == NULL) { + if (def) { + val = def; + camel_url_set_param (url, name, val); + emae_uri_changed (service, url); + } else + val = ""; + } + + w = g_object_new (gtk_entry_get_type (), + "text", val, + NULL); + gtk_label_set_mnemonic_widget ((GtkLabel*)l, w); + g_object_set_data ((GObject *)w, "option-name", (gpointer)name); + g_signal_connect (w, "changed", G_CALLBACK(emae_option_entry_changed), service); + gtk_widget_show (w); + + return w; +} + +static void +emae_option_checkspin_changed (GtkSpinButton *spin, EMAccountEditorService *service) +{ + const gchar *name = g_object_get_data ((GObject *)spin, "option-name"); + gchar value[16]; + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + sprintf (value, "%d", gtk_spin_button_get_value_as_int (spin)); + camel_url_set_param (url, name, value); + emae_uri_changed (service, url); + camel_url_free (url); +} + +static void +emae_option_checkspin_check_changed (GtkToggleButton *toggle, EMAccountEditorService *service) +{ + const gchar *name = g_object_get_data ((GObject *)toggle, "option-name"); + GtkSpinButton *spin = g_object_get_data ((GObject *)toggle, "option-target"); + + if (gtk_toggle_button_get_active (toggle)) { + gtk_widget_set_sensitive ((GtkWidget *)spin, TRUE); + emae_option_checkspin_changed (spin, service); + } else { + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + + camel_url_set_param (url, name, NULL); + gtk_widget_set_sensitive ((GtkWidget *)spin, FALSE); + emae_uri_changed (service, url); + camel_url_free (url); + } +} + +/* this is a fugly api */ +static GtkWidget * +emae_option_checkspin (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *fmt, const gchar *info) +{ + GtkWidget *hbox, *check, *spin, *label = NULL; + double min, def, max; + gchar *pre, *post; + const gchar *val; + gchar on; + gint enable; + + pre = g_alloca (strlen (fmt)+1); + strcpy (pre, fmt); + post = strstr (pre, "%s"); + if (post) { + *post = 0; + post+=2; + } + + if (sscanf (info, "%c:%lf:%lf:%lf", &on, &min, &def, &max) != 4) { + min = 0.0; + def = 0.0; + max = 1.0; + } + + if ((enable = (val = camel_url_get_param (url, name)) != NULL) ) + def = strtod (val, NULL); + else + enable = (on == 'y'); + + hbox = gtk_hbox_new (FALSE, 0); + check = g_object_new (gtk_check_button_get_type (), "label", pre, "use_underline", TRUE, "active", enable, NULL); + + spin = gtk_spin_button_new ((GtkAdjustment *)gtk_adjustment_new (def, min, max, 1, 1, 0), 1, 0); + if (post) + label = gtk_label_new_with_mnemonic (post); + gtk_box_pack_start ((GtkBox *)hbox, check, FALSE, TRUE, 0); + gtk_box_pack_start ((GtkBox *)hbox, spin, FALSE, TRUE, 0); + if (label) + gtk_box_pack_start ((GtkBox *)hbox, label, FALSE, TRUE, 4); + + g_object_set_data ((GObject *)spin, "option-name", (gpointer)name); + g_object_set_data ((GObject *)check, "option-name", (gpointer)name); + g_object_set_data ((GObject *)check, "option-target", (gpointer)spin); + + g_signal_connect (spin, "value_changed", G_CALLBACK(emae_option_checkspin_changed), service); + g_signal_connect (check, "toggled", G_CALLBACK(emae_option_checkspin_check_changed), service); + + gtk_widget_show_all (hbox); + + return hbox; +} + +static void +emae_option_options_changed (GtkComboBox *options, EMAccountEditorService *service) +{ + const gchar *name = g_object_get_data (G_OBJECT (options), "option-name"); + gchar *value = NULL; + CamelURL *url = emae_account_url (service->emae, emae_service_info[service->type].account_uri_key); + gint id = gtk_combo_box_get_active (options); + + if (id != -1) { + GtkTreeModel *model; + GtkTreeIter iter; + + model = gtk_combo_box_get_model (options); + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, id)) { + gtk_tree_model_get (model, &iter, 0, &value, -1); + } + } + + camel_url_set_param (url, name, value); + emae_uri_changed (service, url); + camel_url_free (url); + g_free (value); +} + +/* 'values' is in format "value0:caption0:value2:caption2:...valueN:captionN" */ +static GtkWidget * +emae_option_options (EMAccountEditorService *service, CamelURL *url, const gchar *name, const gchar *values, GtkWidget *l) +{ + GtkComboBox *w; + GtkListStore *store; + GtkTreeIter iter; + const gchar *p, *value, *caption; + GtkCellRenderer *cell; + gint active = 0; /* the first item entered is always a default item */ + gint i; + const gchar *val = camel_url_get_param (url, name); + + w = GTK_COMBO_BOX (gtk_combo_box_new ()); + + /* value and caption */ + store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + + p = values; + for (p = values, i = 0; p; i++) { + gchar *vl, *cp; + + value = 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 (value, caption - value - 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 (service->provider->translation_domain, cp), -1); + + if (val && g_ascii_strcasecmp (val, vl) == 0) + active = i; + + g_free (vl); + g_free (cp); + } + + gtk_combo_box_set_model (w, (GtkTreeModel *)store); + gtk_combo_box_set_active (w, i > 0 ? active : -1); + + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), cell, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), cell, "text", 1, NULL); + + gtk_widget_show (GTK_WIDGET (w)); + + gtk_label_set_mnemonic_widget (GTK_LABEL (l), GTK_WIDGET (w)); + + g_object_set_data (G_OBJECT (w), "option-name", (gpointer)name); + g_signal_connect (w, "changed", G_CALLBACK (emae_option_options_changed), service); + + return GTK_WIDGET (w); +} + +static GtkWidget * +emae_receive_options_item (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + GtkWidget *w, *box, *spin; + gint row; + + if (emae->priv->source.provider == NULL + || emae->priv->source.provider->extra_conf == NULL) + return NULL; + + if (old) + return old; + + /* We have to add the automatic mail check item with the rest of the receive options */ + row = ((GtkTable *)parent)->nrows; + + 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, gpointer data) +{ + EMAccountEditor *emae = data; + struct _receive_options_item *item = (struct _receive_options_item *)eitem; + GtkWidget *w, *l, *h; + CamelProviderConfEntry *entries; + GtkWidget *depw; + GSList *depl = NULL, *n; + EMAccountEditorService *service = &emae->priv->source; + gint row, i; + GHashTable *extra; + CamelURL *url; + + if (emae->priv->source.provider == NULL + || emae->priv->source.provider->extra_conf == NULL) + return NULL; + + entries = emae->priv->source.provider->extra_conf; + for (i=0;entries && entries[i].type != CAMEL_PROVIDER_CONF_END;i++) + if (entries[i].type == CAMEL_PROVIDER_CONF_SECTION_START + && entries[i].name + && strcmp (entries[i].name, eitem->user_data) == 0) + goto section; + + return NULL; +section: + d (printf ("Building extra section '%s'\n", eitem->path)); + + url = emae_account_url (emae, emae_service_info[service->type].account_uri_key); + item->extra_table = g_hash_table_new (g_str_hash, g_str_equal); + extra = g_hash_table_new (g_str_hash, g_str_equal); + row = ((GtkTable *)parent)->nrows; + + for (;entries[i].type != CAMEL_PROVIDER_CONF_END && entries[i].type != CAMEL_PROVIDER_CONF_SECTION_END;i++) { + if (entries[i].depname) { + depw = g_hash_table_lookup (extra, entries[i].depname); + if (depw) + depl = g_object_steal_data ((GObject *)depw, "dependent-list"); + } else + depw = NULL; + + switch (entries[i].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[i].name, "hostname")) + l = (GtkWidget *)emae->priv->source.hostlabel; + else if (!strcmp (entries[i].name, "username")) + l = (GtkWidget *)emae->priv->source.userlabel; + else + l = NULL; + + if (l) { + gtk_label_set_text_with_mnemonic ((GtkLabel *)l, entries[i].text); + if (depw) + depl = g_slist_prepend (depl, l); + } + break; + case CAMEL_PROVIDER_CONF_CHECKBOX: + w = emae_option_toggle (service, url, entries[i].text, entries[i].name, atoi (entries[i].value)); + gtk_table_attach ((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); + g_hash_table_insert (extra, (gpointer)entries[i].name, w); + if (depw) + depl = g_slist_prepend (depl, w); + 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[i].name, "keep_on_server")) + emae_account_toggle_widget (emae, (GtkToggleButton *)w, E_ACCOUNT_SOURCE_KEEP_ON_SERVER); + break; + case CAMEL_PROVIDER_CONF_ENTRY: + l = g_object_new (gtk_label_get_type (), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL); + gtk_widget_show (l); + w = emae_option_entry (service, url, entries[i].name, entries[i].value, l); + gtk_table_attach ((GtkTable *)parent, l, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); + gtk_table_attach ((GtkTable *)parent, w, 1, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); + if (depw) { + depl = g_slist_prepend (depl, w); + depl = g_slist_prepend (depl, l); + } + row++; + /* FIXME: this is another hack for exchange/groupwise connector */ + g_hash_table_insert (item->extra_table, (gpointer)entries[i].name, w); + break; + case CAMEL_PROVIDER_CONF_CHECKSPIN: + w = emae_option_checkspin (service, url, entries[i].name, entries[i].text, entries[i].value); + gtk_table_attach ((GtkTable *)parent, w, 0, 2, row, row+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); + if (depw) + depl = g_slist_prepend (depl, w); + row++; + break; + case CAMEL_PROVIDER_CONF_OPTIONS: + h = gtk_hbox_new (FALSE, 4); + gtk_widget_show (h); + l = g_object_new (gtk_label_get_type (), "label", entries[i].text, "xalign", 0.0, "use_underline", TRUE, NULL); + gtk_widget_show (l); + w = emae_option_options (service, url, entries[i].name, entries[i].value, l); + gtk_box_pack_start (GTK_BOX (h), l, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); + gtk_table_attach ((GtkTable *)parent, h, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); + if (depw) { + depl = g_slist_prepend (depl, h); + } + row++; + break; + default: + break; + } + + if (depw && depl) { + gint act = gtk_toggle_button_get_active ((GtkToggleButton *)depw); + + g_object_set_data_full ((GObject *)depw, "dependent-list", depl, (GDestroyNotify)g_slist_free); + for (n=depl;n;n=g_slist_next (n)) + gtk_widget_set_sensitive ((GtkWidget *)n->data, act); + } + } + + camel_url_free (url); + + /* Since EConfig destroys the factory widget when it changes, we + * need to destroy our own ones as well, and add a dummy item + * so it knows this section isn't empty */ + + w = gtk_label_new (""); + gtk_widget_hide (w); + gtk_table_attach ((GtkTable *)parent, w, 0, 2, row, row+1, 0, 0, 0, 0); + + return w; +} + +static GtkWidget * +emae_send_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + EMAccountEditorPrivate *gui = emae->priv; + GtkWidget *w; + GladeXML *xml; + gchar *gladefile; + + /* no transport options page at all for these types of providers */ + if (gui->source.provider && CAMEL_PROVIDER_IS_STORE_AND_TRANSPORT(gui->source.provider)) { + memset (&gui->transport.frame, 0, ((gchar *)&gui->transport.check_dialog)-((gchar *)&gui->transport.frame)); + return NULL; + } + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + xml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + /* Transport */ + gui->transport.type = CAMEL_PROVIDER_TRANSPORT; + emae_setup_service (emae, &gui->transport, xml); + + w = glade_xml_get_widget (xml, item->label); + if (emae->type == EMAE_PAGES) { + gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0); + } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + GladeXML *druidxml; + GtkWidget *page; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + druidxml = glade_xml_new (gladefile, "transport_page", NULL); + g_free (gladefile); + + page = glade_xml_get_widget (druidxml, "transport_page"); + + gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); + w = page; + g_object_unref (druidxml); + gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); + } else { + gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Sending Email"))); + } + + emae_queue_widgets (emae, xml, "transport_type_table", "vbox12", "vbox183", "vbox61", NULL); + + g_object_unref (xml); + + return w; +} + +static GtkWidget * +emae_defaults_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + EMAccountEditorPrivate *gui = emae->priv; + EAccount *account; + GtkWidget *w; + GladeXML *xml; + gchar *gladefile; + + /*if (old) + return old;*/ + + account = em_account_editor_get_modified_account (emae); + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + xml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + /* Special folders */ + gui->drafts_folder_button = (GtkButton *)emae_account_folder (emae, "drafts_button", E_ACCOUNT_DRAFTS_FOLDER_URI, E_MAIL_FOLDER_DRAFTS, xml); + gui->sent_folder_button = (GtkButton *)emae_account_folder (emae, "sent_button", E_ACCOUNT_SENT_FOLDER_URI, E_MAIL_FOLDER_SENT, xml); + + /* Special Folders "Reset Defaults" button */ + gui->restore_folders_button = (GtkButton *)glade_xml_get_widget (xml, "default_folders_button"); + g_signal_connect (gui->restore_folders_button, "clicked", G_CALLBACK (default_folders_clicked), emae); + + /* Always Cc/Bcc */ + emae_account_toggle (emae, "always_cc", E_ACCOUNT_CC_ALWAYS, xml); + emae_account_entry (emae, "cc_addrs", E_ACCOUNT_CC_ADDRS, xml); + emae_account_toggle (emae, "always_bcc", E_ACCOUNT_BCC_ALWAYS, xml); + emae_account_entry (emae, "bcc_addrs", E_ACCOUNT_BCC_ADDRS, xml); + + gtk_widget_set_sensitive ((GtkWidget *)gui->drafts_folder_button, e_account_writable (account, E_ACCOUNT_DRAFTS_FOLDER_URI)); + + gtk_widget_set_sensitive ( (GtkWidget *)gui->sent_folder_button, + e_account_writable (account, E_ACCOUNT_SENT_FOLDER_URI) + && + (emae->priv->source.provider ? !(emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER): TRUE) + ); + + gtk_widget_set_sensitive ((GtkWidget *)gui->restore_folders_button, + (e_account_writable (account, E_ACCOUNT_SENT_FOLDER_URI) + && ((emae->priv->source.provider && !( emae->priv->source.provider->flags & CAMEL_PROVIDER_DISABLE_SENT_FOLDER)) + || e_account_writable (account, E_ACCOUNT_DRAFTS_FOLDER_URI)))); + + /* Receipt policy */ + emae_setup_receipt_policy (emae, xml); + + w = glade_xml_get_widget (xml, item->label); + gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Defaults"))); + + emae_queue_widgets (emae, xml, "vbox184", "table8", NULL); + + g_object_unref (xml); + + return w; +} + +static GtkWidget * +emae_security_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; +#if defined (HAVE_NSS) + EMAccountEditorPrivate *gui = emae->priv; +#endif + GtkWidget *w; + GladeXML *xml; + gchar *gladefile; + + /*if (old) + return old;*/ + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + xml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + /* Security */ + emae_account_entry (emae, "pgp_key", E_ACCOUNT_PGP_KEY, xml); + emae_account_toggle (emae, "pgp_encrypt_to_self", E_ACCOUNT_PGP_ENCRYPT_TO_SELF, xml); + emae_account_toggle (emae, "pgp_always_sign", E_ACCOUNT_PGP_ALWAYS_SIGN, xml); + emae_account_toggle (emae, "pgp_no_imip_sign", E_ACCOUNT_PGP_NO_IMIP_SIGN, xml); + emae_account_toggle (emae, "pgp_always_trust", E_ACCOUNT_PGP_ALWAYS_TRUST, xml); + +#if defined (HAVE_NSS) + /* TODO: this should handle its entry separately? */ + gui->smime_sign_key = emae_account_entry (emae, "smime_sign_key", E_ACCOUNT_SMIME_SIGN_KEY, xml); + gui->smime_sign_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_select"); + gui->smime_sign_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_sign_key_clear"); + g_signal_connect (gui->smime_sign_key_select, "clicked", G_CALLBACK(smime_sign_key_select), emae); + g_signal_connect (gui->smime_sign_key_clear, "clicked", G_CALLBACK(smime_sign_key_clear), emae); + + gui->smime_sign_default = emae_account_toggle (emae, "smime_sign_default", E_ACCOUNT_SMIME_SIGN_DEFAULT, xml); + + gui->smime_encrypt_key = emae_account_entry (emae, "smime_encrypt_key", E_ACCOUNT_SMIME_ENCRYPT_KEY, xml); + gui->smime_encrypt_key_select = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_select"); + gui->smime_encrypt_key_clear = (GtkButton *)glade_xml_get_widget (xml, "smime_encrypt_key_clear"); + g_signal_connect (gui->smime_encrypt_key_select, "clicked", G_CALLBACK(smime_encrypt_key_select), emae); + g_signal_connect (gui->smime_encrypt_key_clear, "clicked", G_CALLBACK(smime_encrypt_key_clear), emae); + + gui->smime_encrypt_default = emae_account_toggle (emae, "smime_encrypt_default", E_ACCOUNT_SMIME_ENCRYPT_DEFAULT, xml); + gui->smime_encrypt_to_self = emae_account_toggle (emae, "smime_encrypt_to_self", E_ACCOUNT_SMIME_ENCRYPT_TO_SELF, xml); + smime_changed (emae); +#else + { + /* Since we don't have NSS, hide the S/MIME config options */ + GtkWidget *frame; + + frame = glade_xml_get_widget (xml, "smime_vbox"); + gtk_widget_destroy (frame); + } +#endif /* HAVE_NSS */ + + w = glade_xml_get_widget (xml, item->label); + gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Security"))); + + g_object_unref (xml); + + return w; +} + +static GtkWidget * +emae_widget_glade (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + gint i; + + for (i=0;emae->priv->widgets[i];i++) + if (!strcmp (emae->priv->widgets_name[i], item->label)) + return emae->priv->widgets[i]; + + g_warning ("Mail account widget '%s' not found", item->label); + + return NULL; +} + +/* 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 *) "table4", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", 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, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade }, + + { E_CONFIG_PAGE, (gchar *) "40.defaults", (gchar *) "vboxFoldersBorder", emae_defaults_page }, + { E_CONFIG_SECTION, (gchar *) "40.defaults/00.folders", (gchar *) "vbox184", emae_widget_glade }, + { E_CONFIG_SECTION_TABLE, (gchar *) "40.defaults/10.composing", (gchar *) "table8", 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_management_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + EMAccountEditor *emae = data; + EMAccountEditorPrivate *gui = emae->priv; + GtkWidget *w; + + w = gui->management_frame; + if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { + GladeXML *druidxml; + GtkWidget *page; + gchar *gladefile; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + druidxml = glade_xml_new (gladefile, "management_page", NULL); + g_free (gladefile); + + page = glade_xml_get_widget (druidxml, "management_page"); + + gtk_widget_reparent (w, ((GnomeDruidPageStandard *)page)->vbox); + w = page; + g_object_unref (druidxml); + gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); + } + + return w; +} + +static GtkWidget * +emae_widget_druid_glade (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +{ + GladeXML *druidxml; + GtkWidget *w; + gchar *gladefile; + EMAccountEditor *emae = (EMAccountEditor *)data; + + if (emae->type == EMAE_PAGES) + return NULL; + + gladefile = g_build_filename (EVOLUTION_GLADEDIR, + "mail-config.glade", + NULL); + druidxml = glade_xml_new (gladefile, item->label, NULL); + g_free (gladefile); + + w = glade_xml_get_widget (druidxml, item->label); + /* i think the glade file has issues, we need to show all on at least the end page */ + gtk_widget_show_all (w); + g_object_unref (druidxml); + + gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)w); + + return w; +} + +/* plugin meta-data for "org.gnome.evolution.mail.config.accountDruid" */ +static EMConfigItem emae_druid_items[] = { + { E_CONFIG_DRUID, (gchar *) "" }, + { E_CONFIG_PAGE_START, (gchar *) "0.start", (gchar *) "start_page", emae_widget_druid_glade }, + + { 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 *) "table4", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "10.receive/20.security", (gchar *) "vbox181", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "10.receive/30.auth", (gchar *) "vbox179", 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, (gchar *) "30.send/10.config", (gchar *) "vbox12", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "30.send/20.security", (gchar *) "vbox183", emae_widget_glade }, + { E_CONFIG_SECTION, (gchar *) "30.send/30.auth", (gchar *) "vbox61", emae_widget_glade }, + + { E_CONFIG_PAGE, (gchar *) "40.management", (gchar *) "management_frame", emae_management_page }, + + { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_druid_glade }, + { 0 }, +}; +static gboolean emae_druid_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_service_complete (EMAccountEditor *emae, EMAccountEditorService *service) +{ + EAccount *account; + CamelURL *url; + gint ok = TRUE; + const gchar *uri; + + if (service->provider == NULL) + return TRUE; + + account = em_account_editor_get_modified_account (emae); + + uri = e_account_get_string (account, emae_service_info[service->type].account_uri_key); + if (uri == NULL || (url = camel_url_new (uri, NULL)) == NULL) + return FALSE; + + if (CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) { + if (url->host == NULL || url->host[0] == 0) + ok = FALSE; + } + /* We only need the user if the service needs auth as well, i think */ + if (ok + && (service->needs_auth == NULL + || CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_AUTH) + || gtk_toggle_button_get_active (service->needs_auth)) + && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_USER) + && (url->user == NULL || url->user[0] == 0)) + ok = FALSE; + + if (ok + && CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_PATH) + && (url->path == NULL || url->path[0] == 0)) + ok = FALSE; + + camel_url_free (url); + + return ok; +} + +enum { + GMAIL = 0, + YAHOO, + AOL +}; +struct _server_prefill { + const gchar *key; + const gchar *recv; + const gchar *send; + const gchar *proto; + const gchar *ssl; +} mail_servers [] = { + {"gmail", "imap.gmail.com", "smtp.gmail.com", "imap", "always"}, + {"yahoo", "pop3.yahoo.com", "smtp.yahoo.com", "pop", "never"}, + {"aol", "imap.aol.com", "smtp.aol.com", "pop", "never"}, + {"msn", "pop3.email.msn.com", "smtp.email.msn.com", "pop", "never"} +}; + +static gint +check_servers (gchar *server) +{ + gint len = G_N_ELEMENTS(mail_servers), i; + + for (i=0; ipriv->config)->type == E_CONFIG_DRUID) { + if (!strcmp (pageid, "00.identity")) { + if (!emae->priv->identity_set) { + gchar *uname; + + emae->priv->identity_set = 1; +#ifndef G_OS_WIN32 + uname = g_locale_to_utf8(g_get_real_name (), -1, NULL, NULL, NULL); +#else + uname = g_strdup (g_get_real_name ()); +#endif + if (uname) { + gtk_entry_set_text (emae->priv->identity_entries[1], uname); + g_free (uname); + } + } + } else if (!strcmp (pageid, "10.receive")) { + if (!emae->priv->receive_set) { + gchar *user, *at; + gint index; + gchar *uri = g_strdup (e_account_get_string (account, E_ACCOUNT_SOURCE_URL)); + CamelURL *url; + + emae->priv->receive_set = 1; + tmp = (gchar *)e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); + at = strchr (tmp, '@'); + user = g_alloca (at-tmp+1); + memcpy (user, tmp, at-tmp); + user[at-tmp] = 0; + at++; + + index = check_servers (at); + gtk_entry_set_text (emae->priv->source.username, user); + gtk_entry_set_text (emae->priv->transport.username, user); + if (uri && (url = camel_url_new (uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol (url, mail_servers[index].proto); + camel_url_set_param (url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].recv); + camel_url_set_user (url, user); + gtk_entry_set_text (emae->priv->source.hostname, mail_servers[index].recv); + gtk_entry_set_text (emae->priv->transport.hostname, mail_servers[index].send); + uri = camel_url_to_string (url, 0); + e_account_set_string (account, E_ACCOUNT_SOURCE_URL, uri); + + g_free (uri); + camel_url_free (url); + } + + } + } else if (!strcmp (pageid, "30.send")) { + CamelURL *url; + gchar *at, *user; + gint index; + gchar *uri = (gchar *)e_account_get_string (account, E_ACCOUNT_TRANSPORT_URL); + + tmp = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); + at = strchr (tmp, '@'); + user = g_alloca (at-tmp+1); + memcpy (user, tmp, at-tmp); + user[at-tmp] = 0; + at++; + + index = check_servers (at); + if (uri && (url = camel_url_new (uri, NULL)) != NULL) { + refresh = TRUE; + camel_url_set_protocol (url, "smtp"); + camel_url_set_param (url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].send); + camel_url_set_user (url, user); + uri = camel_url_to_string (url, 0); + e_account_set_string (account, E_ACCOUNT_TRANSPORT_URL, uri); + g_free (uri); + camel_url_free (url); + } else { + g_warning ("buz2\n"); + } + + } else if (!strcmp (pageid, "20.receive_options")) { + if (emae->priv->source.provider + && emae->priv->extra_provider != emae->priv->source.provider) { + emae->priv->extra_provider = emae->priv->source.provider; + emae_auto_detect (emae); + } + } else if (!strcmp (pageid, "40.management")) { + if (!emae->priv->management_set) { + gchar *template; + guint i = 0, len; + + emae->priv->management_set = 1; + tmp = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); + len = strlen (tmp); + template = alloca (len + 14); + strcpy (template, tmp); + while (e_get_account_by_name (template)) + sprintf (template + len, " (%d)", i++); + + gtk_entry_set_text (emae->priv->identity_entries[0], template); + } + } + } + + /* + 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 (pageid == NULL || !strcmp (pageid, "00.identity")) { + /* TODO: check the account name is set, and unique in the account list */ + ok = (tmp = e_account_get_string (account, E_ACCOUNT_ID_NAME)) + && tmp[0] + && (tmp = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS)) + && is_email (tmp) + && ((tmp = e_account_get_string (account, E_ACCOUNT_ID_REPLY_TO)) == NULL + || tmp[0] == 0 + || is_email (tmp)); + if (!ok) { + d (printf ("identity incomplete\n")); + } + } + + if (ok && (pageid == NULL || !strcmp (pageid, "10.receive"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers (emae, &emae->priv->source); + } + ok = emae_service_complete (emae, &emae->priv->source); + if (!ok) { + d (printf ("receive page incomplete\n")); + } + } + + if (ok && (pageid == NULL || !strcmp (pageid, "30.send"))) { + if (emae->type == EMAE_PAGES && refresh) { + emae_refresh_providers (emae, &emae->priv->transport); + } + ok = emae_service_complete (emae, &emae->priv->transport); + if (!ok) { + d (printf ("send page incomplete\n")); + } + } + + if (ok && (pageid == NULL || !strcmp (pageid, "40.management"))) { + ok = (tmp = e_account_get_string (account, E_ACCOUNT_NAME)) + && tmp[0] + && ((ea = e_get_account_by_name (tmp)) == NULL + || ea == original_account); + if (!ok) { + d (printf ("management page incomplete\n")); + } + } + + return ok; +} + +void +em_account_editor_check (EMAccountEditor *emae, const gchar *page) +{ + emae_check_complete ((EConfig *)emae->config, page, emae); +} + +/* HACK: FIXME: the component should listen to the account object directly */ +static void +add_new_store (gchar *uri, CamelStore *store, gpointer user_data) +{ +#if 0 /* KILL-BONOBO: Try to actually fix this? */ + MailComponent *component = mail_component_peek (); + EAccount *account = user_data; + + if (store == NULL) + return; + + mail_component_add_store (component, store, account->name); +#endif +} + +static void +emae_commit (EConfig *ec, GSList *items, gpointer data) +{ + EMAccountEditor *emae = data; + EAccountList *accounts = e_get_account_list (); + EAccount *account; + EAccount *modified_account; + EAccount *original_account; + + /* the mail-config*acconts* api needs a lot of work */ + + modified_account = em_account_editor_get_modified_account (emae); + original_account = em_account_editor_get_original_account (emae); + + if (original_account != NULL) { + d (printf ("Committing account '%s'\n", e_account_get_string (modified_account, E_ACCOUNT_NAME))); + e_account_import (original_account, modified_account); + account = original_account; + e_account_list_change (accounts, account); + } else { + d (printf ("Adding new account '%s'\n", e_account_get_string (account, E_ACCOUNT_NAME))); + e_account_list_add (accounts, modified_account); + account = modified_account; + + /* HACK: this will add the account to the folder tree. + We should just be listening to the account list directly for changed events */ + if (account->enabled + && emae->priv->source.provider + && (emae->priv->source.provider->flags & CAMEL_PROVIDER_IS_STORAGE)) + mail_get_store (e_account_get_string (modified_account, E_ACCOUNT_SOURCE_URL), NULL, add_new_store, account); + } + + if (gtk_toggle_button_get_active (emae->priv->default_account)) + e_account_list_set_default (accounts, account); + + e_account_list_save (accounts); +} + +void +em_account_editor_commit (EMAccountEditor *emae) +{ + emae_commit ((EConfig *)emae->config, NULL, emae); +} + +static void +emae_editor_destroyed (GtkWidget *dialog, EMAccountEditor *emae) +{ + emae->editor = NULL; + g_object_unref (emae); +} + +static void +em_account_editor_construct (EMAccountEditor *emae, EMAccountEditorType type, const gchar *id) +{ + EMAccountEditorPrivate *gui = emae->priv; + EAccount *account; + gint i, index; + GSList *l; + GList *prov; + EMConfig *ec; + EMConfigTargetAccount *target; + GHashTable *have; + EConfigItem *items; + + emae->type = type; + + /* sort the providers, remote first */ + gui->providers = g_list_sort (camel_provider_list (TRUE), (GCompareFunc)provider_compare); + + 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_DRUID, id); + items = emae_druid_items; + if (!emae_druid_items_translated) { + for (i=0;items[i].path;i++) { + if (items[i].label) + items[i].label = _(items[i].label); + } + emae_druid_items_translated = TRUE; + } + } + + emae->config = gui->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_commit, NULL, 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=gui->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, NULL, NULL, emae_free_auto, emae); + gui->extra_items = l; + + e_config_add_page_check ((EConfig *)ec, NULL, emae_check_complete, emae); + + account = em_account_editor_get_modified_account (emae); + target = em_config_target_new_account (ec, account); + e_config_set_target ((EConfig *)ec, (EConfigTarget *)target); + + if (type != EMAE_PAGES) { + emae->editor = e_config_create_window ((EConfig *)ec, NULL, type==EMAE_NOTEBOOK?_("Account Editor"):_("Evolution Account Assistant")); + g_signal_connect (emae->editor, "destroy", G_CALLBACK(emae_editor_destroyed), emae); + } else { + e_config_create_widget ((EConfig *)ec); + } +} -- cgit v1.2.3 From b554b165941e9b4e394554591e93e31e5accef16 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 1 Jul 2009 12:16:23 -0400 Subject: Fix merge issues in EMAccountEditor. --- mail/em-account-editor.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index e25d0553cb..71a2457409 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -60,6 +60,7 @@ #include "widgets/misc/e-signature-editor.h" #include "e-mail-local.h" +#include "e-mail-store.h" #include "em-config.h" #include "em-folder-selection-button.h" #include "em-account-editor.h" @@ -191,6 +192,7 @@ struct _EMAccountEditorPrivate { /* for druid page preparation */ guint identity_set:1; guint receive_set:1; + guint send_set:1; guint management_set:1; }; @@ -3047,11 +3049,11 @@ emae_check_complete (EConfig *ec, const gchar *pageid, gpointer data) const gchar *tmp; EAccount *ea; gboolean refresh = FALSE; - gboolean edit; + gboolean new_account; account = em_account_editor_get_modified_account (emae); - original_account = em_account_editor_get_modified_account (emae); - edit = (original_account != NULL); + original_account = em_account_editor_get_original_account (emae); + new_account = (original_account == NULL); /* We use the page-check of various pages to 'prepare' or pre-load their values, only in the druid */ @@ -3090,28 +3092,35 @@ emae_check_complete (EConfig *ec, const gchar *pageid, gpointer data) index = check_servers (at); gtk_entry_set_text (emae->priv->source.username, user); gtk_entry_set_text (emae->priv->transport.username, user); - if (!edit && uri && (url = camel_url_new (uri, NULL)) != NULL) { + if (new_account && uri && (url = camel_url_new (uri, NULL)) != NULL) { refresh = TRUE; - camel_url_set_protocol (url, mail_servers[index].proto); - camel_url_set_param (url, "use_ssl", mail_servers[index].ssl); - camel_url_set_host (url, mail_servers[index].recv); camel_url_set_user (url, user); - gtk_entry_set_text (emae->priv->source.hostname, mail_servers[index].recv); - gtk_entry_set_text (emae->priv->transport.hostname, mail_servers[index].send); + if (index != -1) { + camel_url_set_protocol (url, mail_servers[index].proto); + camel_url_set_param (url, "use_ssl", mail_servers[index].ssl); + camel_url_set_host (url, mail_servers[index].recv); + gtk_entry_set_text (emae->priv->source.hostname, mail_servers[index].recv); + gtk_entry_set_text (emae->priv->transport.hostname, mail_servers[index].send); + } else { + camel_url_set_host (url, ""); + } + g_free (uri); uri = camel_url_to_string (url, 0); e_account_set_string (account, E_ACCOUNT_SOURCE_URL, uri); - g_free (uri); camel_url_free (url); } + g_free (uri); } } else if (!strcmp (pageid, "30.send")) { + if (!emae->priv->send_set) { CamelURL *url; gchar *at, *user; gint index; gchar *uri = (gchar *)e_account_get_string (account, E_ACCOUNT_TRANSPORT_URL); + emae->priv->send_set = 1; tmp = e_account_get_string (account, E_ACCOUNT_ID_ADDRESS); at = strchr (tmp, '@'); user = g_alloca (at-tmp+1); @@ -3120,7 +3129,7 @@ emae_check_complete (EConfig *ec, const gchar *pageid, gpointer data) at++; index = check_servers (at); - if (uri && (url = camel_url_new (uri, NULL)) != NULL) { + if (index != -1 && uri && (url = camel_url_new (uri, NULL)) != NULL) { refresh = TRUE; camel_url_set_protocol (url, "smtp"); camel_url_set_param (url, "use_ssl", mail_servers[index].ssl); @@ -3130,9 +3139,8 @@ emae_check_complete (EConfig *ec, const gchar *pageid, gpointer data) e_account_set_string (account, E_ACCOUNT_TRANSPORT_URL, uri); g_free (uri); camel_url_free (url); - } else { - g_warning ("buz2\n"); } + } } else if (!strcmp (pageid, "20.receive_options")) { if (emae->priv->source.provider @@ -3223,15 +3231,12 @@ em_account_editor_check (EMAccountEditor *emae, const gchar *page) static void add_new_store (gchar *uri, CamelStore *store, gpointer user_data) { -#if 0 /* KILL-BONOBO: Try to actually fix this? */ - MailComponent *component = mail_component_peek (); EAccount *account = user_data; if (store == NULL) return; - mail_component_add_store (component, store, account->name); -#endif + e_mail_store_add (store, account->name); } static void -- cgit v1.2.3 From 374bd42f69aca2e132fd854c9619f3d7491f1f96 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 12 Jul 2009 23:33:07 -0400 Subject: Fix excessive whitespace. --- mail/em-account-editor.c | 1 - 1 file changed, 1 deletion(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 71a2457409..436d24f62b 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -1746,7 +1746,6 @@ emae_refresh_providers (EMAccountEditor *emae, EMAccountEditorService *service) i++; } - gtk_cell_layout_clear ((GtkCellLayout *)dropdown); gtk_combo_box_set_model (dropdown, (GtkTreeModel *)store); gtk_cell_layout_pack_start ((GtkCellLayout *)dropdown, cell, TRUE); -- cgit v1.2.3 From 052e89dd423b5ba2f394f55c2fcc48102e7b9bc3 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 6 Aug 2009 17:48:45 -0400 Subject: Seal up ESignature and add GObject properties. --- mail/em-account-editor.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 6c55a659f8..6ba40772c2 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -787,11 +787,16 @@ emae_signature_added (ESignatureList *signatures, ESignature *sig, EMAccountEdit { 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, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1); + 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); } @@ -808,10 +813,13 @@ emae_signature_get_iter (EMAccountEditor *emae, ESignature *sig, GtkTreeModel ** 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, sig->uid)) + if (uid && !strcmp (uid, signature_uid)) found = TRUE; g_free (uid); } while (!found && gtk_tree_model_iter_next (model, iter)); @@ -834,9 +842,12 @@ emae_signature_changed (ESignatureList *signatures, ESignature *sig, EMAccountEd { 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, sig->autogen?_("Autogenerated"):sig->name, -1); + gtk_list_store_set ((GtkListStore *)model, &iter, 0, name, -1); } static void @@ -923,11 +934,16 @@ emae_setup_signatures (EMAccountEditor *emae, GladeXML *xml) 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, sig->autogen?_("Autogenerated"):sig->name, 1, sig->uid, -1); + gtk_list_store_set (store, &iter, 0, name, 1, uid, -1); - if (current && !strcmp (current, sig->uid)) + if (current && !strcmp (current, uid)) active = i; e_iterator_next (it); -- cgit v1.2.3 From 61923c8daee56a1a82629a6bcfd297a304a9df5d Mon Sep 17 00:00:00 2001 From: Srinivasa Ragavan Date: Mon, 10 Aug 2009 11:04:35 +0530 Subject: Make Port string only for Anjal. --- mail/em-account-editor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 6ba40772c2..782cbec2de 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -1987,7 +1987,7 @@ emae_setup_service (EMAccountEditor *emae, EMAccountEditorService *service, Glad } service->port_hint = glade_xml_get_widget (xml, "port_hint"); - if (!service->provider || CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST)) + if (emae->type == EMAE_PAGES && (!service->provider || CAMEL_PROVIDER_NEEDS(service->provider, CAMEL_URL_PART_HOST))) gtk_widget_show (service->port_hint); else gtk_widget_hide (service->port_hint); -- cgit v1.2.3 From de528db6c18b7ecee83bb8b52850d935c1244ebf Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 18 Aug 2009 10:00:23 -0400 Subject: =?UTF-8?q?Bug=C2=A0567260=20-=20Migrate=20from=20GnomeDruid=20to?= =?UTF-8?q?=20GtkAssistant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail/em-account-editor.c | 172 +++++++++++++++++++++++------------------------ 1 file changed, 83 insertions(+), 89 deletions(-) (limited to 'mail/em-account-editor.c') diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 782cbec2de..af4be14a69 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -26,7 +26,7 @@ work before merge can occur: verify behaviour. - work out what to do with the startup druid. + work out what to do with the startup assistant. also need to work out: how to remove unecessary items from a service url once @@ -48,9 +48,6 @@ #include -#include -#include - #include "shell/e-shell.h" #include "e-util/e-error.h" #include "e-util/e-account-utils.h" @@ -190,7 +187,7 @@ struct _EMAccountEditorPrivate { const gchar *widgets_name[5]; gint widgets_index; - /* for druid page preparation */ + /* for assistant page preparation */ guint identity_set:1; guint receive_set:1; guint send_set:1; @@ -2071,6 +2068,60 @@ emae_setup_service (EMAccountEditor *emae, EMAccountEditorService *service, Glad camel_url_free (url); } +static GtkWidget * +emae_create_basic_assistant_page (GtkAssistant *assistant, const gchar *page_id) +{ + 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 \"Forward\" 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, "management_page") == 0) { + title = _("Account Management"); + label = _("Please enter a descriptive name for this account in the space below.\nThis name will be used for display purposes only."); + } 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); + + lbl = gtk_label_new (label); + gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (lbl), TRUE); + + gtk_box_pack_start (GTK_BOX (vbox), lbl, fill_space, fill_space, 0); + + gtk_widget_show_all (vbox); + + gtk_assistant_append_page (assistant, vbox); + 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; @@ -2126,7 +2177,7 @@ emae_identity_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget xml = glade_xml_new (gladefile, item->label, NULL); g_free (gladefile); - /* Management & Identity fields, in the druid the management frame is relocated to the last page later on */ + /* Management & Identity fields, in the assistant the management frame is relocated to the last page later on */ for (i=0;iidentity_entries[i] = emae_account_entry (emae, emae_identity_entries[i].name, emae_identity_entries[i].item, xml); @@ -2152,22 +2203,12 @@ emae_identity_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget w = glade_xml_get_widget (xml, item->label); if (emae->type == EMAE_PAGES) { gtk_box_pack_start ((GtkBox *)emae->pages[0], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new (gladefile, "identity_page", NULL); - g_free (gladefile); + } else if (((EConfig *)gui->config)->type == E_CONFIG_ASSISTANT) { + GtkWidget *page = emae_create_basic_assistant_page (GTK_ASSISTANT (parent), "identity_page"); - page = glade_xml_get_widget (druidxml, "identity_page"); + gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; - g_object_unref (druidxml); - gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Identity"))); } @@ -2203,22 +2244,12 @@ emae_receive_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget w = glade_xml_get_widget (xml, item->label); if (emae->type == EMAE_PAGES) { gtk_box_pack_start ((GtkBox *)emae->pages[1], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; + } else if (((EConfig *)gui->config)->type == E_CONFIG_ASSISTANT) { + GtkWidget *page = emae_create_basic_assistant_page (GTK_ASSISTANT (parent), "source_page"); - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new (gladefile, "source_page", NULL); - g_free (gladefile); + gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - page = glade_xml_get_widget (druidxml, "source_page"); - - gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; - g_object_unref (druidxml); - gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Receiving Email"))); } @@ -2673,22 +2704,12 @@ emae_send_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *ol w = glade_xml_get_widget (xml, item->label); if (emae->type == EMAE_PAGES) { gtk_box_pack_start ((GtkBox *)emae->pages[2], w, TRUE, TRUE, 0); - } else if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new (gladefile, "transport_page", NULL); - g_free (gladefile); + } else if (((EConfig *)gui->config)->type == E_CONFIG_ASSISTANT) { + GtkWidget *page = emae_create_basic_assistant_page (GTK_ASSISTANT (parent), "transport_page"); - page = glade_xml_get_widget (druidxml, "transport_page"); + gtk_box_pack_start (GTK_BOX (page), w, TRUE, TRUE, 0); - gtk_box_pack_start ((GtkBox*)((GnomeDruidPageStandard *)page)->vbox, w, TRUE, TRUE, 0); w = page; - g_object_unref (druidxml); - gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); } else { gtk_notebook_append_page ((GtkNotebook *)parent, w, gtk_label_new (_("Sending Email"))); } @@ -2884,59 +2905,32 @@ emae_management_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidg GtkWidget *w; w = gui->management_frame; - if (((EConfig *)gui->config)->type == E_CONFIG_DRUID) { - GladeXML *druidxml; - GtkWidget *page; - gchar *gladefile; + if (((EConfig *)gui->config)->type == E_CONFIG_ASSISTANT) { + GtkWidget *page = emae_create_basic_assistant_page (GTK_ASSISTANT (parent), "management_page"); - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new (gladefile, "management_page", NULL); - g_free (gladefile); + gtk_widget_reparent (w, page); - page = glade_xml_get_widget (druidxml, "management_page"); - - gtk_widget_reparent (w, ((GnomeDruidPageStandard *)page)->vbox); w = page; - g_object_unref (druidxml); - gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)page); } return w; } static GtkWidget * -emae_widget_druid_glade (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) +emae_widget_assistant_page (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, gpointer data) { - GladeXML *druidxml; - GtkWidget *w; - gchar *gladefile; EMAccountEditor *emae = (EMAccountEditor *)data; if (emae->type == EMAE_PAGES) return NULL; - gladefile = g_build_filename (EVOLUTION_GLADEDIR, - "mail-config.glade", - NULL); - druidxml = glade_xml_new (gladefile, item->label, NULL); - g_free (gladefile); - - w = glade_xml_get_widget (druidxml, item->label); - /* i think the glade file has issues, we need to show all on at least the end page */ - gtk_widget_show_all (w); - g_object_unref (druidxml); - - gnome_druid_append_page ((GnomeDruid *)parent, (GnomeDruidPage *)w); - - return w; + return emae_create_basic_assistant_page (GTK_ASSISTANT (parent), item->label); } -/* plugin meta-data for "org.gnome.evolution.mail.config.accountDruid" */ -static EMConfigItem emae_druid_items[] = { - { E_CONFIG_DRUID, (gchar *) "" }, - { E_CONFIG_PAGE_START, (gchar *) "0.start", (gchar *) "start_page", emae_widget_druid_glade }, +/* 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 }, @@ -2962,10 +2956,10 @@ static EMConfigItem emae_druid_items[] = { { E_CONFIG_PAGE, (gchar *) "40.management", (gchar *) "management_frame", emae_management_page }, - { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_druid_glade }, + { E_CONFIG_PAGE_FINISH, (gchar *) "999.end", (gchar *) "finish_page", emae_widget_assistant_page }, { 0 }, }; -static gboolean emae_druid_items_translated = FALSE; +static gboolean emae_assistant_items_translated = FALSE; static void emae_free (EConfig *ec, GSList *items, gpointer data) @@ -3079,9 +3073,9 @@ emae_check_complete (EConfig *ec, const gchar *pageid, gpointer data) new_account = (original_account == NULL); /* We use the page-check of various pages to 'prepare' or - pre-load their values, only in the druid */ + pre-load their values, only in the assistant */ if (pageid - && ((EConfig *)emae->priv->config)->type == E_CONFIG_DRUID) { + && ((EConfig *)emae->priv->config)->type == E_CONFIG_ASSISTANT) { if (!strcmp (pageid, "00.identity")) { if (!emae->priv->identity_set) { gchar *uname; @@ -3342,14 +3336,14 @@ em_account_editor_construct (EMAccountEditor *emae, EMAccountEditorType type, co emae_editor_items_translated = TRUE; } } else { - ec = em_config_new (E_CONFIG_DRUID, id); - items = emae_druid_items; - if (!emae_druid_items_translated) { + 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_druid_items_translated = TRUE; + emae_assistant_items_translated = TRUE; } } -- cgit v1.2.3