From 7d76ff550168871217e6d483f965ce430427c536 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 14 Feb 2001 21:51:33 +0000 Subject: New method to create a folder when you don't know its full name. * camel-store.c (camel_store_create_folder): New method to create a folder when you don't know its full name. * providers/imap/camel-imap-store.c (create_folder): Implement. svn path=/trunk/; revision=8231 --- camel/ChangeLog | 7 +++++ camel/camel-store.c | 42 ++++++++++++++++++++++++++++- camel/camel-store.h | 8 ++++++ camel/providers/imap/camel-imap-store.c | 47 +++++++++++++++++++++++++++------ 4 files changed, 95 insertions(+), 9 deletions(-) diff --git a/camel/ChangeLog b/camel/ChangeLog index 5a0d7bfdaf..123aaef782 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,10 @@ +2001-02-14 Dan Winship + + * camel-store.c (camel_store_create_folder): New method to create + a folder when you don't know its full name. + + * providers/imap/camel-imap-store.c (create_folder): Implement. + 2001-02-12 Not Zed * camel-mime-part.c (init_header_name_table): Add address headers diff --git a/camel/camel-store.c b/camel/camel-store.c index e7bd25a4be..bc86a72232 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -42,6 +42,10 @@ static CamelFolder *get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); static CamelFolder *get_inbox (CamelStore *store, CamelException *ex); +static CamelFolderInfo *create_folder (CamelStore *store, + const char *parent_name, + const char *folder_name, + CamelException *ex); static void delete_folder (CamelStore *store, const char *folder_name, CamelException *ex); static void rename_folder (CamelStore *store, const char *old_name, @@ -68,6 +72,7 @@ camel_store_class_init (CamelStoreClass *camel_store_class) camel_store_class->compare_folder_name = g_str_equal; camel_store_class->get_folder = get_folder; camel_store_class->get_inbox = get_inbox; + camel_store_class->create_folder = create_folder; camel_store_class->delete_folder = delete_folder; camel_store_class->rename_folder = rename_folder; camel_store_class->sync = store_sync; @@ -211,6 +216,42 @@ camel_store_get_folder (CamelStore *store, const char *folder_name, guint32 flag } +static CamelFolderInfo * +create_folder (CamelStore *store, const char *parent_name, + const char *folder_name, CamelException *ex) +{ + g_warning ("CamelStore::create_folder not implemented for `%s'", + camel_type_to_name (CAMEL_OBJECT_GET_TYPE (store))); + return NULL; +} + +/** + * camel_store_create_folder: + * @store: a CamelStore + * @parent_name: name of the new folder's parent, or %NULL + * @folder_name: name of the folder to create + * @ex: a CamelException + * + * Creates a new folder as a child of an existing folder. + * @parent_name can be %NULL to create a new top-level folder. + * + * Return value: info about the created folder, which the caller must + * free with camel_store_free_folder_info(). + **/ +CamelFolderInfo * +camel_store_create_folder (CamelStore *store, const char *parent_name, + const char *folder_name, CamelException *ex) +{ + CamelFolderInfo *fi; + + CAMEL_STORE_LOCK(store, folder_lock); + fi = CS_CLASS (store)->create_folder (store, parent_name, folder_name, ex); + CAMEL_STORE_UNLOCK(store, folder_lock); + + return fi; +} + + static void delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) { @@ -232,7 +273,6 @@ camel_store_delete_folder (CamelStore *store, const char *folder_name, CamelExce CAMEL_STORE_LOCK(store, folder_lock); CS_CLASS (store)->delete_folder (store, folder_name, ex); CAMEL_STORE_UNLOCK(store, folder_lock); - } diff --git a/camel/camel-store.h b/camel/camel-store.h index da81a435f0..cd53b7813d 100644 --- a/camel/camel-store.h +++ b/camel/camel-store.h @@ -83,6 +83,10 @@ typedef struct { CamelFolder * (*get_inbox) (CamelStore *store, CamelException *ex); + CamelFolderInfo *(*create_folder) (CamelStore *store, + const char *parent_name, + const char *folder_name, + CamelException *ex); void (*delete_folder) (CamelStore *store, const char *folder_name, CamelException *ex); @@ -126,6 +130,10 @@ CamelFolder * camel_store_get_folder (CamelStore *store, CamelFolder * camel_store_get_inbox (CamelStore *store, CamelException *ex); +CamelFolderInfo *camel_store_create_folder (CamelStore *store, + const char *parent_name, + const char *folder_name, + CamelException *ex); void camel_store_delete_folder (CamelStore *store, const char *folder_name, CamelException *ex); diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index f19d8feb31..d02a2f991e 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -63,6 +63,7 @@ static GList *query_auth_types (CamelService *service, gboolean connect, CamelEx static guint hash_folder_name (gconstpointer key); static gint compare_folder_name (gconstpointer a, gconstpointer b); static CamelFolder *get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); +static CamelFolderInfo *create_folder (CamelStore *store, const char *parent_name, const char *folder_name, CamelException *ex); static CamelFolderInfo *get_folder_info (CamelStore *store, const char *top, gboolean fast, gboolean recursive, gboolean subscribed_only, @@ -96,6 +97,7 @@ camel_imap_store_class_init (CamelImapStoreClass *camel_imap_store_class) camel_store_class->hash_folder_name = hash_folder_name; camel_store_class->compare_folder_name = compare_folder_name; camel_store_class->get_folder = get_folder; + camel_store_class->create_folder = create_folder; camel_store_class->get_folder_info = get_folder_info; camel_store_class->free_folder_info = camel_store_free_folder_info_full; @@ -681,6 +683,42 @@ get_folder (CamelStore *store, const char *folder_name, guint32 flags, return new_folder; } +static char * +imap_concat (CamelImapStore *imap_store, const char *prefix, const char *suffix) +{ + int len; + + len = strlen (prefix); + if (len > 0 && prefix[len - 1] == imap_store->dir_sep) + return g_strdup_printf ("%s%s", prefix, suffix); + else + return g_strdup_printf ("%s%c%s", prefix, imap_store->dir_sep, suffix); +} + +static CamelFolderInfo * +create_folder (CamelStore *store, const char *parent_name, + const char *folder_name, CamelException *ex) +{ + CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); + CamelFolderInfo *fi; + char *full_name; + + if (parent_name) + full_name = imap_concat (imap_store, parent_name, folder_name); + else + full_name = g_strdup (folder_name); + + imap_create (imap_store, full_name, ex); + if (camel_exception_is_set (ex)) { + g_free (full_name); + return NULL; + } + + fi = get_folder_info (store, full_name, FALSE, FALSE, FALSE, ex); + g_free (full_name); + return fi; +} + static CamelFolderInfo * parse_list_response_as_folder_info (CamelImapStore *imap_store, const char *response) @@ -839,14 +877,7 @@ get_folder_info (CamelStore *store, const char *top, gboolean fast, if (subscribed_only && !imap_store->useful_lsub) get_subscribed_folders_by_hand (imap_store, name, folders, ex); else { - if (*name && name[strlen (name) - 1] != imap_store->dir_sep) { - pattern = g_strdup_printf ("%s%c%c", name, - imap_store->dir_sep, - recursive ? '*' : '%'); - } else { - pattern = g_strdup_printf ("%s%c", name, - recursive ? '*' : '%'); - } + pattern = imap_concat (imap_store, name, recursive ? "*" : "%"); get_folders (imap_store, pattern, folders, subscribed_only, ex); g_free (pattern); } -- cgit v1.2.3