X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Feasysetup%2Fmodest-easysetup-wizard.c;h=6997a2d25e8542fd4197db1fe6ed97503dbe7b84;hp=304c585da9ae3c0ab0adfbab4386af55bcf04102;hb=ef00f85692d7ba7b6e3f89421dda704bfc9e609f;hpb=422c29c198cf5de5f59213d5b4599e67732d1141 diff --git a/src/maemo/easysetup/modest-easysetup-wizard.c b/src/maemo/easysetup/modest-easysetup-wizard.c index 304c585..6997a2d 100644 --- a/src/maemo/easysetup/modest-easysetup-wizard.c +++ b/src/maemo/easysetup/modest-easysetup-wizard.c @@ -1,3 +1,4 @@ + /* Copyright (c) 2006, Nokia Corporation * All rights reserved. * @@ -53,16 +54,16 @@ #include "widgets/modest-ui-constants.h" #include "maemo/modest-account-settings-dialog.h" #include "maemo/modest-maemo-utils.h" +#include "modest-utils.h" #include #include /* For strlen(). */ +#include "maemo/modest-hildon-includes.h" /* Include config.h so that _() works: */ #ifdef HAVE_CONFIG_H #include #endif -#define EXAMPLE_EMAIL_ADDRESS "first.last@provider.com" - G_DEFINE_TYPE (ModestEasysetupWizardDialog, modest_easysetup_wizard_dialog, MODEST_TYPE_WIZARD_DIALOG); #define WIZARD_DIALOG_GET_PRIVATE(o) \ @@ -86,8 +87,14 @@ struct _ModestEasysetupWizardDialogPrivate /* Check if the user changes a field to show a confirmation dialog */ gboolean dirty; + + /* If we have a pending load of settings or not. */ + gboolean pending_load_settings; }; +static void save_to_settings (ModestEasysetupWizardDialog *self); + + static gboolean on_delete_event (GtkWidget *widget, GdkEvent *event, @@ -146,18 +153,16 @@ modest_easysetup_wizard_dialog_finalize (GObject *object) if (self->specific_window) gtk_widget_destroy (self->specific_window); + + if (self->settings) + g_object_unref (self->settings); - g_free (self->saved_account_name); - G_OBJECT_CLASS (modest_easysetup_wizard_dialog_parent_class)->finalize (object); } static void show_error (GtkWidget *parent_widget, const gchar* text); -static gboolean -create_account (ModestEasysetupWizardDialog *self, gboolean enabled); - static void create_subsequent_easysetup_pages (ModestEasysetupWizardDialog *self); @@ -195,9 +200,8 @@ static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* acco account_wizard->combo_incoming_security)); const int port_num = get_serverport_incoming(protocol, protocol_security_incoming); GList *list_auth_methods = - modest_maemo_utils_get_supported_secure_authentication_methods ( - protocol, - hostname, port_num, username, GTK_WINDOW (account_wizard), &error); + modest_utils_get_supported_secure_authentication_methods (protocol, hostname, port_num, + username, GTK_WINDOW (account_wizard), &error); if (list_auth_methods) { /* TODO: Select the correct method */ GList* list = NULL; @@ -215,8 +219,8 @@ static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* acco return list; } - if(error == NULL || error->domain != modest_maemo_utils_get_supported_secure_authentication_error_quark() || - error->code != MODEST_MAEMO_UTILS_GET_SUPPORTED_SECURE_AUTHENTICATION_ERROR_CANCELED) + if(error == NULL || error->domain != modest_utils_get_supported_secure_authentication_error_quark() || + error->code != MODEST_UTILS_GET_SUPPORTED_SECURE_AUTHENTICATION_ERROR_CANCELED) { show_error (GTK_WIDGET(account_wizard), _("Could not discover supported secure authentication methods.")); } @@ -380,7 +384,7 @@ on_combo_account_serviceprovider (GtkComboBox *widget, gpointer user_data) domain_name = modest_presets_get_domain (priv->presets, provider_id); if(!domain_name) - domain_name = g_strdup (EXAMPLE_EMAIL_ADDRESS); + domain_name = g_strdup (MODEST_EXAMPLE_EMAIL_ADDRESS); if (self->entry_user_email) gtk_entry_set_text (GTK_ENTRY (self->entry_user_email), domain_name); @@ -415,6 +419,44 @@ on_entry_invalid_character (ModestValidatingEntry *self, const gchar* character, show_error (GTK_WIDGET (self), message); } +static gint +get_default_country_code(void) +{ + /* TODO: Default to the current country somehow. + * But I don't know how to get the information that is specified in the + * "Language and region" control panel. It does not seem be anywhere in gconf. murrayc. + * + * This is probably not the best choice of gconf key: + * This is the "mcc used in the last pairing", ie. the last connection you made. + * set by the osso-operator-wizard package, suggested by Dirk-Jan Binnema. + * + */ + GError *error = NULL; + const gchar* key = "/apps/osso/operator-wizard/last_mcc"; + gint mcc_id = modest_conf_get_int(modest_runtime_get_conf (), key, &error); + + if(mcc_id < 0) + mcc_id = 0; + + if (error) { + g_warning ("Error getting gconf key %s:\n%s", key, error->message); + g_error_free (error); + error = NULL; + + mcc_id = 0; + } + + /* Note that modest_conf_get_int() seems to return 0 without an error if the key is not there + * This might just be a Maemo bug. + */ + if (mcc_id == 0) + { + /* For now, we default to Finland when there is nothing better: */ + mcc_id = 244; + } + return mcc_id; +} + static GtkWidget* create_page_account_details (ModestEasysetupWizardDialog *self) { @@ -460,47 +502,10 @@ create_page_account_details (ModestEasysetupWizardDialog *self) g_signal_connect (G_OBJECT (self->combo_account_serviceprovider), "changed", G_CALLBACK (on_combo_account_serviceprovider), self); - /* TODO: Default to the current country somehow. - * But I don't know how to get the information that is specified in the - * "Language and region" control panel. It does not seem be anywhere in gconf. murrayc. - * - * This is probably not the best choice of gconf key: - * This is the "mcc used in the last pairing", ie. the last connection you made. - * set by the osso-operator-wizard package, suggested by Dirk-Jan Binnema. - * - */ - GError *error = NULL; - const gchar* key = "/apps/osso/operator-wizard/last_mcc"; - gint mcc_id = modest_conf_get_int(modest_runtime_get_conf (), key, &error); - - if(mcc_id < 0) - mcc_id = 0; - - if (error) { - g_warning ("Error getting gconf key %s:\n%s", key, error->message); - g_error_free (error); - error = NULL; - - mcc_id = 0; - } - - /* Note that modest_conf_get_int() seems to return 0 without an error if the key is not there - * This might just be a Maemo bug. - */ - if (mcc_id == 0) - { - /* For now, we default to Finland when there is nothing better: */ - mcc_id = 244; - } - - easysetup_country_combo_box_set_active_country_mcc ( - EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country), mcc_id); - - /* The description widgets: */ self->entry_account_title = GTK_WIDGET (modest_validating_entry_new ()); g_signal_connect(G_OBJECT(self->entry_account_title), "changed", - G_CALLBACK(on_easysetup_changed), self); + G_CALLBACK(on_easysetup_changed), self); /* Do use auto-capitalization: */ hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_account_title), HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_AUTOCAP); @@ -640,7 +645,7 @@ create_page_user_details (ModestEasysetupWizardDialog *self) hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_user_email), HILDON_GTK_INPUT_MODE_FULL); caption = create_caption_new_with_asterisk (self, sizegroup, _("mcen_li_emailsetup_email_address"), self->entry_user_email, NULL, HILDON_CAPTION_MANDATORY); - gtk_entry_set_text (GTK_ENTRY (self->entry_user_email), EXAMPLE_EMAIL_ADDRESS); /* Default text. */ + gtk_entry_set_text (GTK_ENTRY (self->entry_user_email), MODEST_EXAMPLE_EMAIL_ADDRESS); /* Default text. */ gtk_widget_show (self->entry_user_email); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); g_signal_connect(G_OBJECT(self->entry_user_email), "changed", @@ -763,8 +768,7 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); /* The incoming server widgets: */ - if (!self->combo_incoming_servertype) - self->combo_incoming_servertype = GTK_WIDGET (easysetup_servertype_combo_box_new ()); + self->combo_incoming_servertype = GTK_WIDGET (easysetup_servertype_combo_box_new ()); easysetup_servertype_combo_box_set_active_servertype ( EASYSETUP_SERVERTYPE_COMBO_BOX (self->combo_incoming_servertype), MODEST_PROTOCOL_STORE_POP); GtkWidget *caption = create_caption_new_with_asterisk (self, sizegroup, @@ -773,19 +777,12 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); - if(!self->entry_incomingserver) - { - self->entry_incomingserver = gtk_entry_new (); - g_signal_connect(G_OBJECT(self->entry_incomingserver), "changed", - G_CALLBACK(on_easysetup_changed), self); - } + self->entry_incomingserver = gtk_entry_new (); + g_signal_connect(G_OBJECT(self->entry_incomingserver), "changed", G_CALLBACK(on_easysetup_changed), self); /* Auto-capitalization is the default, so let's turn it off: */ hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_incomingserver), HILDON_GTK_INPUT_MODE_FULL); set_default_custom_servernames (self); - if (self->caption_incoming) - gtk_widget_destroy (self->caption_incoming); - /* The caption title will be updated in update_incoming_server_title(). * so this default text will never be seen: */ /* (Note: Changing the title seems pointless. murrayc) */ @@ -806,8 +803,7 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self G_CALLBACK (on_entry_incoming_servername_changed), self); /* The secure connection widgets: */ - if (!self->combo_incoming_security) - self->combo_incoming_security = GTK_WIDGET (modest_serversecurity_combo_box_new ()); + self->combo_incoming_security = GTK_WIDGET (modest_serversecurity_combo_box_new ()); update_incoming_server_security_choices (self); modest_serversecurity_combo_box_set_active_serversecurity ( MODEST_SERVERSECURITY_COMBO_BOX (self->combo_incoming_security), MODEST_PROTOCOL_CONNECTION_NORMAL); @@ -819,12 +815,9 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); - if(!self->checkbox_incoming_auth) - { - self->checkbox_incoming_auth = gtk_check_button_new (); - g_signal_connect (G_OBJECT (self->checkbox_incoming_auth), "toggled", + self->checkbox_incoming_auth = gtk_check_button_new (); + g_signal_connect (G_OBJECT (self->checkbox_incoming_auth), "toggled", G_CALLBACK (on_easysetup_changed), self); - } caption = hildon_caption_new (sizegroup, _("mcen_li_emailsetup_secure_authentication"), self->checkbox_incoming_auth, NULL, HILDON_CAPTION_OPTIONAL); @@ -904,12 +897,9 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); /* The outgoing server widgets: */ - if (!self->entry_outgoingserver) - { - self->entry_outgoingserver = gtk_entry_new (); - g_signal_connect (G_OBJECT (self->entry_outgoingserver), "changed", - G_CALLBACK (on_easysetup_changed), self); - } + self->entry_outgoingserver = gtk_entry_new (); + g_signal_connect (G_OBJECT (self->entry_outgoingserver), "changed", + G_CALLBACK (on_easysetup_changed), self); /* Auto-capitalization is the default, so let's turn it off: */ hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_outgoingserver), HILDON_GTK_INPUT_MODE_FULL); GtkWidget *caption = create_caption_new_with_asterisk (self, sizegroup, @@ -920,12 +910,9 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self set_default_custom_servernames (self); /* The secure connection widgets: */ - if (!self->combo_outgoing_security) - { - self->combo_outgoing_security = GTK_WIDGET (modest_serversecurity_combo_box_new ()); - g_signal_connect (G_OBJECT (self->combo_outgoing_security), "changed", + self->combo_outgoing_security = GTK_WIDGET (modest_serversecurity_combo_box_new ()); + g_signal_connect (G_OBJECT (self->combo_outgoing_security), "changed", G_CALLBACK (on_easysetup_changed), self); - } modest_serversecurity_combo_box_fill ( MODEST_SERVERSECURITY_COMBO_BOX (self->combo_outgoing_security), MODEST_PROTOCOL_TRANSPORT_SMTP); modest_serversecurity_combo_box_set_active_serversecurity ( @@ -937,12 +924,9 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self gtk_widget_show (caption); /* The secure authentication widgets: */ - if (!self->combo_outgoing_auth) - { - self->combo_outgoing_auth = GTK_WIDGET (modest_secureauth_combo_box_new ()); - g_signal_connect (G_OBJECT (self->combo_outgoing_auth), "changed", + self->combo_outgoing_auth = GTK_WIDGET (modest_secureauth_combo_box_new ()); + g_signal_connect (G_OBJECT (self->combo_outgoing_auth), "changed", G_CALLBACK (on_easysetup_changed), self); - } caption = hildon_caption_new (sizegroup, _("mcen_li_emailsetup_secure_authentication"), self->combo_outgoing_auth, NULL, HILDON_CAPTION_OPTIONAL); gtk_widget_show (self->combo_outgoing_auth); @@ -954,14 +938,12 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self gtk_widget_show (separator); /* connection-specific checkbox: */ - if (!self->checkbox_outgoing_smtp_specific) { - self->checkbox_outgoing_smtp_specific = gtk_check_button_new (); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->checkbox_outgoing_smtp_specific), - FALSE); - g_signal_connect (G_OBJECT (self->checkbox_outgoing_smtp_specific), "toggled", - G_CALLBACK (on_easysetup_changed), self); + self->checkbox_outgoing_smtp_specific = gtk_check_button_new (); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->checkbox_outgoing_smtp_specific), + FALSE); + g_signal_connect (G_OBJECT (self->checkbox_outgoing_smtp_specific), "toggled", + G_CALLBACK (on_easysetup_changed), self); - } caption = hildon_caption_new (sizegroup, _("mcen_fi_advsetup_connection_smtp"), self->checkbox_outgoing_smtp_specific, NULL, HILDON_CAPTION_OPTIONAL); gtk_widget_show (self->checkbox_outgoing_smtp_specific); @@ -969,8 +951,7 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self gtk_widget_show (caption); /* Connection-specific SMTP-Severs Edit button: */ - if (!self->button_outgoing_smtp_servers) - self->button_outgoing_smtp_servers = gtk_button_new_with_label (_("mcen_bd_edit")); + self->button_outgoing_smtp_servers = gtk_button_new_with_label (_("mcen_bd_edit")); caption = hildon_caption_new (sizegroup, _("mcen_fi_advsetup_optional_smtp"), self->button_outgoing_smtp_servers, NULL, HILDON_CAPTION_OPTIONAL); hildon_caption_set_child_expand (HILDON_CAPTION (caption), FALSE); @@ -998,17 +979,20 @@ static gboolean show_advanced_edit(gpointer user_data) { ModestEasysetupWizardDialog * self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); - - if (!(self->saved_account_name)) - return FALSE; + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); + gint response; /* Show the Account Settings window: */ ModestAccountSettingsDialog *dialog = modest_account_settings_dialog_new (); - modest_account_settings_dialog_set_account_name (dialog, self->saved_account_name); + if (priv->pending_load_settings) { + save_to_settings (self); + priv->pending_load_settings = FALSE; + } + modest_account_settings_dialog_set_account (dialog, self->settings); modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog)); - gtk_dialog_run (GTK_DIALOG (dialog)); + response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog)); @@ -1020,21 +1004,6 @@ on_button_edit_advanced_settings (GtkButton *button, gpointer user_data) { ModestEasysetupWizardDialog * self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); - /* Save the new account, so we can edit it with ModestAccountSettingsDialog, - * without recoding it to use non-gconf information. - * This account will be deleted if Finish is never actually clicked. */ - - gboolean saved = TRUE; - if (!(self->saved_account_name)) { - saved = create_account (self, FALSE); - } - - if (!saved) - return; - - if (!(self->saved_account_name)) - return; - /* Show the Account Settings window: */ show_advanced_edit(self); } @@ -1042,6 +1011,7 @@ static GtkWidget* create_page_complete_custom (ModestEasysetupWizardDialog *self { GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_setup_complete")); + GtkWidget *button_edit = gtk_button_new_with_label (_("mcen_bd_edit")); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_widget_set_size_request (label, 600, -1); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); @@ -1055,16 +1025,14 @@ static GtkWidget* create_page_complete_custom (ModestEasysetupWizardDialog *self gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); - if (!self->button_edit) - self->button_edit = gtk_button_new_with_label (_("mcen_bd_edit")); GtkWidget *caption = hildon_caption_new (NULL, _("mcen_fi_advanced_settings"), - self->button_edit, NULL, HILDON_CAPTION_OPTIONAL); + button_edit, NULL, HILDON_CAPTION_OPTIONAL); hildon_caption_set_child_expand (HILDON_CAPTION (caption), FALSE); - gtk_widget_show (self->button_edit); + gtk_widget_show (button_edit); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); - g_signal_connect (G_OBJECT (self->button_edit), "clicked", + g_signal_connect (G_OBJECT (button_edit), "clicked", G_CALLBACK (on_button_edit_advanced_settings), self); gtk_widget_show (GTK_WIDGET (box)); @@ -1080,13 +1048,6 @@ on_response (ModestWizardDialog *wizard_dialog, gpointer user_data) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (wizard_dialog); - if (response_id == GTK_RESPONSE_CANCEL) { - /* Remove any temporarily-saved account that will not actually be needed: */ - if (self->saved_account_name) { - modest_account_mgr_remove_account (self->account_manager, - self->saved_account_name); - } - } invoke_enable_buttons_vfunc (self); } @@ -1104,10 +1065,10 @@ on_response_before (ModestWizardDialog *wizard_dialog, if (priv->dirty) { GtkDialog *dialog = GTK_DIALOG (hildon_note_new_confirmation (GTK_WINDOW (self), _("imum_nc_wizard_confirm_lose_changes"))); - /* TODO: These button names will be ambiguous, and not specified in the UI specification. */ + /* TODO: These button names will be ambiguous, and not + * specified in the UI specification. */ const gint dialog_response = gtk_dialog_run (dialog); - self->combo_account_country = NULL; gtk_widget_destroy (GTK_WIDGET (dialog)); if (dialog_response != GTK_RESPONSE_OK) { @@ -1137,12 +1098,19 @@ presets_idle (gpointer userdata) priv->presets = idle_data->presets; if (self->combo_account_country) { - gint mcc = easysetup_country_combo_box_get_active_country_mcc ( + gint mcc = get_default_country_code(); + /* Fill the combo in an idle call, as it takes a lot of time */ + easysetup_country_combo_box_load_data( EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country)); + easysetup_country_combo_box_set_active_country_mcc ( + EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country), mcc); easysetup_provider_combo_box_fill ( - EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, mcc); + EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), + priv->presets, mcc); } + priv->dirty = FALSE; + g_object_unref (idle_data->dialog); g_free (idle_data); @@ -1158,17 +1126,31 @@ presets_loader (gpointer userdata) ModestPresets *presets = NULL; IdleData *idle_data; - const gchar* filepath = MODEST_PROVIDERS_DATA_PATH; /* Defined in config.h */ - presets = modest_presets_new (filepath); - if (!(presets)) { - g_warning ("Could not locate the official provider data keyfile from %s", filepath); + const gchar* path = NULL; + const gchar* path1 = MODEST_PROVIDER_DATA_FILE; + const gchar* path2 = MODEST_MAEMO_PROVIDER_DATA_FILE; + + if (access(path1, R_OK) == 0) + path = path1; + else if (access(path2, R_OK) == 0) + path = path2; + else { + g_warning ("%s: neither '%s' nor '%s' is a readable provider data file", + __FUNCTION__, path1, path2); + return NULL; } + presets = modest_presets_new (path); + if (!presets) { + g_warning ("%s: failed to parse '%s'", __FUNCTION__, path); + return NULL; + } + idle_data = g_new0 (IdleData, 1); idle_data->dialog = self; idle_data->presets = presets; - - g_idle_add (presets_idle, idle_data); + + g_idle_add (presets_idle, idle_data); return NULL; } @@ -1194,6 +1176,7 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) /* The server fields did not have been manually changed yet */ priv->server_changes = 0; + priv->pending_load_settings = TRUE; /* Get the account manager object, * so we can check for existing accounts, @@ -1274,6 +1257,10 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) g_object_ref (self); g_thread_create (presets_loader, self, FALSE, NULL); + hildon_help_dialog_help_enable (GTK_DIALOG(self), "applications_email_wizardwelcome", + modest_maemo_utils_get_osso_context()); + + self->settings = modest_account_settings_new (); } ModestEasysetupWizardDialog* @@ -1373,11 +1360,21 @@ static void create_subsequent_pages (ModestEasysetupWizardDialog *self) if(self->page_custom_incoming) { gtk_widget_destroy (self->page_custom_incoming); self->page_custom_incoming = NULL; + self->combo_incoming_servertype = NULL; + self->caption_incoming = NULL; + self->entry_incomingserver = NULL; + self->combo_incoming_security = NULL; + self->checkbox_incoming_auth = NULL; } if(self->page_custom_outgoing) { gtk_widget_destroy (self->page_custom_outgoing); self->page_custom_outgoing = NULL; + self->entry_outgoingserver = NULL; + self->combo_outgoing_security = NULL; + self->combo_outgoing_auth = NULL; + self->checkbox_outgoing_smtp_specific = NULL; + self->button_outgoing_smtp_servers = NULL; } if(self->page_complete_customsetup) { @@ -1495,6 +1492,12 @@ static gboolean on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget *next_page) { ModestEasysetupWizardDialog *account_wizard = MODEST_EASYSETUP_WIZARD_DIALOG (dialog); + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (account_wizard); + + /* if are browsing pages previous to the last one, then we have pending settings in + * this wizard */ + if (next_page != NULL) + priv->pending_load_settings = TRUE; /* Do extra validation that couldn't be done for every key press, * either because it was too slow, @@ -1551,8 +1554,7 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * /* Check if the server supports secure authentication */ const ModestConnectionProtocol security_incoming = modest_serversecurity_combo_box_get_active_serversecurity ( - MODEST_SERVERSECURITY_COMBO_BOX ( - account_wizard->combo_incoming_security)); + MODEST_SERVERSECURITY_COMBO_BOX (account_wizard->combo_incoming_security)); if (gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (account_wizard->checkbox_incoming_auth)) && !modest_protocol_info_is_secure(security_incoming)) @@ -1567,14 +1569,10 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * */ if(!next_page) /* This is NULL when this is a click on Finish. */ { - if (account_wizard->saved_account_name) { - /* Just enable the already-saved account (temporarily created when - * editing advanced settings): */ - modest_account_mgr_set_enabled (account_wizard->account_manager, - account_wizard->saved_account_name, TRUE); - } else { - create_account (account_wizard, TRUE /* enabled */); + if (priv->pending_load_settings) { + save_to_settings (account_wizard); } + modest_account_mgr_add_account_from_settings (account_wizard->account_manager, account_wizard->settings); } @@ -1685,275 +1683,201 @@ static void show_error (GtkWidget *parent_widget, const gchar* text) { //TODO: Apparently this doesn't show anything in Maemo Bora: - hildon_banner_show_information(parent_widget, NULL, text); - -#if 0 - GtkDialog *dialog = GTK_DIALOG (hildon_note_new_information (parent_window, text)); */ - /* - GtkDialog *dialog = GTK_DIALOG (gtk_message_dialog_new (parent_window, - (GtkDialogFlags)0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - text )); - */ - - gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); -#endif + hildon_banner_show_information(parent_widget, NULL, text); } -/** Attempt to create the account from the information that the user has entered. - * @result: TRUE if the account was successfully created. + +/** + * save_to_settings: + * @self: a #ModestEasysetupWizardDialog + * + * takes information from all the wizard and stores it in settings */ -static gboolean -create_account (ModestEasysetupWizardDialog *self, gboolean enabled) +static void +save_to_settings (ModestEasysetupWizardDialog *self) { ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); guint special_port; - gchar* display_name = get_entered_account_title (self); + gchar *provider_id; + gchar* display_name; + const gchar *username, *password; + gchar *store_hostname, *transport_hostname; + guint store_port, transport_port; + ModestTransportStoreProtocol store_protocol, transport_protocol; + ModestConnectionProtocol store_security, transport_security; + ModestAuthProtocol store_auth_protocol, transport_auth_protocol; + ModestServerAccountSettings *store_settings, *transport_settings; + const gchar *fullname, *email_address; - /* Some checks: */ - if (!display_name) - return FALSE; - - /* We should have checked for this already, - * and changed that name accordingly, - * but let's check again just in case: - */ - if (modest_account_mgr_account_with_display_name_exists (self->account_manager, display_name)) { - g_free (display_name); - return FALSE; - } - - /* Increment the non-user visible name if necessary, - * based on the display name: */ - gchar *account_name_start = g_strdup_printf ("%sID", display_name); - gchar* account_name = modest_account_mgr_get_unused_account_name (self->account_manager, - account_name_start, FALSE /* not a server account */); - g_free (account_name_start); + /* Get details from the specified presets: */ + provider_id = easysetup_provider_combo_box_get_active_provider_id ( + EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider)); /* username and password (for both incoming and outgoing): */ - const gchar* username = gtk_entry_get_text (GTK_ENTRY (self->entry_user_username)); - const gchar* password = gtk_entry_get_text (GTK_ENTRY (self->entry_user_password)); + username = gtk_entry_get_text (GTK_ENTRY (self->entry_user_username)); + password = gtk_entry_get_text (GTK_ENTRY (self->entry_user_password)); + /* Incoming server: */ /* Note: We need something as default for the ModestTransportStoreProtocol* values, * or modest_account_mgr_add_server_account will fail. */ - gchar* servername_incoming = NULL; - guint serverport_incoming = 0; - ModestTransportStoreProtocol protocol_incoming = MODEST_PROTOCOL_STORE_POP; - ModestConnectionProtocol protocol_security_incoming = MODEST_PROTOCOL_CONNECTION_NORMAL; - ModestAuthProtocol protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_NONE; + store_port = 0; + store_protocol = MODEST_PROTOCOL_STORE_POP; + store_security = MODEST_PROTOCOL_CONNECTION_NORMAL; + store_auth_protocol = MODEST_PROTOCOL_AUTH_NONE; - /* Get details from the specified presets: */ - gchar* provider_id = easysetup_provider_combo_box_get_active_provider_id ( - EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider)); if (provider_id) { + ModestPresetsServerType store_provider_server_type; + ModestPresetsSecurity store_provider_security; /* Use presets: */ - servername_incoming = modest_presets_get_server (priv->presets, provider_id, - TRUE /* incoming */); + store_hostname = modest_presets_get_server (priv->presets, provider_id, + TRUE /* store */); - ModestPresetsServerType servertype_incoming = modest_presets_get_info_server_type (priv->presets, - provider_id, - TRUE /* incoming */); - ModestPresetsSecurity security_incoming = modest_presets_get_info_server_security (priv->presets, - provider_id, - TRUE /* incoming */); + store_provider_server_type = modest_presets_get_info_server_type (priv->presets, + provider_id, + TRUE /* store */); + store_provider_security = modest_presets_get_info_server_security (priv->presets, + provider_id, + TRUE /* store */); - /* We don't check for SMTP here as that is impossible for an incoming server. */ - if (servertype_incoming == MODEST_PRESETS_SERVER_TYPE_IMAP) { - protocol_incoming = MODEST_PROTOCOL_STORE_IMAP; - } else if (servertype_incoming == MODEST_PRESETS_SERVER_TYPE_POP) { - protocol_incoming = MODEST_PROTOCOL_STORE_POP; - } - serverport_incoming = get_serverport_incoming(servertype_incoming, security_incoming); + if (store_provider_server_type == MODEST_PRESETS_SERVER_TYPE_IMAP) + store_protocol = MODEST_PROTOCOL_STORE_IMAP; + else if (store_provider_server_type == MODEST_PRESETS_SERVER_TYPE_POP) + store_protocol = MODEST_PROTOCOL_STORE_POP; + else /* fallback */ + store_protocol = MODEST_PROTOCOL_STORE_POP; + + /* we check if there is a *special* port */ + special_port = modest_presets_get_port (priv->presets, provider_id, TRUE /* incoming */); + if (special_port != 0) + store_port = special_port; + else + store_port = get_serverport_incoming(store_provider_server_type, store_provider_security); - if (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING) - protocol_security_incoming = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ + if (store_provider_security & MODEST_PRESETS_SECURITY_SECURE_INCOMING) + store_security = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ - if (security_incoming & MODEST_PRESETS_SECURITY_APOP) - protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_PASSWORD; /* TODO: Is this what we want? */ - } - else { + if (store_provider_security & MODEST_PRESETS_SECURITY_APOP) + store_auth_protocol = MODEST_PROTOCOL_AUTH_PASSWORD; /* TODO: Is this what we want? */ + } else { /* Use custom pages because no preset was specified: */ - servername_incoming = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry_incomingserver) )); - - protocol_incoming = easysetup_servertype_combo_box_get_active_servertype ( - EASYSETUP_SERVERTYPE_COMBO_BOX (self->combo_incoming_servertype)); - - protocol_security_incoming = modest_serversecurity_combo_box_get_active_serversecurity ( + store_hostname = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry_incomingserver) )); + store_protocol = easysetup_servertype_combo_box_get_active_servertype ( + EASYSETUP_SERVERTYPE_COMBO_BOX (self->combo_incoming_servertype)); + store_security = modest_serversecurity_combo_box_get_active_serversecurity ( MODEST_SERVERSECURITY_COMBO_BOX (self->combo_incoming_security)); - /* The UI spec says: + /* The UI spec says: * If secure authentication is unchecked, allow sending username and password also as plain text. - * If secure authentication is checked, require one of the secure methods during connection: SSL, TLS, CRAM-MD5 etc. - */ - + * If secure authentication is checked, require one of the secure methods during + * connection: SSL, TLS, CRAM-MD5 etc. */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbox_incoming_auth)) && - !modest_protocol_info_is_secure(protocol_security_incoming)) { - protocol_authentication_incoming = check_first_supported_auth_method (self); - } - else { - protocol_authentication_incoming = MODEST_PROTOCOL_AUTH_PASSWORD; + !modest_protocol_info_is_secure(store_security)) { + store_auth_protocol = check_first_supported_auth_method (self); + } else { + store_auth_protocol = MODEST_PROTOCOL_AUTH_PASSWORD; } } - - /* First we add the 2 server accounts, and then we add the account that uses them. - * If we don't do it in this order then we will experience a crash. */ - - /* Add a (incoming) server account, to be used by the account: */ - gchar *store_name_start = g_strconcat (account_name, "_store", NULL); - gchar *store_name = modest_account_mgr_get_unused_account_name (self->account_manager, - store_name_start, TRUE /* server account */); - g_free (store_name_start); - - /* we check if there is a *special* port */ - special_port = modest_presets_get_port (priv->presets, provider_id, - TRUE /* incoming */); - if (special_port != 0) - serverport_incoming = special_port; - - gboolean created = modest_account_mgr_add_server_account (self->account_manager, - store_name, - servername_incoming, - serverport_incoming, - username, password, - protocol_incoming, - protocol_security_incoming, - protocol_authentication_incoming); - - g_free (servername_incoming); - - if (!created) { - /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WIDGET (self), _("An error occurred while creating the incoming account.")); - g_free (display_name); - return FALSE; - } + + /* now we store the store account settings */ + store_settings = modest_account_settings_get_store_settings (self->settings); + modest_server_account_settings_set_hostname (store_settings, store_hostname); + modest_server_account_settings_set_username (store_settings, username); + modest_server_account_settings_set_password (store_settings, password); + modest_server_account_settings_set_protocol (store_settings, store_protocol); + modest_server_account_settings_set_security (store_settings, store_security); + modest_server_account_settings_set_auth_protocol (store_settings, store_auth_protocol); + if (store_port != 0) + modest_server_account_settings_set_port (store_settings, store_port); + + g_object_unref (store_settings); + g_free (store_hostname); /* Outgoing server: */ - gchar* servername_outgoing = NULL; - ModestTransportStoreProtocol protocol_outgoing = MODEST_PROTOCOL_STORE_POP; - ModestConnectionProtocol protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_NORMAL; - ModestAuthProtocol protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_NONE; - guint serverport_outgoing = 0; + transport_hostname = NULL; + transport_protocol = MODEST_PROTOCOL_STORE_POP; + transport_security = MODEST_PROTOCOL_CONNECTION_NORMAL; + transport_auth_protocol = MODEST_PROTOCOL_AUTH_NONE; + transport_port = 0; if (provider_id) { + ModestPresetsServerType transport_provider_server_type; + ModestPresetsSecurity transport_provider_security; + /* Use presets: */ - servername_outgoing = modest_presets_get_server (priv->presets, provider_id, - FALSE /* incoming */); + transport_hostname = modest_presets_get_server (priv->presets, provider_id, + FALSE /* transport */); - ModestPresetsServerType servertype_outgoing = modest_presets_get_info_server_type (priv->presets, - provider_id, - FALSE /* incoming */); - + transport_provider_server_type = modest_presets_get_info_server_type (priv->presets, + provider_id, + FALSE /* transport */); + transport_provider_security = modest_presets_get_info_server_security (priv->presets, + provider_id, + FALSE /* transport */); + /* Note: We need something as default, or modest_account_mgr_add_server_account will fail. */ - protocol_outgoing = MODEST_PROTOCOL_TRANSPORT_SENDMAIL; - if (servertype_outgoing == MODEST_PRESETS_SERVER_TYPE_SMTP) - protocol_outgoing = MODEST_PROTOCOL_TRANSPORT_SMTP; - - ModestPresetsSecurity security_outgoing = - modest_presets_get_info_server_security (priv->presets, provider_id, - FALSE /* incoming */); + transport_protocol = MODEST_PROTOCOL_TRANSPORT_SENDMAIL; + if (transport_provider_server_type == MODEST_PRESETS_SERVER_TYPE_SMTP) + transport_protocol = MODEST_PROTOCOL_TRANSPORT_SMTP; - protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_NORMAL; - if (security_outgoing & MODEST_PRESETS_SECURITY_SECURE_SMTP) { + transport_security = MODEST_PROTOCOL_CONNECTION_NORMAL; + if (transport_provider_security & MODEST_PRESETS_SECURITY_SECURE_SMTP) { /* printf("DEBUG: %s: using secure SMTP\n", __FUNCTION__); */ - protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ - serverport_outgoing = 465; - protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_PASSWORD; + transport_security = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ + /* we check if there is a *special* port */ + special_port = modest_presets_get_port (priv->presets, provider_id, + FALSE /* transport */); + if (special_port != 0) + transport_port = special_port; + else + transport_port = 465; + transport_auth_protocol = MODEST_PROTOCOL_AUTH_PASSWORD; } else { /* printf("DEBUG: %s: using non-secure SMTP\n", __FUNCTION__); */ - protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_NONE; + transport_auth_protocol = MODEST_PROTOCOL_AUTH_NONE; } } else { /* Use custom pages because no preset was specified: */ - servername_outgoing = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry_outgoingserver) )); - - protocol_outgoing = MODEST_PROTOCOL_TRANSPORT_SMTP; /* It's always SMTP for outgoing. */ - - protocol_security_outgoing = modest_serversecurity_combo_box_get_active_serversecurity ( - MODEST_SERVERSECURITY_COMBO_BOX (self->combo_outgoing_security)); - - protocol_authentication_outgoing = modest_secureauth_combo_box_get_active_secureauth ( + transport_hostname = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry_outgoingserver) )); + transport_protocol = MODEST_PROTOCOL_TRANSPORT_SMTP; /* It's always SMTP for outgoing. */ + transport_security = modest_serversecurity_combo_box_get_active_serversecurity ( + MODEST_SERVERSECURITY_COMBO_BOX (self->combo_outgoing_security)); + transport_auth_protocol = modest_secureauth_combo_box_get_active_secureauth ( MODEST_SECUREAUTH_COMBO_BOX (self->combo_outgoing_auth)); } - /* Add a (outgoing) server account to be used by the account: */ - gchar *transport_name_start = g_strconcat (account_name, "_transport", NULL); - gchar *transport_name = modest_account_mgr_get_unused_account_name (self->account_manager, - transport_name_start, TRUE /* server account */); - g_free (transport_name_start); - - /* we check if there is a *special* port */ - special_port = modest_presets_get_port (priv->presets, provider_id, - FALSE /* incoming */); - if (special_port != 0) - serverport_outgoing = special_port; - - created = modest_account_mgr_add_server_account (self->account_manager, - transport_name, - servername_outgoing, - serverport_outgoing, - username, password, - protocol_outgoing, - protocol_security_outgoing, - protocol_authentication_outgoing); - - g_free (servername_outgoing); - - if (!created) { - /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WIDGET (self), _("An error occurred while creating the outgoing account.")); - g_free (display_name); - return FALSE; - } + /* now we transport the transport account settings */ + transport_settings = modest_account_settings_get_transport_settings (self->settings); + modest_server_account_settings_set_hostname (transport_settings, transport_hostname); + modest_server_account_settings_set_username (transport_settings, username); + modest_server_account_settings_set_password (transport_settings, password); + modest_server_account_settings_set_protocol (transport_settings, transport_protocol); + modest_server_account_settings_set_security (transport_settings, transport_security); + modest_server_account_settings_set_auth_protocol (transport_settings, transport_auth_protocol); + if (transport_port != 0) + modest_server_account_settings_set_port (transport_settings, transport_port); + + g_object_unref (transport_settings); + g_free (transport_hostname); + + fullname = gtk_entry_get_text (GTK_ENTRY (self->entry_user_name)); + email_address = gtk_entry_get_text (GTK_ENTRY (self->entry_user_email)); + modest_account_settings_set_fullname (self->settings, fullname); + modest_account_settings_set_email_address (self->settings, email_address); + /* we don't set retrieve type to preserve advanced settings if any. By default account settings + are set to headers only */ - const gchar* user_fullname = gtk_entry_get_text (GTK_ENTRY (self->entry_user_name)); - const gchar* emailaddress = gtk_entry_get_text (GTK_ENTRY (self->entry_user_email)); - const gchar *retrieve = MODEST_ACCOUNT_RETRIEVE_VALUE_HEADERS_ONLY; - - /* Create the account, which will contain the two "server accounts": */ - created = modest_account_mgr_add_account (self->account_manager, - account_name, - display_name, - user_fullname, - emailaddress, - retrieve, - store_name, - transport_name, - enabled); - g_free (store_name); - g_free (transport_name); - - if (!created) { - /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WIDGET (self), _("An error occurred while creating the account.")); - g_free (display_name); - return FALSE; - } - - /* Sanity check: */ - /* There must be at least one account now: */ - /* Note, when this fails is is caused by a Maemo gconf bug that has been - * fixed in versions after 3.1. */ - if(!modest_account_mgr_has_accounts (self->account_manager, FALSE)) - g_warning ("modest_account_mgr_account_names() returned NULL after adding an account."); - /* Save the connection-specific SMTP server accounts. */ - modest_account_mgr_set_use_connection_specific_smtp(self->account_manager, account_name, - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->checkbox_outgoing_smtp_specific))); - gboolean result = TRUE; - if (self->specific_window) - result = modest_connection_specific_smtp_window_save_server_accounts ( - MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window)); + modest_account_settings_set_use_connection_specific_smtp + (self->settings, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->checkbox_outgoing_smtp_specific))); - - g_free (self->saved_account_name); - self->saved_account_name = g_strdup (account_name); - - g_free (account_name); + display_name = get_entered_account_title (self); + modest_account_settings_set_display_name (self->settings, display_name); g_free (display_name); - - return result; + + if (self->specific_window) + modest_connection_specific_smtp_window_save_server_accounts ( + MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window)); } +