* mail-local.c: Updates for CamelStore changes, small memory leak fixes. (lookup_folder): Removed (and moved into the reconfigure code) since this method no longer exists in CamelStore. (do_reconfigure_folder, etc): Update the info in the MailLocalStore after reconfiguring. (mail_local_lookup_folder): Removed * local-config.glade: fix padding of the label_format * message-list.c (ml_tree_value_at): Don't keep message infos reffed across calls, since this can cause badness after a reconfigure. Instead, just strdup the needed values and free those on the next call. * mail-tools.c (mail_tool_get_root_of_store): Unused, remove. (mail_tool_get_inbox): use camel_store_get_inbox. * evolution-outlook-importer.c (load_file_fn): * evolution-mbox-importer.c (load_file_fn): Use mail_tool_get_local_inbox() instead of mail_importer_get_folder() * mail-importer.c (mail_importer_get_folder): Removed svn path=/trunk/; revision=8147
223 lines
5.1 KiB
C
223 lines
5.1 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||
/* evolution-mbox-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 the GNU General Public License as
|
||
* published by the Free Software Foundation; either version 2 of the
|
||
* License, or (at your option) any later version.
|
||
*
|
||
* 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., 59 Temple Place - Suite 330,
|
||
* Boston, MA 02111-1307, USA.
|
||
*/
|
||
|
||
#ifdef HAVE_CONFIG_H
|
||
#include <config.h>
|
||
#endif
|
||
|
||
#include "evolution-mbox-importer.h"
|
||
|
||
#include <stdio.h>
|
||
|
||
#include <importer/evolution-importer.h>
|
||
#include <importer/GNOME_Evolution_Importer.h>
|
||
|
||
#include "mail-importer.h"
|
||
#include "mail-tools.h"
|
||
|
||
#include <camel/camel.h>
|
||
|
||
typedef struct {
|
||
MailImporter importer; /* Parent */
|
||
|
||
char *filename;
|
||
int num;
|
||
CamelMimeParser *mp;
|
||
} MboxImporter;
|
||
|
||
|
||
/* EvolutionImporter methods */
|
||
|
||
static void
|
||
process_item_fn (EvolutionImporter *eimporter,
|
||
CORBA_Object listener,
|
||
void *closure,
|
||
CORBA_Environment *ev)
|
||
{
|
||
MboxImporter *mbi = (MboxImporter *) closure;
|
||
MailImporter *importer = (MailImporter *) mbi;
|
||
gboolean done = FALSE;
|
||
CamelException *ex;
|
||
|
||
ex = camel_exception_new ();
|
||
|
||
if (camel_mime_parser_step (mbi->mp, 0, 0) == HSCAN_FROM) {
|
||
/* Import the next message */
|
||
CamelMimeMessage *msg;
|
||
CamelMessageInfo *info;
|
||
|
||
msg = camel_mime_message_new ();
|
||
if (camel_mime_part_construct_from_parser (CAMEL_MIME_PART (msg), mbi->mp) == -1) {
|
||
g_warning ("Failed message %d", mbi->num);
|
||
camel_object_unref (CAMEL_OBJECT (msg));
|
||
done = TRUE;
|
||
}
|
||
|
||
/* write the mesg */
|
||
info = g_new0 (CamelMessageInfo, 1);
|
||
camel_folder_append_message (importer->folder, msg, info, ex);
|
||
g_free (info);
|
||
camel_object_unref (CAMEL_OBJECT (msg));
|
||
if (camel_exception_is_set (ex)) {
|
||
g_warning ("Failed message %d", mbi->num);
|
||
done = TRUE;
|
||
}
|
||
|
||
if (!done) {
|
||
mbi->num++;
|
||
|
||
/* skip over the FROM_END state */
|
||
camel_mime_parser_step (mbi->mp, 0, 0);
|
||
}
|
||
} else {
|
||
/* all messages have now been imported */
|
||
camel_folder_sync (importer->folder, FALSE, ex);
|
||
camel_folder_thaw (importer->folder);
|
||
importer->frozen = FALSE;
|
||
done = TRUE;
|
||
}
|
||
|
||
camel_exception_free (ex);
|
||
GNOME_Evolution_ImporterListener_notifyResult (listener,
|
||
GNOME_Evolution_ImporterListener_OK,
|
||
!done, ev);
|
||
return;
|
||
}
|
||
|
||
static gboolean
|
||
support_format_fn (EvolutionImporter *importer,
|
||
const char *filename,
|
||
void *closure)
|
||
{
|
||
char signature[6];
|
||
gboolean ret = FALSE;
|
||
int fd, n;
|
||
|
||
fd = open (filename, O_RDONLY);
|
||
if (fd == -1)
|
||
return FALSE;
|
||
|
||
n = read (fd, signature, 5);
|
||
if (n > 0) {
|
||
signature[n] = '\0';
|
||
if (!g_strncasecmp (signature, "From ", 5))
|
||
ret = TRUE;
|
||
}
|
||
|
||
close (fd);
|
||
|
||
return ret;
|
||
}
|
||
|
||
static void
|
||
importer_destroy_cb (GtkObject *object,
|
||
MboxImporter *mbi)
|
||
{
|
||
MailImporter *importer;
|
||
|
||
importer = (MailImporter *) mbi;
|
||
if (importer->frozen) {
|
||
CamelException *ex;
|
||
|
||
ex = camel_exception_new ();
|
||
camel_folder_sync (importer->folder, FALSE, ex);
|
||
camel_exception_free (ex);
|
||
|
||
camel_folder_thaw (importer->folder);
|
||
}
|
||
|
||
if (importer->folder)
|
||
camel_object_unref (CAMEL_OBJECT (importer->folder));
|
||
|
||
g_free (mbi->filename);
|
||
if (mbi->mp)
|
||
camel_object_unref (CAMEL_OBJECT (mbi->mp));
|
||
|
||
g_free (mbi);
|
||
}
|
||
|
||
static gboolean
|
||
load_file_fn (EvolutionImporter *eimporter,
|
||
const char *filename,
|
||
void *closure)
|
||
{
|
||
MboxImporter *mbi;
|
||
MailImporter *importer;
|
||
int fd;
|
||
|
||
mbi = (MboxImporter *) closure;
|
||
importer = (MailImporter *) mbi;
|
||
|
||
mbi->filename = g_strdup (filename);
|
||
|
||
fd = open (filename, O_RDONLY);
|
||
if (fd == -1) {
|
||
g_warning ("Cannot open file");
|
||
return FALSE;
|
||
}
|
||
|
||
mbi->mp = camel_mime_parser_new ();
|
||
camel_mime_parser_scan_from (mbi->mp, TRUE);
|
||
if (camel_mime_parser_init_with_fd (mbi->mp, fd) == -1) {
|
||
g_warning ("Unable to process spool folder");
|
||
goto fail;
|
||
}
|
||
|
||
importer->mstream = NULL;
|
||
importer->folder = mail_tool_get_local_inbox (NULL);
|
||
|
||
if (importer->folder == NULL) {
|
||
g_print ("Bad folder\n");
|
||
goto fail;
|
||
}
|
||
|
||
camel_folder_freeze (importer->folder);
|
||
importer->frozen = TRUE;
|
||
|
||
g_warning ("Okay, so everything is now ready to import that mbox file!");
|
||
|
||
return TRUE;
|
||
|
||
fail:
|
||
camel_object_unref (CAMEL_OBJECT (mbi->mp));
|
||
mbi->mp = NULL;
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BonoboObject *
|
||
mbox_factory_fn (BonoboGenericFactory *_factory,
|
||
void *closure)
|
||
{
|
||
EvolutionImporter *importer;
|
||
MboxImporter *mbox;
|
||
|
||
mbox = g_new0 (MboxImporter, 1);
|
||
importer = evolution_importer_new (support_format_fn, load_file_fn,
|
||
process_item_fn, NULL, mbox);
|
||
gtk_signal_connect (GTK_OBJECT (importer), "destroy",
|
||
GTK_SIGNAL_FUNC (importer_destroy_cb), mbox);
|
||
|
||
return BONOBO_OBJECT (importer);
|
||
}
|