X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-easysetup-wizard-dialog.c;h=75d8ebf90961f5d236ac030603742b318c2688e7;hb=8a08916d614f74f314963c7866cb1d80f9d4b6bf;hp=37ef5aaa0c1f40e4e6780cd72db10763cd4c4438;hpb=431405fd7c2c7ab14d9a478024a001920a192bee;p=modest diff --git a/src/hildon2/modest-easysetup-wizard-dialog.c b/src/hildon2/modest-easysetup-wizard-dialog.c index 37ef5aa..75d8ebf 100644 --- a/src/hildon2/modest-easysetup-wizard-dialog.c +++ b/src/hildon2/modest-easysetup-wizard-dialog.c @@ -59,6 +59,7 @@ #include "modest-hildon-includes.h" #include "modest-maemo-security-options-view.h" #include "modest-account-protocol.h" +#include "modest-address-book.h" /* Include config.h so that _() works: */ #ifdef HAVE_CONFIG_H @@ -71,7 +72,7 @@ G_DEFINE_TYPE (ModestEasysetupWizardDialog, modest_easysetup_wizard_dialog, MODE MODEST_TYPE_EASYSETUP_WIZARD_DIALOG, \ ModestEasysetupWizardDialogPrivate)) -#define LABELS_WIDTH 480 +#define LABELS_WIDTH 520 #define DIALOG_WIDTH LABELS_WIDTH + MODEST_MARGIN_DOUBLE typedef struct _ModestEasysetupWizardDialogPrivate ModestEasysetupWizardDialogPrivate; @@ -103,10 +104,11 @@ struct _ModestEasysetupWizardDialogPrivate /* notebook pages: */ GtkWidget *page_welcome; - GtkWidget *check_support_progress; gboolean check_support_done; guint check_support_show_progress_id; guint check_support_progress_pulse_id; + GtkWidget *check_support_cancel_note; + GtkWidget *check_support_progress; gint pending_check_support; gboolean destroyed; @@ -199,6 +201,26 @@ modest_easysetup_wizard_dialog_finalize (GObject *object) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (object); ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + ModestProtocolRegistry *registry; + GSList *provider_protos, *node; + + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + + for (node = provider_protos; node != NULL; node = g_slist_next (node)) { + ModestProtocol *proto = MODEST_PROTOCOL (node->data); + + if (!modest_protocol_registry_protocol_type_has_tag (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) + continue; + + if (MODEST_ACCOUNT_PROTOCOL (proto)) { + modest_account_protocol_wizard_finished (MODEST_ACCOUNT_PROTOCOL (proto)); + } + } + g_slist_free (provider_protos); if (priv->account_manager) g_object_unref (G_OBJECT (priv->account_manager)); @@ -368,8 +390,9 @@ create_captioned (ModestEasysetupWizardDialog *self, { GtkWidget *result; - result = modest_maemo_utils_create_captioned (title_size_group, value_size_group, - value, use_markup, control); + result = modest_maemo_utils_create_captioned_with_size_type (title_size_group, value_size_group, + value, use_markup, control, + MODEST_EDITABLE_SIZE); /* Connect to the appropriate changed signal for the widget, * so we can ask for the prev/next buttons to be enabled/disabled appropriately: @@ -393,36 +416,46 @@ create_page_welcome (ModestEasysetupWizardDialog *self) GtkWidget *box; GtkWidget *align; GtkWidget *label; + GtkWidget *privacy_note; + GtkWidget *pannable; ModestEasysetupWizardDialogPrivate *priv; priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); box = gtk_vbox_new (FALSE, MODEST_MARGIN_NONE); + pannable = hildon_pannable_area_new (); label = gtk_label_new(_("mcen_ia_emailsetup_intro")); - priv->check_support_progress = gtk_progress_bar_new (); + privacy_note = gtk_label_new (_("mcen_ia_privacy_notice")); align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, MODEST_MARGIN_DOUBLE, 0); gtk_widget_set_size_request (label, LABELS_WIDTH, -1); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_widget_set_size_request (privacy_note, LABELS_WIDTH, -1); + gtk_label_set_line_wrap (GTK_LABEL (privacy_note), TRUE); + hildon_helper_set_logical_font (privacy_note, "SmallSystemFont"); /* So that it is not truncated: */ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); gtk_misc_set_padding (GTK_MISC (label), MODEST_MARGIN_DOUBLE, MODEST_MARGIN_DOUBLE); - gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (box), priv->check_support_progress, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), privacy_note, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER (align), box); gtk_widget_show (label); + gtk_widget_show (privacy_note); + + hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pannable), align); gtk_widget_show (GTK_WIDGET (box)); - return GTK_WIDGET (align); + gtk_widget_show (GTK_WIDGET (align)); + gtk_widget_show (pannable); + + return GTK_WIDGET (pannable); } static void -on_account_country_selector_changed (HildonTouchSelector *widget, gint column, gpointer user_data) +on_account_country_selector_changed (HildonTouchSelector *widget, gpointer user_data) { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); g_assert(self); ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - priv->dirty = TRUE; - /* Fill the providers picker, based on the selected country: */ if (priv->presets != NULL) { gint mcc = modest_country_picker_get_active_country_mcc ( @@ -467,9 +500,6 @@ on_account_serviceprovider_selector_changed (HildonTouchSelector *widget, gint c { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); g_assert(self); - ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - - priv->dirty = TRUE; update_user_email_from_provider (self); } @@ -524,8 +554,7 @@ create_page_account_details (ModestEasysetupWizardDialog *self) /* The description widgets: */ priv->entry_account_title = GTK_WIDGET (modest_validating_entry_new ()); - g_signal_connect(G_OBJECT(priv->entry_account_title), "changed", - G_CALLBACK(on_easysetup_changed), self); + /* Do use auto-capitalization: */ hildon_gtk_entry_set_input_mode (GTK_ENTRY (priv->entry_account_title), HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_AUTOCAP); @@ -542,6 +571,10 @@ create_page_account_details (ModestEasysetupWizardDialog *self) g_free (default_account_name); default_account_name = NULL; + /* Connect signal after changing the text in the entry */ + g_signal_connect(G_OBJECT(priv->entry_account_title), "changed", + G_CALLBACK(on_easysetup_changed), self); + priv->caption_account_title = create_captioned (self, title_sizegroup, value_sizegroup, _("mcen_fi_account_title"), FALSE, priv->entry_account_title); @@ -590,6 +623,46 @@ create_page_account_details (ModestEasysetupWizardDialog *self) return GTK_WIDGET (align); } +static void +on_user_username_changed(GtkWidget* widget, ModestEasysetupWizardDialog *self) +{ + ModestEasysetupWizardDialogPrivate* priv; + gchar* provider_id = NULL; + + priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + + /* Work out the user email address */ + provider_id = modest_provider_picker_get_active_provider_id ( + MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker)); + + if (provider_id) { + const gchar *current_username; + gchar *email_address; + gchar *domain_name = modest_presets_get_domain (priv->presets, provider_id); + + current_username = hildon_entry_get_text (HILDON_ENTRY (priv->entry_user_username)); + + if (current_username && strstr (current_username, "@")) { + email_address = g_strdup (current_username); + } else { + email_address = g_strdup_printf ("%s@%s", + current_username, + domain_name); + } + + /* Update the email address */ + hildon_entry_set_text (HILDON_ENTRY (priv->entry_user_email), email_address); + + g_free (email_address); + g_free (domain_name); + g_free (provider_id); + } + + /* Update state */ + on_easysetup_changed(widget, self); +} + + static GtkWidget* create_page_user_details (ModestEasysetupWizardDialog *self) { @@ -598,6 +671,7 @@ create_page_user_details (ModestEasysetupWizardDialog *self) GtkWidget *box; ModestEasysetupWizardDialogPrivate *priv; GtkWidget *align; + const gchar *my_name; priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE(self); @@ -620,6 +694,12 @@ create_page_user_details (ModestEasysetupWizardDialog *self) on_entry_max, self); GtkWidget *caption = create_captioned (self, title_sizegroup, value_sizegroup, _("mcen_li_emailsetup_name"), FALSE, priv->entry_user_name); + + /* Try to initialize the user name with my own contact */ + my_name = modest_address_book_get_my_name (); + if (my_name) + gtk_entry_set_text (GTK_ENTRY (priv->entry_user_name), my_name); + g_signal_connect(G_OBJECT(priv->entry_user_name), "changed", G_CALLBACK(on_easysetup_changed), self); gtk_widget_show (priv->entry_user_name); @@ -647,7 +727,7 @@ create_page_user_details (ModestEasysetupWizardDialog *self) gtk_widget_show (priv->entry_user_username); gtk_box_pack_start (GTK_BOX (box), caption, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(priv->entry_user_username), "changed", - G_CALLBACK(on_easysetup_changed), self); + G_CALLBACK(on_user_username_changed), self); gtk_widget_show (caption); /* Prevent the use of some characters in the username, @@ -804,8 +884,6 @@ on_servertype_selector_changed(HildonTouchSelector *selector, gint column, gpoin { ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (user_data); ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE(self); - ModestServertypePicker *picker; - ModestProtocolType protocol_type; priv->dirty = TRUE; @@ -813,8 +891,6 @@ on_servertype_selector_changed(HildonTouchSelector *selector, gint column, gpoin update_incoming_server_title (self); /* Update security options if needed */ - picker = MODEST_SERVERTYPE_PICKER (priv->incoming_servertype_picker); - protocol_type = modest_servertype_picker_get_active_servertype (picker); update_incoming_server_security_choices (self); gtk_widget_show (priv->incoming_security); @@ -876,7 +952,7 @@ create_page_custom_incoming (ModestEasysetupWizardDialog *self) gtk_widget_show (priv->incoming_servertype_picker); priv->entry_incomingserver = hildon_entry_new (MODEST_EDITABLE_SIZE); - g_signal_connect(G_OBJECT(priv->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 (priv->entry_incomingserver), HILDON_GTK_INPUT_MODE_FULL); set_default_custom_servernames (self); @@ -891,12 +967,6 @@ create_page_custom_incoming (ModestEasysetupWizardDialog *self) gtk_box_pack_start (GTK_BOX (box), priv->caption_incoming, FALSE, FALSE, 0); gtk_widget_show (priv->caption_incoming); - /* Change the caption title when the servertype changes, - * as in the UI spec: */ - g_signal_connect (G_OBJECT (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (priv->incoming_servertype_picker))), - "changed", - G_CALLBACK (on_servertype_selector_changed), self); - /* Remember when the servername was changed manually: */ g_signal_connect (G_OBJECT (priv->entry_incomingserver), "changed", G_CALLBACK (on_entry_incoming_servername_changed), self); @@ -914,6 +984,15 @@ create_page_custom_incoming (ModestEasysetupWizardDialog *self) modest_servertype_picker_set_active_servertype ( MODEST_SERVERTYPE_PICKER (priv->incoming_servertype_picker), MODEST_PROTOCOLS_STORE_POP); + update_incoming_server_title (self); + update_incoming_server_security_choices (self); + set_default_custom_servernames (self); + + /* Change the caption title when the servertype changes, + * as in the UI spec: */ + g_signal_connect (G_OBJECT (hildon_picker_button_get_selector (HILDON_PICKER_BUTTON (priv->incoming_servertype_picker))), + "changed", + G_CALLBACK (on_servertype_selector_changed), self); align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, MODEST_MARGIN_DOUBLE, 0); @@ -927,6 +1006,11 @@ create_page_custom_incoming (ModestEasysetupWizardDialog *self) g_object_unref (title_sizegroup); g_object_unref (value_sizegroup); + /* Connect changed signals. We do it here after initializing everything */ + g_signal_connect (G_OBJECT(priv->entry_incomingserver), "changed", + G_CALLBACK(on_easysetup_changed), self); + + return GTK_WIDGET (pannable); } @@ -1000,8 +1084,7 @@ create_page_custom_outgoing (ModestEasysetupWizardDialog *self) /* The outgoing server widgets: */ priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); priv->entry_outgoingserver = hildon_entry_new (MODEST_EDITABLE_SIZE); - g_signal_connect (G_OBJECT (priv->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 (priv->entry_outgoingserver), HILDON_GTK_INPUT_MODE_FULL); smtp_caption_label = g_strconcat (_("mcen_li_emailsetup_smtp"), "\n(SMTP)", NULL); @@ -1034,8 +1117,6 @@ create_page_custom_outgoing (ModestEasysetupWizardDialog *self) _("mcen_fi_advsetup_connection_smtp")); gtk_button_set_alignment (GTK_BUTTON (priv->checkbox_outgoing_smtp_specific), 0.0, 0.5); - g_signal_connect (G_OBJECT (priv->checkbox_outgoing_smtp_specific), "toggled", - G_CALLBACK (on_easysetup_changed), self); gtk_widget_show (priv->checkbox_outgoing_smtp_specific); gtk_box_pack_start (GTK_BOX (box), priv->checkbox_outgoing_smtp_specific, @@ -1072,6 +1153,12 @@ create_page_custom_outgoing (ModestEasysetupWizardDialog *self) g_object_unref (title_sizegroup); g_object_unref (value_sizegroup); + /* Connect changed signals. We do it here after initializing everything */ + g_signal_connect (G_OBJECT (priv->entry_outgoingserver), "changed", + G_CALLBACK (on_easysetup_changed), self); + g_signal_connect (G_OBJECT (priv->checkbox_outgoing_smtp_specific), "toggled", + G_CALLBACK (on_easysetup_changed), self); + return GTK_WIDGET (pannable); } @@ -1110,28 +1197,27 @@ on_button_edit_advanced_settings (GtkButton *button, gpointer user_data) static GtkWidget* create_page_complete_custom (ModestEasysetupWizardDialog *self) { + gchar *complete_string; GtkWidget *align; - GtkWidget *box = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT); - GtkWidget *label = gtk_label_new(_("mcen_ia_emailsetup_setup_complete")); - GtkWidget *button_edit = gtk_button_new_with_label (_("mcen_fi_advanced_settings")); - hildon_gtk_widget_set_theme_size (button_edit, HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH); + GtkWidget *box; + GtkWidget *label; + GtkWidget *button_edit; + + box = gtk_vbox_new (FALSE, MODEST_MARGIN_DEFAULT); + complete_string = g_strconcat (_("mcen_ia_emailsetup_setup_complete"), " ", + _("mcen_ia_customsetup_complete"), NULL); + label = gtk_label_new(complete_string); + g_free (complete_string); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_widget_set_size_request (label, LABELS_WIDTH, -1); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_misc_set_padding (GTK_MISC (label), MODEST_MARGIN_DOUBLE, MODEST_MARGIN_DOUBLE); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - label = gtk_label_new (_("mcen_ia_customsetup_complete")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_widget_set_size_request (label, LABELS_WIDTH, -1); - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_misc_set_padding (GTK_MISC (label), MODEST_MARGIN_DOUBLE, MODEST_MARGIN_DOUBLE); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); gtk_widget_show (label); + button_edit = gtk_button_new_with_label (_("mcen_fi_advanced_settings")); + hildon_gtk_widget_set_theme_size (button_edit, HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH); gtk_widget_show (button_edit); gtk_box_pack_start (GTK_BOX (box), button_edit, FALSE, FALSE, 0); @@ -1172,12 +1258,17 @@ on_response_before (ModestWizardDialog *wizard_dialog, /* 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. */ + gint dialog_response; + GtkWidget *dialog; + + dialog = hildon_note_new_confirmation ((GtkWindow *) self, + _("imum_nc_wizard_confirm_lose_changes")); + + modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), + (GtkWindow *) dialog, + (GtkWindow *) wizard_dialog); - const gint dialog_response = gtk_dialog_run (dialog); + dialog_response = gtk_dialog_run ((GtkDialog *) dialog); gtk_widget_destroy (GTK_WIDGET (dialog)); if (dialog_response != GTK_RESPONSE_OK) { @@ -1200,9 +1291,8 @@ fill_providers (ModestEasysetupWizardDialog *self) modest_country_picker_load_data( MODEST_COUNTRY_PICKER (priv->account_country_picker)); /* connect to country picker's changed signal, so we can fill the provider picker: */ - g_signal_connect (G_OBJECT (hildon_picker_button_get_selector - (HILDON_PICKER_BUTTON (priv->account_country_picker))), - "changed", + g_signal_connect ((GObject *) priv->account_country_picker, + "value-changed", G_CALLBACK (on_account_country_selector_changed), self); modest_country_picker_set_active_country_locale ( @@ -1296,11 +1386,15 @@ modest_easysetup_wizard_dialog_append_page (GtkNotebook *notebook, const gchar *label) { gint index; + /* Append page and set attributes */ index = gtk_notebook_append_page (notebook, page, gtk_label_new (label)); gtk_container_child_set (GTK_CONTAINER (notebook), page, "tab-expand", TRUE, "tab-fill", TRUE, NULL); + + /* Give focus to page and show it */ + gtk_container_set_focus_child (GTK_CONTAINER (notebook), page); gtk_widget_show (page); } @@ -1369,6 +1463,8 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) priv->check_support_done = FALSE; priv->check_support_show_progress_id = 0; priv->check_support_progress_pulse_id = 0; + priv->check_support_cancel_note = NULL; + priv->check_support_progress = NULL; priv->pending_check_support = 0; priv->destroyed = FALSE; priv->page_welcome = create_page_welcome (self); @@ -1429,7 +1525,6 @@ modest_easysetup_wizard_dialog_init (ModestEasysetupWizardDialog *self) priv->settings = modest_account_settings_new (); - check_support_of_protocols (self); } ModestEasysetupWizardDialog* @@ -1512,17 +1607,31 @@ create_subsequent_easysetup_pages (ModestEasysetupWizardDialog *self) /* */ static void -remove_non_common_tabs (GtkNotebook *notebook, +remove_non_common_tabs (ModestEasysetupWizardDialog *self, gboolean remove_user_details) { gint starting_tab; + GtkNotebook *notebook; + ModestEasysetupWizardDialogPrivate *priv; + + priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + g_object_get (self, "wizard-notebook", ¬ebook, NULL); + /* The first 2 tabs are the common ones (welcome tab and the providers tab), so we always remove starting from the end */ - starting_tab = (remove_user_details) ? 2 : 3; - while (gtk_notebook_get_n_pages (notebook) > starting_tab) + while (gtk_notebook_get_n_pages (notebook) > starting_tab) { + /* Disconnect signal */ + GtkWidget *page = gtk_notebook_get_nth_page (notebook, -1); + if (modest_signal_mgr_is_connected (priv->missing_data_signals, (GObject *) page, "missing-mandatory-data")) { + priv->missing_data_signals = modest_signal_mgr_disconnect (priv->missing_data_signals, + (GObject *) page, + "missing-mandatory-data"); + } + /* Remove page from notebook */ gtk_notebook_remove_page (notebook, -1); + } } static void @@ -1549,8 +1658,12 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self) picker = MODEST_PROVIDER_PICKER (priv->account_serviceprovider_picker); id_type = modest_provider_picker_get_active_id_type (picker); g_object_get (self, "wizard-notebook", ¬ebook, NULL); - modest_wizard_dialog_set_response_override_handler (MODEST_WIZARD_DIALOG (self), - NULL); + + /* Remove the response override handler for non-plugin + protocols. For plugins it'll be overriden later */ + if (id_type != MODEST_PROVIDER_PICKER_ID_PLUGIN_PROTOCOL) + modest_wizard_dialog_set_response_override_handler (MODEST_WIZARD_DIALOG (self), + NULL); if (id_type == MODEST_PROVIDER_PICKER_ID_OTHER) { @@ -1558,13 +1671,13 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self) /* If we come from a rollbacked easysetup */ if (priv->page_complete_easysetup) { - remove_non_common_tabs (notebook, FALSE); + remove_non_common_tabs (self, FALSE); priv->page_complete_easysetup = NULL; } /* If we come from a rollbacked plugin protocol setup */ if (priv->last_plugin_protocol_selected != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) { - remove_non_common_tabs (notebook, TRUE); + remove_non_common_tabs (self, TRUE); priv->last_plugin_protocol_selected = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID; modest_signal_mgr_disconnect_all_and_destroy (priv->missing_data_signals); priv->missing_data_signals = NULL; @@ -1574,7 +1687,7 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self) } else { /* If we come from a rollbacked custom setup */ if (priv->page_custom_incoming) { - remove_non_common_tabs (notebook, TRUE); + remove_non_common_tabs (self, TRUE); init_user_page (priv); init_incoming_page (priv); init_outgoing_page (priv); @@ -1587,39 +1700,43 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self) ModestProtocol *protocol; gchar *proto_name; ModestProtocolType proto_type; + ModestWizardDialogResponseOverrideFunc response_override; + + /* Get protocol data */ + proto_name = modest_provider_picker_get_active_provider_id (picker); + protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (), + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS, + proto_name); + proto_type = modest_protocol_get_type_id (protocol); /* If we come from a rollbacked easy setup */ - if (priv->last_plugin_protocol_selected == - MODEST_PROTOCOL_REGISTRY_TYPE_INVALID && + if (priv->last_plugin_protocol_selected != proto_type && priv->page_complete_easysetup) { - remove_non_common_tabs (notebook, TRUE); + remove_non_common_tabs (self, TRUE); init_user_page (priv); priv->page_complete_easysetup = NULL; } - proto_name = modest_provider_picker_get_active_provider_id (picker); - protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (), - MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS, - proto_name); - proto_type = modest_protocol_get_type_id (protocol); + /* Ensure that the response override handler + is set. It might happen that plugins clear + them incorrectly */ + response_override = modest_account_protocol_get_wizard_response_override + (MODEST_ACCOUNT_PROTOCOL (protocol)); + modest_wizard_dialog_set_response_override_handler (MODEST_WIZARD_DIALOG (self), + response_override); if (protocol && MODEST_IS_ACCOUNT_PROTOCOL (protocol) && proto_type != priv->last_plugin_protocol_selected) { ModestPairList *tabs; GSList *tmp; gboolean first_page = TRUE; - ModestWizardDialogResponseOverrideFunc response_override; /* Remember the last selected plugin protocol */ priv->last_plugin_protocol_selected = proto_type; /* Get tabs */ tabs = modest_account_protocol_get_easysetupwizard_tabs (MODEST_ACCOUNT_PROTOCOL (protocol)); - response_override = modest_account_protocol_get_wizard_response_override - (MODEST_ACCOUNT_PROTOCOL (protocol)); - modest_wizard_dialog_set_response_override_handler (MODEST_WIZARD_DIALOG (self), - response_override); tmp = (GSList *) tabs; while (tmp) { ModestPair *pair = (ModestPair *) tmp->data; @@ -1653,7 +1770,7 @@ create_subsequent_pages (ModestEasysetupWizardDialog *self) } else { if (priv->last_plugin_protocol_selected != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) { - remove_non_common_tabs (notebook, TRUE); + remove_non_common_tabs (self, TRUE); init_user_page (priv); priv->page_complete_easysetup = NULL; priv->last_plugin_protocol_selected = MODEST_PROTOCOL_REGISTRY_TYPE_INVALID; @@ -1806,7 +1923,12 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * * either because it was too slow, * or because it requires interaction: */ - if (current_page == priv->page_account_details) { + if (current_page == priv->page_welcome) { + if (!priv->check_support_done) { + check_support_of_protocols (self); + return priv->check_support_done; + } + } else if (current_page == priv->page_account_details) { /* Check that the title is not already in use: */ gchar* account_title = get_entered_account_title (self); if (!account_title) @@ -1843,6 +1965,25 @@ on_before_next (ModestWizardDialog *dialog, GtkWidget *current_page, GtkWidget * return FALSE; } + } else if (current_page == priv->page_custom_incoming || + current_page == priv->page_custom_outgoing) { + + const gchar *hostname; + GtkWidget *entry = (current_page == priv->page_custom_incoming) ? + priv->entry_incomingserver : + priv->entry_outgoingserver; + + hostname = gtk_entry_get_text (GTK_ENTRY (entry)); + if (!modest_text_utils_validate_domain_name (hostname)) { + /* Show error */ + modest_platform_information_banner (NULL, NULL, _("mcen_ib_invalid_servername")); + + /* Return focus to the email address entry: */ + gtk_widget_grab_focus (entry); + gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); + + return FALSE; + } } if (next_page == priv->page_custom_incoming) { @@ -1934,7 +2075,7 @@ real_enable_buttons (ModestWizardDialog *dialog, gboolean enable_next) /* If the check support is not done then do not enable the wizard to continue */ - enable_next = enable_next && priv->check_support_done; + enable_next = enable_next && priv->pending_check_support == 0; } gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), @@ -1996,6 +2137,35 @@ modest_easysetup_wizard_dialog_class_init (ModestEasysetupWizardDialogClass *kla base_klass->save = on_save; } +static void +check_username_for_provider (const gchar *provider_id, + const gchar *domain, + gchar **username) +{ + gchar *providers_to_check[] = { "ovi.com", "yahoomailplus.com", "hotmail.com" }; + gint i; + gboolean found = FALSE; + gchar *old; + + /* Check if the username contains the @hostname, if not then add it */ + if (strchr (*username, '@')) + return; + + /* Check if it's one of the providers to check */ + for (i = 0; i < G_N_ELEMENTS (providers_to_check) && !found; i++) { + if (!g_ascii_strncasecmp (providers_to_check[i], provider_id, strlen (providers_to_check[i]))) + found = TRUE; + } + + if (!found) + return; + + /* Replace the username */ + old = *username; + *username = g_strconcat (*username, "@", domain, NULL); + g_free (old); +} + /** * save_to_settings: * @self: a #ModestEasysetupWizardDialog @@ -2008,7 +2178,8 @@ save_to_settings (ModestEasysetupWizardDialog *self) ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); guint special_port; gchar *provider_id = NULL; - gchar* display_name; + gchar *alternate_username = NULL; + gchar *display_name; const gchar *username, *password; gchar *store_hostname, *transport_hostname; guint store_port, transport_port; @@ -2056,8 +2227,8 @@ save_to_settings (ModestEasysetupWizardDialog *self) priv->settings); g_list_free (wizard_pages); } else { - g_warning ("The selected protocol is a plugin protocol "// - "but it's not a ModestAccountProtocol"); + g_debug ("The selected protocol is a plugin protocol "// + "but it's not a ModestAccountProtocol"); } g_free (provider_id); @@ -2082,6 +2253,8 @@ save_to_settings (ModestEasysetupWizardDialog *self) if (provider_id) { ModestProtocolType store_provider_server_type; gboolean store_provider_use_alternate_port; + gchar *domain = NULL; + /* Use presets: */ store_hostname = modest_presets_get_server (priv->presets, provider_id, TRUE /* store */); @@ -2099,6 +2272,17 @@ save_to_settings (ModestEasysetupWizardDialog *self) provider_id, TRUE /* store */); + + /* This is HORRIBLE, but it seems that somehow it helps users + that do not like to read the user instructions for their + email accounts */ + domain = modest_presets_get_domain (priv->presets, provider_id); + if (domain) { + alternate_username = g_strdup (username); + check_username_for_provider (provider_id, domain, &alternate_username); + g_free (domain); + } + /* We don't check for SMTP here as that is impossible for an incoming server. */ if (store_provider_server_type == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) store_protocol = MODEST_PROTOCOLS_STORE_POP; @@ -2136,7 +2320,7 @@ save_to_settings (ModestEasysetupWizardDialog *self) /* now we store the common store account 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_username (store_settings, (alternate_username) ? alternate_username : username); modest_server_account_settings_set_password (store_settings, password); modest_server_account_settings_set_protocol (store_settings, store_protocol); @@ -2153,6 +2337,7 @@ save_to_settings (ModestEasysetupWizardDialog *self) if (provider_id) { ModestProtocolType transport_provider_server_type; ModestProtocolType transport_provider_security; + gboolean is_secure; /* Use presets */ transport_hostname = modest_presets_get_server (priv->presets, provider_id, @@ -2168,21 +2353,26 @@ save_to_settings (ModestEasysetupWizardDialog *self) /* Note: We need something as default, or modest_account_mgr_add_server_account will fail. */ transport_protocol = transport_provider_server_type; transport_security = transport_provider_security; - if (transport_security == MODEST_PROTOCOLS_CONNECTION_SSL) { - /* printf("DEBUG: %s: using secure SMTP\n", __FUNCTION__); */ - /* 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_PROTOCOLS_AUTH_PASSWORD; + is_secure = modest_protocol_registry_protocol_type_is_secure (modest_runtime_get_protocol_registry (), + transport_security); + + /* 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 { - /* printf("DEBUG: %s: using non-secure SMTP\n", __FUNCTION__); */ - transport_auth_protocol = MODEST_PROTOCOLS_AUTH_NONE; + gboolean use_alternate_port = FALSE; + if (transport_security == MODEST_PROTOCOLS_CONNECTION_SSL) + use_alternate_port = TRUE; + transport_port = get_port_from_protocol(transport_provider_server_type, use_alternate_port); } + if (is_secure) + transport_auth_protocol = MODEST_PROTOCOLS_AUTH_PASSWORD; + else + transport_auth_protocol = MODEST_PROTOCOLS_AUTH_NONE; + modest_server_account_settings_set_security_protocol (transport_settings, transport_security); modest_server_account_settings_set_auth_protocol (transport_settings, @@ -2216,12 +2406,14 @@ save_to_settings (ModestEasysetupWizardDialog *self) /* now we store the common transport account 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_username (transport_settings, (alternate_username) ? alternate_username : username); modest_server_account_settings_set_password (transport_settings, password); modest_server_account_settings_set_protocol (transport_settings, transport_protocol); g_object_unref (transport_settings); g_free (transport_hostname); + if (alternate_username) + g_free (alternate_username); fullname = hildon_entry_get_text (HILDON_ENTRY (priv->entry_user_name)); email_address = hildon_entry_get_text (HILDON_ENTRY (priv->entry_user_email)); @@ -2241,6 +2433,11 @@ save_to_settings (ModestEasysetupWizardDialog *self) modest_account_settings_set_display_name (priv->settings, display_name); g_free (display_name); g_free (provider_id); + + /* This values are hardcoded for Fremantle */ + modest_account_settings_set_retrieve_type (priv->settings, + MODEST_ACCOUNT_RETRIEVE_MESSAGES_AND_ATTACHMENTS); + modest_account_settings_set_retrieve_limit (priv->settings, 20); } @@ -2340,38 +2537,35 @@ check_has_supported_auth_methods(ModestEasysetupWizardDialog* self) } static gboolean -check_support_progress_pulse (gpointer userdata) +check_support_show_progress (gpointer userdata) { ModestEasysetupWizardDialog *self = (ModestEasysetupWizardDialog *) userdata; ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - if (priv->destroyed) { - priv->check_support_progress_pulse_id = 0; + priv->check_support_show_progress_id = 0; + + if (priv->destroyed) return FALSE; - } - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->check_support_progress)); + hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), TRUE); - return TRUE; + return FALSE; } static gboolean -check_support_show_progress (gpointer userdata) +check_support_progress_pulse (gpointer userdata) { ModestEasysetupWizardDialog *self = (ModestEasysetupWizardDialog *) userdata; ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); - priv->check_support_show_progress_id = 0; - - if (priv->destroyed) + if (priv->destroyed || priv->check_support_progress == NULL) { + priv->check_support_progress_pulse_id = 0; return FALSE; + } - gtk_widget_show (priv->check_support_progress); gtk_progress_bar_pulse (GTK_PROGRESS_BAR (priv->check_support_progress)); - priv->check_support_progress_pulse_id = g_timeout_add (200, check_support_progress_pulse, self); - - return FALSE; + return TRUE; } static void @@ -2389,36 +2583,80 @@ check_support_callback (ModestAccountProtocol *protocol, priv->check_support_show_progress_id = 0; } - if (priv->check_support_progress_pulse_id > 0) { - g_source_remove (priv->check_support_progress_pulse_id); - priv->check_support_progress_pulse_id = 0; - } - if (priv->pending_check_support == 0) { priv->check_support_done = TRUE; + if (priv->check_support_cancel_note) { + gtk_widget_destroy (priv->check_support_cancel_note); + priv->check_support_cancel_note = NULL; + priv->check_support_progress = NULL; + } + if (!priv->destroyed) { if (priv->presets) fill_providers (self); - gtk_widget_hide (priv->check_support_progress); + hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), FALSE); invoke_enable_buttons_vfunc (self); + gtk_dialog_response (GTK_DIALOG (self), MODEST_WIZARD_DIALOG_NEXT); } } g_object_unref (self); } +static void +on_check_support_cancel (GtkDialog *cancel_note, + gint response, + ModestEasysetupWizardDialog *self) +{ + ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); + ModestProtocolRegistry *registry; + GSList *provider_protos, *node; + + registry = modest_runtime_get_protocol_registry (); + provider_protos = modest_protocol_registry_get_by_tag (registry, + MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + + for (node = provider_protos; node != NULL; node = g_slist_next (node)) { + ModestProtocol *proto = MODEST_PROTOCOL (node->data); + + if (!modest_protocol_registry_protocol_type_has_tag (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_STORE_PROTOCOLS)) + continue; + + if (modest_protocol_registry_protocol_type_has_tag + (registry, + modest_protocol_get_type_id (proto), + MODEST_PROTOCOL_REGISTRY_SINGLETON_PROVIDER_PROTOCOLS)) { + /* Check if there's already an account configured with this account type */ + if (modest_account_mgr_singleton_protocol_exists (modest_runtime_get_account_mgr (), + modest_protocol_get_type_id (proto))) + continue; + } + + if (MODEST_ACCOUNT_PROTOCOL (proto)) { + modest_account_protocol_cancel_check_support (MODEST_ACCOUNT_PROTOCOL (proto)); + } + } + g_slist_free (provider_protos); + + gtk_widget_destroy (GTK_WIDGET (cancel_note)); + priv->check_support_cancel_note = NULL; + priv->check_support_progress = NULL; +} static void check_support_of_protocols (ModestEasysetupWizardDialog *self) { ModestProtocolRegistry *registry; - GSList *provider_protos, *node; + GSList *provider_protos, *node, *check_support_providers; ModestEasysetupWizardDialogPrivate *priv = MODEST_EASYSETUP_WIZARD_DIALOG_GET_PRIVATE (self); registry = modest_runtime_get_protocol_registry (); provider_protos = modest_protocol_registry_get_by_tag (registry, MODEST_PROTOCOL_REGISTRY_PROVIDER_PROTOCOLS); + check_support_providers = NULL; for (node = provider_protos; node != NULL; node = g_slist_next (node)) { ModestProtocol *proto = MODEST_PROTOCOL (node->data); @@ -2439,17 +2677,33 @@ check_support_of_protocols (ModestEasysetupWizardDialog *self) if (MODEST_ACCOUNT_PROTOCOL (proto)) { priv->pending_check_support ++; - modest_account_protocol_check_support (MODEST_ACCOUNT_PROTOCOL (proto), - check_support_callback, - g_object_ref (self)); + check_support_providers = g_slist_prepend (check_support_providers, proto); } } g_slist_free (provider_protos); + + for (node = check_support_providers; node != NULL; node = g_slist_next (node)) { + ModestProtocol *proto = MODEST_PROTOCOL (node->data); + + modest_account_protocol_check_support (MODEST_ACCOUNT_PROTOCOL (proto), + check_support_callback, + g_object_ref (self)); + } + g_slist_free (check_support_providers); if (priv->pending_check_support > 0) { priv->check_support_show_progress_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 1000, check_support_show_progress, g_object_ref (self), g_object_unref); + priv->check_support_progress_pulse_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 200, + check_support_progress_pulse, + g_object_ref (self), g_object_unref); + priv->check_support_progress = gtk_progress_bar_new (); + priv->check_support_cancel_note = hildon_note_new_cancel_with_progress_bar (GTK_WINDOW (self), + _("mcen_cn_availability_check"), + GTK_PROGRESS_BAR (priv->check_support_progress)); + gtk_widget_show (priv->check_support_cancel_note); + g_signal_connect (priv->check_support_cancel_note, "response", G_CALLBACK (on_check_support_cancel), self); } else { priv->check_support_done = TRUE; }