+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);
+ self->combo_account_country = NULL;
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ if (dialog_response != GTK_RESPONSE_OK) {
+ /* Don't let the dialog close */
+ g_signal_stop_emission_by_name (wizard_dialog, "response");
+ }
+ }
+ }
+}
+
+typedef struct IdleData {
+ ModestEasysetupWizardDialog *dialog;
+ ModestPresets *presets;
+} IdleData;
+
+gboolean
+presets_idle (gpointer userdata)
+{
+ IdleData *idle_data = (IdleData *) userdata;
+ ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (idle_data->dialog);
+ ModestEasysetupWizardDialogPrivate *priv = WIZARD_DIALOG_GET_PRIVATE (self);
+
+ g_assert (idle_data->presets);
+
+ gdk_threads_enter ();
+
+ priv->presets = idle_data->presets;
+
+ if (self->combo_account_country) {
+ 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);
+ }
+
+ priv->dirty = FALSE;
+
+ g_object_unref (idle_data->dialog);
+ g_free (idle_data);
+
+ gdk_threads_leave ();
+
+ return FALSE;
+}
+
+gpointer
+presets_loader (gpointer userdata)
+{
+ ModestEasysetupWizardDialog *self = MODEST_EASYSETUP_WIZARD_DIALOG (userdata);
+ ModestPresets *presets = NULL;
+ IdleData *idle_data;
+
+ 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);
+
+ return NULL;
+}
+