diff options
-rw-r--r-- | mail/e-mail-migrate.c | 352 |
1 files changed, 1 insertions, 351 deletions
diff --git a/mail/e-mail-migrate.c b/mail/e-mail-migrate.c index 59605e24a4..f3ce503012 100644 --- a/mail/e-mail-migrate.c +++ b/mail/e-mail-migrate.c @@ -70,16 +70,6 @@ #define d(x) x -typedef struct _MigrateStateInfo MigrateStateInfo; - -struct _MigrateStateInfo { - gchar *label_name; - gdouble progress; -}; - -static gboolean -update_states_in_main_thread (MigrateStateInfo *info); - /* 1.4 upgrade functions */ #define EM_TYPE_MIGRATE_SESSION \ @@ -119,100 +109,9 @@ em_migrate_session_new (const gchar *user_data_dir) "user-data-dir", user_data_dir, NULL); } -static GtkWidget *window; -static GtkLabel *label; static GtkProgressBar *progress; static void -em_migrate_setup_progress_dialog (const gchar *title, - const gchar *desc) -{ - GtkWidget *vbox, *hbox, *w; - gchar *markup; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title ((GtkWindow *) window, _("Migrating...")); - gtk_window_set_modal ((GtkWindow *) window, TRUE); - gtk_container_set_border_width ((GtkContainer *) window, 6); - - vbox = gtk_vbox_new (FALSE, 6); - gtk_widget_show (vbox); - gtk_container_add ((GtkContainer *) window, vbox); - - w = gtk_label_new (desc); - - gtk_label_set_line_wrap ((GtkLabel *) w, TRUE); - gtk_widget_show (w); - gtk_box_pack_start ((GtkBox *) vbox, w, TRUE, TRUE, 0); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_widget_show (hbox); - gtk_box_pack_start ((GtkBox *) vbox, hbox, TRUE, TRUE, 0); - - label = (GtkLabel *) gtk_label_new (""); - gtk_widget_show ((GtkWidget *) label); - gtk_box_pack_start ((GtkBox *) hbox, (GtkWidget *) label, TRUE, TRUE, 0); - - progress = (GtkProgressBar *) gtk_progress_bar_new (); - gtk_widget_show ((GtkWidget *) progress); - gtk_box_pack_start ((GtkBox *) hbox, (GtkWidget *) progress, TRUE, TRUE, 0); - - /* Prepare the message */ - vbox = gtk_vbox_new (FALSE, 12); - gtk_widget_show (vbox); - gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); - - w = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0); - markup = g_strconcat ( - "<big><b>", - title ? title : _("Migration"), - "</b></big>", NULL); - gtk_label_set_markup (GTK_LABEL (w), markup); - gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); - g_free (markup); - - w = gtk_label_new (desc); - gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0); - gtk_label_set_line_wrap (GTK_LABEL (w), TRUE); - gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); - - /* Progress bar */ - w = gtk_vbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), w, TRUE, TRUE, 0); - - label = GTK_LABEL (gtk_label_new ("")); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_label_set_line_wrap (label, TRUE); - gtk_widget_show (GTK_WIDGET (label)); - gtk_box_pack_start (GTK_BOX (w), GTK_WIDGET (label), TRUE, TRUE, 0); - - progress = GTK_PROGRESS_BAR (gtk_progress_bar_new ()); - gtk_widget_show (GTK_WIDGET (progress)); - gtk_box_pack_start (GTK_BOX (w), GTK_WIDGET (progress), TRUE, TRUE, 0); - - gtk_container_add (GTK_CONTAINER (window), hbox); - gtk_widget_show_all (hbox); - gtk_widget_show (window); -} - -static void -em_migrate_close_progress_dialog (void) -{ - gtk_widget_destroy ((GtkWidget *) window); -} - -static void -em_migrate_set_folder_name (const gchar *folder_name) -{ - gchar *text; - - text = g_strdup_printf (_("Migrating '%s':"), folder_name); - gtk_label_set_text (label, text); - g_free (text); -} - -static void em_migrate_set_progress (double percent) { gchar text[5]; @@ -566,253 +465,6 @@ em_update_sa_junk_setting_2_23 (void) g_object_unref (client); } -#ifndef G_OS_WIN32 - -static gboolean -update_states_in_main_thread (MigrateStateInfo *info) -{ - g_return_val_if_fail (info != NULL, FALSE); - g_return_val_if_fail (info->label_name != NULL, FALSE); - - em_migrate_set_progress (info->progress); - em_migrate_set_folder_name (info->label_name); - - /* XXX Why is this necessary? */ - while (gtk_events_pending ()) - gtk_main_iteration (); - - return FALSE; -} - -static void -migrate_state_info_free (MigrateStateInfo *info) -{ - g_free (info->label_name); - g_slice_free (MigrateStateInfo, info); -} - -static void -migrate_folders (CamelStore *store, - gboolean is_local, - CamelFolderInfo *fi, - const gchar *acc, - gboolean *done, - gint *nth_folder, - gint total_folders) -{ - CamelFolder *folder; - - while (fi) { - MigrateStateInfo *info; - - *nth_folder = *nth_folder + 1; - - info = g_slice_new0 (MigrateStateInfo); - info->label_name = g_strdup_printf ( - "%s/%s", acc, fi->full_name); - info->progress = (gdouble) (*nth_folder) / total_folders; - - g_idle_add_full ( - G_PRIORITY_LOW, (GSourceFunc) - update_states_in_main_thread, info, - (GDestroyNotify) migrate_state_info_free); - - if (is_local) - folder = camel_store_get_folder_sync ( - store, fi->full_name, - CAMEL_STORE_IS_MIGRATING, NULL, NULL); - else - folder = camel_store_get_folder_sync ( - store, fi->full_name, 0, NULL, NULL); - - if (folder != NULL) - camel_folder_summary_migrate_infos (folder->summary); - migrate_folders ( - store, is_local, fi->child, - acc, done, nth_folder, total_folders); - fi = fi->next; - } - - if ((*nth_folder) == (total_folders - 1)) - *done = TRUE; -} - -#endif /* G_OS_WIN32 */ - -/* This could be in CamelStore.ch */ -static void -count_folders (CamelFolderInfo *fi, - gint *count) -{ - while (fi) { - *count = *count + 1; - count_folders (fi->child, count); - fi = fi->next; - } -} - -static CamelStore * -setup_local_store (EShellBackend *shell_backend, - EMMigrateSession *session) -{ - CamelSettings *settings; - CamelService *service; - const gchar *data_dir; - gchar *path; - - service = camel_session_add_service ( - CAMEL_SESSION (session), "local", "mbox", - CAMEL_PROVIDER_STORE, NULL); - - settings = camel_service_get_settings (service); - data_dir = e_shell_backend_get_data_dir (shell_backend); - - path = g_build_filename (data_dir, "local", NULL); - g_object_set (settings, "path", path, NULL); - g_free (path); - - return CAMEL_STORE (service); -} - -#ifndef G_OS_WIN32 - -struct migrate_folders_to_db_structure { - gchar *account_name; - CamelStore *store; - CamelFolderInfo *info; - gboolean done; - gboolean is_local_store; -}; - -static void -migrate_folders_to_db_thread (struct migrate_folders_to_db_structure *migrate_dbs) -{ - gint num_of_folders = 0, nth_folder = 0; - count_folders (migrate_dbs->info, &num_of_folders); - migrate_folders ( - migrate_dbs->store, migrate_dbs->is_local_store, - migrate_dbs->info, migrate_dbs->account_name, - &(migrate_dbs->done), &nth_folder, num_of_folders); -} - -static void -migrate_to_db (EShellBackend *shell_backend) -{ - EMMigrateSession *session; - EAccountList *accounts; - EMailBackend *mail_backend; - EMailSession *mail_session; - EIterator *iter; - gint i = 0, len; - CamelStore *store = NULL; - CamelSettings *settings; - CamelFolderInfo *info; - const gchar *data_dir; - const gchar *path; - - if (!(accounts = e_get_account_list ())) - return; - - mail_backend = E_MAIL_BACKEND (shell_backend); - mail_session = e_mail_backend_get_session (mail_backend); - data_dir = e_shell_backend_get_data_dir (shell_backend); - - /* Initialize the mail stores early so we can add a new one. */ - e_mail_store_init (mail_session, data_dir); - - iter = e_list_get_iterator ((EList *) accounts); - len = e_list_length ((EList *) accounts); - - session = em_migrate_session_new (data_dir); - camel_session_set_online ((CamelSession *) session, FALSE); - em_migrate_setup_progress_dialog ( - _("Migrating Folders"), - _("The summary format of the Evolution mailbox " - "folders has been moved to SQLite since Evolution 2.24.\n\nPlease be " - "patient while Evolution migrates your folders...")); - - em_migrate_set_progress ((gdouble) i / (len + 1)); - store = setup_local_store (shell_backend, session); - - settings = camel_service_get_settings (CAMEL_SERVICE (store)); - path = camel_local_settings_get_path (CAMEL_LOCAL_SETTINGS (settings)); - - info = camel_store_get_folder_info_sync ( - store, NULL, - CAMEL_STORE_FOLDER_INFO_RECURSIVE | - CAMEL_STORE_FOLDER_INFO_FAST | - CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, - NULL, NULL); - if (info) { - struct migrate_folders_to_db_structure migrate_dbs; - - if (path != NULL && g_str_has_suffix (path, ".evolution/mail/local")) - migrate_dbs.is_local_store = TRUE; - else - migrate_dbs.is_local_store = FALSE; - migrate_dbs.account_name = _("On This Computer"); - migrate_dbs.info = info; - migrate_dbs.store = store; - migrate_dbs.done = FALSE; - - g_thread_create ( - (GThreadFunc) migrate_folders_to_db_thread, - &migrate_dbs, TRUE, NULL); - while (!migrate_dbs.done) - g_main_context_iteration (NULL, TRUE); - } - i++; - em_migrate_set_progress ((gdouble) i / (len + 1)); - - while (e_iterator_is_valid (iter)) { - EAccount *account = (EAccount *) e_iterator_get (iter); - EAccountService *service; - - service = account->source; - em_migrate_set_progress ((gdouble) i / (len + 1)); - if (account->enabled - && service->url != NULL && service->url[0] - && strncmp (service->url, "mbox:", 5) != 0) { - - store = e_mail_store_add_by_account ( - mail_session, account); - - info = camel_store_get_folder_info_sync ( - store, NULL, - CAMEL_STORE_FOLDER_INFO_RECURSIVE | - CAMEL_STORE_FOLDER_INFO_FAST | - CAMEL_STORE_FOLDER_INFO_SUBSCRIBED, - NULL, NULL); - if (info) { - struct migrate_folders_to_db_structure migrate_dbs; - - migrate_dbs.account_name = account->name; - migrate_dbs.info = info; - migrate_dbs.store = store; - migrate_dbs.done = FALSE; - - g_thread_create ( - (GThreadFunc) - migrate_folders_to_db_thread, - &migrate_dbs, TRUE, NULL); - while (!migrate_dbs.done) - g_main_context_iteration (NULL, TRUE); - } else - printf("%s:%s: failed to get folder infos \n", G_STRLOC, G_STRFUNC); - } - i++; - e_iterator_next (iter); - - } - - g_object_unref (iter); - em_migrate_close_progress_dialog (); - - g_object_unref (session); -} - -#endif - static gboolean mbox_to_maildir_migration_needed (EShellBackend *shell_backend) { @@ -1539,10 +1191,8 @@ e_mail_migrate (EShellBackend *shell_backend, if (major < 2 || (major == 2 && minor < 22)) em_update_message_notify_settings_2_21 (); - if (major < 2 || (major == 2 && minor < 24)) { + if (major < 2 || (major == 2 && minor < 24)) em_update_sa_junk_setting_2_23 (); - migrate_to_db (shell_backend); - } #else if (major < 2 || (major == 2 && minor < 24)) g_warning ( |