aboutsummaryrefslogtreecommitdiffstats
path: root/mail/importers/evolution-outlook-importer.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/importers/evolution-outlook-importer.c')
-rw-r--r--mail/importers/evolution-outlook-importer.c462
1 files changed, 0 insertions, 462 deletions
diff --git a/mail/importers/evolution-outlook-importer.c b/mail/importers/evolution-outlook-importer.c
deleted file mode 100644
index c6edd358e1..0000000000
--- a/mail/importers/evolution-outlook-importer.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* evolution-outlook-importer.c
- *
- * Authors: Iain Holmes <iain@ximian.com>
- *
- * Copyright (C) 2001 Ximian, 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
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <gtk/gtkhbox.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmessagedialog.h>
-#include <gtk/gtkprogressbar.h>
-
-#include <bonobo/bonobo-control.h>
-#include <glib/gi18n.h>
-
-#include <camel/camel-exception.h>
-#include <camel/camel-folder.h>
-#include <camel/camel-stream-mem.h>
-#include <camel/camel-store.h>
-#include <camel/camel-mime-message.h>
-
-#include <importer/evolution-importer.h>
-#include <importer/GNOME_Evolution_Importer.h>
-
-#include <e-util/e-util-private.h>
-
-#include "mail/em-folder-selection-button.h"
-
-#include "mail/mail-component.h"
-#include "mail/mail-mt.h"
-#include "mail/mail-tools.h"
-
-#include "mail-importer.h"
-
-static int mail_importer_import_outlook(const char *path, const char *folderuri, CamelOperation *cancel);
-
-typedef struct {
- EvolutionImporter *ii;
-
- GMutex *status_lock;
- char *status_what;
- int status_pc;
- int status_timeout_id;
- CamelOperation *cancel; /* cancel/status port */
-
- GtkWidget *selector;
- GtkWidget *label;
- GtkWidget *progressbar;
- GtkWidget *dialog;
-
- char *uri;
-} OutlookImporter;
-
-struct oe_msg_segmentheader {
- gint32 self;
- gint32 increase;
- gint32 include;
- gint32 next;
- gint32 usenet;
-};
-
-typedef struct oe_msg_segmentheader oe_msg_segmentheader;
-
-
-/* EvolutionImporter methods */
-
-/* Based on code from liboe 0.92 (STABLE)
- Copyright (C) 2000 Stephan B. Nedregård (stephan@micropop.com)
- Modified 2001 Iain Holmes <iain@ximian.com>
- Copyright (C) 2001 Ximian, Inc. */
-
-static void
-process_item_fn(EvolutionImporter *eimporter, CORBA_Object listener, void *data, CORBA_Environment *ev)
-{
- GNOME_Evolution_ImporterListener_ImporterResult result;
-#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));
-}
-
-
-/* EvolutionImporterFactory methods */
-
-static void
-folder_selected(EMFolderSelectionButton *button, OutlookImporter *importer)
-{
- g_free(importer->uri);
- importer->uri = g_strdup(em_folder_selection_button_get_selection(button));
-}
-
-static void
-create_control_fn(EvolutionImporter *importer, Bonobo_Control *control, void *data)
-{
- GtkWidget *hbox, *w;
-
- hbox = gtk_hbox_new(FALSE, 0);
-
- w = gtk_label_new(_("Destination folder:"));
- gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
-
- 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);
- gtk_box_pack_start((GtkBox *)hbox, w, FALSE, TRUE, 6);
-
- gtk_widget_show_all(hbox);
-
- /* Another weird-arsed shell api */
- *control = BONOBO_OBJREF(bonobo_control_new(hbox));
-}
-
-static gboolean
-support_format_fn(EvolutionImporter *importer, const char *filename, void *data)
-{
- FILE *handle;
- guint32 signature[4];
- int ok;
-
- /* Outlook Express sniffer.
- Taken from liboe 0.92 (STABLE)
- Copyright (C) 2000 Stephan B. Nedregård (stephan@micropop.com) */
-
- handle = g_fopen (filename, "rb");
- if (handle == NULL)
- return FALSE; /* Can't open file: Can't support it :) */
-
- /* SIGNATURE */
- fread (&signature, 16, 1, handle);
- /* This needs testing */
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- signature[0] = GUINT32_TO_BE(signature[0]);
- signature[1] = GUINT32_TO_BE(signature[1]);
- signature[2] = GUINT32_TO_BE(signature[2]);
- signature[3] = GUINT32_TO_BE(signature[3]);
-#endif
- ok = ((signature[0]!=0xFE12ADCF /* OE 5 & OE 5 BETA SIGNATURE */
- || signature[1]!=0x6F74FDC5
- || signature[2]!=0x11D1E366
- || signature[3]!=0xC0004E9A)
- && (signature[0]==0x36464D4A /* OE4 SIGNATURE */
- && signature[1]==0x00010003));
-
- fclose (handle);
- return ok; /* Can't handle OE 5 yet */
-}
-
-/* Note the similarity of most of this code to evolution-mbox-importer.
- Yes it should be subclassed, or something ... */
-static void
-importer_destroy_cb(void *data, GObject *object)
-{
- OutlookImporter *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
-outlook_status(CamelOperation *op, const char *what, int pc, void *data)
-{
- OutlookImporter *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);
-}
-
-static gboolean
-outlook_status_timeout(void *data)
-{
- OutlookImporter *importer = data;
- int pc;
- char *what;
-
- if (!importer->status_what)
- return TRUE;
-
- 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
-outlook_importer_response(GtkWidget *w, guint button, void *data)
-{
- OutlookImporter *importer = data;
-
- if (button == GTK_RESPONSE_CANCEL
- && importer->cancel)
- camel_operation_cancel(importer->cancel);
-}
-
-static gboolean
-load_file_fn(EvolutionImporter *eimporter, const char *filename, void *data)
-{
- OutlookImporter *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(outlook_importer_response), importer);
- gtk_widget_show_all(importer->dialog);
-
- importer->status_timeout_id = g_timeout_add(100, outlook_status_timeout, importer);
- importer->cancel = camel_operation_new(outlook_status, importer);
-
- mail_msg_wait(mail_importer_import_outlook(filename, importer->uri, importer->cancel));
-
- camel_operation_unref(importer->cancel);
- g_source_remove(importer->status_timeout_id);
- importer->status_timeout_id = 0;
-
- return TRUE;
-}
-
-BonoboObject *
-outlook_importer_new(void)
-{
- EvolutionImporter *importer;
- OutlookImporter *oli;
-
- oli = g_new0 (OutlookImporter, 1);
- oli->status_lock = g_mutex_new();
- importer = evolution_importer_new (create_control_fn, support_format_fn, load_file_fn, process_item_fn, NULL, oli);
- g_object_weak_ref((GObject *)importer, importer_destroy_cb, oli);
-
- return BONOBO_OBJECT (importer);
-}
-
-struct _import_outlook_msg {
- struct _mail_msg msg;
-
- char *path;
- char *uri;
- CamelOperation *cancel;
-};
-
-static char *
-import_outlook_describe(struct _mail_msg *mm, int complete)
-{
- return g_strdup (_("Importing mailbox"));
-}
-
-static void
-import_outlook_import(struct _mail_msg *mm)
-{
- struct _import_outlook_msg *m = (struct _import_outlook_msg *) mm;
- struct stat st;
- CamelFolder *folder;
- int fd = -1;
-
- if (stat(m->path, &st) == -1) {
- g_warning("cannot find source file to import '%s': %s", m->path, g_strerror(errno));
- return;
- }
-
- if (m->uri == NULL || m->uri[0] == 0)
- folder = mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_INBOX);
- else
- folder = mail_tool_uri_to_folder(m->uri, CAMEL_STORE_FOLDER_CREATE, &mm->ex);
-
- if (folder == NULL)
- return;
-
- if (S_ISREG(st.st_mode)) {
- CamelOperation *oldcancel = NULL;
- CamelMessageInfo *info;
- GByteArray *buffer;
- off_t pos;
-
- fd = g_open(m->path, O_RDONLY|O_BINARY, 0);
- if (fd == -1) {
- g_warning("cannot find source file to import '%s': %s", m->path, g_strerror(errno));
- goto fail;
- }
-
- if (lseek(fd, 0x54, SEEK_SET) == -1)
- goto fail;
-
- if (m->cancel)
- oldcancel = camel_operation_register(m->cancel);
-
- camel_folder_freeze(folder);
-
- buffer = g_byte_array_new();
- pos = 0x54;
- do {
- oe_msg_segmentheader header;
- int pc;
- size_t len;
- CamelStream *mem;
- CamelMimeMessage *msg;
-
- if (st.st_size > 0)
- pc = (int)(100.0 * ((double)pos / (double)st.st_size));
- camel_operation_progress(NULL, pc);
-
- if (read(fd, &header, sizeof(header)) != sizeof(header))
- goto fail2;
-
- pos += sizeof(header);
-
-#if G_BYTE_ORDER == G_BIG_ENDIAN
- header.include = GUINT32_TO_BE(header.include);
-#endif
- /* the -4 is some magical value */
- len = header.include - sizeof(header) - 4;
- /* sanity check */
- if (len > (pos + st.st_size))
- goto fail2;
- g_byte_array_set_size(buffer, len);
- if (read(fd, buffer->data, len) != len)
- goto fail2;
-
- pos += len;
-
- mem = camel_stream_mem_new();
- camel_stream_mem_set_byte_array((CamelStreamMem *)mem, buffer);
-
- msg = camel_mime_message_new();
- if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)msg, mem) == -1) {
- camel_object_unref(msg);
- camel_object_unref(mem);
- goto fail2;
- }
-
- info = camel_message_info_new(NULL);
- /* any headers to read? */
-
- camel_folder_append_message(folder, msg, info, NULL, &mm->ex);
-
- camel_message_info_free(info);
- camel_object_unref(msg);
- camel_object_unref(mem);
- } while (!camel_exception_is_set(&mm->ex) && pos < st.st_size);
-
- camel_folder_sync(folder, FALSE, NULL);
- camel_folder_thaw(folder);
- camel_operation_end(NULL);
- fail2:
- /* TODO: these api's are a bit weird, registering the old is the same as deregistering */
- if (m->cancel)
- camel_operation_register(oldcancel);
- g_byte_array_free(buffer, TRUE);
- }
-fail:
- if (fd != -1)
- close(fd);
- camel_object_unref(folder);
-}
-
-static void
-import_outlook_done(struct _mail_msg *mm)
-{
-}
-
-static void
-import_outlook_free (struct _mail_msg *mm)
-{
- struct _import_outlook_msg *m = (struct _import_outlook_msg *)mm;
-
- if (m->cancel)
- camel_operation_unref(m->cancel);
- g_free(m->uri);
- g_free(m->path);
-}
-
-static struct _mail_msg_op import_outlook_op = {
- import_outlook_describe,
- import_outlook_import,
- import_outlook_done,
- import_outlook_free,
-};
-
-static int
-mail_importer_import_outlook(const char *path, const char *folderuri, CamelOperation *cancel)
-{
- struct _import_outlook_msg *m;
- int id;
-
- m = mail_msg_new(&import_outlook_op, NULL, sizeof (*m));
- m->path = g_strdup(path);
- m->uri = g_strdup(folderuri);
- if (cancel) {
- m->cancel = cancel;
- camel_operation_ref(cancel);
- }
-
- id = m->msg.seq;
- e_thread_put(mail_thread_queued, (EMsg *)m);
-
- return id;
-}