X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Feasysetup%2Fmodest-easysetup-wizard.c;h=575b53b104b1584fab3380b38925c247e5bf6ab6;hp=41c1083cd8818b6b6a43e82f5db6c544796042b9;hb=f6bbbbad62ac6fd92e896b59c4adfdd751aa8134;hpb=e6c1ad85e2cb021474d1b79cd58243eced604626 diff --git a/src/maemo/easysetup/modest-easysetup-wizard.c b/src/maemo/easysetup/modest-easysetup-wizard.c index 41c1083..575b53b 100644 --- a/src/maemo/easysetup/modest-easysetup-wizard.c +++ b/src/maemo/easysetup/modest-easysetup-wizard.c @@ -26,7 +26,7 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + #include "modest-easysetup-wizard.h" #include @@ -52,6 +52,7 @@ #include "maemo/modest-connection-specific-smtp-window.h" #include "widgets/modest-ui-constants.h" #include "maemo/modest-account-settings-dialog.h" +#include "maemo/modest-maemo-utils.h" #include #include /* For strlen(). */ @@ -69,12 +70,33 @@ G_DEFINE_TYPE (ModestEasysetupWizardDialog, modest_easysetup_wizard_dialog, MODE typedef struct _ModestEasysetupWizardDialogPrivate ModestEasysetupWizardDialogPrivate; + +typedef enum { + MODEST_EASYSETUP_WIZARD_DIALOG_INCOMING_CHANGED = 0x01, + MODEST_EASYSETUP_WIZARD_DIALOG_OUTGOING_CHANGED = 0x02 +} ModestEasysetupWizardDialogServerChanges; + struct _ModestEasysetupWizardDialogPrivate { ModestPresets *presets; + + /* Remember what fields the user edited manually to not prefill them + * again. */ + ModestEasysetupWizardDialogServerChanges server_changes; + + /* Check if the user changes a field to show a confirmation dialog */ + gboolean dirty; }; static void +on_easysetup_changed(GtkWidget* widget, ModestEasysetupWizardDialog* wizard) +{ + ModestEasysetupWizardDialogPrivate* priv = WIZARD_DIALOG_GET_PRIVATE(wizard); + g_return_if_fail (priv != NULL); + priv->dirty = TRUE; +} + +static void modest_easysetup_wizard_dialog_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { @@ -122,7 +144,7 @@ modest_easysetup_wizard_dialog_finalize (GObject *object) } static void -show_error (GtkWindow *parent_window, const gchar* text); +show_error (GtkWidget *parent_widget, const gchar* text); static gboolean create_account (ModestEasysetupWizardDialog *self, gboolean enabled); @@ -135,6 +157,94 @@ set_default_custom_servernames(ModestEasysetupWizardDialog *dialog); static void on_combo_servertype_changed(GtkComboBox *combobox, gpointer user_data); +static gint get_serverport_incoming(ModestPresetsServerType servertype_incoming, + ModestPresetsSecurity security_incoming) +{ + int serverport_incoming = 0; + /* We don't check for SMTP here as that is impossible for an incoming server. */ + if (servertype_incoming == MODEST_PRESETS_SERVER_TYPE_IMAP) { + serverport_incoming = + (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT) ? 993 : 143; + } else if (servertype_incoming == MODEST_PRESETS_SERVER_TYPE_POP) { + serverport_incoming = + (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT) ? 995 : 110; + } + return serverport_incoming; +} + +static GList* check_for_supported_auth_methods(ModestEasysetupWizardDialog* account_wizard) +{ + GError *error = NULL; + const ModestTransportStoreProtocol protocol = + easysetup_servertype_combo_box_get_active_servertype ( + EASYSETUP_SERVERTYPE_COMBO_BOX (account_wizard->combo_incoming_servertype)); + const gchar* hostname = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_incomingserver)); + const gchar* username = gtk_entry_get_text(GTK_ENTRY(account_wizard->entry_user_username)); + const ModestConnectionProtocol protocol_security_incoming = + modest_serversecurity_combo_box_get_active_serversecurity ( + MODEST_SERVERSECURITY_COMBO_BOX ( + 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); + if (list_auth_methods) { + /* TODO: Select the correct method */ + GList* list = NULL; + GList* method; + for (method = list_auth_methods; method != NULL; method = g_list_next(method)) { + ModestAuthProtocol auth = (ModestAuthProtocol) (GPOINTER_TO_INT(method->data)); + if (modest_protocol_info_auth_is_secure(auth)) { + list = g_list_append(list, GINT_TO_POINTER(auth)); + } + } + + g_list_free(list_auth_methods); + + if (list) + 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) + { + show_error (GTK_WIDGET(account_wizard), _("Could not discover supported secure authentication methods.")); + } + + if(error != NULL) + g_error_free(error); + + return NULL; +} + +static gboolean check_has_supported_auth_methods(ModestEasysetupWizardDialog* account_wizard) +{ + GList* methods = check_for_supported_auth_methods(account_wizard); + if (!methods) + { + return FALSE; + } + + g_list_free(methods); + return TRUE; +} + +static ModestAuthProtocol check_first_supported_auth_method(ModestEasysetupWizardDialog* account_wizard) +{ + ModestAuthProtocol result = MODEST_PROTOCOL_AUTH_PASSWORD; + + GList* methods = check_for_supported_auth_methods(account_wizard); + if (methods) + { + /* Use the first one: */ + result = (ModestAuthProtocol) (GPOINTER_TO_INT(methods->data)); + g_list_free(methods); + } + + return result; +} + static void invoke_enable_buttons_vfunc (ModestEasysetupWizardDialog *wizard_dialog) { @@ -216,6 +326,9 @@ create_page_welcome (ModestEasysetupWizardDialog *self) { GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_intro")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + /* So that it is not truncated: */ + gtk_widget_set_size_request (label, 600, -1); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); gtk_widget_show (GTK_WIDGET (box)); @@ -229,11 +342,13 @@ on_combo_account_country (GtkComboBox *widget, gpointer user_data) g_assert(self); ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); + priv->dirty = TRUE; + /* Fill the providers combo, based on the selected country: */ - gint mcc_id = easysetup_country_combo_box_get_active_country_id ( + gint mcc = easysetup_country_combo_box_get_active_country_mcc ( EASYSETUP_COUNTRY_COMBO_BOX (self->combo_account_country)); easysetup_provider_combo_box_fill ( - EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, mcc_id); + EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider), priv->presets, mcc); } static void @@ -243,6 +358,8 @@ on_combo_account_serviceprovider (GtkComboBox *widget, gpointer user_data) g_assert(self); ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); + priv->dirty = TRUE; + /* Fill the providers combo, based on the selected country: */ gchar* provider_id = easysetup_provider_combo_box_get_active_provider_id ( EASYSETUP_PROVIDER_COMBO_BOX (self->combo_account_serviceprovider)); @@ -265,8 +382,26 @@ on_combo_account_serviceprovider (GtkComboBox *widget, gpointer user_data) static void on_entry_max (ModestValidatingEntry *self, gpointer user_data) { - ModestEasysetupWizardDialog *dialog = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); - show_error (GTK_WINDOW (dialog), _("ckdg_ib_maximum_characters_reached")); + /* ModestEasysetupWizardDialog *dialog = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); */ + show_error (GTK_WIDGET (self), _CS("ckdg_ib_maximum_characters_reached")); +} + +static void +on_entry_invalid_character (ModestValidatingEntry *self, const gchar* character, gpointer user_data) +{ + /* ModestEasysetupWizardDialog *dialog = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); */ + + const gchar *show_char = NULL; + if (character) + show_char = character; + else { + /* TODO: We need a logical ID for this: */ + show_char = _("whitespace"); + } + + /* TODO: Should this show just this one bad character or all the not-allowed characters? */ + gchar *message = g_strdup_printf (_CS("ckdg_ib_illegal_characters_entered"), show_char); + show_error (GTK_WIDGET (self), message); } static GtkWidget* @@ -274,6 +409,8 @@ create_page_account_details (ModestEasysetupWizardDialog *self) { GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); GtkWidget *label = gtk_label_new(_("mcen_ia_accountdetails")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (label, 600, -1); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (label); @@ -345,12 +482,14 @@ create_page_account_details (ModestEasysetupWizardDialog *self) mcc_id = 244; } - easysetup_country_combo_box_set_active_country_id ( + 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); /* 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); @@ -390,6 +529,9 @@ create_page_account_details (ModestEasysetupWizardDialog *self) modest_validating_entry_set_unallowed_characters ( MODEST_VALIDATING_ENTRY (self->entry_account_title), list_prevent); g_list_free (list_prevent); + list_prevent = NULL; + modest_validating_entry_set_func(MODEST_VALIDATING_ENTRY(self->entry_account_title), + on_entry_invalid_character, self); /* Set max length as in the UI spec: * The UI spec seems to want us to show a dialog if we hit the maximum. */ @@ -412,10 +554,11 @@ create_page_user_details (ModestEasysetupWizardDialog *self) * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */ GtkSizeGroup* sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - /* The name widgets: */ + /* The name widgets: (use auto cap) */ self->entry_user_name = GTK_WIDGET (modest_validating_entry_new ()); - /* Auto-capitalization is the default, so let's turn it off: */ - hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_user_name), HILDON_GTK_INPUT_MODE_FULL); + hildon_gtk_entry_set_input_mode (GTK_ENTRY (self->entry_user_name), + HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_AUTOCAP); + /* Set max length as in the UI spec: * The UI spec seems to want us to show a dialog if we hit the maximum. */ gtk_entry_set_max_length (GTK_ENTRY (self->entry_user_name), 64); @@ -423,6 +566,8 @@ create_page_user_details (ModestEasysetupWizardDialog *self) on_entry_max, self); GtkWidget *caption = create_caption_new_with_asterisk (self, sizegroup, _("mcen_li_emailsetup_name"), self->entry_user_name, NULL, HILDON_CAPTION_OPTIONAL); + g_signal_connect(G_OBJECT(self->entry_user_name), "changed", + G_CALLBACK(on_easysetup_changed), self); gtk_widget_show (self->entry_user_name); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); @@ -434,6 +579,8 @@ create_page_user_details (ModestEasysetupWizardDialog *self) list_prevent = g_list_append (list_prevent, ">"); modest_validating_entry_set_unallowed_characters ( MODEST_VALIDATING_ENTRY (self->entry_user_name), list_prevent); + modest_validating_entry_set_func(MODEST_VALIDATING_ENTRY(self->entry_user_name), + on_entry_invalid_character, self); g_list_free (list_prevent); /* The username widgets: */ @@ -444,12 +591,16 @@ create_page_user_details (ModestEasysetupWizardDialog *self) self->entry_user_username, NULL, HILDON_CAPTION_MANDATORY); gtk_widget_show (self->entry_user_username); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); + g_signal_connect(G_OBJECT(self->entry_user_username), "changed", + G_CALLBACK(on_easysetup_changed), self); gtk_widget_show (caption); /* Prevent the use of some characters in the username, * as required by our UI specification: */ modest_validating_entry_set_unallowed_characters_whitespace ( MODEST_VALIDATING_ENTRY (self->entry_user_username)); + modest_validating_entry_set_func(MODEST_VALIDATING_ENTRY(self->entry_user_username), + on_entry_invalid_character, self); /* Set max length as in the UI spec: * The UI spec seems to want us to show a dialog if we hit the maximum. */ @@ -466,6 +617,8 @@ create_page_user_details (ModestEasysetupWizardDialog *self) /* gtk_entry_set_invisible_char (GTK_ENTRY (self->entry_user_password), '*'); */ caption = create_caption_new_with_asterisk (self, sizegroup, _("mail_fi_password"), self->entry_user_password, NULL, HILDON_CAPTION_OPTIONAL); + g_signal_connect(G_OBJECT(self->entry_user_password), "changed", + G_CALLBACK(on_easysetup_changed), self); gtk_widget_show (self->entry_user_password); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); @@ -479,6 +632,8 @@ create_page_user_details (ModestEasysetupWizardDialog *self) gtk_entry_set_text (GTK_ENTRY (self->entry_user_email), 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", + G_CALLBACK(on_easysetup_changed), self); gtk_widget_show (caption); /* Set max length as in the UI spec: @@ -498,11 +653,19 @@ static GtkWidget* create_page_complete_easysetup (ModestEasysetupWizardDialog *s GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_setup_complete")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (label, 600, -1); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + /* The documentation for gtk_label_set_line_wrap() says that we must + * call gtk_widget_set_size_request() with a hard-coded width, + * though I wonder why gtk_label_set_max_width_chars() isn't enough. */ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new (_("mcen_ia_customsetup_complete")); + label = gtk_label_new (_("mcen_ia_easysetup_complete")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (label, 600, -1); + gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); @@ -549,13 +712,39 @@ static void update_incoming_server_security_choices (ModestEasysetupWizardDialog static void on_combo_servertype_changed(GtkComboBox *combobox, gpointer user_data) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE(self); + + priv->dirty = TRUE; + update_incoming_server_title (self); update_incoming_server_security_choices (self); + + set_default_custom_servernames (self); } - + +static void on_entry_incoming_servername_changed(GtkEntry *entry, gpointer user_data) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); + priv->dirty = TRUE; + priv->server_changes |= MODEST_EASYSETUP_WIZARD_DIALOG_INCOMING_CHANGED; +} + static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self) { GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); + GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + + /* Show note that account type cannot be changed in future: */ + GtkWidget *label = gtk_label_new (_("mcen_ia_emailsetup_account_type")); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (label, 600, -1); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + gtk_widget_show (label); /* Create a size group to be used by all captions. * Note that HildonCaption does not create a default size group if we do not specify one. @@ -574,7 +763,11 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self 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); + } /* 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); @@ -596,7 +789,11 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self * as in the UI spec: */ g_signal_connect (G_OBJECT (self->combo_incoming_servertype), "changed", G_CALLBACK (on_combo_servertype_changed), self); - + + /* Remember when the servername was changed manually: */ + g_signal_connect (G_OBJECT (self->entry_incomingserver), "changed", + 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 ()); @@ -605,21 +802,33 @@ static GtkWidget* create_page_custom_incoming (ModestEasysetupWizardDialog *self MODEST_SERVERSECURITY_COMBO_BOX (self->combo_incoming_security), MODEST_PROTOCOL_CONNECTION_NORMAL); caption = hildon_caption_new (sizegroup, _("mcen_li_emailsetup_secure_connection"), self->combo_incoming_security, NULL, HILDON_CAPTION_OPTIONAL); + g_signal_connect (G_OBJECT (self->combo_incoming_security), "changed", + G_CALLBACK (on_easysetup_changed), self); gtk_widget_show (self->combo_incoming_security); 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", + G_CALLBACK (on_easysetup_changed), self); + } caption = hildon_caption_new (sizegroup, _("mcen_li_emailsetup_secure_authentication"), self->checkbox_incoming_auth, NULL, HILDON_CAPTION_OPTIONAL); + gtk_widget_show (self->checkbox_incoming_auth); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, MODEST_MARGIN_HALF); gtk_widget_show (caption); gtk_widget_show (GTK_WIDGET (box)); + + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box); + gtk_container_set_focus_vadjustment (GTK_CONTAINER (box), + gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window))); + gtk_widget_show (scrolled_window); - return GTK_WIDGET (box); + return GTK_WIDGET (scrolled_window); } static void @@ -648,13 +857,17 @@ static void on_button_outgoing_smtp_servers (GtkButton *button, gpointer user_data) { ModestEasysetupWizardDialog * self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); + ModestEasysetupWizardDialogPrivate* priv = WIZARD_DIALOG_GET_PRIVATE(self); + + /* We set dirty here because setting it depending on the connection specific dialog + seems overkill */ + priv->dirty = TRUE; /* Create the window, if necessary: */ if (!(self->specific_window)) { self->specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ()); modest_connection_specific_smtp_window_fill_with_connections ( - MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window), self->account_manager, - NULL /* account_name, not known yet. */); + MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window), self->account_manager); } /* Show the window: */ @@ -662,6 +875,13 @@ on_button_outgoing_smtp_servers (GtkButton *button, gpointer user_data) gtk_widget_show (self->specific_window); } +static void on_entry_outgoing_servername_changed (GtkEntry *entry, gpointer user_data) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); + priv->server_changes |= MODEST_EASYSETUP_WIZARD_DIALOG_OUTGOING_CHANGED; +} + static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self) { GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); @@ -673,7 +893,11 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self /* 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); + } /* 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, @@ -685,7 +909,11 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *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", + 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 ( @@ -698,7 +926,11 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self /* 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", + 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); @@ -714,6 +946,9 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *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); @@ -737,6 +972,9 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self g_signal_connect (G_OBJECT (self->button_outgoing_smtp_servers), "clicked", G_CALLBACK (on_button_outgoing_smtp_servers), self); + + g_signal_connect (G_OBJECT (self->entry_outgoingserver), "changed", + G_CALLBACK (on_entry_outgoing_servername_changed), self); gtk_widget_show (GTK_WIDGET (box)); @@ -745,7 +983,7 @@ static GtkWidget* create_page_custom_outgoing (ModestEasysetupWizardDialog *self } static gboolean -on_timeout_show_advanced_edit(gpointer user_data) +show_advanced_edit(gpointer user_data) { ModestEasysetupWizardDialog * self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); @@ -760,18 +998,7 @@ on_timeout_show_advanced_edit(gpointer user_data) gtk_dialog_run (GTK_DIALOG (dialog)); - /* TODO: The hide() is not necessary. - * It is just here to show that it doesn't work, - * just as destroy doesn't work. - */ - gtk_widget_hide (GTK_WIDGET(dialog)); - - /* TODO: The dialog remains on screen, not allowing any interaction. - * But gtk_widget_destroy() should always destroy. - */ - printf("debug: destroying settings dialog\n"); gtk_widget_destroy (GTK_WIDGET (dialog)); - printf("debug: after destroying settings dialog (doesn't seem to work).\n"); return FALSE; /* Do not call this timeout callback again. */ } @@ -786,10 +1013,8 @@ on_button_edit_advanced_settings (GtkButton *button, gpointer user_data) * This account will be deleted if Finish is never actually clicked. */ gboolean saved = TRUE; - gboolean was_already_saved = TRUE; if (!(self->saved_account_name)) { saved = create_account (self, FALSE); - was_already_saved = FALSE; } if (!saved) @@ -799,28 +1024,22 @@ on_button_edit_advanced_settings (GtkButton *button, gpointer user_data) return; /* Show the Account Settings window: */ - if (was_already_saved) { - /* Just show the dialog immediately: */ - on_timeout_show_advanced_edit(self); - } - else - { - printf ("debug: waiting for gconf to update its local cache. " - "This is a hack to work around a maemo gconf bug in maemo bora.\n"); - - g_timeout_add (5000, on_timeout_show_advanced_edit, self); - } + show_advanced_edit(self); } 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")); 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); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); - label = gtk_label_new (_("mcen_ia_easysetup_complete")); + label = gtk_label_new (_("mcen_ia_customsetup_complete")); 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); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); @@ -849,18 +1068,46 @@ 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, FALSE); - } + self->saved_account_name); + } } - + invoke_enable_buttons_vfunc (self); } +static void +on_response_before (ModestWizardDialog *wizard_dialog, + gint response_id, + gpointer user_data) +{ + ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (wizard_dialog); + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE(wizard_dialog); + if (response_id == GTK_RESPONSE_CANCEL) { + /* This is mostly copied from + * src/maemo/modest-account-settings-dialog.c */ + 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. */ + + const gint dialog_response = gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + + if (dialog_response != GTK_RESPONSE_OK) + { + /* This is a nasty hack. murrayc. */ + /* Don't let the dialog close */ + g_signal_stop_emission_by_name (wizard_dialog, "response"); + } + } + } +} + static void modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) { @@ -887,8 +1134,10 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) } g_assert(priv->presets); - - + + /* The server fields did not have been manually changed yet */ + priv->server_changes = 0; + /* Get the account manager object, * so we can check for existing accounts, * and create new accounts: */ @@ -905,16 +1154,32 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) /* Add the common pages: */ gtk_notebook_append_page (notebook, self->page_welcome, gtk_label_new (_("mcen_ti_emailsetup_welcome"))); + gtk_container_child_set (GTK_CONTAINER (notebook), + self->page_welcome, + "tab-expand", TRUE, + "tab-fill", TRUE, + NULL); + gtk_notebook_append_page (notebook, self->page_account_details, gtk_label_new (_("mcen_ti_accountdetails"))); + gtk_container_child_set (GTK_CONTAINER (notebook), + self->page_account_details, + "tab-expand", TRUE, + "tab-fill", TRUE, + NULL); + gtk_notebook_append_page (notebook, self->page_user_details, gtk_label_new (_("mcen_ti_emailsetup_userdetails"))); + gtk_container_child_set (GTK_CONTAINER (notebook), + self->page_user_details, + "tab-expand", TRUE, + "tab-fill", TRUE, + NULL); /* Create and add the easysetup-specific pages, * because we need _some_ final page to enable the Next and Finish buttons: */ create_subsequent_easysetup_pages (self); - /* Connect to the dialog's response signal so we can enable/disable buttons * for the newly-selected page, because the prev/next buttons cause response to be emitted. * Note that we use g_signal_connect_after() instead of g_signal_connect() @@ -932,7 +1197,14 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) */ g_signal_connect_after (G_OBJECT (self), "response", G_CALLBACK (on_response), self); - + + /* This is to show a confirmation dialog when the user hits cancel */ + g_signal_connect (G_OBJECT (self), "response", + G_CALLBACK (on_response_before), self); + + /* Reset dirty, because there was no user input until now */ + priv->dirty = FALSE; + /* When this window is shown, hibernation should not be possible, * because there is no sensible way to save the state: */ modest_window_mgr_prevent_hibernation_while_window_is_shown ( @@ -941,7 +1213,8 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) ModestEasysetupWizardDialog* modest_easysetup_wizard_dialog_new (void) -{ +{ + return g_object_new (MODEST_TYPE_EASYSETUP_WIZARD_DIALOG, NULL); } @@ -972,9 +1245,15 @@ static void create_subsequent_customsetup_pages (ModestEasysetupWizardDialog *se gtk_notebook_append_page (notebook, self->page_custom_outgoing, gtk_label_new (_("mcen_ti_emailsetup_outgoingdetails"))); - if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_customsetup))) + if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_customsetup))) { gtk_notebook_append_page (notebook, self->page_complete_customsetup, gtk_label_new (_("mcen_ti_emailsetup_complete"))); + gtk_container_child_set (GTK_CONTAINER (notebook), + self->page_complete_customsetup, + "tab-expand", TRUE, + "tab-fill", TRUE, + NULL); + } /* This is unnecessary with GTK+ 2.10: */ modest_wizard_dialog_force_title_update (MODEST_WIZARD_DIALOG(self)); @@ -990,9 +1269,15 @@ static void create_subsequent_easysetup_pages (ModestEasysetupWizardDialog *self if(!self->page_complete_easysetup) self->page_complete_easysetup = create_page_complete_easysetup (self); - if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_easysetup))) + if (!gtk_widget_get_parent (GTK_WIDGET (self->page_complete_easysetup))) { gtk_notebook_append_page (notebook, self->page_complete_easysetup, gtk_label_new (_("mcen_ti_emailsetup_complete"))); + gtk_container_child_set (GTK_CONTAINER (notebook), + self->page_complete_easysetup, + "tab-expand", TRUE, + "tab-fill", TRUE, + NULL); + } /* This is unnecessary with GTK+ 2.10: */ modest_wizard_dialog_force_title_update (MODEST_WIZARD_DIALOG(self)); @@ -1072,21 +1357,27 @@ util_get_default_servername_from_email_address (const gchar* email_address, Mode static void set_default_custom_servernames (ModestEasysetupWizardDialog *account_wizard) { + ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE(account_wizard); + if (!account_wizard->entry_incomingserver) return; /* Set a default domain for the server, based on the email address, * if no server name was already specified. */ - const gchar* incoming_existing = gtk_entry_get_text (GTK_ENTRY (account_wizard->entry_incomingserver)); - if ((!incoming_existing || (strlen(incoming_existing) == 0)) - && account_wizard->entry_user_email) { + if (account_wizard->entry_user_email + && ((priv->server_changes & MODEST_EASYSETUP_WIZARD_DIALOG_INCOMING_CHANGED) == 0)) { const ModestTransportStoreProtocol protocol = easysetup_servertype_combo_box_get_active_servertype ( EASYSETUP_SERVERTYPE_COMBO_BOX (account_wizard->combo_incoming_servertype)); const gchar* email_address = gtk_entry_get_text (GTK_ENTRY(account_wizard->entry_user_email)); gchar* servername = util_get_default_servername_from_email_address (email_address, protocol); + + /* Do not set the INCOMING_CHANGED flag because of this edit */ + g_signal_handlers_block_by_func (G_OBJECT (account_wizard->entry_incomingserver), G_CALLBACK (on_entry_incoming_servername_changed), account_wizard); gtk_entry_set_text (GTK_ENTRY (account_wizard->entry_incomingserver), servername); + g_signal_handlers_unblock_by_func (G_OBJECT (account_wizard->entry_incomingserver), G_CALLBACK (on_entry_incoming_servername_changed), account_wizard); + g_free (servername); } @@ -1096,17 +1387,45 @@ static void set_default_custom_servernames (ModestEasysetupWizardDialog *account if (!account_wizard->entry_outgoingserver) return; - const gchar* outgoing_existing = gtk_entry_get_text (GTK_ENTRY (account_wizard->entry_outgoingserver)); - if ((!outgoing_existing || (strlen(outgoing_existing) == 0)) - && account_wizard->entry_user_email) { + if (account_wizard->entry_user_email + && ((priv->server_changes & MODEST_EASYSETUP_WIZARD_DIALOG_OUTGOING_CHANGED) == 0)) { const gchar* email_address = gtk_entry_get_text (GTK_ENTRY(account_wizard->entry_user_email)); gchar* servername = util_get_default_servername_from_email_address (email_address, MODEST_PROTOCOL_TRANSPORT_SMTP); + + /* Do not set the OUTGOING_CHANGED flag because of this edit */ + g_signal_handlers_block_by_func (G_OBJECT (account_wizard->entry_outgoingserver), G_CALLBACK (on_entry_outgoing_servername_changed), account_wizard); gtk_entry_set_text (GTK_ENTRY (account_wizard->entry_outgoingserver), servername); + g_signal_handlers_unblock_by_func (G_OBJECT (account_wizard->entry_outgoingserver), G_CALLBACK (on_entry_outgoing_servername_changed), account_wizard); + g_free (servername); } } +static gchar* +get_entered_account_title (ModestEasysetupWizardDialog *account_wizard) +{ + const gchar* account_title = + gtk_entry_get_text (GTK_ENTRY (account_wizard->entry_account_title)); + if (!account_title || (strlen (account_title) == 0)) + return NULL; + else { + /* Strip it of whitespace at the start and end: */ + gchar *result = g_strdup (account_title); + result = g_strstrip (result); + + if (!result) + return NULL; + + if (strlen (result) == 0) { + g_free (result); + return NULL; + } + + return result; + } +} + static gboolean on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget *next_page) { @@ -1118,8 +1437,8 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * */ if (current_page == account_wizard->page_account_details) { /* Check that the title is not already in use: */ - const gchar* account_title = gtk_entry_get_text (GTK_ENTRY (account_wizard->entry_account_title)); - if ((!account_title) || (strlen(account_title) == 0)) + gchar* account_title = get_entered_account_title (account_wizard); + if (!account_title) return FALSE; /* Aavoid a clash with an existing display name: */ @@ -1128,7 +1447,7 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * if (name_in_use) { /* Warn the user via a dialog: */ - show_error (GTK_WINDOW (account_wizard), _("mail_ib_account_name_already_existing")); + hildon_banner_show_information(NULL, NULL, _("mail_ib_account_name_already_existing")); return FALSE; } @@ -1139,13 +1458,14 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * if ((!email_address) || (strlen(email_address) == 0)) return FALSE; - if (!modest_text_utils_validate_email_address (email_address)) { + if (!modest_text_utils_validate_email_address (email_address, NULL)) { /* Warn the user via a dialog: */ - show_error (GTK_WINDOW (account_wizard), _("mcen_ib_invalid_email")); + hildon_banner_show_information (NULL, NULL, _("mcen_ib_invalid_email")); /* Return focus to the email address entry: */ gtk_widget_grab_focus (account_wizard->entry_user_email); - + gtk_editable_select_region (GTK_EDITABLE (account_wizard->entry_user_email), 0, -1); + return FALSE; } @@ -1162,6 +1482,19 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * } else if (next_page == account_wizard->page_custom_outgoing) { set_default_custom_servernames (account_wizard); + + /* 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)); + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (account_wizard->checkbox_incoming_auth)) + && !modest_protocol_info_is_secure(security_incoming)) + { + if (!check_has_supported_auth_methods (account_wizard)) + return FALSE; + } } /* If this is the last page, and this is a click on Finish, @@ -1191,8 +1524,19 @@ static gboolean entry_is_empty (GtkWidget *entry) const gchar* text = gtk_entry_get_text (GTK_ENTRY (entry)); if ((!text) || (strlen(text) == 0)) return TRUE; - else - return FALSE; + else { + /* Strip it of whitespace at the start and end: */ + gchar *stripped = g_strdup (text); + stripped = g_strstrip (stripped); + + if (!stripped) + return TRUE; + + const gboolean result = (strlen (stripped) == 0); + + g_free (stripped); + return result; + } } static void @@ -1273,9 +1617,13 @@ modest_easysetup_wizard_dialog_class_init (ModestEasysetupWizardDialogClass *kla } static void -show_error (GtkWindow *parent_window, const gchar* text) +show_error (GtkWidget *parent_widget, const gchar* text) { - GtkDialog *dialog = GTK_DIALOG (hildon_note_new_information (parent_window, 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, @@ -1286,6 +1634,7 @@ show_error (GtkWindow *parent_window, const gchar* text) gtk_dialog_run (dialog); gtk_widget_destroy (GTK_WIDGET (dialog)); +#endif } /** Attempt to create the account from the information that the user has entered. @@ -1296,7 +1645,7 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) { ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self); - const gchar* display_name = gtk_entry_get_text (GTK_ENTRY (self->entry_account_title)); + gchar* display_name = get_entered_account_title (self); /* Some checks: */ if (!display_name) @@ -1306,8 +1655,10 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) * 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)) + 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: */ @@ -1319,7 +1670,6 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) /* 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)); - /* Incoming server: */ /* Note: We need something as default for the ModestTransportStoreProtocol* values, * or modest_account_mgr_add_server_account will fail. */ @@ -1328,7 +1678,7 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) ModestTransportStoreProtocol protocol_incoming = MODEST_PROTOCOL_STORE_POP; ModestConnectionProtocol protocol_security_incoming = MODEST_PROTOCOL_CONNECTION_NORMAL; ModestAuthProtocol protocol_authentication_incoming = 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)); @@ -1345,18 +1695,15 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) TRUE /* incoming */); g_warning ("security incoming: %x", security_incoming); - + /* 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; - serverport_incoming = - (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT) ? 993 : 143; } else if (servertype_incoming == MODEST_PRESETS_SERVER_TYPE_POP) { - protocol_incoming = MODEST_PROTOCOL_STORE_POP; - serverport_incoming = - (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING_ALTERNATE_PORT) ? 995 : 110; + protocol_incoming = MODEST_PROTOCOL_STORE_POP; } - + serverport_incoming = get_serverport_incoming(servertype_incoming, security_incoming); + if (security_incoming & MODEST_PRESETS_SECURITY_SECURE_INCOMING) protocol_security_incoming = MODEST_PROTOCOL_CONNECTION_SSL; /* TODO: Is this what we want? */ @@ -1376,11 +1723,15 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) /* 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. - * TODO: Do we need to discover which of these (SSL, TLS, CRAM-MD5) is supported? */ - protocol_authentication_incoming = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbox_incoming_auth)) - ? MODEST_PROTOCOL_AUTH_CRAMMD5 - : MODEST_PROTOCOL_AUTH_PASSWORD; + + 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; + } } /* First we add the 2 server accounts, and then we add the account that uses them. @@ -1404,22 +1755,11 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) if (!created) { /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WINDOW (self), _("An error occurred while creating the incoming account.")); + show_error (GTK_WIDGET (self), _("An error occurred while creating the incoming 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. */ - GSList *account_names = modest_account_mgr_account_names (self->account_manager, FALSE); - if(!account_names) - { - g_warning ("modest_account_mgr_account_names() returned NULL after adding an account."); - } - g_slist_free (account_names); - - /* Outgoing server: */ gchar* servername_outgoing = NULL; ModestTransportStoreProtocol protocol_outgoing = MODEST_PROTOCOL_STORE_POP; @@ -1444,15 +1784,21 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) ModestPresetsSecurity security_outgoing = modest_presets_get_info_server_security (priv->presets, provider_id, FALSE /* incoming */); - + + /* TODO: The secure-smtp information in the presets data is currently wrong, + * so we choose a reasonable default. Remove this when the presets data is corrected: */ + security_outgoing = security_outgoing & MODEST_PRESETS_SECURITY_SECURE_SMTP; + protocol_security_outgoing = MODEST_PROTOCOL_CONNECTION_NORMAL; if (security_outgoing & 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; - } else + } else { + /* printf("DEBUG: %s: using non-secure SMTP\n", __FUNCTION__); */ protocol_authentication_outgoing = MODEST_PROTOCOL_AUTH_NONE; - /* TODO: There is no SMTP authentication enum for presets. */ + } } else { /* Use custom pages because no preset was specified: */ @@ -1485,7 +1831,8 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) if (!created) { /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WINDOW (self), _("An error occurred while creating the outgoing account.")); + show_error (GTK_WIDGET (self), _("An error occurred while creating the outgoing account.")); + g_free (display_name); return FALSE; } @@ -1500,10 +1847,18 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) if (!created) { /* TODO: Provide a Logical ID for the text: */ - show_error (GTK_WINDOW (self), _("An error occurred while creating the account.")); + 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."); + /* The user name and email address must be set additionally: */ const gchar* user_name = gtk_entry_get_text (GTK_ENTRY (self->entry_user_name)); modest_account_mgr_set_string (self->account_manager, account_name, @@ -1523,15 +1878,18 @@ create_account (ModestEasysetupWizardDialog *self, gboolean enabled) MODEST_ACCOUNT_RETRIEVE, retrieve, FALSE /* not server 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), account_name); + MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (self->specific_window)); g_free (self->saved_account_name); self->saved_account_name = g_strdup (account_name); g_free (account_name); - + g_free (display_name); + return result; }