diff options
author | Michael Zucci <zucchi@src.gnome.org> | 2005-07-12 12:04:14 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2005-07-12 12:04:14 +0800 |
commit | 9f12922bd88bd7a83247cc7e0646c72773e2a013 (patch) | |
tree | da9a3d002dfa58ff262ef25ca3effe426fbfcc3a /mail/importers/evolution-mbox-importer.c | |
parent | cf563ecd524fd20fb3cc8ebade877ad442d85c43 (diff) | |
download | gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar.gz gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar.bz2 gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar.lz gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar.xz gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.tar.zst gsoc2013-evolution-9f12922bd88bd7a83247cc7e0646c72773e2a013.zip |
Merge back eplugin-import-branch.
svn path=/trunk/; revision=29725
Diffstat (limited to 'mail/importers/evolution-mbox-importer.c')
-rw-r--r-- | mail/importers/evolution-mbox-importer.c | 191 |
1 files changed, 77 insertions, 114 deletions
diff --git a/mail/importers/evolution-mbox-importer.c b/mail/importers/evolution-mbox-importer.c index 3630277cdd..804a137543 100644 --- a/mail/importers/evolution-mbox-importer.c +++ b/mail/importers/evolution-mbox-importer.c @@ -36,18 +36,13 @@ #include <string.h> #include <gtk/gtkhbox.h> +#include <gtk/gtkvbox.h> #include <gtk/gtklabel.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkprogressbar.h> -#include <bonobo/bonobo-control.h> -#include <libgnome/gnome-i18n.h> +#include <glib/gi18n.h> #include <camel/camel-exception.h> -#include <importer/evolution-importer.h> -#include <importer/GNOME_Evolution_Importer.h> - #include "mail/em-folder-selection-button.h" #include "mail/mail-component.h" @@ -55,17 +50,11 @@ #include "mail-importer.h" -/* #define IMPORTER_DEBUG */ -#ifdef IMPORTER_DEBUG -#define IN g_print ("=====> %s (%d)\n", G_GNUC_FUNCTION, __LINE__) -#define OUT g_print ("<==== %s (%d)\n", G_GNUC_FUNCTION, __LINE__) -#else -#define IN -#define OUT -#endif +#include "e-util/e-import.h" typedef struct { - EvolutionImporter *ii; + EImport *import; + EImportTarget *target; GMutex *status_lock; char *status_what; @@ -73,42 +62,18 @@ typedef struct { int status_timeout_id; CamelOperation *cancel; /* cancel/status port */ - GtkWidget *selector; - GtkWidget *label; - GtkWidget *progressbar; - GtkWidget *dialog; - char *uri; } MboxImporter; static void -process_item_fn(EvolutionImporter *eimporter, CORBA_Object listener, void *data, CORBA_Environment *ev) -{ - /*MboxImporter *importer = data;*/ - GNOME_Evolution_ImporterListener_ImporterResult result; - - /* This is essentially a NOOP, it merely returns ok/fail and is only called once */ - -#if 0 - if (camel_exception_is_set(importer->ex)) - result = GNOME_Evolution_ImporterListener_BAD_FILE; - else -#endif - result = GNOME_Evolution_ImporterListener_OK; - - GNOME_Evolution_ImporterListener_notifyResult(listener, result, FALSE, ev); - bonobo_object_unref(BONOBO_OBJECT(eimporter)); -} - -static void -folder_selected(EMFolderSelectionButton *button, MboxImporter *importer) +folder_selected(EMFolderSelectionButton *button, EImportTargetURI *target) { - g_free(importer->uri); - importer->uri = g_strdup(em_folder_selection_button_get_selection(button)); + g_free(target->uri_dest); + target->uri_dest = g_strdup(em_folder_selection_button_get_selection(button)); } -static void -create_control_fn(EvolutionImporter *importer, Bonobo_Control *control, void *data) +static GtkWidget * +mbox_getwidget(EImport *ei, EImportTarget *target, EImportImporter *im) { GtkWidget *hbox, *w; @@ -120,23 +85,35 @@ create_control_fn(EvolutionImporter *importer, Bonobo_Control *control, void *da w = em_folder_selection_button_new(_("Select folder"), _("Select folder to import into")); em_folder_selection_button_set_selection((EMFolderSelectionButton *)w, mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_INBOX)); - g_signal_connect(w, "selected", G_CALLBACK(folder_selected), data); + g_signal_connect(w, "selected", G_CALLBACK(folder_selected), target); gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6); - gtk_widget_show_all(hbox); + w = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start((GtkBox *)w, hbox, FALSE, FALSE, 0); + gtk_widget_show_all(w); - /* Another weird-arsed shell api */ - *control = BONOBO_OBJREF(bonobo_control_new(hbox)); + return w; } static gboolean -support_format_fn(EvolutionImporter *importer, const char *filename, void *closure) +mbox_supported(EImport *ei, EImportTarget *target, EImportImporter *im) { char signature[6]; gboolean ret = FALSE; int fd, n; + EImportTargetURI *s; + + if (target->type != E_IMPORT_TARGET_URI) + return FALSE; - fd = open(filename, O_RDONLY); + s = (EImportTargetURI *)target; + if (s->uri_src == NULL) + return TRUE; + + if (strncmp(s->uri_src, "file:///", strlen("file:///")) != 0) + return FALSE; + + fd = open(s->uri_src + strlen("file://"), O_RDONLY); if (fd != -1) { n = read(fd, signature, 5); ret = n == 5 && memcmp(signature, "From ", 5) == 0; @@ -147,22 +124,6 @@ support_format_fn(EvolutionImporter *importer, const char *filename, void *closu } static void -importer_destroy_cb(void *data, GObject *object) -{ - MboxImporter *importer = data; - - if (importer->status_timeout_id) - g_source_remove(importer->status_timeout_id); - g_free(importer->status_what); - g_mutex_free(importer->status_lock); - - if (importer->dialog) - gtk_widget_destroy(importer->dialog); - - g_free(importer); -} - -static void mbox_status(CamelOperation *op, const char *what, int pc, void *data) { MboxImporter *importer = data; @@ -186,72 +147,74 @@ mbox_status_timeout(void *data) int pc; char *what; - if (!importer->status_what) - return TRUE; + if (importer->status_what) { + g_mutex_lock(importer->status_lock); + what = importer->status_what; + importer->status_what = NULL; + pc = importer->status_pc; + g_mutex_unlock(importer->status_lock); - g_mutex_lock(importer->status_lock); - what = importer->status_what; - importer->status_what = NULL; - pc = importer->status_pc; - g_mutex_unlock(importer->status_lock); + e_import_status(importer->import, (EImportTarget *)importer->target, what, pc); + } - 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 -mbox_importer_response(GtkWidget *w, guint button, void *data) +mbox_import_done(void *data, CamelException *ex) { MboxImporter *importer = data; - if (button == GTK_RESPONSE_CANCEL - && importer->cancel) - camel_operation_cancel(importer->cancel); + g_source_remove(importer->status_timeout_id); + g_free(importer->status_what); + g_mutex_free(importer->status_lock); + camel_operation_unref(importer->cancel); + + e_import_complete(importer->import, importer->target); + g_free(importer); } -static gboolean -load_file_fn(EvolutionImporter *eimporter, const char *filename, void *data) +static void +mbox_import(EImport *ei, EImportTarget *target, EImportImporter *im) { - MboxImporter *importer = data; - char *utf8_filename; - - utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - importer->dialog = gtk_message_dialog_new(NULL, 0/*GTK_DIALOG_NO_SEPARATOR*/, - GTK_MESSAGE_INFO, GTK_BUTTONS_CANCEL, - _("Importing `%s'"), utf8_filename); - g_free (utf8_filename); - gtk_window_set_title (GTK_WINDOW (importer->dialog), _("Importing...")); - - importer->label = gtk_label_new (_("Please wait")); - importer->progressbar = gtk_progress_bar_new (); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (importer->dialog)->vbox), importer->label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (importer->dialog)->vbox), importer->progressbar, FALSE, FALSE, 0); - g_signal_connect(importer->dialog, "response", G_CALLBACK(mbox_importer_response), importer); - gtk_widget_show_all(importer->dialog); + MboxImporter *importer; + /* TODO: do we validate target? */ + + importer = g_malloc0(sizeof(*importer)); + g_datalist_set_data(&target->data, "mbox-data", importer); + importer->import = ei; + importer->target = target; + importer->status_lock = g_mutex_new(); importer->status_timeout_id = g_timeout_add(100, mbox_status_timeout, importer); importer->cancel = camel_operation_new(mbox_status, importer); - mail_msg_wait(mail_importer_import_mbox(filename, importer->uri, importer->cancel)); + mail_importer_import_mbox(((EImportTargetURI *)target)->uri_src+strlen("file://"), ((EImportTargetURI *)target)->uri_dest, importer->cancel, mbox_import_done, importer); +} - camel_operation_unref(importer->cancel); - g_source_remove(importer->status_timeout_id); - importer->status_timeout_id = 0; +static void +mbox_cancel(EImport *ei, EImportTarget *target, EImportImporter *im) +{ + MboxImporter *importer = g_datalist_get_data(&target->data, "mbox-data"); - return TRUE; + if (importer) + camel_operation_cancel(importer->cancel); } -BonoboObject * -mbox_importer_new(void) +static EImportImporter mbox_importer = { + E_IMPORT_TARGET_URI, + 0, + mbox_supported, + mbox_getwidget, + mbox_import, + mbox_cancel, +}; + +EImportImporter * +mbox_importer_peek(void) { - MboxImporter *mbox; - - mbox = g_new0 (MboxImporter, 1); - mbox->status_lock = g_mutex_new(); - mbox->ii = evolution_importer_new(create_control_fn, support_format_fn, load_file_fn, process_item_fn, NULL, mbox); - g_object_weak_ref(G_OBJECT(mbox->ii), importer_destroy_cb, mbox); - - return BONOBO_OBJECT (mbox->ii); + mbox_importer.name = _("Berkeley Mailbox (mbox)"); + mbox_importer.description = _("Importer Berkeley Mailbox format folders"); + + return &mbox_importer; } |