aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/mbox/camel-mbox-store.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2000-06-07 08:06:29 +0800
committerDan Winship <danw@src.gnome.org>2000-06-07 08:06:29 +0800
commit4d5427769cfec587d9b8f727bd57ac1a1d2ae340 (patch)
tree4298b8ea452be219ecce2d96a4bc927782cabc31 /camel/providers/mbox/camel-mbox-store.c
parentecd4fe3af090f79f30dd9df18bc4c087c366157b (diff)
downloadgsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar.gz
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar.bz2
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar.lz
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar.xz
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.tar.zst
gsoc2013-evolution-4d5427769cfec587d9b8f727bd57ac1a1d2ae340.zip
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
Diffstat (limited to 'camel/providers/mbox/camel-mbox-store.c')
-rw-r--r--camel/providers/mbox/camel-mbox-store.c128
1 files changed, 117 insertions, 11 deletions
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 <config.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
#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);
}