Work in progress. Missing files
authorBertrand Guiheneuf <bertrand@src.gnome.org>
Tue, 21 Dec 1999 23:18:14 +0000 (23:18 +0000)
committerBertrand Guiheneuf <bertrand@src.gnome.org>
Tue, 21 Dec 1999 23:18:14 +0000 (23:18 +0000)
camel/providers/mbox/Makefile.am [new file with mode: 0644]
camel/providers/mbox/camel-mbox-folder.c [new file with mode: 0644]
camel/providers/mbox/camel-mbox-folder.h [new file with mode: 0644]
camel/providers/mbox/camel-mbox-store.c [new file with mode: 0644]
camel/providers/mbox/camel-mbox-store.h [new file with mode: 0644]

diff --git a/camel/providers/mbox/Makefile.am b/camel/providers/mbox/Makefile.am
new file mode 100644 (file)
index 0000000..b614a63
--- /dev/null
@@ -0,0 +1,26 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = 
+
+libcamelmboxincludedir = $(includedir)/camel
+
+
+lib_LTLIBRARIES = libcamelmbox.la
+
+INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir) \
+       -I$(top_srcdir)/intl                    \
+       $(GTK_INCLUDEDIR) -I$(top_srcdir)/camel
+
+libcamelmbox_la_SOURCES =                      \
+       camel-mbox-folder.c                     \
+       camel-mbox-store.c                      
+
+libcamelmboxinclude_HEADERS =                  \
+       camel-mbox-folder.h                     \
+       camel-mbox-store.h
+
+
+libcamelmbox_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir)
+
+
+EXTRA_DIST = 
diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c
new file mode 100644 (file)
index 0000000..1d6d91f
--- /dev/null
@@ -0,0 +1,509 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-mbox-folder.c : Abstract class for an email folder */
+
+/* 
+ *
+ * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> .
+ *
+ * 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 <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 "gstring-util.h"
+#include "camel-log.h"
+#include "camel-stream-buffered-fs.h"
+#include "camel-folder-summary.h"
+#include "gmime-utils.h"
+
+#include "camel-exception.h"
+
+#if 0
+#include "mbox-utils.h"
+#include "mbox-uid.h"
+#include "mbox-summary.h"
+#endif 
+
+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 _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex);
+static void _set_name(CamelFolder *folder, const gchar *name, CamelException *ex);
+
+
+static void _open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex);
+static void _close (CamelFolder *folder, gboolean expunge, CamelException *ex);
+static gboolean _exists (CamelFolder *folder, CamelException *ex);
+static gboolean _create(CamelFolder *folder, CamelException *ex);
+static gboolean _delete (CamelFolder *folder, gboolean recurse, CamelException *ex);
+#if 0
+static gboolean _delete_messages (CamelFolder *folder, CamelException *ex);
+static GList *_list_subfolders (CamelFolder *folder, CamelException *ex);
+static CamelMimeMessage *_get_message (CamelFolder *folder, gint number, CamelException *ex);
+static gint _get_message_count (CamelFolder *folder, CamelException *ex);
+static gint _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException *ex);
+static void _expunge (CamelFolder *folder, CamelException *ex);
+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);
+static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex);
+static GList *_get_uid_list  (CamelFolder *folder, CamelException *ex);
+#endif
+
+static void _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_with_store = _init_with_store;
+       camel_folder_class->set_name = _set_name;
+       camel_folder_class->open = _open;
+       camel_folder_class->close = _close;
+       camel_folder_class->exists = _exists;
+       camel_folder_class->create = _create;
+       camel_folder_class->delete = _delete;
+#if 0
+       camel_folder_class->delete_messages = _delete_messages;
+       camel_folder_class->list_subfolders = _list_subfolders;
+       camel_folder_class->get_message_by_number = _get_message_by_number;
+       camel_folder_class->get_message_count = _get_message_count;
+       camel_folder_class->append_message = _append_message;
+       camel_folder_class->expunge = _expunge;
+       camel_folder_class->copy_message_to = _copy_message_to;
+       camel_folder_class->get_message_uid = _get_message_uid;
+       camel_folder_class->get_message_by_uid = _get_message_by_uid;
+       camel_folder_class->get_uid_list = _get_uid_list;
+#endif
+       gtk_object_class->finalize = _finalize;
+       
+}
+
+
+
+static void           
+_finalize (GtkObject *object)
+{
+       CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (object);
+
+       CAMEL_LOG_FULL_DEBUG ("Entering CamelFolder::finalize\n");
+
+       
+       g_free (mbox_folder->folder_file_path);
+       g_free (mbox_folder->folder_dir_path);
+
+       GTK_OBJECT_CLASS (parent_class)->finalize (object);
+       CAMEL_LOG_FULL_DEBUG ("Leaving CamelFolder::finalize\n");
+}
+
+
+
+
+
+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 
+_init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException *ex)
+{
+       CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::init_with_store\n");
+
+       /* call parent method */
+       parent_class->init_with_store (folder, parent_store, ex);
+       if (camel_exception_get_id (ex)) return;
+
+       /* we assume that the parent init_with_store 
+          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->summary = NULL;
+       
+       CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::init_with_store\n");
+}
+
+
+
+
+
+
+static void
+_open (CamelFolder *folder, CamelFolderOpenMode mode, CamelException *ex)
+{
+       CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
+       struct dirent *dir_entry;
+       DIR *dir_handle;
+       
+       
+       if (folder->open_state == FOLDER_OPEN) {
+               camel_exception_set (ex, 
+                                    CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
+                                    "folder is already open");
+               return;
+       }
+
+       
+#if 0
+       Here, we need to check for the summary file 
+       existence and create it if necessary.
+       /* get (or create) uid list */
+       if (!(mbox_load_uid_list (mbox_folder) > 0))
+               mbox_generate_uid_list (mbox_folder);
+
+       /* get or create summary */
+       /* it is important that it comes after uid list reading/generation */
+       if (!(mbox_load_summary (mbox_folder) > 0))
+               mbox_generate_summary (folder);
+       
+#endif 
+}
+
+
+
+
+
+
+static void
+_close (CamelFolder *folder, gboolean expunge, CamelException *ex)
+{
+       CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
+
+
+       /* call parent implementation */
+       parent_class->close (folder, expunge, ex);
+}
+
+
+
+
+static void
+_set_name (CamelFolder *folder, const gchar *name, CamelException *ex)
+{
+       CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER (folder);
+       const gchar *root_dir_path;
+       gchar *full_name;
+       const gchar *parent_full_name;
+       gchar separator;
+       
+       CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::set_name\n");
+
+       /* call default implementation */
+       parent_class->set_name (folder, name, ex);
+       if (camel_exception_get_id (ex)) return;
+
+       g_free (mbox_folder->folder_file_path);
+       g_free (mbox_folder->folder_dir_path);
+
+       separator = camel_store_get_separator (folder->parent_store);
+       root_dir_path = camel_mbox_store_get_toplevel_dir (CAMEL_MBOX_STORE(folder->parent_store));
+
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name full_name is %s\n", folder->full_name);
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name root_dir_path is %s\n", root_dir_path);
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::separator is %c\n", separator);
+
+       mbox_folder->folder_file_path = g_strdup_printf ("%s%c%s", root_dir_path, separator, folder->full_name);
+       mbox_folder->folder_dir_path = g_strdup_printf ("%s%c%s.sdb", root_dir_path, separator, folder->full_name);
+       
+       
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name mbox_folder->folder_file_path is %s\n", 
+                             mbox_folder->folder_file_path);
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::set_name mbox_folder->folder_dir_path is %s\n", 
+                             mbox_folder->folder_dir_path);
+       CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::set_name\n");
+}
+
+
+
+
+
+
+static gboolean
+_exists (CamelFolder *folder, CamelException *ex)
+{
+       CamelMboxFolder *mbox_folder = CAMEL_MBOX_FOLDER(folder);
+       struct stat stat_buf;
+       gint stat_error;
+       gboolean exists;
+
+       CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::exists\n");
+
+       /* check if the folder object exists */
+       if (!folder) {
+               camel_exception_set (ex, 
+                                    CAMEL_EXCEPTION_FOLDER_NULL,
+                                    "folder object is NULL");
+               return FALSE;
+       }
+
+       /* 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;
+       }
+       
+       /* check if the mbox directory exists */
+       stat_error = stat (mbox_folder->folder_dir_path, &stat_buf);
+       if (stat_error == -1)  {
+               CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::exists when executing stat on %s, stat_error = %d\n", 
+                                     mbox_folder->folder_dir_path, stat_error);
+               CAMEL_LOG_FULL_DEBUG ("  Full error text is : %s\n", strerror(errno));
+               camel_exception_set (ex, 
+                                    CAMEL_EXCEPTION_SYSTEM,
+                                    strerror(errno));
+               return FALSE;
+       }
+       exists = S_ISDIR (stat_buf.st_mode);
+       if (!exists) return FALSE;
+
+       /* check if the mbox file exists */
+       stat_error = stat (mbox_folder->folder_file_path, &stat_buf);
+       if (stat_error == -1)  {
+               CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::exists when executing stat on %s, stat_error = %d\n", 
+                                     mbox_folder->folder_file_path, stat_error);
+               CAMEL_LOG_FULL_DEBUG ("  Full error text is : %s\n", strerror(errno));
+               camel_exception_set (ex, 
+                                    CAMEL_EXCEPTION_SYSTEM,
+                                    strerror(errno));
+               return FALSE;
+       }
+
+       exists = S_REG (stat_buf.st_mode);
+       /* we should  check the rights here  */
+       
+       CAMEL_LOG_FULL_DEBUG ("Leaving CamelMboxFolder::exists\n");
+       return exists;
+}
+
+
+
+
+
+
+
+
+static gboolean
+_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;
+       mode_t old_umask;
+
+       /* check if the folder object exists */
+       if (!folder) {
+               camel_exception_set (ex, 
+                                    CAMEL_EXCEPTION_FOLDER_NULL,
+                                    "folder object is NULL");
+               return FALSE;
+       }
+
+
+       /* 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_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;
+       }
+
+       
+       /* 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 */
+       old_umask = umask (0700);
+       creat_fd = open (folder_file_path, 
+                        O_WRONLY | O_CREAT | O_APPEND | 
+                        S_IRUSR  | S_IWUSR); 
+       umask (old_umask);
+       if (creat_fd == -1) goto io_error;
+               
+       
+       return TRUE;
+
+       /* exception handling for io errors */
+       io_error :
+
+               CAMEL_LOG_WARNING ("CamelMboxFolder::create, error when creating %s and %s\n", 
+                                  folder_dir_path, folder_file_path);
+               CAMEL_LOG_FULL_DEBUG ( "  Full error text is : %s\n", strerror(errno));
+
+               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;
+               }
+}
+
+
+
+
+
+
+
+
+static gboolean
+_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;
+
+       /* 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 where the folder does not exist, 
+          return immediatly */
+       if (!camel_folder_exists (folder, ex)) 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 delete */
+       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 */
+       CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::delete removing directory %s\n", folder_dir_path);
+       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;
+       }
+       
+       /** Ber : tu dois supprimer le fichier maintenant */
+       return TRUE;
+}
diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h
new file mode 100644 (file)
index 0000000..7de357e
--- /dev/null
@@ -0,0 +1,72 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-mbox-folder.h : Abstract class for an email folder */
+
+/* 
+ *
+ * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> .
+ *
+ * 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 "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 *folder_dir_path;  /* contains the subfolders */
+       GArray *uid_array;
+
+} 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-store.c b/camel/providers/mbox/camel-mbox-store.c
new file mode 100644 (file)
index 0000000..743d168
--- /dev/null
@@ -0,0 +1,153 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-mbox-store.c : class for an mbox store */
+
+/* 
+ *
+ * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> .
+ *
+ * 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 "camel-mbox-store.h"
+#include "camel-mbox-folder.h"
+#include "url-util.h"
+
+static CamelStoreClass *parent_class=NULL;
+
+/* 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 void _init (CamelStore *store, CamelSession *session, const gchar *url_name);
+static CamelFolder *_get_folder (CamelStore *store, const gchar *folder_name);
+
+
+static void
+camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class)
+{
+       CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS (camel_mbox_store_class);
+
+       parent_class = gtk_type_class (camel_store_get_type ());
+       
+       /* virtual method definition */
+       /* virtual method overload */
+       camel_store_class->init = _init;
+       camel_store_class->get_folder = _get_folder;
+}
+
+
+
+static void
+camel_mbox_store_init (gpointer object, gpointer klass)
+{
+       CamelMboxStore *mbox_store = CAMEL_MBOX_STORE (object);
+       CamelStore *store = CAMEL_STORE (object);
+       
+       store->separator = '/';
+}
+
+
+
+
+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;
+}
+
+
+
+
+/* These evil public functions are here for test only */
+void 
+camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel)
+{
+       store->toplevel_dir = g_strdup (toplevel);
+       CAMEL_STORE(store)->separator = '/';
+}
+
+
+const gchar *
+camel_mbox_store_get_toplevel_dir (CamelMboxStore *store)
+{
+       return store->toplevel_dir;
+}
+
+
+
+static void 
+_init (CamelStore *store, CamelSession *session, const gchar *url_name)
+{
+       CamelMboxStore *mbox_store = CAMEL_MBOX_STORE (store);
+       Gurl *store_url;
+       
+       g_assert (url_name);
+       /* call parent implementation */
+       parent_class->init (store, session, url_name);
+       
+       
+       /* find the path in the URL*/
+       store_url = g_url_new (url_name);
+
+       g_return_if_fail (store_url);
+       g_return_if_fail (store_url->path); 
+       
+       mbox_store->toplevel_dir = g_strdup (store_url->path); 
+       g_url_free (store_url);
+
+       
+       
+}
+
+
+static CamelFolder *
+_get_folder (CamelStore *store, const gchar *folder_name)
+{
+       CamelMboxFolder *new_mbox_folder;
+       CamelFolder *new_folder;
+
+       /* check if folder has already been created */
+       /* call the standard routine for that when  */
+       /* it is done ... */
+
+       new_mbox_folder =  gtk_type_new (CAMEL_MBOX_FOLDER_TYPE);
+       new_folder = CAMEL_FOLDER (new_mbox_folder);
+       
+       CF_CLASS (new_folder)->init_with_store (new_folder, store, NULL);
+       CF_CLASS (new_folder)->set_name (new_folder, folder_name, NULL);
+       
+       
+       return new_folder;
+}
diff --git a/camel/providers/mbox/camel-mbox-store.h b/camel/providers/mbox/camel-mbox-store.h
new file mode 100644 (file)
index 0000000..c55766c
--- /dev/null
@@ -0,0 +1,72 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* camel-mbox-store.h : class for an mbox store */
+
+/* 
+ *
+ * Copyright (C) 1999 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> .
+ *
+ * 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;       
+       
+       gchar *toplevel_dir;    
+} CamelMboxStore;
+
+
+
+typedef struct {
+       CamelStoreClass parent_class;
+
+
+} CamelMboxStoreClass;
+
+
+/* public methods */
+
+/* Standard Gtk function */
+GtkType camel_mbox_store_get_type (void);
+
+void camel_mbox_store_set_toplevel_dir (CamelMboxStore *store, const gchar *toplevel);
+const gchar *camel_mbox_store_get_toplevel_dir (CamelMboxStore *store);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* CAMEL_MBOX_STORE_H */
+
+