/* -*- 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 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-outlook-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-exception.h> extern char *evolution_dir; typedef struct { MailImporter importer; char *filename; gboolean oe4; /* Is file OE4 or not? */ FILE *handle; long pos; off_t size; gboolean busy; } OutlookImporter; struct oe_msg_segmentheader { int self; int increase; int include; int next; int 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 *closure, CORBA_Environment *ev) { OutlookImporter *oli = (OutlookImporter *) closure; MailImporter *importer = (MailImporter *) oli; oe_msg_segmentheader *header; gboolean more = TRUE; char *cb, *sfull, *s; long end_pos = 0; int i; if (oli->busy == TRUE) { GNOME_Evolution_ImporterListener_notifyResult (listener, GNOME_Evolution_ImporterListener_BUSY, more, ev); return; } oli->busy = TRUE; header = g_new (oe_msg_segmentheader, 1); fread (header, 16, 1, oli->handle); /* Write a From line */ mail_importer_add_line (importer, "From evolution-outlook-importer", FALSE); end_pos = oli->pos + header->include; if (end_pos >= oli->size) { end_pos = oli->size; more = FALSE; } oli->pos += 4; cb = g_new (char, 4); sfull = g_new (char, 65536); s = sfull; while (oli->pos < end_pos) { fread (cb, 1, 4, oli->handle); for (i = 0; i < 4; i++, oli->pos++) { if (*(cb + i ) != 0x0d) { *s++ = *(cb + i); if (*(cb + i) == 0x0a) { *s = '\0'; mail_importer_add_line (importer, sfull, FALSE); s = sfull; } } } } if (s != sfull) { *s = '\0'; mail_importer_add_line (importer, sfull, FALSE); s = sfull; } mail_importer_add_line (importer, "\n", TRUE); oli->pos = end_pos; fseek (oli->handle, oli->pos, SEEK_SET); g_free (header); g_free (sfull); g_free (cb); GNOME_Evolution_ImporterListener_notifyResult (listener, GNOME_Evolution_ImporterListener_OK, more, ev); if (more == FALSE) { CamelException *ex; ex = camel_exception_new (); camel_folder_thaw (importer->folder); camel_folder_sync (importer->folder, FALSE, ex); camel_exception_free (ex); fclose (oli->handle); oli->handle = NULL; } oli->busy = FALSE; return; } /* EvolutionImporterFactory methods */ static gboolean support_format_fn (EvolutionImporter *importer, const char *filename, void *closure) { FILE *handle; int signature[4]; /* Outlook Express sniffer. Taken from liboe 0.92 (STABLE) Copyright (C) 2000 Stephan B. Nedreg�rd (stephan@micropop.com) */ handle = fopen (filename, "rb"); if (handle == NULL) return FALSE; /* Can't open file: Can't support it :) */ /* SIGNATURE */ fread (&signature, 16, 1, handle); if ((signature[0]!=0xFE12ADCF) || /* OE 5 & OE 5 BETA SIGNATURE */ (signature[1]!=0x6F74FDC5) || (signature[2]!=0x11D1E366) || (signature[3]!=0xC0004E9A)) { if ((signature[0]==0x36464D4A) && (signature[1]==0x00010003)) /* OE4 SIGNATURE */ { fclose (handle); return TRUE; /* OE 4 */ } fclose (handle); return FALSE; /* Not Outlook 4 or 5 */ } fclose (handle); return FALSE; /* Can't handle OE 5 yet */ } static void importer_destroy_cb (GtkObject *object, OutlookImporter *oli) { MailImporter *importer; importer = (MailImporter *) oli; if (importer->folder) camel_object_unref (CAMEL_OBJECT (importer->folder)); g_free (oli->filename); if (oli->handle) fclose (oli->handle); g_free (oli); } static gboolean load_file_fn (EvolutionImporter *eimporter, const char *filename, void *closure) { OutlookImporter *oli; MailImporter *importer; struct stat buf; long pos = 0x54; oli = (OutlookImporter *) closure; importer = (MailImporter *) oli; oli->filename = g_strdup (filename); /* Will return TRUE if oe4 format */ oli->oe4 = support_format_fn (NULL, filename, NULL); if (oli->oe4 == FALSE) { g_warning ("Not OE4 format"); return FALSE; } oli->handle = fopen (filename, "rb"); if (oli->handle == NULL) { g_warning ("Cannot open the file"); return FALSE; } /* Get size of file */ if (stat (filename, &buf) == -1) { g_warning ("Cannot stat file"); return FALSE; } oli->size = buf.st_size; /* Set the fposition to the begining */ fseek (oli->handle, pos, SEEK_SET); oli->pos = pos; importer->mstream = NULL; importer->folder = mail_tool_get_local_inbox (NULL); if (importer->folder == NULL){ g_warning ("Bad folder"); return FALSE; } camel_folder_freeze (importer->folder); oli->busy = FALSE; return TRUE; } BonoboObject * outlook_factory_fn (BonoboGenericFactory *_factory, void *closure) { EvolutionImporter *importer; OutlookImporter *oli; oli = g_new0 (OutlookImporter, 1); importer = evolution_importer_new (support_format_fn, load_file_fn, process_item_fn, NULL, oli); gtk_signal_connect (GTK_OBJECT (importer), "destroy", GTK_SIGNAL_FUNC (importer_destroy_cb), oli); return BONOBO_OBJECT (importer); } w44/cgit/cgit.cgi/freebsd-ports-gnome/log/?id=2fb59e9058f73bfd20c4968def31091487b86179'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/multimedia?id=2fb59e9058f73bfd20c4968def31091487b86179'>multimedia</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/multimedia/freetuxtv?id=2fb59e9058f73bfd20c4968def31091487b86179'>freetuxtv</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/multimedia/freetuxtv?id=2fb59e9058f73bfd20c4968def31091487b86179&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=f99ed704c1a2efe29e594749712a423f22bf39b8'>- Remove dependency glib20 pulled in by other deps (gtk20)</a></td><td>nemysis</td><td><span title='2014-02-01 09:16:58 +0800'>2014-02-01</span></td><td>2</td><td><span class='deletions'>-2</span>/<span class='insertions'>+18</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=30e10e1d3c1d2aba115571f87754d3a229fa9391'>Switch FreeBSD CURRENT to use the new xorg stack (WITH_NEW_XORG=) [0]</a></td><td>zeising</td><td><span title='2013-12-16 19:11:09 +0800'>2013-12-16</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=949b23f840ee4297d08decb8eacd1de4c9fd982a'>- Bump PORTREVISION to trigger fix in r334478</a></td><td>nemysis</td><td><span title='2013-11-23 06:41:10 +0800'>2013-11-23</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=ab677570ea965f522859fd48d6fce33c2e6a1f2c'>- Unbreak after vlc update</a></td><td>nemysis</td><td><span title='2013-11-21 20:15:31 +0800'>2013-11-21</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=59207d74c514f603766aee8c408fb3141a60dbe5'>Update to libmpc version 1.0.1 which brings the following fixes:</a></td><td>gerald</td><td><span title='2013-10-26 08:52:33 +0800'>2013-10-26</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=cfecf7790a815eae7147c6109eb4c1266576314f'>- Remove manual creation and removal of share/applications, as it's now in th...</a></td><td>amdmi3</td><td><span title='2013-10-22 21:56:27 +0800'>2013-10-22</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+0</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=8ab3db7fb73779a69e2df0d643dff74a7e288d22'>- Change maintainer email to @FreeBSD.org</a></td><td>nemysis</td><td><span title='2013-10-22 05:31:04 +0800'>2013-10-22</span></td><td>1</td><td><span class='deletions'>-26</span>/<span class='insertions'>+19</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=a8130c980c07259b8eab7b6bf3945e86793344e6'>The FreeBSD graphics/x11 team proudly presents</a></td><td>zeising</td><td><span title='2013-09-30 01:01:41 +0800'>2013-09-30</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=2fb3adc82da4c9df4c899dfb738f8cfc63262559'>Add NO_STAGE all over the place in preparation for the staging support (cat: ...</a></td><td>bapt</td><td><span title='2013-09-21 04:57:48 +0800'>2013-09-21</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=da258ad9a4ded9a27a8c070a61c3a78fa151c483'>- Update to 7.31.0</a></td><td>sunpoet</td><td><span title='2013-07-12 00:26:26 +0800'>2013-07-12</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=b1ff644123688010f6ba2e840c409d68caae53be'>multimedia/freetuxtv: fix build</a></td><td>wg</td><td><span title='2013-06-25 21:51:12 +0800'>2013-06-25</span></td><td>3</td><td><span class='deletions'>-38</span>/<span class='insertions'>+22</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=715298b528f23a6a763e28623a4c98f1365c81ce'>The FreeBSD x11 team proudly presents</a></td><td>zeising</td><td><span title='2013-05-25 22:37:02 +0800'>2013-05-25</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=caa9438450e360865a162824de84b11452f8b522'>Chase textproc/libebml, multimedia/libmatroska update.</a></td><td>ehaupt</td><td><span title='2013-05-07 07:01:58 +0800'>2013-05-07</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=bed7f8c6b7d24bd79cfb65f528602915a4d25128'>- Convert USE_ICONV=yes to USES=iconv</a></td><td>mva</td><td><span title='2013-04-27 19:59:28 +0800'>2013-04-27</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=be0532aa1927751208f2697351ec6365d64f46e3'>- Convert USE_GETTEXT to USES (part 4)</a></td><td>ak</td><td><span title='2013-04-26 18:44:28 +0800'>2013-04-26</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=135776951ec27858cec633271bc65e3e49745f01'>Finish converting the whole ports tree to USES=pkgconfig</a></td><td>bapt</td><td><span title='2013-04-23 22:20:25 +0800'>2013-04-23</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=b8fc98671acba737d3bd713d6a8ab2a62b0585d1'>Update PCRE to 8.32</a></td><td>mm</td><td><span title='2012-12-11 03:11:11 +0800'>2012-12-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=5bec4d844f08034eea5494f67d2ba8515200c2ce'>- Fix typo</a></td><td>ak</td><td><span title='2012-10-06 18:57:09 +0800'>2012-10-06</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/multimedia/freetuxtv?id=d9cc6a63c94dea837f45f7ea90c1393c0584f828'>Options framework take care of NLS, no need do specify it</a></td><td>pawel</td><td><span title='2012-10-06 01:53:45 +0800'>2012-10-06</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+0</span></td></tr>