aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/mbox
diff options
context:
space:
mode:
authornobody <nobody@localhost>2000-05-02 07:51:27 +0800
committernobody <nobody@localhost>2000-05-02 07:51:27 +0800
commit7882fd81661586ecf3a33e725fef29d7c6657dc9 (patch)
tree02764133d670788239da089583f787e455be8439 /camel/providers/mbox
parent46a917144878351adb2db43ab27179a271a03d7d (diff)
downloadgsoc2013-evolution-GTKHTML_0_2.tar
gsoc2013-evolution-GTKHTML_0_2.tar.gz
gsoc2013-evolution-GTKHTML_0_2.tar.bz2
gsoc2013-evolution-GTKHTML_0_2.tar.lz
gsoc2013-evolution-GTKHTML_0_2.tar.xz
gsoc2013-evolution-GTKHTML_0_2.tar.zst
gsoc2013-evolution-GTKHTML_0_2.zip
This commit was manufactured by cvs2svn to create tag 'GTKHTML_0_2'.GTKHTML_0_2
svn path=/tags/GTKHTML_0_2/; revision=2738
Diffstat (limited to 'camel/providers/mbox')
-rw-r--r--camel/providers/mbox/.cvsignore7
-rw-r--r--camel/providers/mbox/Makefile.am42
-rw-r--r--camel/providers/mbox/camel-mbox-folder.c945
-rw-r--r--camel/providers/mbox/camel-mbox-folder.h81
-rw-r--r--camel/providers/mbox/camel-mbox-provider.c50
-rw-r--r--camel/providers/mbox/camel-mbox-search.c357
-rw-r--r--camel/providers/mbox/camel-mbox-search.h11
-rw-r--r--camel/providers/mbox/camel-mbox-store.c129
-rw-r--r--camel/providers/mbox/camel-mbox-store.h69
-rw-r--r--camel/providers/mbox/camel-mbox-summary.c1499
-rw-r--r--camel/providers/mbox/camel-mbox-summary.h84
-rw-r--r--camel/providers/mbox/libcamelmbox.urls1
12 files changed, 0 insertions, 3275 deletions
diff --git a/camel/providers/mbox/.cvsignore b/camel/providers/mbox/.cvsignore
deleted file mode 100644
index fd6b811c68..0000000000
--- a/camel/providers/mbox/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.deps
-Makefile
-Makefile.in
-.libs
-.deps
-*.lo
-*.la
diff --git a/camel/providers/mbox/Makefile.am b/camel/providers/mbox/Makefile.am
deleted file mode 100644
index 25a26e25db..0000000000
--- a/camel/providers/mbox/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-SUBDIRS =
-
-libcamelmboxincludedir = $(includedir)/camel
-
-
-providerdir = $(pkglibdir)/camel-providers/$(VERSION)
-
-provider_LTLIBRARIES = libcamelmbox.la
-provider_DATA = libcamelmbox.urls
-
-INCLUDES = -I.. \
- -I$(srcdir)/.. \
- -I$(top_srcdir)/camel \
- -I$(top_srcdir)/intl \
- -I$(top_srcdir)/libibex \
- -I$(top_srcdir)/e-util \
- -I$(top_srcdir) \
- -I$(includedir) \
- $(GTK_INCLUDEDIR)
-
-libcamelmbox_la_SOURCES = \
- camel-mbox-folder.c \
- camel-mbox-provider.c \
- camel-mbox-store.c \
- camel-mbox-search.c \
- camel-mbox-summary.c
-
-libcamelmboxinclude_HEADERS = \
- camel-mbox-folder.h \
- camel-mbox-store.h \
- camel-mbox-search.h \
- camel-mbox-summary.h
-
-libcamelmbox_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir)
-
-libcamelmbox_la_LIBADD = $(top_builddir)/e-util/libeutil.la $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-#libcamelmbox_la_LIBADD = $(top_builddir)/libibex/libibex.la $(UNICODE_LIBS)
-
-EXTRA_DIST = libcamelmbox.urls
-
diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c
deleted file mode 100644
index 7e55610cf8..0000000000
--- a/camel/providers/mbox/camel-mbox-folder.c
+++ /dev/null
@@ -1,945 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-folder.c : Abstract class for an email folder */
-
-/*
- * Authors: Bertrand Guiheneuf <bertrand@helixcode.com>
- * Michael Zucchi <notzed@helixcode.com>
- *
- * Copyright (C) 1999, 2000 Helix Code 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
- */
-
-
-#include <config.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include "camel-mbox-folder.h"
-#include "camel-mbox-store.h"
-#include "string-utils.h"
-#include "camel-stream-fs.h"
-#include "camel-mbox-summary.h"
-#include "gmime-utils.h"
-#include "camel-mbox-search.h"
-#include "camel-data-wrapper.h"
-#include "camel-mime-message.h"
-
-#include "camel-exception.h"
-
-#define d(x)
-
-static CamelFolderClass *parent_class=NULL;
-
-/* Returns the class for a CamelMboxFolder */
-#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CMBOXS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass)
-
-
-static void mbox_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name,
- gchar separator, CamelException *ex);
-
-static void mbox_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex);
-static void mbox_close (CamelFolder *folder, gboolean expunge, CamelException *ex);
-static gboolean mbox_exists (CamelFolder *folder, CamelException *ex);
-static gboolean mbox_create(CamelFolder *folder, CamelException *ex);
-static gboolean mbox_delete (CamelFolder *folder, gboolean recurse, CamelException *ex);
-static gboolean mbox_delete_messages (CamelFolder *folder, CamelException *ex);
-static GList *mbox_list_subfolders (CamelFolder *folder, CamelException *ex);
-static CamelMimeMessage *mbox_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex);
-static gint mbox_get_message_count (CamelFolder *folder, CamelException *ex);
-static void mbox_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex);
-static GList *mbox_get_uid_list (CamelFolder *folder, CamelException *ex);
-static CamelMimeMessage *mbox_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex);
-
-static void mbox_expunge (CamelFolder *folder, CamelException *ex);
-#if 0
-static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder, CamelException *ex);
-static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex);
-#endif
-
-GPtrArray *summary_get_message_info (CamelFolder *folder, int first, int count);
-static const CamelMessageInfo *mbox_summary_get_by_uid(CamelFolder *f, const char *uid);
-
-static void mbox_finalize (GtkObject *object);
-
-static void
-camel_mbox_folder_class_init (CamelMboxFolderClass *camel_mbox_folder_class)
-{
- CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_mbox_folder_class);
- GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (camel_folder_class);
-
- parent_class = gtk_type_class (camel_folder_get_type ());
-
- /* virtual method definition */
-
- /* virtual method overload */
- camel_folder_class->init = mbox_init;
- camel_folder_class->open = mbox_open;
- camel_folder_class->close = mbox_close;
- camel_folder_class->exists = mbox_exists;
- camel_folder_class->create = mbox_create;
- camel_folder_class->delete = mbox_delete;
- camel_folder_class->delete_messages = mbox_delete_messages;
- camel_folder_class->list_subfolders = mbox_list_subfolders;
- camel_folder_class->get_message_by_number = mbox_get_message_by_number;
- camel_folder_class->get_message_count = mbox_get_message_count;
- camel_folder_class->append_message = mbox_append_message;
- camel_folder_class->get_uid_list = mbox_get_uid_list;
- camel_folder_class->expunge = mbox_expunge;
-#if 0
- camel_folder_class->copy_message_to = _copy_message_to;
- camel_folder_class->get_message_uid = _get_message_uid;
-#endif
- camel_folder_class->get_message_by_uid = mbox_get_message_by_uid;
-
- camel_folder_class->search_by_expression = camel_mbox_folder_search_by_expression;
-
- camel_folder_class->get_message_info = summary_get_message_info;
- camel_folder_class->summary_get_by_uid = mbox_summary_get_by_uid;
-
- gtk_object_class->finalize = mbox_finalize;
-
-}
-
-static void
-mbox_finalize (GtkObject *object)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (object);
-
- g_free (mbox_folder->folder_file_path);
- g_free (mbox_folder->folder_dir_path);
-
- GTK_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-GtkType
-camel_mbox_folder_get_type (void)
-{
- static GtkType camel_mbox_folder_type = 0;
-
- if (!camel_mbox_folder_type) {
- GtkTypeInfo camel_mbox_folder_info =
- {
- "CamelMboxFolder",
- sizeof (CamelMboxFolder),
- sizeof (CamelMboxFolderClass),
- (GtkClassInitFunc) camel_mbox_folder_class_init,
- (GtkObjectInitFunc) NULL,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- camel_mbox_folder_type = gtk_type_unique (CAMEL_FOLDER_TYPE, &camel_mbox_folder_info);
- }
-
- return camel_mbox_folder_type;
-}
-
-static void
-mbox_init (CamelFolder *folder, CamelStore *parent_store,
- CamelFolder *parent_folder, const gchar *name, gchar separator,
- CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
- const gchar *root_dir_path;
-
- /* call parent method */
- parent_class->init (folder, parent_store, parent_folder,
- name, separator, ex);
- if (camel_exception_get_id (ex))
- return;
-
- /* we assume that the parent init
- method checks for the existance of @folder */
- folder->can_hold_messages = TRUE;
- folder->can_hold_folders = TRUE;
- folder->has_summary_capability = TRUE;
- folder->has_uid_capability = TRUE;
- folder->has_search_capability = TRUE;
-
- folder->permanent_flags = CAMEL_MESSAGE_ANSWERED |
- CAMEL_MESSAGE_DELETED |
- CAMEL_MESSAGE_DRAFT |
- CAMEL_MESSAGE_FLAGGED |
- CAMEL_MESSAGE_SEEN;
-
- mbox_folder->summary = NULL;
-
- /* now set the name info */
- g_free (mbox_folder->folder_file_path);
- g_free (mbox_folder->folder_dir_path);
- g_free (mbox_folder->index_file_path);
-
- root_dir_path = camel_mbox_store_get_toplevel_dir (CAMEL_MBOX_STORE(folder->parent_store));
-
- mbox_folder->folder_file_path = g_strdup_printf ("%s/%s", root_dir_path, folder->full_name);
- mbox_folder->summary_file_path = g_strdup_printf ("%s/%s-ev-summary", root_dir_path, folder->full_name);
- mbox_folder->folder_dir_path = g_strdup_printf ("%s/%s.sdb", root_dir_path, folder->full_name);
- mbox_folder->index_file_path = g_strdup_printf ("%s/%s.ibex", root_dir_path, folder->full_name);
-}
-
-static void
-mbox_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
-
- /* call parent class */
- parent_class->open (folder, mode, ex);
- if (camel_exception_get_id(ex))
- return;
-
- mbox_folder->index = ibex_open(mbox_folder->index_file_path, O_CREAT|O_RDWR, 0600);
- if (mbox_folder->index == NULL) {
- g_warning("Could not open/create index file: %s: indexing will not function",
- strerror(errno));
- }
-
- mbox_folder->summary = camel_mbox_summary_new(mbox_folder->summary_file_path, mbox_folder->folder_file_path, mbox_folder->index);
- if (mbox_folder->summary == NULL) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */
- "Could not create summary");
- return;
- }
- camel_mbox_summary_load(mbox_folder->summary);
-}
-
-static void
-mbox_close (CamelFolder *folder, gboolean expunge, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
-
- /* call parent implementation */
- parent_class->close (folder, expunge, ex);
-
- if (expunge) {
- mbox_expunge(folder, ex);
- }
-
- /* save index */
- if (mbox_folder->index) {
- ibex_close(mbox_folder->index);
- mbox_folder->index = NULL;
- }
- camel_mbox_summary_save (mbox_folder->summary);
- camel_mbox_summary_unref (mbox_folder->summary);
- mbox_folder->summary = NULL;
-}
-
-
-static void
-mbox_expunge (CamelFolder *folder, CamelException *ex)
-{
- CamelMboxFolder *mbox = (CamelMboxFolder *)folder;
-
- if (camel_mbox_summary_expunge(mbox->summary) == -1) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID, /* FIXME: right error code */
- "Could not expunge: %s", strerror(errno));
- }
-}
-
-
-/* FIXME: clean up this snot */
-static gboolean
-mbox_exists (CamelFolder *folder, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder;
- struct stat stat_buf;
- gint stat_error;
- gboolean exists;
-
- g_assert(folder != NULL);
-
- mbox_folder = CAMEL_MBOX_FOLDER (folder);
-
- /* check if the mbox file path is determined */
- if (!mbox_folder->folder_file_path) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "undetermined folder file path. Maybe use set_name ?");
- return FALSE;
- }
-
- /* check if the mbox dir path is determined */
- if (!mbox_folder->folder_dir_path) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "undetermined folder directory path. Maybe use set_name ?");
- return FALSE;
- }
-
-
- /* we should not check for that here */
-#if 0
- /* check if the mbox directory exists */
- access_result = access (mbox_folder->folder_dir_path, F_OK);
- if (access_result < 0) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- strerror(errno));
- return FALSE;
- }
- stat_error = stat (mbox_folder->folder_dir_path, &stat_buf);
- if (stat_error == -1) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- strerror(errno));
- return FALSE;
- }
- exists = S_ISDIR (stat_buf.st_mode);
- if (!exists) return FALSE;
-#endif
-
-
- /* check if the mbox file exists */
- stat_error = stat (mbox_folder->folder_file_path, &stat_buf);
- if (stat_error == -1)
- return FALSE;
-
- exists = S_ISREG (stat_buf.st_mode);
- /* we should check the rights here */
-
- return exists;
-}
-
-/* FIXME: clean up this snot */
-static gboolean
-mbox_create (CamelFolder *folder, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
- const gchar *folder_file_path, *folder_dir_path;
- mode_t dir_mode = S_IRWXU;
- gint mkdir_error;
- gboolean folder_already_exists;
- int creat_fd;
-
- g_assert(folder != NULL);
-
- /* call default implementation */
- parent_class->create (folder, ex);
-
- /* get the paths of what we need to create */
- folder_file_path = mbox_folder->folder_file_path;
- folder_dir_path = mbox_folder->folder_dir_path;
-
- if (!(folder_file_path || folder_dir_path)) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "invalid folder path. Use set_name ?");
- return FALSE;
- }
-
-
- /* if the folder already exists, simply return */
- folder_already_exists = camel_folder_exists (folder,ex);
- if (camel_exception_get_id (ex))
- return FALSE;
-
- if (folder_already_exists)
- return TRUE;
-
-
- /* create the directory for the subfolders */
- mkdir_error = mkdir (folder_dir_path, dir_mode);
- if (mkdir_error == -1)
- goto io_error;
-
-
- /* create the mbox file */
- /* it must be rw for the user and none for the others */
- creat_fd = open (folder_file_path,
- O_WRONLY | O_CREAT | O_APPEND,
- 0600);
- if (creat_fd == -1)
- goto io_error;
-
- close (creat_fd);
-
- return TRUE;
-
- /* exception handling for io errors */
- io_error :
- if (errno == EACCES) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
- "You don't have the permission to create the mbox file.");
- return FALSE;
- } else {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- "Unable to create the mbox file.");
- return FALSE;
- }
-}
-
-
-/* FIXME: cleanup */
-static gboolean
-mbox_delete (CamelFolder *folder, gboolean recurse, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
- const gchar *folder_file_path, *folder_dir_path;
- gint rmdir_error = 0;
- gint unlink_error = 0;
- gboolean folder_already_exists;
-
- g_assert(folder != NULL);
-
- /* check if the folder object exists */
-
- /* in the case where the folder does not exist,
- return immediatly */
- folder_already_exists = camel_folder_exists (folder, ex);
- if (camel_exception_get_id (ex))
- return FALSE;
-
- if (!folder_already_exists)
- return TRUE;
-
-
- /* call default implementation.
- It should delete the messages in the folder
- and recurse the operation to subfolders */
- parent_class->delete (folder, recurse, ex);
-
-
- /* get the paths of what we need to be deleted */
- folder_file_path = mbox_folder->folder_file_path;
- folder_dir_path = mbox_folder->folder_file_path;
-
- if (!(folder_file_path || folder_dir_path)) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "invalid folder path. Use set_name ?");
- return FALSE;
- }
-
-
- /* physically delete the directory */
- rmdir_error = rmdir (folder_dir_path);
- if (rmdir_error == -1)
- switch (errno) {
- case EACCES :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
- "Not enough permission to delete the mbox folder");
- return FALSE;
- break;
-
- case ENOTEMPTY :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_NON_EMPTY,
- "mbox folder not empty. Cannot delete it. Maybe use recurse flag ?");
- return FALSE;
- break;
- default :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- "Unable to delete the mbox folder.");
- return FALSE;
- }
-
- /* physically delete the file */
- unlink_error = unlink (folder_dir_path);
- if (unlink_error == -1)
- switch (errno) {
- case EACCES :
- case EPERM :
- case EROFS :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
- "Not enough permission to delete the mbox file");
- return FALSE;
- break;
-
- case EFAULT :
- case ENOENT :
- case ENOTDIR :
- case EISDIR :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_PATH,
- "Invalid mbox file");
- return FALSE;
- break;
-
- default :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- "Unable to delete the mbox folder.");
- return FALSE;
- }
-
-
- return TRUE;
-}
-
-/* TODO: remove this */
-gboolean
-mbox_delete_messages (CamelFolder *folder, CamelException *ex)
-{
-
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
- const gchar *folder_file_path;
- gboolean folder_already_exists;
- int creat_fd;
- g_assert(folder!=NULL);
-
- /* in the case where the folder does not exist,
- return immediatly */
- folder_already_exists = camel_folder_exists (folder, ex);
- if (camel_exception_get_id (ex)) return FALSE;
-
- if (!folder_already_exists) return TRUE;
-
-
-
- /* get the paths of the mbox file we need to delete */
- folder_file_path = mbox_folder->folder_file_path;
-
- if (!folder_file_path) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "invalid folder path. Use set_name ?");
- return FALSE;
- }
-
-
- /* create the mbox file */
- /* it must be rw for the user and none for the others */
- creat_fd = open (folder_file_path,
- O_WRONLY | O_TRUNC,
- 0600);
- if (creat_fd == -1)
- goto io_error;
- close (creat_fd);
-
- return TRUE;
-
- /* exception handling for io errors */
- io_error :
- if (errno == EACCES) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
- "You don't have the permission to write in the mbox file.");
- return FALSE;
- } else {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- "Unable to write in the mbox file.");
- return FALSE;
- }
-
-
-}
-
-/* FIXME: cleanup */
-static GList *
-mbox_list_subfolders (CamelFolder *folder, CamelException *ex)
-{
- GList *subfolder_name_list = NULL;
-
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
- const gchar *folder_dir_path;
- gboolean folder_exists;
-
- struct stat stat_buf;
- gint stat_error = 0;
- gchar *entry_name;
- gchar *full_entry_name;
- gchar *real_folder_name;
- struct dirent *dir_entry;
- DIR *dir_handle;
- gboolean folder_suffix_found;
-
-
- /* check if the folder object exists */
- if (!folder) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_NULL,
- "folder object is NULL");
- return FALSE;
- }
-
-
- /* in the case the folder does not exist,
- raise an exception */
- folder_exists = camel_folder_exists (folder, ex);
- if (camel_exception_get_id (ex)) return FALSE;
-
- if (!folder_exists) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "Inexistant folder.");
- return FALSE;
- }
-
-
- /* get the mbox subfolders directories */
- folder_dir_path = mbox_folder->folder_file_path;
- if (!folder_dir_path) {
- camel_exception_set (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID,
- "Invalid folder path. Use set_name ?");
- return FALSE;
- }
-
-
- dir_handle = opendir (folder_dir_path);
-
- /* read the first entry in the directory */
- dir_entry = readdir (dir_handle);
- while ((stat_error != -1) && (dir_entry != NULL)) {
-
- /* get the name of the next entry in the dir */
- entry_name = dir_entry->d_name;
- full_entry_name = g_strdup_printf ("%s/%s", folder_dir_path, entry_name);
- stat_error = stat (full_entry_name, &stat_buf);
- g_free (full_entry_name);
-
- /* is it a directory ? */
- if ((stat_error != -1) && S_ISDIR (stat_buf.st_mode)) {
- /* yes, add it to the list */
- if (entry_name[0] != '.') {
- /* if the folder is a netscape folder, remove the
- ".sdb" from the name */
- real_folder_name = string_prefix (entry_name, ".sdb", &folder_suffix_found);
- /* stick here the tests for other folder suffixes if any */
-
- if (!folder_suffix_found) real_folder_name = g_strdup (entry_name);
-
- /* add the folder name to the list */
- subfolder_name_list = g_list_append (subfolder_name_list,
- real_folder_name);
- }
- }
- /* read next entry */
- dir_entry = readdir (dir_handle);
- }
-
- closedir (dir_handle);
-
- return subfolder_name_list;
-
-
-
- /* io exception handling */
- switch (errno) {
- case EACCES :
-
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION,
- "Unable to list the directory. Full Error text is : %s ",
- strerror (errno));
- break;
-
- case ENOENT :
- case ENOTDIR :
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_PATH,
- "Invalid mbox folder path. Full Error text is : %s ",
- strerror (errno));
- break;
-
- default :
- camel_exception_set (ex,
- CAMEL_EXCEPTION_SYSTEM,
- "Unable to delete the mbox folder.");
-
- }
-
- g_list_free (subfolder_name_list);
- return NULL;
-}
-
-static gint
-mbox_get_message_count (CamelFolder *folder, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
-
- g_assert (folder);
- g_assert (mbox_folder->summary);
-
- return camel_mbox_summary_message_count(mbox_folder->summary);
-}
-
-/*
- This is a lazy append.
-
- Basically, messages are appended to the end of the mbox, and probably assigned
- a new uid (they wont be if copying from a source folder which doesn't have
- a uid - which wont happen with the current summariser).
-
- Indexing/summarising happens when the mbox is next queried.
-
- Should this set a flag up for subsequent updating??
-*/
-
-/* FIXME: this may need some tweaking for performance? */
-/* FIXME: MUST check all sytem call return codes MUST MUST */
-static void
-mbox_append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder), *source_folder;
- CamelStream *output_stream;
- struct stat st;
- off_t seek;
- char *xev;
- guint32 uid;
-
- if (stat(mbox_folder->folder_file_path, &st) != 0) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, /* FIXME: what code? */
- "Cannot append to mbox file: %s", strerror (errno));
- return;
- }
-
- /* are we coming from an mbox folder? then we can optimise somewhat ... */
- if (message->folder && IS_CAMEL_MBOX_FOLDER(message->folder)) {
- CamelMboxMessageInfo *info;
- int sfd, dfd;
- off_t pos;
-
- /* FIXME: this is pretty ugly - we lookup the message info in the source folder, copy it,
- then go back and paste in its real uid. */
- source_folder = (CamelMboxFolder *)message->folder;
- info = camel_mbox_summary_uid(source_folder->summary, message->message_uid);
-
- d(printf("Copying message directly from %s to %s\n", source_folder->folder_file_path, mbox_folder->folder_file_path));
- d(printf("start = %d, xev = %d\n", ((CamelMboxMessageContentInfo *)info->info.content)->pos, info->xev_offset));
-
- sfd = open(source_folder->folder_file_path, O_RDONLY);
- dfd = open(mbox_folder->folder_file_path, O_RDWR|O_CREAT, 0600);
- if (lseek(dfd, st.st_size, SEEK_SET) != st.st_size) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, /* FIXME: what code? */
- "Cannot append to mbox file: %s", strerror (errno));
- close(sfd);
- close(dfd);
- return;
- }
- write(dfd, "From - \n", strlen("From - \n"));
- camel_mbox_summary_copy_block
- (sfd, dfd, ((CamelMboxMessageContentInfo *)info->info.content)->pos,
- ((CamelMboxMessageContentInfo *)info->info.content)->endpos - ((CamelMboxMessageContentInfo *)info->info.content)->pos);
- if (info->xev_offset != -1) {
- pos = st.st_size + (info->xev_offset - ((CamelMboxMessageContentInfo *)info->info.content)->pos) + strlen("From - \n");
- d(printf("Inserting new uid at %d\n", (int)pos));
- if (pos != lseek(dfd, pos, SEEK_SET)) {
- ftruncate(dfd, st.st_size);
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, /* FIXME: what code? */
- "Cannot append to mbox file: %s", strerror (errno));
- close(sfd);
- close(dfd);
- return;
- }
- uid = camel_mbox_summary_next_uid(mbox_folder->summary);
- xev = g_strdup_printf("X-Evolution: %08x-%04x", uid, 0);
- write(dfd, xev, strlen(xev)); /* FIXME: check return */
- d(printf("header = %s\n", xev));
- g_free(xev);
- }
- close(sfd);
- close(dfd);
- return;
- }
-
- /* its not an mbox folder, so lets do it the slow way ... */
- output_stream = camel_stream_fs_new_with_name (mbox_folder->folder_file_path, O_CREAT|O_RDWR, 0600);
- if (output_stream == NULL) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, /* FIXME: what code? */
- "Cannot append to mbox file: %s", strerror (errno));
- return;
- }
-
- seek = camel_seekable_stream_seek((CamelSeekableStream *)output_stream, st.st_size, SEEK_SET);
- if (seek != st.st_size) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INSUFFICIENT_PERMISSION, /* FIXME: what code? */
- "Cannot seek to position in mbox file: %s", strerror (errno));
- gtk_object_unref ((GtkObject *)output_stream);
- return;
- }
-
- /* assign a new x-evolution header */
- /* FIXME: save flags? */
- camel_medium_remove_header((CamelMedium *)message, "X-Evolution");
- uid = camel_mbox_summary_next_uid(mbox_folder->summary);
- xev = g_strdup_printf("%08x-%04x", uid, 0);
- camel_medium_add_header((CamelMedium *)message, "X-Evolution", xev);
- g_free(xev);
-
- camel_stream_write_string (output_stream, "From - \n");
- /* FIXME: does this return an error? IT HAS TO FOR THIS TO BE RELIABLE */
- camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream);
- camel_stream_close (output_stream);
-
- /* TODO: update the summary so it knows a new message is there to summarise/index */
- /* This is only a performance improvement, the summary is *only* a cache */
-
- gtk_object_unref (GTK_OBJECT (output_stream));
-}
-
-
-
-
-static GList *
-mbox_get_uid_list (CamelFolder *folder, CamelException *ex)
-{
- GList *uid_list = NULL;
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
- int i, count;
-
- /* FIXME: how are these allocated strings ever free'd? */
- count = camel_mbox_summary_message_count(mbox_folder->summary);
- for (i=0;i<count;i++) {
- CamelMboxMessageInfo *info = camel_mbox_summary_index(mbox_folder->summary, i);
- uid_list = g_list_prepend(uid_list, g_strdup(info->info.uid));
- }
-
- return uid_list;
-}
-
-static CamelMimeMessage *
-mbox_get_message_by_number (CamelFolder *folder, gint number, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
- CamelMboxMessageInfo *info;
-
- g_warning("YOUR CODE SHOULD NOT BE GETTING MESSAGES BY NUMBER, CHANGE IT");
-
- info = camel_mbox_summary_index(mbox_folder->summary, number);
- if (info == NULL) {
- camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_INVALID,
- "No such message %d in folder `%s'.",
- number, folder->name);
- return NULL;
- }
-
- return mbox_get_message_by_uid (folder, info->info.uid, ex);
-}
-
-/* track flag changes in the summary */
-static void
-message_changed(CamelMimeMessage *m, int type, CamelMboxFolder *mf)
-{
- printf("Message changed: %s: %d\n", m->message_uid, type);
- switch (type) {
- case MESSAGE_FLAGS_CHANGED:
- camel_mbox_summary_set_flags_by_uid(mf->summary, m->message_uid, m->flags);
- break;
- default:
- printf("Unhandled message change event: %d\n", type);
- break;
- }
-}
-
-
-static CamelMimeMessage *
-mbox_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
-{
- CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
- CamelStream *message_stream;
- CamelMimeMessage *message = NULL;
- CamelStore *parent_store;
- CamelMboxMessageInfo *info;
-
- /* get the parent store */
- parent_store = camel_folder_get_parent_store (folder, ex);
- if (camel_exception_get_id (ex)) {
- return NULL;
- }
-
- /* get the message summary info */
- info = camel_mbox_summary_uid(mbox_folder->summary, uid);
-
- if (info == NULL) {
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_UID,
- "uid %s not found in the folder",
- uid);
- return NULL;
- }
-
- /* if this has no content, its an error in the library */
- g_assert(info->info.content);
-
- /* FIXME: more checks below */
- /* create a stream bound to the message position/size */
- message_stream = camel_stream_fs_new_with_name_and_bounds (mbox_folder->folder_file_path, O_RDONLY, 0,
- ((CamelMboxMessageContentInfo *)info->info.content)->pos,
- ((CamelMboxMessageContentInfo *)info->info.content)->endpos);
- gtk_object_ref((GtkObject *)message_stream);
- gtk_object_sink((GtkObject *)message_stream);
- message = camel_mime_message_new();
- if (camel_data_wrapper_construct_from_stream((CamelDataWrapper *)message, message_stream) == -1) {
- gtk_object_unref((GtkObject *)message);
- gtk_object_unref((GtkObject *)message_stream);
- camel_exception_setv (ex,
- CAMEL_EXCEPTION_FOLDER_INVALID_UID, /* FIXME: code */
- "Could not create message for uid %s: %s", uid, strerror(errno));
- return NULL;
- }
- gtk_object_unref((GtkObject *)message_stream);
-
- /* init other fields? */
- message->folder = folder;
- gtk_object_ref((GtkObject *)folder);
- message->message_uid = g_strdup(uid);
- message->flags = info->info.flags;
- printf("%p flags = %x = %x\n", message, info->info.flags, message->flags);
-
- gtk_signal_connect((GtkObject *)message, "message_changed", message_changed, folder);
-
- return message;
-}
-
-/* get message info for a range of messages */
-GPtrArray *summary_get_message_info (CamelFolder *folder, int first, int count)
-{
- GPtrArray *array = g_ptr_array_new();
- int i, maxcount;
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
-
- maxcount = camel_mbox_summary_message_count(mbox_folder->summary);
- maxcount = MAX(count, maxcount);
- for (i=first;i<maxcount;i++)
- g_ptr_array_add(array, g_ptr_array_index(mbox_folder->summary->messages, i));
-
- return array;
-}
-
-/* get a single message info, by uid */
-static const CamelMessageInfo *
-mbox_summary_get_by_uid(CamelFolder *f, const char *uid)
-{
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)f;
-
- return (CamelMessageInfo *)camel_mbox_summary_uid(mbox_folder->summary, uid);
-}
-
diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h
deleted file mode 100644
index 366aca3e86..0000000000
--- a/camel/providers/mbox/camel-mbox-folder.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-folder.h : Abstract class for an email folder */
-
-/*
- *
- * Author : Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright (C) 1999 Helix Code .
- *
- * 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
- */
-
-
-#ifndef CAMEL_MBOX_FOLDER_H
-#define CAMEL_MBOX_FOLDER_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <gtk/gtk.h>
-#include "camel-folder.h"
-#include "libibex/ibex.h"
-#include "camel-mbox-summary.h"
-
-/* #include "camel-store.h" */
-
-#define CAMEL_MBOX_FOLDER_TYPE (camel_mbox_folder_get_type ())
-#define CAMEL_MBOX_FOLDER(obj) (GTK_CHECK_CAST((obj), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolder))
-#define CAMEL_MBOX_FOLDER_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MBOX_FOLDER_TYPE, CamelMboxFolderClass))
-#define IS_CAMEL_MBOX_FOLDER(o) (GTK_CHECK_TYPE((o), CAMEL_MBOX_FOLDER_TYPE))
-
-typedef struct {
- CamelFolder parent_object;
-
- gchar *folder_file_path; /* contains the messages */
- gchar *summary_file_path; /* contains the messages summary */
- gchar *folder_dir_path; /* contains the subfolders */
- gchar *index_file_path; /* index of body contents */
-
- ibex *index; /* index for this folder */
- GList *searches; /* current searches */
-
- CamelMboxSummary *summary;
-} CamelMboxFolder;
-
-
-
-typedef struct {
- CamelFolderClass parent_class;
-
- /* Virtual methods */
-
-} CamelMboxFolderClass;
-
-
-/* public methods */
-
-/* Standard Gtk function */
-GtkType camel_mbox_folder_get_type (void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MBOX_FOLDER_H */
diff --git a/camel/providers/mbox/camel-mbox-provider.c b/camel/providers/mbox/camel-mbox-provider.c
deleted file mode 100644
index 04ce88de12..0000000000
--- a/camel/providers/mbox/camel-mbox-provider.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-provider.c: mbox provider registration code */
-
-/*
- * Authors :
- * Bertrand Guiheneuf <bertrand@helixcode.com>
- *
- * Copyright (C) 2000 HelixCode (www.helixcode.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
- */
-
-#include "config.h"
-#include "camel-mbox-store.h"
-#include "camel-provider.h"
-#include "camel-session.h"
-
-static CamelProvider mbox_provider = {
- "mbox",
- "UNIX mbox-format mail files",
-
- "For reading mail delivered by the local system, and for "
- "storing mail on local disk.",
-
- 0,
-
- { 0, 0 }
-};
-
-void
-camel_provider_module_init (CamelSession *session)
-{
- mbox_provider.object_types[CAMEL_PROVIDER_STORE] =
- camel_mbox_store_get_type();
-
- camel_session_register_provider (session, &mbox_provider);
-}
diff --git a/camel/providers/mbox/camel-mbox-search.c b/camel/providers/mbox/camel-mbox-search.c
deleted file mode 100644
index 094533edbd..0000000000
--- a/camel/providers/mbox/camel-mbox-search.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright 2000 HelixCode (http://www.helixcode.com).
- *
- * Author :
- * Michael Zucchi <notzed@helixcode.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
- */
-
-#include <glib.h>
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-
-
-#include <camel/gmime-utils.h>
-#include "camel/camel-mime-message.h"
-#include "camel/camel-mime-part.h"
-#include "camel/camel-stream.h"
-#include "camel/camel-stream-fs.h"
-#include "camel/camel.h"
-#include "camel-mbox-folder.h"
-#include "camel-mbox-summary.h"
-
-#include "camel-mbox-search.h"
-#define HAVE_FILTER
-#ifdef HAVE_FILTER
-#include "e-sexp.h"
-
-#define HAVE_IBEX
-#ifdef HAVE_IBEX
-#include "ibex.h"
-#endif
-
-#define p(x) /* parse debug */
-#define r(x) /* run debug */
-#define d(x) /* general debug */
-
-
-/*
-
- Matching operators:
-
- list = (body-contains string+)
- bool = (body-contains string+)
- Returns a list of all messages containing any of the strings in the message.
- If within a match-all, then returns true for the current message.
-
- list = (match-all bool-expr)
- Returns a list of all messages for which the bool expression is true.
- The bool-expr is evaluated for each message in turn.
- It is more efficient not to perform body-content comparisons inside a
- match-all operator.
-
- int = (date-sent)
- Returns a time_t of the date-sent of the message.
-
- bool = (header-contains string string+)
- Returns true if the current message (inside a match-all operator)
- has a header 'string1', which contains any of the following strings.
-*/
-
-
-struct _searchcontext {
- int id; /* id of this search */
-
- CamelFolder *folder;
-
-#ifdef HAVE_IBEX
- ibex *index; /* index of content for this folder */
-#endif
-
- CamelMboxSummary *summary;
-
- CamelMboxMessageInfo *message_current; /* when performing a (match operation */
-};
-
-struct _glib_sux_donkeys {
- int count;
- GPtrArray *uids;
-};
-/* or, store all unique values */
-static void
-g_lib_sux_htor(char *key, int value, struct _glib_sux_donkeys *fuckup)
-{
- g_ptr_array_add(fuckup->uids, key);
-}
-
-static ESExpResult *
-func_body_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- ESExpResult *r;
- int i, j;
- struct _searchcontext *ctx = data;
-
- if (ctx->message_current) {
- int truth = FALSE;
-
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- if (ctx->index) {
- for (i=0;i<argc && !truth;i++) {
- if (argv[i]->type == ESEXP_RES_STRING) {
- truth = ibex_find_name(ctx->index, ctx->message_current->info.uid, argv[i]->value.string);
- } else {
- g_warning("Invalid type passed to body-contains match function");
- }
- }
- } else {
- g_warning("Cannot perform indexed query with no index");
- }
- r->value.bool = truth;
- } else {
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
-
- if (ctx->index) {
- if (argc==1) {
- /* common case */
- r->value.ptrarray = ibex_find(ctx->index, argv[0]->value.string);
- } else {
- GHashTable *ht = g_hash_table_new(g_str_hash, g_str_equal);
- GPtrArray *pa;
- struct _glib_sux_donkeys lambdafoo;
-
- /* this sux, perform an or operation on the result(s) of each word */
- for (i=0;i<argc;i++) {
- if (argv[i]->type == ESEXP_RES_STRING) {
- pa = ibex_find(ctx->index, argv[i]->value.string);
- for (j=0;j<pa->len;j++) {
- g_hash_table_insert(ht, g_ptr_array_index(pa, j), (void *)1);
- }
- g_ptr_array_free(pa, FALSE);
- }
- }
- lambdafoo.uids = g_ptr_array_new();
- g_hash_table_foreach(ht, (GHFunc)g_lib_sux_htor, &lambdafoo);
- r->value.ptrarray = lambdafoo.uids;
- }
- } else {
- r->value.ptrarray = g_ptr_array_new();
- }
- }
-
- return r;
-}
-
-static ESExpResult *
-func_date_sent(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- ESExpResult *r;
- struct _searchcontext *ctx = data;
-
- r = e_sexp_result_new(ESEXP_RES_INT);
-
- if (ctx->message_current) {
- g_warning("FIXME: implement date parsing ...");
- /* r->value.number = get_date(ctx->message_current); */
- } else {
- r->value.number = time(0);
- }
- return r;
-}
-
-
-static ESExpResult *
-func_match_all(struct _ESExp *f, int argc, struct _ESExpTerm **argv, void *data)
-{
- int i;
- ESExpResult *r, *r1;
- struct _searchcontext *ctx = data;
-
- if (argc>1) {
- g_warning("match-all only takes a single argument, other arguments ignored");
- }
- r = e_sexp_result_new(ESEXP_RES_ARRAY_PTR);
- r->value.ptrarray = g_ptr_array_new();
-
- for (i=0;i<ctx->summary->messages->len;i++) {
- if (argc>0) {
- ctx->message_current = g_ptr_array_index(ctx->summary->messages, i);
- r1 = e_sexp_term_eval(f, argv[0]);
- if (r1->type == ESEXP_RES_BOOL) {
- if (r1->value.bool)
- g_ptr_array_add(r->value.ptrarray, ctx->message_current->info.uid);
- } else {
- g_warning("invalid syntax, matches require a single bool result");
- }
- e_sexp_result_free(r1);
- } else {
- g_ptr_array_add(r->value.ptrarray, ctx->message_current->info.uid);
- }
- }
- ctx->message_current = NULL;
-
- return r;
-}
-
-static ESExpResult *
-func_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
-{
- ESExpResult *r;
- struct _searchcontext *ctx = data;
- int truth = FALSE;
-
- r(printf("executing header-contains\n"));
-
- /* are we inside a match-all? */
- if (ctx->message_current && argc>1
- && argv[0]->type == ESEXP_RES_STRING) {
- char *headername, *header = NULL;
- char strbuf[32];
- int i;
-
- /* only a subset of headers are supported .. */
- headername = argv[0]->value.string;
- if (!strcasecmp(headername, "subject")) {
- header = ctx->message_current->info.subject;
- } else if (!strcasecmp(headername, "date")) {
- sprintf(strbuf, "%d", (int)ctx->message_current->info.date_sent);
- header = strbuf;
- } else if (!strcasecmp(headername, "from")) {
- header = ctx->message_current->info.from;
- } else {
- g_warning("Performing query on unknown header: %s", headername);
- }
-
- if (header) {
- for (i=1;i<argc && !truth;i++) {
- if (argv[i]->type == ESEXP_RES_STRING
- && strstr(header, argv[i]->value.string)) {
- printf("%s got a match with %s of %s\n", ctx->message_current->info.uid, header, argv[i]->value.string);
- truth = TRUE;
- break;
- }
- }
- }
- }
- r = e_sexp_result_new(ESEXP_RES_BOOL);
- r->value.bool = truth;
-
- return r;
-}
-
-
-/* 'builtin' functions */
-static struct {
- char *name;
- ESExpFunc *func;
- int type; /* set to 1 if a function can perform shortcut evaluation, or
- doesn't execute everything, 0 otherwise */
-} symbols[] = {
- { "body-contains", func_body_contains, 0 },
- { "date-sent", func_date_sent, 0 },
- { "match-all", (ESExpFunc *)func_match_all, 1 },
- { "header-contains", func_header_contains, 0 },
-};
-
-GList *camel_mbox_folder_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex)
-{
- int i;
- struct _searchcontext *ctx;
- GList *matches = NULL;
- ESExp *f;
- ESExpResult *r;
- CamelMboxFolder *mbox_folder = (CamelMboxFolder *)folder;
-
- /* setup our expression evaluator */
- f = e_sexp_new();
-
- ctx = g_malloc0(sizeof(*ctx));
-
- /* setup out context */
- ctx->folder = folder;
- ctx->summary = mbox_folder->summary;
-
- if (ctx->summary == NULL || camel_exception_get_id (ex)) {
- printf ("Cannot get summary\n"
- "Full description : %s\n", camel_exception_get_description (ex));
- g_free(ctx);
- gtk_object_unref((GtkObject *)f);
- return NULL;
- }
-
- /* FIXME: the index should be global to the folder */
- ctx->message_current = NULL;
- ctx->index = CAMEL_MBOX_FOLDER(folder)->index;
- if (!ctx->index) {
- g_warning("No folder index, searches will not function fully");
- }
-
- ((CamelMboxFolder *)folder)->searches = g_list_append(((CamelMboxFolder *)folder)->searches, ctx);
-
- for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
- if (symbols[i].type == 1) {
- e_sexp_add_ifunction(f, 0, symbols[i].name, (ESExpIFunc *)symbols[i].func, ctx);
- } else {
- e_sexp_add_function(f, 0, symbols[i].name, symbols[i].func, ctx);
- }
- }
-
- e_sexp_input_text(f, expression, strlen(expression));
- e_sexp_parse(f);
- r = e_sexp_eval(f);
-
- /* now create a folder summary to return?? */
- if (r
- && r->type == ESEXP_RES_ARRAY_PTR) {
- d(printf("got result ...\n"));
- for (i=0;i<r->value.ptrarray->len;i++) {
- d(printf("adding match: %s\n", (char *)g_ptr_array_index(r->value.ptrarray, i)));
- matches = g_list_prepend(matches, g_strdup(g_ptr_array_index(r->value.ptrarray, i)));
- }
- e_sexp_result_free(r);
- } else {
- printf("no result!\n");
- }
-
- gtk_object_unref((GtkObject *)f);
-
- ((CamelMboxFolder *)folder)->searches = g_list_remove(((CamelMboxFolder *)folder)->searches, ctx);
-
- g_free(ctx);
-
- return matches;
-}
-
-#else /* HAVE_FILTER */
-
-int camel_mbox_folder_search_by_expression(CamelFolder *folder, const char *expression,
- CamelSearchFunc *func, void *data, CamelException *ex)
-{
- return -1;
-}
-
-gboolean camel_mbox_folder_search_complete(CamelFolder *folder, int searchid, int wait, CamelException *ex)
-{
- return TRUE;
-}
-
-void camel_mbox_folder_search_cancel(CamelFolder *folder, int searchid, CamelException *ex)
-{
- /* empty */
-}
-
-#endif /*! HAVE_FILTER */
diff --git a/camel/providers/mbox/camel-mbox-search.h b/camel/providers/mbox/camel-mbox-search.h
deleted file mode 100644
index f99d922252..0000000000
--- a/camel/providers/mbox/camel-mbox-search.h
+++ /dev/null
@@ -1,11 +0,0 @@
-
-#ifndef _CAMEL_MBOX_SEARCH_H
-#define _CAMEL_MBOX_SEARCH_H
-
-#include <glib.h>
-#include "camel-mbox-folder.h"
-
-GList *camel_mbox_folder_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex);
-
-#endif /* ! _CAMEL_MBOX_SEARCH_H */
-
diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c
deleted file mode 100644
index 8db2f9338e..0000000000
--- a/camel/providers/mbox/camel-mbox-store.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-store.c : class for an mbox store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.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
- */
-
-
-#include <config.h>
-
-#include "camel-mbox-store.h"
-#include "camel-mbox-folder.h"
-#include "camel-exception.h"
-#include "camel-url.h"
-
-/* Returns the class for a CamelMboxStore */
-#define CMBOXS_CLASS(so) CAMEL_MBOX_STORE_CLASS (GTK_OBJECT(so)->klass)
-#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-#define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass)
-
-static CamelFolder *get_folder (CamelStore *store, const char *folder_name,
- CamelException *ex);
-static char *get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex);
-
-static void
-camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class)
-{
- CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class);
-
- /* virtual method overload */
- camel_store_class->get_folder = get_folder;
- camel_store_class->get_folder_name = get_folder_name;
-}
-
-
-
-static void
-camel_mbox_store_init (gpointer object, gpointer klass)
-{
- CamelService *service = CAMEL_SERVICE (object);
- CamelStore *store = CAMEL_STORE (object);
-
- service->url_flags = CAMEL_SERVICE_URL_NEED_PATH;
-
- /* mbox names are filenames, so they are case-sensitive. */
- store->folders = g_hash_table_new (g_str_hash, g_str_equal);
-}
-
-
-
-
-GtkType
-camel_mbox_store_get_type (void)
-{
- static GtkType camel_mbox_store_type = 0;
-
- if (!camel_mbox_store_type) {
- GtkTypeInfo camel_mbox_store_info =
- {
- "CamelMboxStore",
- sizeof (CamelMboxStore),
- sizeof (CamelMboxStoreClass),
- (GtkClassInitFunc) camel_mbox_store_class_init,
- (GtkObjectInitFunc) camel_mbox_store_init,
- /* reserved_1 */ NULL,
- /* reserved_2 */ NULL,
- (GtkClassInitFunc) NULL,
- };
-
- camel_mbox_store_type = gtk_type_unique (CAMEL_STORE_TYPE, &camel_mbox_store_info);
- }
-
- return camel_mbox_store_type;
-}
-
-
-const gchar *
-camel_mbox_store_get_toplevel_dir (CamelMboxStore *store)
-{
- CamelURL *url = CAMEL_SERVICE (store)->url;
-
- g_assert(url != NULL);
- return url->path;
-}
-
-
-
-static CamelFolder *
-get_folder (CamelStore *store, const char *folder_name, CamelException *ex)
-{
- CamelMboxFolder *new_mbox_folder;
- CamelFolder *new_folder;
-
- new_mbox_folder = gtk_type_new (CAMEL_MBOX_FOLDER_TYPE);
- new_folder = CAMEL_FOLDER (new_mbox_folder);
-
- /* XXX We shouldn't be passing NULL here, but it's equivalent to
- * what was there before, and there's no
- * CamelMboxFolder::get_subfolder yet anyway...
- */
- CF_CLASS (new_folder)->init (new_folder, store, NULL,
- folder_name, '/', ex);
-
- return new_folder;
-}
-
-static char *
-get_folder_name (CamelStore *store, const char *folder_name,
- CamelException *ex)
-{
- return g_strdup (folder_name);
-}
diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h
deleted file mode 100644
index 06a971ada4..0000000000
--- a/camel/providers/mbox/camel-mbox-store.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* camel-mbox-store.h : class for an mbox store */
-
-/*
- *
- * Copyright (C) 2000 Helix Code, Inc. <bertrand@helixcode.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
- */
-
-
-#ifndef CAMEL_MBOX_STORE_H
-#define CAMEL_MBOX_STORE_H 1
-
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus }*/
-
-#include <gtk/gtk.h>
-#include "camel-store.h"
-
-#define CAMEL_MBOX_STORE_TYPE (camel_mbox_store_get_type ())
-#define CAMEL_MBOX_STORE(obj) (GTK_CHECK_CAST((obj), CAMEL_MBOX_STORE_TYPE, CamelMboxStore))
-#define CAMEL_MBOX_STORE_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), CAMEL_MBOX_STORE_TYPE, CamelMboxStoreClass))
-#define IS_CAMEL_MBOX_STORE(o) (GTK_CHECK_TYPE((o), CAMEL_MBOX_STORE_TYPE))
-
-
-typedef struct {
- CamelStore parent_object;
-
-} CamelMboxStore;
-
-
-
-typedef struct {
- CamelStoreClass parent_class;
-
-} CamelMboxStoreClass;
-
-
-/* public methods */
-
-/* Standard Gtk function */
-GtkType camel_mbox_store_get_type (void);
-
-const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* CAMEL_MBOX_STORE_H */
-
-
diff --git a/camel/providers/mbox/camel-mbox-summary.c b/camel/providers/mbox/camel-mbox-summary.c
deleted file mode 100644
index 4d10709fcd..0000000000
--- a/camel/providers/mbox/camel-mbox-summary.c
+++ /dev/null
@@ -1,1499 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/uio.h>
-
-#include <stdio.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-
-#include <camel/camel-mime-message.h>
-
-#include <camel/camel-mime-parser.h>
-#include <camel/camel-mime-filter.h>
-#include <camel/camel-mime-filter-basic.h>
-#include <camel/camel-mime-filter-charset.h>
-#include <camel/camel-mime-filter-index.h>
-
-#include <camel/camel-mime-utils.h>
-
-#include "camel-mbox-summary.h"
-
-#include <errno.h>
-#include <ctype.h>
-#include <netinet/in.h>
-
-#define d(x)
-
-#define CAMEL_MBOX_SUMMARY_VERSION 2
-
-static int safe_write(int fd, char *buffer, size_t towrite);
-static void camel_mbox_summary_add(CamelMboxSummary *s, CamelMboxMessageInfo *info);
-
-/*
- Disk file format?
-
- message uid
-message-block
- date:
- date received?
-
- subject: (unicode encoded)
- from: (unicode encoded)
- to: (unicode)
-
- content-block
-
-content-block
- content-type: ; params;
- content-id:
- content-description:
- content-transfer-encoding:
- message-start:
- header-size:
- body-size:
-
- message-block
- multipart-block
-
- */
-
-/* pah, i dont care, its almost no code and it works, dont need a glist */
-struct _node {
- struct _node *next;
-};
-
-static struct _node *
-my_list_append(struct _node **list, struct _node *n)
-{
- struct _node *ln = (struct _node *)list;
- while (ln->next)
- ln = ln->next;
- n->next = 0;
- ln->next = n;
- return n;
-}
-
-static int
-my_list_size(struct _node **list)
-{
- int len = 0;
- struct _node *ln = (struct _node *)list;
- while (ln->next) {
- ln = ln->next;
- len++;
- }
- return len;
-}
-
-/* low-level io functions */
-static int
-encode_int (FILE *out, gint32 value)
-{
- int i;
-
- for (i=28;i>0;i-=7) {
- if (value >= (1<<i)) {
- unsigned int c = (value>>i) & 0x7f;
- if (fputc(c, out) == -1)
- return -1;
- }
- }
- return fputc(value | 0x80, out);
-}
-
-static gint32
-decode_int (FILE *in)
-{
- gint32 value=0, v;
-
- /* until we get the last byte, keep decoding 7 bits at a time */
- while ( ((v = fgetc(in)) & 0x80) == 0 && v!=EOF) {
- value |= v;
- value <<= 7;
- }
- value |= (v&0x7f);
- return value;
-}
-
-static int
-encode_fixed_int (FILE *out, gint32 value)
-{
- guint32 save;
-
- save = htonl(value);
- return fwrite(&save, sizeof(save), 1, out);
-}
-
-static gint32
-decode_fixed_int (FILE *out)
-{
- guint32 save;
-
- if (fread(&save, sizeof(save), 1, out) != -1) {
- return ntohl(save);
- } else {
- return -1;
- }
-}
-
-/* should be sorted, for binary search */
-/* This is a tokenisation mechanism for strings written to the
- summary - to save space.
- This list can have at most 31 words. */
-static char * tokens[] = {
- "7bit",
- "8bit",
- "alternative",
- "application",
- "base64",
- "boundary",
- "charset",
- "filename",
- "html",
- "image",
- "iso-8859-1",
- "iso-8859-8",
- "message",
- "mixed",
- "multipart",
- "name",
- "octet-stream",
- "parallel",
- "plain",
- "quoted-printable",
- "rfc822",
- "text",
- "us-ascii", /* 23 words */
-};
-
-#define tokens_len (sizeof(tokens)/sizeof(tokens[0]))
-
-/* baiscally ...
- 0 = null
- 1-tokens_len == tokens[id-1]
- >=32 string, length = n-32
-*/
-
-static int
-encode_string (FILE *out, char *str)
-{
- if (str == NULL) {
- return encode_int(out, 0);
- } else {
- int len = strlen(str);
- int i, token=-1;
-
- if (len <= 16) {
- char lower[32];
-
- for (i=0;i<len;i++)
- lower[i] = tolower(str[i]);
- lower[i] = 0;
- for (i=0;i<tokens_len;i++) {
- if (!strcmp(tokens[i], lower)) {
- token = i;
- break;
- }
- }
- }
- if (token != -1) {
- return encode_int(out, token+1);
- } else {
- if (encode_int(out, len+32) == -1)
- return -1;
- return fwrite(str, len, 1, out);
- }
- }
- return 0;
-}
-
-static char *
-decode_string (FILE *in)
-{
- char *ret;
- int len;
-
- len = decode_int(in);
-
- if (len<32) {
- if (len <= 0) {
- ret = NULL;
- } else if (len<= tokens_len) {
- ret = g_strdup(tokens[len-1]);
- } else {
- g_warning("Invalid token encountered: %d", len);
- ret = NULL;
- }
- } else if (len > 10240) {
- g_warning("Got broken string header length: %d bytes", len);
- ret = NULL;
- } else {
- len -= 32;
- ret = g_malloc(len+1);
- if (fread(ret, len, 1, in) == -1) {
- g_free(ret);
- return NULL;
- }
- ret[len]=0;
- }
-
- return ret;
-}
-
-
-
-/* allocation functions */
-
-static void
-body_part_dump(CamelMboxMessageContentInfo *bs, int depth)
-{
- CamelMboxMessageContentInfo *c;
- char *prefix;
-
- if (bs == NULL)
- return;
-
- prefix = alloca(depth*2+1);
- memset(prefix, ' ', depth*2);
- prefix[depth*2]=0;
- printf("%scontent-range: %d %d %d\n", prefix, (int)bs->pos, (int)bs->bodypos, (int)bs->endpos);
- printf("%scontent-type: %s/%s\n", prefix, bs->info.type?bs->info.type->type:"?", bs->info.type?bs->info.type->subtype:"?");
- printf("%scontent-id: %s\n", prefix, bs->info.id);
- printf("%scontent-description: %s\n", prefix, bs->info.description);
- printf("%scontent-transfer-encoding: %s\n", prefix, bs->info.encoding);
- c = (CamelMboxMessageContentInfo *)bs->info.childs;
- while (c) {
- printf("%s -- \n", prefix);
- body_part_dump(c, depth+1);
- c = (CamelMboxMessageContentInfo *)c->info.next;
- }
-}
-
-static void
-message_struct_dump(CamelMboxMessageInfo *ms)
-{
- char *tmp;
-
- if (ms == NULL) {
- printf("Empty message?\n");
- return;
- }
-
- printf("Subject: %s\n", ms->info.subject);
- printf("From: %s\n", ms->info.from);
- printf("To: %s\n", ms->info.to);
- tmp = header_format_date(ms->info.date_sent, 0);
- printf("Date: %s\n", tmp);
- g_free(tmp);
- tmp = header_format_date(ms->info.date_received, 0);
- printf("Date-Received: %s\n", tmp);
- g_free(tmp);
- printf("UID: %08x-%04x\n", atoi(ms->info.uid), ms->info.flags);
- printf(" -- content ->\n");
- body_part_dump((CamelMboxMessageContentInfo *)ms->info.content, 1);
-}
-
-static CamelMboxMessageContentInfo *
-body_part_new(CamelMimeParser *mp, CamelMboxMessageContentInfo *parent, int start, int body)
-{
- CamelMboxMessageContentInfo *bs;
-
- bs = g_malloc0(sizeof(*bs));
-
- bs->info.parent = (CamelMessageContentInfo *)parent;
-
- bs->info.type = camel_mime_parser_content_type(mp);
- header_content_type_ref(bs->info.type);
-
- bs->info.id = header_msgid_decode(camel_mime_parser_header(mp, "content-id", NULL));
- bs->info.description = header_decode_string(camel_mime_parser_header(mp, "content-description", NULL));
- bs->info.encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL));
-
- /* not sure what to set here? */
- bs->pos = start;
- bs->bodypos = body;
- bs->endpos = -1;
-
- if (parent)
- my_list_append((struct _node **)&parent->info.childs, (struct _node *)bs);
-
- return bs;
-}
-
-static CamelMboxMessageInfo *
-message_struct_new(CamelMimeParser *mp, CamelMboxMessageContentInfo *parent, int start, int body, off_t xev_offset)
-{
- CamelMboxMessageInfo *ms;
- struct _header_address *addr;
- const char *text;
-
- ms = g_malloc0(sizeof(*ms));
-
- /* FIXME: what about cc, sender vs from? */
- ms->info.subject = header_decode_string(camel_mime_parser_header(mp, "subject", NULL));
- text = camel_mime_parser_header(mp, "from", NULL);
- addr = header_address_decode(text);
- if (addr) {
- ms->info.from = header_address_list_format(addr);
- header_address_list_clear(&addr);
- } else {
- ms->info.from = g_strdup(text);
- }
- text = camel_mime_parser_header(mp, "to", NULL);
- addr = header_address_decode(text);
- if (addr) {
- ms->info.to = header_address_list_format(addr);
- header_address_list_clear(&addr);
- } else {
- ms->info.to = g_strdup(text);
- }
-
- ms->info.date_sent = header_decode_date(camel_mime_parser_header(mp, "date", NULL), NULL);
- ms->info.date_received = 0;
-
- ms->info.content = (CamelMessageContentInfo *)body_part_new(mp, parent, start, body);
- ms->xev_offset = xev_offset;
-
- return ms;
-}
-
-static void
-body_part_free(CamelMboxMessageContentInfo *bs)
-{
- CamelMboxMessageContentInfo *c, *cn;
-
- c = (CamelMboxMessageContentInfo *)bs->info.childs;
- while (c) {
- cn = (CamelMboxMessageContentInfo *)c->info.next;
- body_part_free(c);
- c = cn;
- }
- g_free(bs->info.id);
- g_free(bs->info.description);
- g_free(bs->info.encoding);
- header_content_type_unref(bs->info.type);
- g_free(bs);
-}
-
-static void
-message_struct_free(CamelMboxMessageInfo *ms)
-{
- g_free(ms->info.subject);
- g_free(ms->info.to);
- g_free(ms->info.from);
- body_part_free((CamelMboxMessageContentInfo *)ms->info.content);
- g_free(ms);
-}
-
-
-/* IO functions */
-static CamelMboxMessageContentInfo *
-body_part_load(FILE *in)
-{
- CamelMboxMessageContentInfo *bs = NULL, *c;
- struct _header_content_type *ct;
- char *type;
- char *subtype;
- int i, count;
-
- d(printf("got content-block\n"));
- bs = g_malloc0(sizeof(*bs));
- bs->pos = decode_int(in);
- bs->bodypos = bs->pos + decode_int(in);
- bs->endpos = bs->pos + decode_int(in);
-
- /* do content type */
- d(printf("got content-type\n"));
- type = decode_string(in);
- subtype = decode_string(in);
-
- ct = header_content_type_new(type, subtype);
- bs->info.type = ct;
- count = decode_int(in);
- d(printf("getting %d params\n", count));
- for (i=0;i<count;i++) {
- char *name = decode_string(in);
- char *value = decode_string(in);
-
- d(printf(" %s = \"%s\"\n", name, value));
-
- header_content_type_set_param(ct, name, value);
- /* FIXME: do this so we dont have to double alloc/free */
- g_free(name);
- g_free(value);
- }
-
- d(printf("got content-id\n"));
- bs->info.id = decode_string(in);
- d(printf("got content-description\n"));
- bs->info.description = decode_string(in);
- d(printf("got content-encoding\n"));
- bs->info.encoding = decode_string(in);
-
- count = decode_int(in);
- d(printf("got children, %d\n", count));
- for (i=0;i<count;i++) {
- c = body_part_load(in);
- if (c) {
- my_list_append((struct _node **)&bs->info.childs, (struct _node *)c);
- c->info.parent = (CamelMessageContentInfo *)bs;
- } else {
- printf("Cannot load child\n");
- }
- }
-
- return bs;
-}
-
-static int
-body_part_save(FILE *out, CamelMboxMessageContentInfo *bs)
-{
- CamelMboxMessageContentInfo *c, *cn;
- struct _header_content_type *ct;
- struct _header_param *hp;
-
- encode_int(out, bs->pos);
- encode_int(out, bs->bodypos - bs->pos);
- encode_int(out, bs->endpos - bs->pos);
-
- ct = bs->info.type;
- if (ct) {
- encode_string(out, ct->type);
- encode_string(out, ct->subtype);
- encode_int(out, my_list_size((struct _node **)&ct->params));
- hp = ct->params;
- while (hp) {
- encode_string(out, hp->name);
- encode_string(out, hp->value);
- hp = hp->next;
- }
- } else {
- encode_string(out, NULL);
- encode_string(out, NULL);
- encode_int(out, 0);
- }
- encode_string(out, bs->info.id);
- encode_string(out, bs->info.description);
- encode_string(out, bs->info.encoding);
-
- encode_int(out, my_list_size((struct _node **)&bs->info.childs));
-
- c = (CamelMboxMessageContentInfo *)bs->info.childs;
- while (c) {
- cn = (CamelMboxMessageContentInfo *)c->info.next;
- body_part_save(out, c);
- c = cn;
- }
-
- return 0;
-}
-
-static CamelMboxMessageInfo *
-message_struct_load(FILE *in)
-{
- CamelMboxMessageInfo *ms;
-
- ms = g_malloc0(sizeof(*ms));
-
- ms->info.uid = g_strdup_printf("%u", decode_int(in));
- ms->info.flags = decode_int(in);
- ms->info.date_sent = decode_int(in);
- ms->info.date_received = decode_int(in);
- ms->xev_offset = decode_int(in);
- ms->info.subject = decode_string(in);
- ms->info.from = decode_string(in);
- ms->info.to = decode_string(in);
- ms->info.content = (CamelMessageContentInfo *)body_part_load(in);
-
- return ms;
-}
-
-static int
-message_struct_save(FILE *out, CamelMboxMessageInfo *ms)
-{
- encode_int(out, strtoul(ms->info.uid, NULL, 10));
- encode_int(out, ms->info.flags);
- encode_int(out, ms->info.date_sent);
- encode_int(out, ms->info.date_received);
- encode_int(out, ms->xev_offset);
- encode_string(out, ms->info.subject);
- encode_string(out, ms->info.from);
- encode_string(out, ms->info.to);
- body_part_save(out, (CamelMboxMessageContentInfo *)ms->info.content);
-
- return 0;
-}
-
-static unsigned int
-header_evolution_decode(const char *in, unsigned int *uid, unsigned int *flags)
-{
- char *header;
- if (in
- && (header = header_token_decode(in))) {
- if (strlen(header) == strlen("00000000-0000")
- && sscanf(header, "%08x-%04x", uid, flags) == 2) {
- g_free(header);
- return *uid;
- }
- g_free(header);
- }
-
- return ~0;
-}
-
-static int
-safe_write(int fd, char *buffer, size_t towrite)
-{
- size_t donelen;
- size_t len;
-
- donelen = 0;
- while (donelen < towrite) {
- len = write(fd, buffer + donelen, towrite - donelen);
- if (len == -1) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
- return -1;
- }
- donelen += len;
- }
- return donelen;
-}
-
-static int
-header_write(int fd, struct _header_raw *header, unsigned int uid, unsigned int flags)
-{
- struct iovec iv[4];
- int outlen = 0;
-
- iv[1].iov_base = ":";
- iv[1].iov_len = 1;
- iv[3].iov_base = "\n";
- iv[3].iov_len = 1;
-
- while (header) {
- if (strcasecmp(header->name, "x-evolution")) {
- int len;
-
- iv[0].iov_base = header->name;
- iv[0].iov_len = strlen(header->name);
- iv[2].iov_base = header->value;
- iv[2].iov_len = strlen(header->value);
-
- do {
- len = writev(fd, iv, 4);
- } while (len == -1 && errno == EINTR);
-
- if (len == -1)
- return -1;
- outlen += len;
- }
- header = header->next;
- }
-
- return outlen;
-}
-
-/* returns -1 on error, else number of bytes written */
-int
-camel_mbox_summary_copy_block(int fromfd, int tofd, off_t readpos, size_t bytes)
-{
- char buffer[4096];
- int written = 0;
- off_t pos, newpos;
-
- pos = lseek(fromfd, 0, SEEK_CUR);
- if (pos == -1)
- return -1;
-
- newpos = lseek(fromfd, readpos, SEEK_SET);
- if (newpos == -1 || newpos != readpos)
- goto error;
-
- d(printf("oldpos = %d; copying %d from %d\n", (int)pos, (int)bytes, (int)readpos));
-
- while (bytes>0) {
- int toread, towrite, donelen;
-
- toread = bytes;
- if (bytes>4096)
- toread = 4096;
- else
- toread = bytes;
- reread:
- towrite = read(fromfd, buffer, toread);
- if (towrite == -1) {
- if (errno == EINTR || errno == EAGAIN)
- goto reread;
- goto error;
- }
-
- /* check for 'end of file' */
- if (towrite == 0)
- break;
-
- if ( (donelen = safe_write(tofd, buffer, towrite)) == -1)
- goto error;
-
- written += donelen;
- bytes -= donelen;
- }
-
- d(printf("written %d bytes\n", written));
-
- newpos = lseek(fromfd, pos, SEEK_SET);
- if (newpos == -1 || newpos != pos);
- return -1;
-
- return written;
-
-error:
- lseek(fromfd, pos, SEEK_SET);
- return -1;
-}
-
-#define SAVEIT
-
-/* TODO: Allow to sync with current summary info, without over-writing flags if they
- already exist there */
-/* TODO: Lazy sync, make this read-only, and dont write out xev headers unless we need
- to? */
-static int index_folder(CamelMboxSummary *s, int startoffset)
-{
- CamelMimeParser *mp;
- int fd;
- int fdout;
- int state;
-
- int toplevel = FALSE;
- const char *xev;
- char *data;
- int datalen;
-
- int enc_id=-1;
- int chr_id=-1;
- int idx_id=-1;
- struct _header_content_type *ct;
- int doindex=FALSE;
- CamelMimeFilterCharset *mfc = NULL;
- CamelMimeFilterIndex *mfi = NULL;
- CamelMimeFilterBasic *mf64 = NULL, *mfqp = NULL;
-
- CamelMboxMessageContentInfo *body = NULL, *parent = NULL;
- CamelMboxMessageInfo *message = NULL;
-
- int from_end = 0; /* start of message */
- int from = 0; /* start of headers */
- int last_write = 0; /* last written position */
- int eof;
- int write_offset = 0; /* how much does the dest differ from the source pos */
- int old_offset = 0;
-
- guint32 newuid, newflags;
- off_t xevoffset = -1;
-
- char *tmpname;
-
- printf("indexing %s (%s) from %d\n", s->folder_path, s->summary_path, startoffset);
-
- fd = open(s->folder_path, O_RDONLY);
- if (fd==-1) {
- perror("Can't open folder");
- return -1;
- }
-
- tmpname = g_strdup_printf("%s.tmp", s->folder_path);
-
- fdout = open(tmpname, O_WRONLY|O_CREAT|O_TRUNC, 0600);
- if (fdout==-1) {
- perror("Can't open output");
- g_free(tmpname);
- return -1;
- }
-
- mp = camel_mime_parser_new();
- camel_mime_parser_init_with_fd(mp, fd);
- camel_mime_parser_scan_from(mp, TRUE);
-
- /* FIXME: cleaner fail code */
- if (startoffset > 0) {
- if (camel_mime_parser_seek(mp, startoffset, SEEK_SET) != startoffset) {
- g_free(tmpname);
- gtk_object_unref((GtkObject *)mp);
- return -1;
- }
- }
-
- mfi = camel_mime_filter_index_new_ibex(s->index);
-
- while ( (state = camel_mime_parser_step(mp, &data, &datalen)) != HSCAN_EOF ) {
- switch(state) {
- case HSCAN_FROM: /* starting a new message content */
- /* save the current position */
- d(printf("from = %d\n", (int)camel_mime_parser_tell(mp)));
- toplevel = FALSE;
- from = camel_mime_parser_tell(mp);
- break;
-
- case HSCAN_FROM_END:
- d(printf("from-end = %d\n", (int)camel_mime_parser_tell(mp)));
- d(printf("message from %d to %d\n", from_end, (int)camel_mime_parser_tell(mp)));
- from_end = camel_mime_parser_tell(mp);
- break;
-
- case HSCAN_MESSAGE:
- case HSCAN_MULTIPART:
- case HSCAN_HEADER: /* starting a new header */
- newuid=~0;
- newflags=0;
- if (!toplevel) {
- char name[32];
- unsigned int olduid, oldflags;
- int headerlen;
- int docopy = FALSE;
-
- /* check for X-Evolution header ... if its there, nothing to do (skip content) */
- xev = camel_mime_parser_header(mp, "x-evolution", (int *)&xevoffset);
- if (xev) {
- d(printf("An x-evolution header exists at: %d = %s\n", xevoffset + write_offset, xev));
- xevoffset = xevoffset + write_offset;
- if (header_evolution_decode(xev, &olduid, &oldflags) != ~0) {
- d(printf(" uid = %d = %x\n", olduid, olduid));
- newuid = olduid;
- newflags = oldflags;
-#if 0
- while (camel_mime_parser_step(mp, &data, &datalen) != HSCAN_FROM_END)
- ;
- break;
-#endif
- } else {
- printf("Invalid xev header? I need to write out a new one ...\n");
- }
- }
-
- toplevel = TRUE;
-
- /* assign a new uid for this message */
- if (newuid == ~0) {
- newuid = s->nextuid++;
- docopy = TRUE;
- } else {
- /* make sure we account for this uid when assigning uid's */
- /* this really needs a pre-scan pass ... *sigh* */
- camel_mbox_summary_set_uid(s, newuid);
- }
-
- /* setup index name for this uid */
- sprintf(name, "%x", newuid);
- camel_mime_filter_index_set_name(mfi, name);
- /* remove all references to this name from the index */
- if (s->index)
- ibex_unindex(s->index, name);
-
- d(printf("Message content starts at %d\n", camel_mime_parser_tell(mp)));
-
- if (docopy) {
- /* now, copy over bits of mbox from last write, and insert the X-Evolution header (at the top of headers) */
- /* if we already have a valid x-evolution header, use that, dont need to copy */
- camel_mbox_summary_copy_block(fd, fdout, last_write, from-last_write);
- last_write = from;
-
- headerlen = header_write(fdout, camel_mime_parser_headers_raw(mp), newuid, 0);
- sprintf(name, "X-Evolution: %08x-%04x\n\n", newuid, 0);
- safe_write(fdout, name, strlen(name));
- d(printf("new X-Evolution at %d\n", headerlen + from + write_offset));
- xevoffset = headerlen + from + write_offset;
- old_offset = write_offset;
-
- write_offset += (headerlen - (camel_mime_parser_tell(mp)-from)) + strlen(name);
- last_write = camel_mime_parser_tell(mp);
- }
- } else {
- old_offset = write_offset;
- }
-
- /* we only care about the rest for actual content parts */
- /* TODO: Cleanup, this is a huge mess */
- if (state != HSCAN_HEADER) {
- if (message == NULL) {
- message = message_struct_new(mp, parent, camel_mime_parser_tell_start_headers(mp)+old_offset, camel_mime_parser_tell(mp)+write_offset, xevoffset);
- parent = (CamelMboxMessageContentInfo *)message->info.content;
- if (newuid != ~0) {
- message->info.uid = g_strdup_printf("%u", newuid);
- message->info.flags = newflags;
- } else {
- g_warning("This shouldn't happen?");
- }
- } else {
- parent = body_part_new(mp, parent, camel_mime_parser_tell_start_headers(mp)+old_offset, camel_mime_parser_tell(mp)+write_offset);
- }
- break;
- }
-
- if (message == NULL) {
- message = message_struct_new(mp, parent, camel_mime_parser_tell_start_headers(mp)+old_offset, camel_mime_parser_tell(mp)+write_offset, xevoffset);
- body = (CamelMboxMessageContentInfo *)message->info.content;
- if (newuid != ~0) {
- message->info.uid = g_strdup_printf("%u", newuid);
- message->info.flags = newflags;
- } else {
- g_warning("This shouldn't happen?");
- }
- } else {
- body = body_part_new(mp, parent, camel_mime_parser_tell_start_headers(mp)+old_offset, camel_mime_parser_tell(mp)+write_offset);
- }
-
- /* check headers for types that we can index */
- ct = camel_mime_parser_content_type(mp);
- if (header_content_type_is(ct, "text", "*")) {
- char *encoding;
- const char *charset;
-
- /* TODO: The filters should all be cached, so they aren't recreated between
- messages/message parts */
- encoding = header_content_encoding_decode(camel_mime_parser_header(mp, "content-transfer-encoding", NULL));
- if (encoding) {
- if (!strcasecmp(encoding, "base64")) {
- d(printf("Adding decoding filter for base64\n"));
- if (mf64 == NULL)
- mf64 = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_BASE64_DEC);
- enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mf64);
- } else if (!strcasecmp(encoding, "quoted-printable")) {
- d(printf("Adding decoding filter for quoted-printable\n"));
- if (mfqp == NULL)
- mfqp = camel_mime_filter_basic_new_type(CAMEL_MIME_FILTER_BASIC_QP_DEC);
- enc_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mfqp);
- }
- g_free(encoding);
- }
-
- charset = header_content_type_param(ct, "charset");
- if (charset!=NULL
- && !(strcasecmp(charset, "us-ascii")==0
- || strcasecmp(charset, "utf-8")==0)) {
- d(printf("Adding conversion filter from %s to utf-8\n", charset));
- if (mfc == NULL)
- mfc = camel_mime_filter_charset_new_convert(charset, "utf-8");
- if (mfc) {
- chr_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mfc);
- } else {
- g_warning("Cannot convert '%s' to 'utf-8', message display may be corrupt", charset);
- }
- }
-
- doindex = TRUE;
-
- /* and this filter actually does the indexing */
- idx_id = camel_mime_parser_filter_add(mp, (CamelMimeFilter *)mfi);
- } else {
- doindex = FALSE;
- }
- break;
-
- /* fixme, this needs thought *sigh* */
- case HSCAN_MESSAGE_END:
- case HSCAN_MULTIPART_END:
- if (parent) {
- parent->endpos = camel_mime_parser_tell(mp)+write_offset;
- if (parent->info.parent == NULL) {
- camel_mbox_summary_add(s, message);
- message = NULL;
- parent = NULL;
- } else {
- parent = (CamelMboxMessageContentInfo *)parent->info.parent;
- }
- }
- break;
-
- case HSCAN_BODY:
- if (doindex) {
- d(printf("Got content to index:\n%.*s", datalen, data));
- }
- break;
-
- case HSCAN_BODY_END:
- if (body) {
- body->endpos = camel_mime_parser_tell(mp)+write_offset;
- if (body->info.parent == NULL) {
- camel_mbox_summary_add(s, message);
- message = NULL;
- }
- }
-
- d(printf("end of content, removing decoders\n"));
- if (enc_id != -1) {
- camel_mime_parser_filter_remove(mp, enc_id);
- enc_id = -1;
- }
- if (chr_id != -1) {
- camel_mime_parser_filter_remove(mp, chr_id);
- chr_id = -1;
- }
- if (idx_id != -1) {
- camel_mime_parser_filter_remove(mp, idx_id);
- idx_id = -1;
- }
- break;
- }
- }
-
- /* did we actually write anything out? Then rename and be done with it. */
- if (last_write>0) {
- eof = camel_mime_parser_tell(mp);
- camel_mbox_summary_copy_block(fd, fdout, last_write, eof-last_write);
-
- if (close(fdout) == -1) {
- perror("Could not close output file");
- unlink(tmpname);
- } else {
- printf("renaming %s to %s\n", tmpname, s->folder_path);
- if (rename(tmpname, s->folder_path) == -1) {
- perror("Error renaming file");
- unlink(tmpname);
- }
- }
- } else {
- /* no, then dont bother touching the inbox */
- printf("No written changes to mbox, removing tmp file\n");
- close(fdout);
- unlink(tmpname);
- }
-
- close(fd);
-
- if (mf64) gtk_object_unref((GtkObject *)mf64);
- if (mfqp) gtk_object_unref((GtkObject *)mfqp);
- if (mfc) gtk_object_unref((GtkObject *)mfc);
- if (mfi) gtk_object_unref((GtkObject *)mfi);
-
- /* force an index sync? */
- if (s->index) {
- ibex_write(s->index);
- }
-
- gtk_object_unref((GtkObject *)mp);
-
- /* and finally ... update the summary sync info */
- {
- struct stat st;
-
- if (stat(s->folder_path, &st) == 0) {
- s->time = st.st_mtime;
- s->size = st.st_size;
- }
- }
-
- g_free(tmpname);
-
- return 0;
-}
-
-CamelMboxSummary *camel_mbox_summary_new(const char *summary, const char *folder, ibex *index)
-{
- CamelMboxSummary *s;
-
- s = g_malloc0(sizeof(*s));
-
- s->dirty = TRUE;
- s->folder_path = g_strdup(folder);
- s->summary_path = g_strdup(summary);
- /* FIXME: refcount index? */
- s->index = index;
-
- s->messages = g_ptr_array_new();
- s->message_uid = g_hash_table_new(g_str_hash, g_str_equal);
-
- /* always force an update */
- s->time = 0;
- s->size = 0;
-
- s->nextuid = 1;
-
- /* TODO: force an initial load right now? */
-
- return s;
-}
-
-void camel_mbox_summary_unref(CamelMboxSummary *s)
-{
- g_warning("Unimplemented function, mbox_summary_unref");
-}
-
-/* check that the summary is uptodate, TRUE means it is uptodate */
-int camel_mbox_summary_check(CamelMboxSummary *s)
-{
- struct stat st;
-
- /* no folder at all? */
- if (stat(s->folder_path, &st) != 0)
- return FALSE;
-
- return (st.st_size == s->size) && (st.st_mtime == s->time);
-}
-
-static void camel_mbox_summary_add(CamelMboxSummary *s, CamelMboxMessageInfo *info)
-{
- if (info->info.uid == NULL) {
- info->info.uid = g_strdup_printf("%u", s->nextuid++);
- }
- if (g_hash_table_lookup(s->message_uid, info->info.uid)) {
- g_error("Trying to insert message with clashing uid's");
- }
- d(printf("adding %s\n", info->info.uid));
- g_ptr_array_add(s->messages, info);
- g_hash_table_insert(s->message_uid, info->info.uid, info);
- s->dirty = TRUE;
-}
-
-static int summary_header_read(FILE *fp, guint32 *version, time_t *time, size_t *size, guint32 *nextuid)
-{
- fseek(fp, 0, SEEK_SET);
- *version = decode_fixed_int(fp);
- *time = decode_fixed_int(fp);
- *size = decode_fixed_int(fp);
- *nextuid = decode_fixed_int(fp);
- return ferror(fp);
-}
-
-static void
-summary_clear(CamelMboxSummary *s)
-{
- int i;
-
- for (i=0;i<s->messages->len;i++) {
- message_struct_free(g_ptr_array_index(s->messages, i));
- }
- g_ptr_array_free(s->messages, TRUE);
- g_hash_table_destroy(s->message_uid);
-
- s->messages = g_ptr_array_new();
- s->message_uid = g_hash_table_new(g_str_hash, g_str_equal);
-}
-
-int camel_mbox_summary_load(CamelMboxSummary *s)
-{
- struct stat st;
- FILE *fp;
- int i, total;
- CamelMboxMessageInfo *info;
-
- summary_clear(s);
-
- if ((fp = fopen(s->summary_path, "r")) == NULL) {
- g_warning("Loading non-existant summary, generating summary for folder: %s: %s", s->summary_path, strerror(errno));
- index_folder(s, 0);
- camel_mbox_summary_save(s);
- } else {
- guint32 version, nextuid;
- time_t time;
- size_t size;
-
- if (stat(s->folder_path, &st) != 0) {
- g_warning("Uh, no folder anyway, aborting");
- fclose(fp);
- return -1;
- }
-
- if (summary_header_read(fp, &version, &time, &size, &nextuid) != 0
- || version != CAMEL_MBOX_SUMMARY_VERSION) {
- g_warning("Summary missing or version mismatch, reloading summary");
- fclose(fp);
- index_folder(s, 0);
- camel_mbox_summary_save(s);
- return 0;
- }
-
- s->nextuid = MAX(s->nextuid, nextuid);
- s->time = time;
- s->size = size;
- total = decode_fixed_int(fp);
-
- if (time != st.st_mtime || size != st.st_size) {
- /* if its grown, then just index the new stuff, and load the rest from the summary */
- if (size < st.st_size) {
- g_warning("Indexing/summarizing from start position: %d", size);
-
- d(printf("loading %d items from summary file\n", total));
- for (i=0;i<total;i++) {
- info = message_struct_load(fp);
- if (info) {
- camel_mbox_summary_add(s, info);
- } else {
- break;
- }
- }
- fclose(fp);
- s->dirty = FALSE;
- index_folder(s, size); /* if it adds any, it'll dirtify it */
- camel_mbox_summary_save(s);
- } else {
- g_warning("Folder changed/smaller, reindexing everything");
- index_folder(s, 0);
- camel_mbox_summary_save(s);
- fclose(fp);
- }
- return 0;
- }
-
- printf("loading %d items from summary file\n", total);
- for (i=0;i<total;i++) {
- info = message_struct_load(fp);
- if (info) {
- camel_mbox_summary_add(s, info);
- } else {
- break;
- }
- }
- fclose(fp);
- s->dirty = FALSE;
- }
- return 0;
-}
-
-static int summary_header_write(FILE *fp, CamelMboxSummary *s)
-{
- fseek(fp, 0, SEEK_SET);
- encode_fixed_int(fp, CAMEL_MBOX_SUMMARY_VERSION);
- encode_fixed_int(fp, s->time);
- /* if we're dirty, then dont *really* save it ... */
- if (s->dirty)
- encode_fixed_int(fp, 0);
- else
- encode_fixed_int(fp, s->size);
- encode_fixed_int(fp, s->nextuid);
- fflush(fp);
- return ferror(fp);
-}
-
-static int summary_header_save(CamelMboxSummary *s)
-{
- int fd;
- FILE *fp;
-
- fd = open(s->summary_path, O_WRONLY|O_CREAT, 0600);
- if (fd == -1)
- return -1;
- fp = fdopen(fd, "w");
- if (fp == NULL)
- return -1;
-
- summary_header_write(fp, s);
- return fclose(fp);
-}
-
-int camel_mbox_summary_save(CamelMboxSummary *s)
-{
- int i, fd;
- FILE *fp;
-
- printf("saving summary? %s\n", s->summary_path);
-
- /* FIXME: error checking */
- if (s->dirty) {
- printf("yes\n");
- fd = open(s->summary_path, O_WRONLY|O_CREAT|O_TRUNC, 0600);
- if (fd == -1)
- return -1;
- fp = fdopen(fd, "w");
- if (fp == NULL)
- return -1;
-
- s->dirty = FALSE;
-
- summary_header_write(fp, s);
- encode_fixed_int(fp, s->messages->len);
-
- printf("message count = %d\n", s->messages->len);
-
- for (i=0;i<s->messages->len;i++) {
- message_struct_save(fp, g_ptr_array_index(s->messages, i));
- }
- fclose(fp);
- } else {
- printf("no\n");
- }
- return 0;
-}
-
-CamelMboxMessageInfo *camel_mbox_summary_uid(CamelMboxSummary *s, const char *uid)
-{
- return g_hash_table_lookup(s->message_uid, uid);
-}
-
-CamelMboxMessageInfo *camel_mbox_summary_index(CamelMboxSummary *s, int index)
-{
- return g_ptr_array_index(s->messages, index);
-}
-
-int camel_mbox_summary_message_count(CamelMboxSummary *s)
-{
- return s->messages->len;
-}
-
-guint32 camel_mbox_summary_next_uid(CamelMboxSummary *s)
-{
- guint32 uid = s->nextuid++;
-
- summary_header_save(s);
- return uid;
-}
-
-guint32 camel_mbox_summary_set_uid(CamelMboxSummary *s, guint32 uid)
-{
- if (s->nextuid <= uid) {
- s->nextuid = uid+1;
- summary_header_save(s);
- }
- return s->nextuid;
-}
-
-void camel_mbox_summary_set_flags_by_uid(CamelMboxSummary *s, const char *uid, guint32 flags)
-{
- CamelMessageInfo *info;
-
- info = (CamelMessageInfo *)camel_mbox_summary_uid(s, uid);
- if (info != NULL) {
- if (info->flags != flags) {
- info->flags = flags | CAMEL_MESSAGE_FOLDER_FLAGGED;
- s->dirty = TRUE;
- }
- } else {
- g_warning("Message has dissapeared from summary? uid %s", uid);
- }
-}
-
-/* update offsets in the summary to take account deleted parts */
-static void
-offset_content(CamelMboxMessageContentInfo *content, off_t offset)
-{
- content->pos -= offset;
- content->bodypos -= offset;
- content->endpos -= offset;
- content = (CamelMboxMessageContentInfo *)content->info.childs;
- while (content) {
- offset_content(content, offset);
- content = (CamelMboxMessageContentInfo *)content->info.next;
- }
-}
-
-void camel_mbox_summary_remove_uid(CamelMboxSummary *s, const char *uid)
-{
- CamelMboxMessageInfo *oldinfo;
- char *olduid;
-
- if (g_hash_table_lookup_extended(s->message_uid, uid, (void *)&olduid, (void *)&oldinfo)) {
-#if 0
- /* FIXME: this code should be executed to update the summary info,
- however, only if we're not depending on the info not changing yet */
- off_t offset = info->endpos - info->pos;
- int i, count, got = FALSE;
-
- count = s->messages->len;
- for (i=0;i<count;i++) {
- CamelMboxMessageInfo *minfo = g_ptr_array_index(s->messages, i);
- if (got) {
- offset_content(minfo, offset);
- } else if (minfo == info) {
- got = TRUE;
- }
- }
-#endif
- g_hash_table_remove(s->message_uid, uid);
- g_ptr_array_remove(s->messages, oldinfo);
- message_struct_free(oldinfo);
- g_free(olduid);
- }
-}
-
-/* perform expunge/update xev headers, etc */
-/* TODO: merge this with the indexing code, so that it can index new parts
- without having to reread everything again? */
-/* TODO: sync with the mbox, if it has changed */
-int
-camel_mbox_summary_expunge(CamelMboxSummary *s)
-{
- int quick = TRUE, work=FALSE;
- int i, count;
- CamelMboxMessageInfo *info;
-
- printf("Executing expunge ...\n");
-
- count = camel_mbox_summary_message_count(s);
- for (i=0;quick && i<count;i++) {
- info = camel_mbox_summary_index(s, i);
- if (info->xev_offset == -1 || info->info.flags & CAMEL_MESSAGE_DELETED)
- quick = FALSE;
- else
- work |= (info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0;
- }
- if (quick) {
- int fd;
- char name[32];
-
- if (!work)
- return 0;
-
- camel_mbox_summary_save(s);
-
- fd = open(s->folder_path, O_WRONLY);
-
- if (fd == -1) {
- g_error("Cannot open folder for update: %s", strerror(errno));
- return -1;
- }
-
- /* poke in the new xev info */
- for (i=0;i<count;i++) {
- info = camel_mbox_summary_index(s, i);
- g_assert(info);
- g_assert(info->xev_offset != -1);
- if (info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED) {
- printf("Setting new flags to message %s = %04x\n", info->info.uid, info->info.flags & 0xffff);
- lseek(fd, info->xev_offset, SEEK_SET);
- sprintf(name, "X-Evolution: %08x-%04x\n\n", (unsigned int)strtoul(info->info.uid, NULL, 10), info->info.flags & 0xffff);
- write(fd, name, strlen(name));
- info->info.flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED;
- }
- }
- close(fd);
- } else {
- char *tmpname;
- int fd, fdout;
- int last_write = 0, offset = 0, summary_end = 0, last_start = 0;
- CamelMboxMessageContentInfo *content;
- struct stat st;
-
- printf("We must expunge messages and/or write headers\n");
-
- /* FIXME: This should check the current summary is correct */
-
- /* we have to write out new headers or delete messages, starting from message i */
-
- fd = open(s->folder_path, O_RDONLY);
- if (fd == -1) {
- g_error("Cannot open folder for read: %s", strerror(errno));
- return -1;
- }
-
- tmpname = g_strdup_printf("%s.tmp", s->folder_path);
- fdout = open(tmpname, O_WRONLY|O_CREAT|O_TRUNC, 0600);
- if (fdout == -1) {
- g_error("Cannot open tmp file for write: %s", strerror(errno));
- close(fd);
- g_free(tmpname);
- return -1;
- }
-
- for (i=0;i<count;i++) {
- info = camel_mbox_summary_index(s, i);
- g_assert(info);
- g_assert(info->info.content);
-
- content = (CamelMboxMessageContentInfo *)info->info.content;
-
- /* FIXME: Must also write out xev headers etc, as appropriate? */
-
- /* we need to use the end of the previous message, becuase the beginning of
- this message doesn't include the "^From " line. */
-
- /* do we remove this message? */
- if (info->info.flags & CAMEL_MESSAGE_DELETED) {
- printf("Deleting message: %s\n", info->info.uid);
- camel_mbox_summary_copy_block(fd, fdout, last_write, last_start-last_write);
- last_write = content->endpos;
- last_start = last_write;
- offset += (content->endpos - content->pos);
-
- /* remove this message from the index */
- if (s->index) {
- char name[32];
-
- sprintf(name, "%x", info->info.uid);
- ibex_unindex(s->index, name);
- }
-
- camel_mbox_summary_remove_uid(s, info->info.uid);
- i--; /* redo this index */
- count--;
- } else {
- printf("Keeping message: %s\n", info->info.uid);
- last_start = content->endpos;
- offset_content(content, offset);
- summary_end = content->endpos;
- }
- }
- /* copy the rest of the file ... */
- camel_mbox_summary_copy_block(fd, fdout, last_write, INT_MAX);
-
- close(fd);
- if (close(fdout) == -1) {
- g_error("Cannot close tmp folder: %s", strerror(errno));
- unlink(tmpname);
- g_free(tmpname);
- return -1;
- }
-
- if (rename(tmpname, s->folder_path) == -1) {
- g_error("Cannot rename folder: %s", strerror(errno));
- unlink(tmpname);
- g_free(tmpname);
- return -1;
- }
-
- /* force an index sync */
- if (s->index) {
- ibex_write(s->index);
- }
-
- /* update summary size to match the actual (written) folder size ... */
- s->size = summary_end;
- /* and the time to match the newly written time, so we dont update needlessly */
- if (stat(s->folder_path, &st) == 0) {
- s->time = st.st_mtime;
- }
-
- camel_mbox_summary_save(s);
- }
-
- return 0;
-}
-
-
-#if 0
-int main(int argc, char **argv)
-{
- if (argc<2) {
- printf("usage: %s mbox\n", argv[0]);
- return 1;
- }
-
- gtk_init(&argc, &argv);
-
- index_folder(argv[1]);
-
- return 0;
-}
-#endif
diff --git a/camel/providers/mbox/camel-mbox-summary.h b/camel/providers/mbox/camel-mbox-summary.h
deleted file mode 100644
index fda574c6f8..0000000000
--- a/camel/providers/mbox/camel-mbox-summary.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2000 Helix Code Inc.
- *
- * Authors: Michael Zucchi <notzed@helixcode.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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 Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef _CAMEL_MBOX_SUMMARY_H
-#define _CAMEL_MBOX_SUMMARY_H
-
-#include <glib.h>
-#include <camel/camel-folder.h>
-#include <libibex/ibex.h>
-
-typedef struct {
- CamelMessageContentInfo info;
-
- /* position in stream of this part */
- off_t pos;
- off_t bodypos;
- off_t endpos;
-} CamelMboxMessageContentInfo;
-
-typedef struct {
- CamelMessageInfo info;
-
- /* position of the xev header, if one exists */
- off_t xev_offset;
-} CamelMboxMessageInfo;
-
-typedef struct {
- int dirty; /* if anything has changed */
-
- char *folder_path;
- char *summary_path;
- ibex *index;
-
- GPtrArray *messages; /* array of messages matching mbox order */
- GHashTable *message_uid; /* index to messages by uid */
-
- int nextuid;
-
- time_t time; /* time/size of folder's last update */
- size_t size;
-} CamelMboxSummary;
-
-CamelMboxSummary *camel_mbox_summary_new(const char *summary, const char *folder, ibex *index);
-void camel_mbox_summary_unref(CamelMboxSummary *);
-
-int camel_mbox_summary_load(CamelMboxSummary *);
-int camel_mbox_summary_save(CamelMboxSummary *);
-int camel_mbox_summary_check(CamelMboxSummary *);
-int camel_mbox_summary_expunge(CamelMboxSummary *);
-
-guint32 camel_mbox_summary_next_uid(CamelMboxSummary *);
-/* set the minimum uid */
-guint32 camel_mbox_summary_set_uid(CamelMboxSummary *s, guint32 uid);
-
-CamelMboxMessageInfo *camel_mbox_summary_uid(CamelMboxSummary *s, const char *uid);
-/* dont use this function yet ... */
-void camel_mbox_summary_remove_uid(CamelMboxSummary *s, const char *uid);
-CamelMboxMessageInfo *camel_mbox_summary_index(CamelMboxSummary *, int index);
-int camel_mbox_summary_message_count(CamelMboxSummary *);
-
-/* set flags within a summary item */
-void camel_mbox_summary_set_flags_by_uid(CamelMboxSummary *s, const char *uid, guint32 flags);
-
-/* TODO: should be in a utility library */
-int camel_mbox_summary_copy_block(int fromfd, int tofd, off_t readpos, size_t bytes);
-
-#endif /* ! _CAMEL_MBOX_SUMMARY_H */
diff --git a/camel/providers/mbox/libcamelmbox.urls b/camel/providers/mbox/libcamelmbox.urls
deleted file mode 100644
index e021190356..0000000000
--- a/camel/providers/mbox/libcamelmbox.urls
+++ /dev/null
@@ -1 +0,0 @@
-mbox