From a007d6d2084df436d5f1fa2b6804064c6e7c62e0 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 26 Sep 2002 05:34:10 +0000 Subject: Implement FOLDER_CREATE flag. (scan_dir): Dont free name on exception, its 2002-09-26 Not Zed * providers/local/camel-spool-store.c (get_folder): Implement FOLDER_CREATE flag. (scan_dir): Dont free name on exception, its alloca'd. (scan_dir): If we start scanning from a file, just add that directly. (scan_dir): Allow empty files to also show up in folder list, as well as files starting with "From ". * providers/local/camel-spool-folder.c (camel_spool_folder_new): Check folder != NULL before writing to it. * providers/local/camel-local-store.c (create_folder): Handle a parent of NULL for creating top-level dirs. Part of #31186. svn path=/trunk/; revision=18230 --- camel/providers/local/camel-local-store.c | 12 ++-- camel/providers/local/camel-spool-folder.c | 7 ++- camel/providers/local/camel-spool-store.c | 88 +++++++++++++++++++++++++----- 3 files changed, 87 insertions(+), 20 deletions(-) (limited to 'camel/providers/local') diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c index 0fbb9eb14e..567b2b316a 100644 --- a/camel/providers/local/camel-local-store.c +++ b/camel/providers/local/camel-local-store.c @@ -222,15 +222,16 @@ create_folder(CamelStore *store, const char *parent_name, const char *folder_nam /* This is a pretty hacky version of create folder, but should basically work */ - /* FIXME: The strings here are funny because of string freeze */ - if (path[0] != '/') { camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, _("Store root %s is not an absolute path"), path); return NULL; } - name = g_strdup_printf("%s/%s/%s", path, parent_name, folder_name); + if (parent_name) + name = g_strdup_printf("%s/%s/%s", path, parent_name, folder_name); + else + name = g_strdup_printf("%s/%s", path, folder_name); if (stat(name, &st) == 0 || errno != ENOENT) { camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, @@ -241,7 +242,10 @@ create_folder(CamelStore *store, const char *parent_name, const char *folder_nam g_free(name); - name = g_strdup_printf("%s/%s", parent_name, folder_name); + if (parent_name) + name = g_strdup_printf("%s/%s", parent_name, folder_name); + else + name = g_strdup_printf("%s", folder_name); folder = ((CamelStoreClass *)((CamelObject *)store)->klass)->get_folder(store, name, CAMEL_STORE_FOLDER_CREATE, ex); if (folder) { diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c index 55df340c26..8118468a60 100644 --- a/camel/providers/local/camel-spool-folder.c +++ b/camel/providers/local/camel-spool-folder.c @@ -122,9 +122,10 @@ camel_spool_folder_new(CamelStore *parent_store, const char *full_name, guint32 flags &= CAMEL_STORE_FOLDER_BODY_INDEX; folder = (CamelFolder *)camel_local_folder_construct((CamelLocalFolder *)folder, parent_store, full_name, flags, ex); - - if (camel_url_get_param(((CamelService *)parent_store)->url, "xstatus")) - camel_mbox_summary_xstatus((CamelMboxSummary *)folder->summary, TRUE); + if (folder) { + if (camel_url_get_param(((CamelService *)parent_store)->url, "xstatus")) + camel_mbox_summary_xstatus((CamelMboxSummary *)folder->summary, TRUE); + } return folder; } diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c index 6c26f780a0..b1e7c7e091 100644 --- a/camel/providers/local/camel-spool-store.c +++ b/camel/providers/local/camel-spool-store.c @@ -23,7 +23,9 @@ #include #endif +#include #include +#include #include #include #include @@ -134,21 +136,52 @@ construct (CamelService *service, CamelSession *session, CamelProvider *provider static CamelFolder * get_folder(CamelStore * store, const char *folder_name, guint32 flags, CamelException * ex) { - CamelFolder *folder; + CamelFolder *folder = NULL; + int fd; + struct stat st; + char *name; d(printf("opening folder %s on path %s\n", folder_name, path)); /* we only support an 'INBOX' in mbox mode */ - if (((CamelSpoolStore *)store)->type == CAMEL_SPOOL_STORE_MBOX - && strcmp(folder_name, "INBOX") != 0) { - camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, - _("Folder `%s/%s' does not exist."), - ((CamelService *)store)->url->path, folder_name); - return NULL; + if (((CamelSpoolStore *)store)->type == CAMEL_SPOOL_STORE_MBOX) { + if (strcmp(folder_name, "INBOX") != 0) { + camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + _("Folder `%s/%s' does not exist."), + ((CamelService *)store)->url->path, folder_name); + } else { + folder = camel_spool_folder_new(store, folder_name, flags, ex); + } + } else { + name = g_strdup_printf("%s%s", CAMEL_LOCAL_STORE(store)->toplevel_dir, folder_name); + if (stat(name, &st) == -1) { + if (errno != ENOENT) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not open folder `%s':\n%s"), + folder_name, strerror(errno)); + } else if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) { + camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + _("Folder `%s' does not exist."), folder_name); + } else { + fd = open(name, O_CREAT, 0600); + if (fd == -1) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not create folder `%s':\n%s"), + folder_name, strerror(errno)); + } else { + close(fd); + folder = camel_spool_folder_new(store, folder_name, flags, ex); + } + } + } else if (!S_ISREG(st.st_mode)) { + camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + _("`%s' is not a mailbox file."), name); + } else { + folder = camel_spool_folder_new(store, folder_name, flags, ex); + } + g_free(name); } - folder = camel_spool_folder_new(store, folder_name, flags, ex); - return folder; } @@ -246,12 +279,40 @@ static int scan_dir(CamelStore *store, GHashTable *visited, char *root, const ch } else name = root; + if (stat(name, &st) == -1) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not scan folder `%s': %s"), + name, strerror(errno)); + } else if (S_ISREG(st.st_mode)) { + /* incase we start scanning from a file. messy duplication :-/ */ + if (path) { + CAMEL_STORE_LOCK(store, cache_lock); + folder = g_hash_table_lookup(store->folders, path); + if (folder) + unread = camel_folder_get_unread_message_count(folder); + else + unread = -1; + CAMEL_STORE_UNLOCK(store, cache_lock); + tmp = strrchr(path, '/'); + if (tmp) + tmp++; + else + tmp = (char *)path; + uri = g_strdup_printf("%s:%s#%s", ((CamelService *)store)->url->protocol, root, path); + fi = camel_folder_info_new(uri, path, tmp, unread); + fi->parent = parent; + fi->sibling = *fip; + *fip = fi; + g_free(uri); + } + return 0; + } + dir = opendir(name); if (dir == NULL) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, _("Could not scan folder `%s': %s"), - root, strerror(errno)); - g_free(name); + name, strerror(errno)); return -1; } @@ -298,8 +359,9 @@ static int scan_dir(CamelStore *store, GHashTable *visited, char *root, const ch if (folder == NULL) { fp = fopen(tmp, "r"); if (fp != NULL) { - if (fgets(from, sizeof(from), fp) != NULL - && strncmp(from, "From ", 5) == 0) { + if (st.st_size == 0 + || (fgets(from, sizeof(from), fp) != NULL + && strncmp(from, "From ", 5) == 0)) { folder = (CamelFolder *)1; /* TODO: if slow mode selected, we could look up unread counts here - but its pretty expensive */ -- cgit v1.2.3