278 lines
6.0 KiB
C
278 lines
6.0 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
/* netscape-importer.c
|
|
*
|
|
*
|
|
* Authors:
|
|
* Iain Holmes <iain@ximian.com>
|
|
*
|
|
* Copyright 2001 Ximian, Inc. (http://www.ximian.com)
|
|
*
|
|
* 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 <stdio.h>
|
|
#include <errno.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <dirent.h>
|
|
|
|
#include <glib.h>
|
|
#include <gnome.h>
|
|
|
|
#include "mail-importer.h"
|
|
static char *nsmail_dir = NULL;
|
|
|
|
/*#define SUPER_IMPORTER_DEBUG*/
|
|
#ifdef SUPER_IMPORTER_DEBUG
|
|
#define d(x) x
|
|
#else
|
|
#define d(x)
|
|
#endif
|
|
|
|
#if 0
|
|
typedef struct {
|
|
MailImporter importer;
|
|
|
|
int num;
|
|
CamelMimeParser *mp;
|
|
} NetscapeImporter;
|
|
|
|
static void
|
|
netscape_clean_up (void)
|
|
{
|
|
g_free (nsmail_dir);
|
|
nsmail_dir = NULL;
|
|
}
|
|
|
|
static gboolean
|
|
netscape_can_import (void)
|
|
{
|
|
char *nsprefs;
|
|
FILE *prefs_handle;
|
|
|
|
nsprefs = gnome_util_prepend_user_home (".netscape/preferences.js");
|
|
prefs_handle = fopen (nsprefs, "r");
|
|
g_free (nsprefs);
|
|
|
|
if (prefs_handle == NULL) {
|
|
d(g_warning ("No .netscape/preferences.js"));
|
|
return FALSE;
|
|
}
|
|
|
|
/* Find the user mail dir */
|
|
while (1) {
|
|
char line[4096];
|
|
|
|
fgets (line, 4096, prefs_handle);
|
|
if (line == NULL) {
|
|
d(g_warning ("No mail.directory entry"));
|
|
fclose (prefs_handle);
|
|
return FALSE;
|
|
}
|
|
|
|
if (strstr (line, "mail.directory") != NULL) {
|
|
char *sep, *start, *end;
|
|
/* Found the line */
|
|
|
|
sep = strchr (line, ',');
|
|
if (sep == NULL) {
|
|
d(g_warning ("Bad line %s", line));
|
|
fclose (prefs_handle);
|
|
return FALSE;
|
|
}
|
|
|
|
start = strchr (sep, '\"') + 1;
|
|
if (start == NULL) {
|
|
d(g_warning ("Bad line %s", line));
|
|
fclose (prefs_handle);
|
|
return FALSE;
|
|
}
|
|
|
|
end = strrchr (sep, '\"');
|
|
if (end == NULL) {
|
|
d(g_warning ("Bad line %s", line));
|
|
fclose (prefs_handle);
|
|
return FALSE;
|
|
}
|
|
|
|
nsmail_dir = g_strndup (start, end - start);
|
|
d(g_warning ("Got nsmail_dir: %s", nsmail_dir));
|
|
fclose (prefs_handle);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
netscape_import_file (const char *parent,
|
|
const char *dirname,
|
|
const char *filename)
|
|
{
|
|
char *summary, *summarypath;
|
|
|
|
/* Check that the file is a netscape mbox.
|
|
It should have an associated .summary file */
|
|
summary = g_strdup_printf (".%s.summary", filename);
|
|
summarypath = g_concat_dir_and_file (dirname, summary);
|
|
if (!g_file_exists (summarypath)) {
|
|
d(g_warning ("%s does not exist.\nIgnoring %s", summary,
|
|
filename));
|
|
g_free (summary);
|
|
g_free (summarypath);
|
|
return;
|
|
}
|
|
|
|
g_free (summary);
|
|
g_free (summarypath);
|
|
|
|
/* Do import */
|
|
mail_importer_create_folder (parent, filename, "mail", NULL);
|
|
g_print ("Importing %s as %s\n", parent, filename);
|
|
}
|
|
|
|
static void
|
|
scan_dir (NetscapeImporter *importer,
|
|
char *parent,
|
|
const char *dirname)
|
|
{
|
|
DIR *nsmail;
|
|
struct stat buf;
|
|
struct dirent *current;
|
|
|
|
nsmail = opendir (dirname);
|
|
if (nsmail == NULL) {
|
|
d(g_warning ("Could not open %s\nopendir returned: %s",
|
|
dirname, g_strerror (errno)));
|
|
return;
|
|
}
|
|
|
|
current = readdir (nsmail);
|
|
while (current) {
|
|
char *fullname;
|
|
|
|
/* Ignore things which start with .
|
|
which should be ., .., and the summaries. */
|
|
if (current->d_name[0] =='.') {
|
|
current = readdir (nsmail);
|
|
continue;
|
|
}
|
|
|
|
fullname = g_concat_dir_and_file (dirname, current->d_name);
|
|
if (stat (fullname, &buf) == -1) {
|
|
d(g_warning ("Could not stat %s\nstat returned:%s",
|
|
fullname, g_strerror (errno)));
|
|
current = readdir (nsmail);
|
|
g_free (fullname);
|
|
continue;
|
|
}
|
|
|
|
if (S_ISREG (buf.st_mode)) {
|
|
d(g_print ("File: %s\n", fullname));
|
|
netscape_import_file (importer, parent, dirname,
|
|
current->d_name);
|
|
} else if (S_ISDIR (buf.st_mode)) {
|
|
char *ext;
|
|
d(g_print ("Directory: %s\n", fullname));
|
|
|
|
ext = strrchr (current->d_name, '.');
|
|
if (ext && strcmp (ext + 1, "sbd") == 0) {
|
|
/* Strip the .sbd */
|
|
if (parent == NULL) {
|
|
parent = g_strndup (current->d_name,
|
|
ext - current->d_name);
|
|
} else {
|
|
char *part;
|
|
char *tmp;
|
|
|
|
part = g_strndup (current->d_name,
|
|
ext - current->d_name);
|
|
tmp = parent;
|
|
parent = g_concat_dir_and_file (parent,
|
|
part);
|
|
g_free (tmp);
|
|
g_free (part);
|
|
}
|
|
|
|
scan_dir (importer, parent, fullname);
|
|
}
|
|
}
|
|
|
|
g_free (fullname);
|
|
current = readdir (nsmail);
|
|
}
|
|
}
|
|
|
|
static void
|
|
netscape_create_structure (void)
|
|
{
|
|
DIR *nsmail;
|
|
struct dirent *current;
|
|
NetscapeImporter *importer;
|
|
|
|
g_return_if_fail (nsmail_dir != NULL);
|
|
|
|
importer = g_new0 (NetscapeImporter, 1);
|
|
|
|
g_print ("Creating structure\n"
|
|
"------------------\n");
|
|
scan_dir (importer, g_strdup ("/"), nsmail_dir);
|
|
g_print ("------------------\n");
|
|
}
|
|
|
|
|
|
#ifdef STANDALONE
|
|
int
|
|
main (int argc,
|
|
char **argv)
|
|
#else
|
|
int
|
|
netscape_importer(void)
|
|
#endif
|
|
{
|
|
gboolean found;
|
|
|
|
g_print ("ISI - Iain's Super Importer\n");
|
|
g_print ("Checking for Netscape mail:\t");
|
|
found = netscape_can_import ();
|
|
g_print ("%s", found ? "Found" : "Not found");
|
|
|
|
if (found)
|
|
g_print (" (%s)\n", nsmail_dir);
|
|
else
|
|
g_print ("\n");
|
|
|
|
netscape_create_structure ();
|
|
}
|
|
|
|
BonoboObject *
|
|
mbox_factory_fn (BonoboGenericFactory *_factory,
|
|
void *closure)
|
|
{
|
|
EvolutionImporter *importer;
|
|
NetscapeImporter *netscape;
|
|
|
|
netscape = g_new0 (NetscapeImporter, 1);
|
|
importer = evolution_importer_new (support_format_fn,
|
|
load_file_fn,
|
|
process_item_fn, NULL, netscape);
|
|
}
|
|
#endif
|