aboutsummaryrefslogtreecommitdiffstats
path: root/mail/importers/pine-importer.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-02-11 16:26:58 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-02-11 16:26:58 +0800
commit06b08adb257351bf8080d960fb98b4265cc43081 (patch)
tree9f429f497d47c5b933d2c4c98a1058566233a7dc /mail/importers/pine-importer.c
parent136b8ea938580f3c1d4fb9f92093c4631ec6038b (diff)
downloadgsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar.gz
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar.bz2
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar.lz
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar.xz
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.tar.zst
gsoc2013-evolution-06b08adb257351bf8080d960fb98b4265cc43081.zip
Basically rewrote this, the import tasks run in another thread. It tells
2004-02-11 Not Zed <NotZed@Ximian.com> * importers/pine-importer.c: Basically rewrote this, the import tasks run in another thread. It tells you more about what's going on, and its cancellable. (pine_store_settings): changed the meaning of the settings slightly, if set it means we've processed them already. * mail-component-factory.c (factory): hook in importer factory callback. 2004-02-10 Not Zed <NotZed@Ximian.com> * importers/*-importer.c: removed module init, just provide a new method. Updates for api changes. * Makefile.am: link mail importers in directly. * mail-importer.c: changed to do stuff in-memory with linked stuff, moved to importers/. * importers/GNOME_Evolution_Mail_Importers.server.in.in: merge all importer .server info's here, point them all to the mailer factory. Removed the others. * importers/Makefile.am: remove Mailer.idl stuff. Move all importers to a single library. svn path=/trunk/; revision=24701
Diffstat (limited to 'mail/importers/pine-importer.c')
-rw-r--r--mail/importers/pine-importer.c659
1 files changed, 258 insertions, 401 deletions
diff --git a/mail/importers/pine-importer.c b/mail/importers/pine-importer.c
index 89cfcc2fdc..9ce7f4520a 100644
--- a/mail/importers/pine-importer.c
+++ b/mail/importers/pine-importer.c
@@ -3,8 +3,10 @@
*
* Authors:
* Iain Holmes <iain@ximian.com>
+ * Michael Zucchi <notzed@ximian.com>
*
* Copyright 2001 Ximian, Inc. (www.ximian.com)
+ * Copyright 2004 Novell, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -54,13 +56,13 @@
#include <importer/evolution-importer-client.h>
#include <importer/GNOME_Evolution_Importer.h>
-#include "mail/mail-importer.h"
+#include "mail-importer.h"
-#include <ebook/e-book.h>
-#include <ebook/e-card-simple.h>
+#include "mail/mail-mt.h"
+#include "mail/mail-component.h"
+
+#include <libebook/e-book.h>
-#define PINE_INTELLIGENT_IMPORTER_IID "OAFIID:GNOME_Evolution_Mail_Pine_Intelligent_Importer_Factory:" BASE_VERSION
-#define MBOX_IMPORTER_IID "OAFIID:GNOME_Evolution_Mail_Mbox_Importer:" BASE_VERSION
#define KEY "pine-mail-imported"
/*#define SUPER_IMPORTER_DEBUG*/
@@ -73,21 +75,19 @@
typedef struct {
EvolutionIntelligentImporter *ii;
- GList *dir_list;
-
- int progress_count;
- int more;
- EvolutionImporterResult result;
-
- GNOME_Evolution_Importer importer;
- EvolutionImporterListener *listener;
+ GMutex *status_lock;
+ char *status_what;
+ int status_pc;
+ int status_timeout_id;
+ CamelOperation *cancel; /* cancel/status port */
GtkWidget *mail;
- gboolean do_mail;
GtkWidget *address;
- gboolean do_address;
- EBook *book;
+ gboolean do_mail;
+ gboolean done_mail;
+ gboolean do_address;
+ gboolean done_address;
/* GUI */
GtkWidget *dialog;
@@ -95,32 +95,32 @@ typedef struct {
GtkWidget *progressbar;
} PineImporter;
-typedef struct {
- char *parent;
- char *foldername;
- char *path;
- gboolean folder;
-} PineFolder;
-
-void mail_importer_module_init (void);
+static void
+pine_importer_response(GtkWidget *w, guint button, void *data)
+{
+ PineImporter *importer = data;
-static void import_next (PineImporter *importer);
+ if (button == GTK_RESPONSE_CANCEL
+ && importer->cancel)
+ camel_operation_cancel(importer->cancel);
+}
static GtkWidget *
create_importer_gui (PineImporter *importer)
{
GtkWidget *dialog;
- dialog = gnome_message_box_new (_("Evolution is importing your old Pine data"), GNOME_MESSAGE_BOX_INFO, NULL);
+ dialog = gtk_message_dialog_new(NULL, 0/*GTK_DIALOG_NO_SEPARATOR*/,
+ GTK_MESSAGE_INFO, GTK_BUTTONS_CANCEL,
+ _("Evolution is importing your old Pine data"));
gtk_window_set_title (GTK_WINDOW (dialog), _("Importing..."));
importer->label = gtk_label_new (_("Please wait"));
importer->progressbar = gtk_progress_bar_new ();
- gtk_progress_set_activity_mode (GTK_PROGRESS (importer->progressbar), TRUE);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
- importer->label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),
- importer->progressbar, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), importer->label, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), importer->progressbar, FALSE, FALSE, 0);
+ g_signal_connect(dialog, "response", G_CALLBACK(pine_importer_response), importer);
+
return dialog;
}
@@ -129,8 +129,9 @@ pine_store_settings (PineImporter *importer)
{
GConfClient *gconf = gconf_client_get_default ();
- gconf_client_set_bool (gconf, "/apps/evolution/importer/pine/mail", importer->do_mail, NULL);
- gconf_client_set_bool (gconf, "/apps/evolution/importer/pine/address", importer->do_address, NULL);
+ gconf_client_set_bool (gconf, "/apps/evolution/importer/pine/mail", importer->done_mail, NULL);
+ gconf_client_set_bool (gconf, "/apps/evolution/importer/pine/address", importer->done_address, NULL);
+ g_object_unref(gconf);
}
static void
@@ -138,403 +139,287 @@ pine_restore_settings (PineImporter *importer)
{
GConfClient *gconf = gconf_client_get_default ();
- importer->do_mail = gconf_client_get_bool (gconf, "/apps/evolution/importer/pine/mail", NULL);
- importer->do_address = gconf_client_get_bool (gconf, "/apps/evolution/importer/pine/address", NULL);
+ importer->done_mail = gconf_client_get_bool (gconf, "/apps/evolution/importer/pine/mail", NULL);
+ importer->done_address = gconf_client_get_bool (gconf, "/apps/evolution/importer/pine/address", NULL);
+ g_object_unref(gconf);
}
-static void
-add_card_cb (EBook *book,
- EBookStatus status,
- const char *id,
- gpointer closure)
+static gboolean
+pine_can_import (EvolutionIntelligentImporter *ii, void *closure)
{
- g_object_unref (closure);
-}
+ PineImporter *importer = closure;
+ char *maildir, *addrfile;
+ gboolean md_exists = FALSE, addr_exists = FALSE;
+ struct stat st;
+
+ maildir = g_build_filename(g_get_home_dir(), "mail", NULL);
+ md_exists = lstat(maildir, &st) == 0 && S_ISDIR(st.st_mode);
+ g_free (maildir);
-static void
-parse_line (EBook *book,
- char *line)
-{
- char **strings;
- ECardName *name;
- ECard *card;
- EList *list;
+ importer->do_mail = md_exists && !importer->done_mail;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (importer->mail), importer->do_mail);
+ gtk_widget_set_sensitive (importer->mail, md_exists);
- card = e_card_new ("");
- strings = g_strsplit (line, "\t", 3);
- if (strings[0] && strings[1] && strings[2]) {
- name = e_card_name_from_string (strings[1]);
- g_object_set (card,
- "nickname", strings[0],
- "full_name", strings[1],
- "name", name, NULL);
- g_object_get (card,
- "email", &list,
- NULL);
- e_list_append (list, strings[2]);
- g_strfreev (strings);
- e_book_add_card (book, card, add_card_cb, card);
- }
+ addrfile = g_build_filename(g_get_home_dir(), ".addressbook", NULL);
+ addr_exists = lstat(addrfile, &st) == 0 && S_ISREG(st.st_mode);
+ g_free (addrfile);
+
+ gtk_widget_set_sensitive (importer->address, addr_exists);
+
+ return md_exists || addr_exists;
}
-static void
-import_addressfile (EBook *book,
- EBookStatus status,
- gpointer user_data)
-{
- char *addressbook;
- FILE *handle;
- char line[2 * 1024];
- int which = 0;
- char *lastline = NULL;
- PineImporter *importer = user_data;
-
- addressbook = g_build_filename(g_get_home_dir(), ".addressbook", NULL);
- handle = fopen (addressbook, "r");
- g_free (addressbook);
-
- if (handle == NULL) {
- g_warning ("Cannot open .addressbook");
- return;
- }
+/*
+See: http://www.washington.edu/pine/tech-notes/low-level.html
- while (fgets (line + which * 1024, 1024, handle)) {
- int length;
- char *thisline = line + which * 1024;
-
- importer->progress_count++;
- if ((importer->progress_count & 0xf) == 0)
- gtk_progress_bar_pulse(GTK_PROGRESS_BAR(importer->progressbar));
-
- length = strlen (thisline);
- if (thisline[length - 1] == '\n') {
- line[--length] = 0;
- }
+addressbook line is:
+ <nickname>TAB<fullname>TAB<address>TAB<fcc>TAB<comments>
+lists, address is:
+ "(" <address>, <address>, <address>, ... ")"
- if (lastline && *thisline && isspace ((int) *thisline)) {
- char *temp;
+<address> is rfc822 address, or alias address.
+if rfc822 address includes a phrase, then that overrides <fullname>
- while (*thisline && isspace ((int) *thisline)) {
- thisline++;
- }
- temp = lastline;
- lastline = g_strdup_printf ("%s%s", lastline, thisline);
- g_free (temp);
- continue;
- }
+FIXME: we dont handle aliases in lists.
+*/
- if (lastline) {
- parse_line (book, lastline);
- g_free (lastline);
+static void
+import_contact(EBook *book, char *line)
+{
+ char **strings, *addr, **addrs;
+ int i;
+ GList *list;
+ /*EContactName *name;*/
+ EContact *card;
+ size_t len;
+
+ card = e_contact_new();
+ strings = g_strsplit(line, "\t", 5);
+ if (strings[0] && strings[1] && strings[2]) {
+ e_contact_set(card, E_CONTACT_NICKNAME, strings[0]);
+ e_contact_set(card, E_CONTACT_FULL_NAME, strings[1]);
+
+ addr = strings[2];
+ len = strlen(addr);
+ if (addr[0] == '(' && addr[len-1] == ')') {
+ addr[0] = 0;
+ addr[len-1] = 0;
+ addrs = g_strsplit(addr+1, ",", 0);
+ list = NULL;
+ for (i=0;addrs[i];i++)
+ list = g_list_append(list, addrs[i]);
+ e_contact_set(card, E_CONTACT_EMAIL, list);
+ g_strfreev(addrs);
+ e_contact_set(card, E_CONTACT_IS_LIST, GINT_TO_POINTER(TRUE));
+ } else {
+ e_contact_set(card, E_CONTACT_EMAIL_1, strings[2]);
}
- lastline = g_strdup (thisline);
- }
+ /*name = e_contact_name_from_string(strings[1]);*/
- if (lastline) {
- parse_line (book, lastline);
- g_free (lastline);
- }
+ if (strings[3] && strings[4])
+ e_contact_set(card, E_CONTACT_NOTE, strings[4]);
- fclose (handle);
+ /* FIXME Error checking */
+ e_book_add_contact(book, card, NULL);
+ g_object_unref(card);
+ }
+ g_strfreev (strings);
}
static void
-import_addressbook (PineImporter *importer)
+import_contacts(PineImporter *importer)
{
- char *path, *uri;
+ ESource *primary;
+ ESourceList *source_list;
+ EBook *book;
+ char *name;
+ GString *line;
+ FILE *fp;
+ size_t offset;
+
+ printf("importing pine addressbook\n");
+
+ if (!e_book_get_addressbooks(&source_list, NULL))
+ return;
- importer->book = e_book_new ();
- if (importer->book == NULL) {
+ name = g_build_filename(g_get_home_dir(), ".addressbook", NULL);
+ fp = fopen(name, "r");
+ g_free(name);
+ if (fp == NULL)
+ return;
+
+ /* FIXME Better error handling */
+ if ((book = e_book_new()) == NULL) {
+ fclose(fp);
g_warning ("Could not create EBook.");
return;
}
+
+ primary = e_source_list_peek_source_any(source_list);
+ e_book_load_source(book, primary, TRUE, NULL);
+ g_object_unref(primary);
+ g_object_unref(source_list);
+
+ line = g_string_new("");
+ g_string_set_size(line, 256);
+ offset = 0;
+ while (fgets(line->str+offset, 256, fp)) {
+ size_t len;
+
+ len = strlen(line->str+offset)+offset;
+ if (line->str[len-1] == '\n')
+ g_string_truncate(line, len-1);
+ else if (!feof(fp)) {
+ offset = len;
+ g_string_set_size(line, len+256);
+ continue;
+ } else {
+ g_string_truncate(line, len);
+ }
- path = g_build_filename(g_get_home_dir (),
- "evolution/local/Contacts/addressbook.db", NULL);
- uri = g_strdup_printf ("file://%s", path);
- g_free (path);
+ import_contact(book, line->str);
+ offset = 0;
+ }
- e_book_load_uri (importer->book, uri, import_addressfile, importer);
- g_free (uri);
+ g_string_free(line, TRUE);
+ fclose(fp);
+ g_object_unref(book);
}
-static void
-importer_cb (EvolutionImporterListener *listener,
- EvolutionImporterResult result,
- gboolean more_items,
- void *data)
-{
- PineImporter *importer = (PineImporter *) data;
+struct _pine_import_msg {
+ struct _mail_msg msg;
- importer->result = result;
- importer->more = more_items;
-}
+ PineImporter *importer;
+};
-static gboolean
-pine_import_file (PineImporter *importer,
- const char *path,
- const char *folderpath,
- gboolean folder)
+static char *
+pine_import_describe (struct _mail_msg *mm, int complete)
{
- CORBA_boolean result;
- CORBA_Environment ev;
- CORBA_Object objref;
- char *str, *uri;
- struct stat st;
+ return g_strdup (_("Importing Pine data"));
+}
- CORBA_exception_init (&ev);
+static MailImporterSpecial pine_special_folders[] = {
+ { "sent-mail", "Sent" }, /* pine */
+ { "saved-messages", "Drafts" }, /* pine */
+ { 0 },
+};
- str = g_strdup_printf (_("Importing %s as %s"), path, folderpath);
- gtk_label_set_text (GTK_LABEL (importer->label), str);
- g_free (str);
- while (g_main_context_iteration(NULL, FALSE))
- ;
+static void
+pine_import_import(struct _mail_msg *mm)
+{
+ struct _pine_import_msg *m = (struct _pine_import_msg *) mm;
- uri = mail_importer_make_local_folder(folderpath);
- if (!uri)
- return FALSE;
+ if (m->importer->do_address)
+ import_contacts(m->importer);
- /* only create dirs, dont try to import them */
- if (lstat(path, &st) == 0 && S_ISDIR(st.st_mode)) {
- g_free(uri);
- /* this is ok, we return false to say we haven't launched an async task */
- return FALSE;
- }
+ if (m->importer->do_mail) {
+ char *path;
- result = GNOME_Evolution_Importer_loadFile (importer->importer, path, uri, "", &ev);
- g_free(uri);
- if (ev._major != CORBA_NO_EXCEPTION || result == FALSE) {
- g_warning ("Exception here: %s\n%s, %s", CORBA_exception_id (&ev), path, folderpath);
- CORBA_exception_free (&ev);
- return FALSE;
+ path = g_build_filename(g_get_home_dir(), "mail", NULL);
+ mail_importer_import_folders_sync(path, NULL, pine_special_folders, m->importer->cancel);
+ g_free(path);
}
-
- /* process all items in a direct loop */
- importer->listener = evolution_importer_listener_new (importer_cb, importer);
- objref = bonobo_object_corba_objref (BONOBO_OBJECT (importer->listener));
- do {
- importer->progress_count++;
- if ((importer->progress_count & 0xf) == 0)
- gtk_progress_bar_pulse(GTK_PROGRESS_BAR(importer->progressbar));
-
- importer->result = -1;
- GNOME_Evolution_Importer_processItem (importer->importer, objref, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("Exception: %s", CORBA_exception_id (&ev));
- break;
- }
-
- while (importer->result == -1 || g_main_context_pending(NULL))
- g_main_context_iteration(NULL, TRUE);
- } while (importer->more);
- bonobo_object_unref((BonoboObject *)importer->listener);
-
- CORBA_exception_free (&ev);
-
- return FALSE;
}
-static gboolean
-pine_can_import (EvolutionIntelligentImporter *ii,
- void *closure)
+static void
+pine_import_imported(struct _mail_msg *mm)
{
- PineImporter *importer = closure;
- char *maildir, *addrfile;
- gboolean md_exists = FALSE, addr_exists = FALSE;
- struct stat st;
-
- maildir = g_build_filename(g_get_home_dir(), "mail", NULL);
- md_exists = lstat(maildir, &st) == 0 && S_ISDIR(st.st_mode);
- importer->do_mail = md_exists;
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (importer->mail),
- importer->do_mail);
-
- gtk_widget_set_sensitive (importer->mail, md_exists);
- g_free (maildir);
-
- addrfile = g_build_filename(g_get_home_dir(), ".addressbook", NULL);
- addr_exists = lstat(addrfile, &st) == 0 && S_ISREG(st.st_mode);
- g_free (addrfile);
- gtk_widget_set_sensitive (importer->address, addr_exists);
-
- return md_exists || addr_exists;
}
static void
-import_next (PineImporter *importer)
+pine_import_free(struct _mail_msg *mm)
{
- PineFolder *data;
-
-trynext:
- if (importer->dir_list) {
- char *folder;
- GList *l;
- int ok;
-
- l = importer->dir_list;
- data = l->data;
- folder = g_build_filename(data->parent, data->foldername, NULL);
- importer->dir_list = l->next;
- g_list_free_1(l);
-
- ok = pine_import_file (importer, data->path, folder, data->folder);
-
- g_free (folder);
- g_free (data->parent);
- g_free (data->path);
- g_free (data->foldername);
- g_free (data);
- if (!ok)
- goto trynext;
- } else {
- bonobo_object_unref((BonoboObject *)importer->ii);
- }
+ /*struct _pine_import_msg *m = (struct _pine_import_msg *)mm;*/
}
-/* Pine uses sent-mail and saved-mail whereas Evolution uses Sent and Drafts */
-static char *
-maybe_replace_name (const char *original_name)
+static struct _mail_msg_op pine_import_op = {
+ pine_import_describe,
+ pine_import_import,
+ pine_import_imported,
+ pine_import_free,
+};
+
+static int
+mail_importer_pine_import(PineImporter *importer)
{
- if (strcmp (original_name, "sent-mail") == 0) {
- return g_strdup ("Sent");
- } else if (strcmp (original_name, "saved-messages") == 0) {
- return g_strdup ("Drafts");
- }
+ struct _pine_import_msg *m;
+ int id;
+
+ m = mail_msg_new(&pine_import_op, NULL, sizeof (*m));
+ m->importer = importer;
- return g_strdup (original_name);
+ id = m->msg.seq;
+
+ e_thread_put(mail_thread_queued, (EMsg *) m);
+
+ return id;
}
static void
-scan_dir (PineImporter *importer,
- const char *dirname,
- const char *orig_parent)
+pine_status(CamelOperation *op, const char *what, int pc, void *data)
{
- DIR *maildir;
- struct stat buf;
- struct dirent *current;
- char *str;
-
- maildir = opendir (dirname);
- if (maildir == NULL) {
- g_warning ("Could not open %s\nopendir returned: %s",
- dirname, g_strerror (errno));
- return;
- }
-
- str = g_strdup_printf (_("Scanning %s"), dirname);
- gtk_label_set_text (GTK_LABEL (importer->label), str);
- g_free (str);
+ PineImporter *importer = data;
+
+ if (pc == CAMEL_OPERATION_START)
+ pc = 0;
+ else if (pc == CAMEL_OPERATION_END)
+ pc = 100;
+
+ g_mutex_lock(importer->status_lock);
+ g_free(importer->status_what);
+ importer->status_what = g_strdup(what);
+ importer->status_pc = pc;
+ g_mutex_unlock(importer->status_lock);
+}
- while (gtk_events_pending ()) {
- gtk_main_iteration ();
- }
+static gboolean
+pine_status_timeout(void *data)
+{
+ PineImporter *importer = data;
+ int pc;
+ char *what;
- current = readdir (maildir);
- while (current) {
- PineFolder *pf;
- char *fullname, *foldername;
-
- /* Ignore . and .. */
- if (current->d_name[0] == '.') {
- if (current->d_name[1] == '\0' ||
- (current->d_name[1] == '.' && current->d_name[2] == '\0')) {
- current = readdir (maildir);
- continue;
- }
- }
+ if (!importer->status_what)
+ return TRUE;
- if (*orig_parent == '/') {
- foldername = maybe_replace_name (current->d_name);
- } else {
- foldername = g_strdup (current->d_name);
- }
-
- fullname = g_build_filename(dirname, current->d_name, NULL);
- if (stat (fullname, &buf) == -1) {
- g_warning ("Could not stat %s\nstat returned: %s",
- fullname, g_strerror (errno));
- current = readdir (maildir);
- g_free (fullname);
- continue;
- }
-
- if (S_ISREG (buf.st_mode)) {
- pf = g_new (PineFolder, 1);
- pf->path = g_strdup (fullname);
- pf->parent = g_strdup (orig_parent);
- pf->foldername = g_strdup (foldername);
- pf->folder = FALSE;
- importer->dir_list = g_list_append (importer->dir_list, pf);
- } else if (S_ISDIR (buf.st_mode)) {
- char *subdir;
-
- pf = g_new (PineFolder, 1);
- pf->path = g_strdup (fullname);
- pf->parent = g_strdup (orig_parent);
- pf->foldername = g_strdup (foldername);
- pf->folder = TRUE;
- importer->dir_list = g_list_append (importer->dir_list, pf);
-
- subdir = g_build_filename (orig_parent, foldername, NULL);
- scan_dir (importer, fullname, subdir);
- g_free (subdir);
- }
-
- g_free (fullname);
- g_free (foldername);
- current = readdir (maildir);
- }
+ g_mutex_lock(importer->status_lock);
+ what = importer->status_what;
+ importer->status_what = NULL;
+ pc = importer->status_pc;
+ g_mutex_unlock(importer->status_lock);
+
+ gtk_progress_bar_set_fraction((GtkProgressBar *)importer->progressbar, (gfloat)(pc/100.0));
+ gtk_progress_bar_set_text((GtkProgressBar *)importer->progressbar, what);
+
+ return TRUE;
}
static void
-pine_create_structure (EvolutionIntelligentImporter *ii,
- void *closure)
+pine_create_structure (EvolutionIntelligentImporter *ii, void *closure)
{
PineImporter *importer = closure;
- char *maildir;
- GConfClient *gconf = gconf_client_get_default ();
-
- bonobo_object_ref (BONOBO_OBJECT (ii));
- pine_store_settings (importer);
- /* Create a dialog */
- if (importer->do_address == TRUE ||
- importer->do_mail == TRUE) {
+ if (importer->do_address || importer->do_mail) {
importer->dialog = create_importer_gui (importer);
gtk_widget_show_all (importer->dialog);
- while (gtk_events_pending ()) {
- gtk_main_iteration ();
- }
- }
+ importer->status_timeout_id = g_timeout_add(100, pine_status_timeout, importer);
+ importer->cancel = camel_operation_new(pine_status, importer);
- if (importer->do_address == TRUE) {
- gconf_client_set_bool(gconf, "/apps/evolution/importer/pine/address-imported", TRUE, NULL);
- import_addressbook (importer);
- }
+ mail_msg_wait(mail_importer_pine_import(importer));
- if (importer->do_mail == TRUE) {
- gconf_client_set_bool(gconf, "/apps/evolution/importer/pine/mail-imported", TRUE, NULL);
- maildir = g_build_filename(g_get_home_dir(), "mail", NULL);
- gtk_label_set_text (GTK_LABEL (importer->label),
- _("Scanning directory"));
- while (gtk_events_pending ()) {
- gtk_main_iteration ();
- }
-
- scan_dir (importer, maildir, "/");
- g_free (maildir);
+ camel_operation_unref(importer->cancel);
+ g_source_remove(importer->status_timeout_id);
+ importer->status_timeout_id = 0;
- /* Import them */
- import_next (importer);
+ if (importer->do_address)
+ importer->done_address = TRUE;
+ if (importer->do_mail)
+ importer->done_mail = TRUE;
}
- if (importer->do_mail == FALSE && importer->do_address == FALSE) {
- /* Destroy it here if we weren't importing mail
- otherwise the mail importer destroys itself
- once the mail is imported */
- bonobo_object_unref (BONOBO_OBJECT (ii));
- }
+ pine_store_settings (importer);
+
bonobo_object_unref (BONOBO_OBJECT (ii));
}
@@ -543,22 +428,21 @@ pine_destroy_cb (PineImporter *importer, GtkObject *object)
{
pine_store_settings (importer);
+ if (importer->status_timeout_id)
+ g_source_remove(importer->status_timeout_id);
+ g_mutex_free(importer->status_lock);
+
if (importer->dialog)
gtk_widget_destroy(importer->dialog);
-
- if (importer->importer != CORBA_OBJECT_NIL) {
- bonobo_object_release_unref (importer->importer, NULL);
- }
}
/* Fun inity stuff */
/* Fun control stuff */
static void
-checkbox_toggle_cb (GtkToggleButton *tb,
- gboolean *do_item)
+checkbox_toggle_cb(GtkToggleButton *tb, gboolean *do_item)
{
- *do_item = gtk_toggle_button_get_active (tb);
+ *do_item = gtk_toggle_button_get_active(tb);
}
static BonoboControl *
@@ -587,31 +471,20 @@ create_checkboxes_control (PineImporter *importer)
return control;
}
-static BonoboObject *
-factory_fn (BonoboGenericFactory *_factory,
- const char *iid,
- void *closure)
+BonoboObject *
+pine_intelligent_importer_new(void)
{
EvolutionIntelligentImporter *importer;
BonoboControl *control;
PineImporter *pine;
- CORBA_Environment ev;
char *message = N_("Evolution has found Pine mail files.\n"
"Would you like to import them into Evolution?");
pine = g_new0 (PineImporter, 1);
- CORBA_exception_init (&ev);
- pine_restore_settings (pine);
+ pine->status_lock = g_mutex_new();
- pine->importer = bonobo_activation_activate_from_id (MBOX_IMPORTER_IID, 0, NULL, &ev);
- if (ev._major != CORBA_NO_EXCEPTION) {
- g_warning ("Could not start MBox importer\n%s",
- CORBA_exception_id (&ev));
- CORBA_exception_free (&ev);
- return NULL;
- }
- CORBA_exception_free (&ev);
+ pine_restore_settings (pine);
importer = evolution_intelligent_importer_new (pine_can_import,
pine_create_structure,
@@ -625,19 +498,3 @@ factory_fn (BonoboGenericFactory *_factory,
BONOBO_OBJECT (control));
return BONOBO_OBJECT (importer);
}
-
-void
-mail_importer_module_init (void)
-{
- BonoboGenericFactory *factory;
- static int init = FALSE;
-
- if (init)
- return;
-
- factory = bonobo_generic_factory_new (PINE_INTELLIGENT_IMPORTER_IID,
- factory_fn, NULL);
- if (factory == NULL)
- g_warning ("Could not initialise Pine Intelligent Mail Importer.");
- init = TRUE;
-}