diff options
Diffstat (limited to 'camel/providers/local/camel-local-store.c')
-rw-r--r-- | camel/providers/local/camel-local-store.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c index 918b8db420..9b48b91175 100644 --- a/camel/providers/local/camel-local-store.c +++ b/camel/providers/local/camel-local-store.c @@ -44,10 +44,10 @@ 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 delete_folder(CamelStore *store, const char *folder_name, CamelException *ex); static void rename_folder(CamelStore *store, const char *old, const char *new, CamelException *ex); +static CamelFolderInfo *create_folder(CamelStore *store, const char *parent_name, const char *folder_name, CamelException *ex); static CamelStoreClass *parent_class = NULL; @@ -67,6 +67,7 @@ camel_local_store_class_init (CamelLocalStoreClass *camel_local_store_class) camel_store_class->get_folder_info = get_folder_info; camel_store_class->free_folder_info = camel_store_free_folder_info_full; + camel_store_class->create_folder = create_folder; camel_store_class->delete_folder = delete_folder; camel_store_class->rename_folder = rename_folder; } @@ -202,6 +203,53 @@ get_folder_info (CamelStore *store, const char *top, return NULL; } +static CamelFolderInfo * +create_folder(CamelStore *store, const char *parent_name, const char *folder_name, CamelException *ex) +{ + char *path = ((CamelLocalStore *)store)->toplevel_dir; + char *name; + CamelFolder *folder; + CamelFolderInfo *info = NULL; + struct stat st; + + /* 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 (stat(name, &st) == 0 || errno != ENOENT) { + camel_exception_setv(ex, CAMEL_EXCEPTION_STORE_NO_FOLDER, + _("Cannot get folder: %s: %s"), name, strerror(errno)); + g_free(name); + return NULL; + } + + g_free(name); + + name = g_strdup_printf("%s/%s", parent_name, folder_name); + + folder = ((CamelStoreClass *)((CamelObject *)store)->classfuncs)->get_folder(store, name, CAMEL_STORE_FOLDER_CREATE, ex); + if (folder) { + camel_object_unref((CamelObject *)folder); + info = ((CamelStoreClass *)((CamelObject *)store)->classfuncs)->get_folder_info(store, name, 0, ex); + + /* get_folder(CREATE) will emit a folder_created event for us */ + /*if (info) + camel_object_trigger_event((CamelObject *)store, "folder_created", info);*/ + } + + g_free(name); + + return info; +} + static int xrename(const char *oldp, const char *newp, const char *prefix, const char *suffix, int missingok, CamelException *ex) { struct stat st; |