aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/local/camel-spool-store.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2001-06-18 22:36:44 +0800
committerMichael Zucci <zucchi@src.gnome.org>2001-06-18 22:36:44 +0800
commite905364beee184b99637029de7151b43339b2e1c (patch)
tree70761b71502abd250930cedeacc6fa191dac2bff /camel/providers/local/camel-spool-store.c
parent5255cb6d496630adb35934b850d8b064c3121c74 (diff)
downloadgsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar.gz
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar.bz2
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar.lz
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar.xz
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.tar.zst
gsoc2013-evolution-e905364beee184b99637029de7151b43339b2e1c.zip
Only create a missing uid if we have indexing turned on.
2001-06-18 Not Zed <NotZed@Ximian.com> * camel-folder-summary.c (camel_folder_summary_info_new_from_parser): Only create a missing uid if we have indexing turned on. * camel-lock-helper.c (setup_process): Function to setup process/sanity/security checks. Change to the real uid as soon as we can. (lock_path): First try to lock as the real uid, if that fails, try the root uid. (unlock_id): Unlock as the uid we created the lock as. * Makefile.am (INCLUDES): Added -DCAMEL_SBINDIR for lock helper location. * providers/local/camel-spool-folder.c (spool_lock): Implemented, using lock helper locking. Need to work out if the locking requires a root created lock? (spool_unlock): Likewise. 2001-06-15 Not Zed <NotZed@Ximian.com> * camel-lock-helper.c: Setuid Lock helper process. Creates and manages .locks, keeping them active, removing them, etc. What real perms it needs is a little system dependent. 2001-06-14 Not Zed <NotZed@Ximian.com> * providers/local/camel-maildir-store.c (get_folder_info): Implement. (scan_dir): Does the work of scanning for maildir directories. 2001-06-13 Not Zed <NotZed@Ximian.com> * providers/local/camel-spool-store.c (get_folder_info): Implemented, just returns a hardcoded INBOX folder. (free_folder_info): implemented, free's the 1 possible level of folder info. * providers/local/camel-spool-folder.c (camel_spool_folder_construct): Set the real unread message count on the folder_created thing. svn path=/trunk/; revision=10261
Diffstat (limited to 'camel/providers/local/camel-spool-store.c')
-rw-r--r--camel/providers/local/camel-spool-store.c91
1 files changed, 64 insertions, 27 deletions
diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c
index 5ef47347d1..655050c5f4 100644
--- a/camel/providers/local/camel-spool-store.c
+++ b/camel/providers/local/camel-spool-store.c
@@ -46,8 +46,9 @@ static CamelFolder *get_folder(CamelStore * store, const char *folder_name, guin
static char *get_name(CamelService *service, gboolean brief);
static CamelFolder *get_inbox (CamelStore *store, CamelException *ex);
static void rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex);
-static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top,
- guint32 flags, CamelException *ex);
+static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelException *ex);
+static void free_folder_info (CamelStore *store, CamelFolderInfo *fi);
+
static void delete_folder(CamelStore *store, const char *folder_name, CamelException *ex);
static void rename_folder(CamelStore *store, const char *old, const char *new, CamelException *ex);
@@ -67,7 +68,7 @@ camel_spool_store_class_init (CamelSpoolStoreClass *camel_spool_store_class)
camel_store_class->get_folder = get_folder;
camel_store_class->get_inbox = get_inbox;
camel_store_class->get_folder_info = get_folder_info;
- camel_store_class->free_folder_info = camel_store_free_folder_info_full;
+ camel_store_class->free_folder_info = free_folder_info;
camel_store_class->delete_folder = delete_folder;
camel_store_class->rename_folder = rename_folder;
@@ -95,15 +96,42 @@ static void
construct (CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex)
{
int len;
+ char *path, *name;
+ struct stat st;
+
+ printf("constructing store of type %s '%s:%s'\n",
+ camel_type_to_name(((CamelObject *)service)->s.type), url->protocol, url->path);
CAMEL_SERVICE_CLASS (parent_class)->construct (service, session, provider, url, ex);
if (camel_exception_is_set (ex))
return;
+ if (service->url->path[0] != '/') {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
+ _("Store root %s is not an absolute path"), service->url->path);
+ return;
+ }
+
len = strlen (service->url->path);
- if (service->url->path[len - 1] != '/') {
+ if (len > 0 && service->url->path[len - 1] == '/') {
service->url->path = g_realloc (service->url->path, len + 2);
- strcpy (service->url->path + len, "/");
+ service->url->path[len-1] = 0;
+ }
+
+ path = service->url->path;
+ len = strlen(path);
+ name = path;
+#if 0
+ name = alloca(len+1);
+ strcpy(name, path);
+ name[len-1] = 0;
+#endif
+
+ if (stat(name, &st) == -1 || !S_ISREG(st.st_mode)) {
+ camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
+ _("Spool `%s' does not exist or is not a regular file"),
+ path);
+ return;
}
}
@@ -119,35 +147,26 @@ camel_spool_store_get_toplevel_dir (CamelSpoolStore *store)
static CamelFolder *
get_folder(CamelStore * store, const char *folder_name, guint32 flags, CamelException * ex)
{
- struct stat st;
char *path = ((CamelService *)store)->url->path;
char *name;
+ int len;
- 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", CAMEL_SERVICE(store)->url->path, folder_name);
+ printf("opening folder %s on path %s\n", folder_name, path);
- if (stat(name, &st) == -1) {
+ /* we only support an 'INBOX' */
+ if (strcmp(folder_name, "INBOX") != 0) {
camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
_("Folder `%s/%s' does not exist."),
path, folder_name);
- g_free(name);
- return NULL;
- } 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;
}
- g_free(name);
+ len = strlen(path);
+ name = alloca(len+1);
+ strcpy(name, path);
+ name[len-1] = 0;
- return camel_spool_folder_new(store, folder_name, flags, ex);
+ return camel_spool_folder_new(store, name, flags, ex);
}
static CamelFolder *
@@ -171,12 +190,30 @@ static CamelFolderInfo *
get_folder_info (CamelStore *store, const char *top,
guint32 flags, CamelException *ex)
{
- /* FIXME: This is broken, but it corresponds to what was
- * there before.
- */
- return NULL;
+ CamelFolderInfo *fi = NULL;
+ CamelService *service = (CamelService *)store;
+
+ if (top == NULL || strcmp(top, "/INBOX") == 0) {
+ /* FIXME: if the folder is opened we could look it up? */
+ fi = g_malloc0(sizeof(*fi));
+ fi->full_name = "/INBOX";
+ fi->name = "INBOX";
+ fi->url = g_strdup_printf("spool://%s#%s", service->url->path, fi->name);
+ fi->unread_message_count = -1;
+ }
+
+ return fi;
}
+static void free_folder_info (CamelStore *store, CamelFolderInfo *fi)
+{
+ if (fi) {
+ g_free(fi->url);
+ g_free(fi);
+ }
+}
+
+
/* default implementation, rename all */
static void
rename_folder(CamelStore *store, const char *old, const char *new, CamelException *ex)