From 4d5427769cfec587d9b8f727bd57ac1a1d2ae340 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 7 Jun 2000 00:06:29 +0000 Subject: Remove exists, create, delete. A CamelFolder now always references an * camel-folder.c: Remove exists, create, delete. A CamelFolder now always references an existing folder. Remove delete_messages too since it wasn't being used. Add a "create" flag to get_subfolder saying whether or not to create the subfolder if it doesn't yet exist. * camel-store.c (camel_store_get_folder): Add a "create" flag to say whether or not to create the folder if it doesn't yet exist. (camel_store_delete_folder): New method, moved from CamelFolder. (cache_folder, uncache_folder): Fix up a bit. (get_folder_name): Explain what this is for. * providers/mbox/camel-mbox-folder.c: * providers/mbox/camel-mbox-store.c: Update. Remove support for hierarchical folders to simplify this for now, since we're not using it, and it's not completely clear how they should work in an ELocalStorage world. Needs to be revisited. * providers/pop3/camel-pop3-folder.c (delete_messages): Remove. * providers/pop3/camel-pop3-store.c (get_folder): Update. * providers/vee/camel-vee-folder.c (exists): Remove. * providers/vee/camel-vee-store.c (vee_get_folder): Update. svn path=/trunk/; revision=3453 --- camel/providers/mbox/camel-mbox-store.c | 128 +++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 11 deletions(-) (limited to 'camel/providers/mbox/camel-mbox-store.c') diff --git a/camel/providers/mbox/camel-mbox-store.c b/camel/providers/mbox/camel-mbox-store.c index 8db2f9338e..6a2b826f9b 100644 --- a/camel/providers/mbox/camel-mbox-store.c +++ b/camel/providers/mbox/camel-mbox-store.c @@ -24,6 +24,11 @@ #include +#include +#include +#include +#include + #include "camel-mbox-store.h" #include "camel-mbox-folder.h" #include "camel-exception.h" @@ -35,7 +40,9 @@ #define CMBOXF_CLASS(so) CAMEL_MBOX_FOLDER_CLASS (GTK_OBJECT(so)->klass) static CamelFolder *get_folder (CamelStore *store, const char *folder_name, - CamelException *ex); + gboolean create, CamelException *ex); +static void delete_folder (CamelStore *store, const char *folder_name, + CamelException *ex); static char *get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex); @@ -46,6 +53,7 @@ camel_mbox_store_class_init (CamelMboxStoreClass *camel_mbox_store_class) /* virtual method overload */ camel_store_class->get_folder = get_folder; + camel_store_class->delete_folder = delete_folder; camel_store_class->get_folder_name = get_folder_name; } @@ -101,29 +109,127 @@ camel_mbox_store_get_toplevel_dir (CamelMboxStore *store) } - static CamelFolder * -get_folder (CamelStore *store, const char *folder_name, CamelException *ex) +get_folder (CamelStore *store, const char *folder_name, gboolean create, + CamelException *ex) { - CamelMboxFolder *new_mbox_folder; CamelFolder *new_folder; + char *name; + struct stat st; + + name = g_strdup_printf ("%s%s", CAMEL_SERVICE (store)->url->path, + folder_name); + + if (stat (name, &st) == -1) { + int fd; + + if (errno != ENOENT) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + "Could not open folder `%s':" + "\n%s", folder_name, + g_strerror (errno)); + g_free (name); + return NULL; + } + if (!create) { + camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + "Folder `%s' does not exist.", + folder_name); + g_free (name); + return NULL; + } + + fd = open (name, O_WRONLY | O_CREAT | O_APPEND, + S_IRUSR | S_IWUSR); + g_free (name); + if (fd == -1) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + "Could not create folder `%s':" + "\n%s", folder_name, + g_strerror (errno)); + return NULL; + } + close (fd); + } else if (!S_ISREG (st.st_mode)) { + camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + "`%s' is not a regular file.", + name); + g_free (name); + return NULL; + } - new_mbox_folder = gtk_type_new (CAMEL_MBOX_FOLDER_TYPE); - new_folder = CAMEL_FOLDER (new_mbox_folder); + new_folder = gtk_type_new (CAMEL_MBOX_FOLDER_TYPE); - /* 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 void +delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) +{ + char *name, *name2; + struct stat st; + int status; + + name = g_strdup_printf ("%s%s", CAMEL_SERVICE (store)->url->path, + folder_name); + if (stat (name, &st) == -1) { + if (errno == ENOENT) + return; + + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + "Could not delete folder `%s':\n%s", + folder_name, g_strerror (errno)); + g_free (name); + return; + } + if (!S_ISREG (st.st_mode)) { + camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + "`%s' is not a regular file.", name); + g_free (name); + return; + } + if (st.st_size != 0) { + camel_exception_setv (ex, CAMEL_EXCEPTION_FOLDER_NON_EMPTY, + "Folder `%s' is not empty. Not deleted.", + folder_name); + g_free (name); + return; + } + + /* Delete index and summary first, then the main file. */ + name2 = g_strdup_printf ("%s.ibex", name); + status = unlink (name2); + g_free (name2); + if (status == 0 || errno == ENOENT) { + name2 = g_strdup_printf ("%s-ev-summary", name); + status = unlink (name2); + g_free (name2); + } + if (status == 0 || errno == ENOENT) + status = unlink (name); + g_free (name); + + if (status == -1 && errno != ENOENT) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + "Could not delete folder `%s':\n%s", + folder_name, g_strerror (errno)); + } +} + static char * get_folder_name (CamelStore *store, const char *folder_name, CamelException *ex) { - return g_strdup (folder_name); + /* For now, we don't allow hieararchy. FIXME. */ + if (strchr (folder_name + 1, '/')) { + camel_exception_set (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + "Mbox folders may not be nested."); + return NULL; + } + + return *folder_name == '/' ? g_strdup (folder_name) : + g_strdup_printf ("/%s", folder_name); } -- cgit v1.2.3