From 3d36457b2cd4b52492f58e16914ca75d7932a46e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 20 Aug 2001 07:30:25 +0000 Subject: Get the entire directory structure for the folder we just created, meaning 2001-08-20 Jeffrey Stedfast * providers/imap/camel-imap-store.c (create_folder): Get the entire directory structure for the folder we just created, meaning if we created a folder named "test.mailbox" where test didn't previously exist, get the listing for "test" and "test.mailbox". * providers/imap/camel-imap-utils.c (imap_parse_folder_name): New function. svn path=/trunk/; revision=12258 --- camel/providers/imap/camel-imap-store.c | 36 ++++++++++++++++++++---- camel/providers/imap/camel-imap-utils.c | 50 +++++++++++++++++++++++++++++++++ camel/providers/imap/camel-imap-utils.h | 29 +++++++++++-------- 3 files changed, 98 insertions(+), 17 deletions(-) diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index cde667d9cc..fbdc092dc8 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -992,10 +992,11 @@ create_folder (CamelStore *store, const char *parent_name, const char *folder_name, CamelException *ex) { CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); - CamelImapResponse *response; - CamelFolderInfo *fi; char *full_name, *resp, *thisone; + CamelImapResponse *response; + CamelFolderInfo *root, *fi; gboolean need_convert; + char **pathnames; int i, flags; if (!camel_disco_store_check_online (CAMEL_DISCO_STORE (store), ex)) @@ -1063,14 +1064,37 @@ create_folder (CamelStore *store, const char *parent_name, full_name = imap_concat (imap_store, parent_name, folder_name); response = camel_imap_command (imap_store, NULL, ex, "CREATE %F", full_name); + g_free (full_name); + if (response) { + CamelFolderInfo *parent; + camel_imap_response_free (imap_store, response); - fi = get_folder_info_online (store, full_name, 0, ex); + + /* We have to do this in case we are creating a + recursive directory structure */ + pathnames = imap_parse_folder_name (imap_store, folder_name); + full_name = imap_concat (imap_store, parent_name, pathnames[0]); + g_free (pathnames); + parent = root = get_folder_info_online (store, full_name, 0, ex); + g_free (full_name); + for (i = 1; parent && pathnames[i]; i++) { + full_name = imap_concat (imap_store, parent_name, pathnames[i]); + g_free (pathnames); + fi = get_folder_info_online (store, full_name, 0, ex); + g_free (full_name); + + if (!fi) + break; + + fi->parent = parent; + parent->child = fi; + parent = fi; + } } else - fi = NULL; + root = NULL; - g_free (full_name); - return fi; + return root; } static CamelFolderInfo * diff --git a/camel/providers/imap/camel-imap-utils.c b/camel/providers/imap/camel-imap-utils.c index ce547a5198..25154755f4 100644 --- a/camel/providers/imap/camel-imap-utils.c +++ b/camel/providers/imap/camel-imap-utils.c @@ -138,6 +138,56 @@ imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, ch return TRUE; } + +/** + * imap_parse_folder_name: + * @store: + * @folder_name: + * + * Return an array of folder paths representing the folder heirarchy. + * For example: + * Full/Path/"to / from"/Folder + * Results in: + * Full, Full/Path, Full/Path/"to / from", Full/Path/"to / from"/Folder + **/ +char ** +imap_parse_folder_name (CamelImapStore *store, const char *folder_name) +{ + GPtrArray *heirarchy; + char **paths; + const char *p; + + p = folder_name; + if (*p == store->dir_sep) + p++; + + heirarchy = g_ptr_array_new (); + + while (*p) { + if (*p == '"') { + p++; + while (*p && *p != '"') + p++; + if (*p) + p++; + continue; + } + + if (*p == store->dir_sep) + g_ptr_array_add (heirarchy, g_strndup (folder_name, p - folder_name)); + + p++; + } + + g_ptr_array_add (heirarchy, g_strdup (folder_name)); + g_ptr_array_add (heirarchy, NULL); + + paths = (char **) heirarchy->pdata; + g_ptr_array_free (heirarchy, FALSE); + + return paths; +} + char * imap_create_flag_list (guint32 flags) { diff --git a/camel/providers/imap/camel-imap-utils.h b/camel/providers/imap/camel-imap-utils.h index 1d20ffe175..295e491583 100644 --- a/camel/providers/imap/camel-imap-utils.h +++ b/camel/providers/imap/camel-imap-utils.h @@ -37,13 +37,20 @@ char *imap_next_word (const char *buf); #define IMAP_LIST_FLAG_NOSELECT (1 << 1) #define IMAP_LIST_FLAG_MARKED (1 << 2) #define IMAP_LIST_FLAG_UNMARKED (1 << 3) -gboolean imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, char *sep, char **folder); -char *imap_create_flag_list (guint32 flags); -guint32 imap_parse_flag_list (char **flag_list); +gboolean imap_parse_list_response (CamelImapStore *store, const char *buf, int *flags, + char *sep, char **folder); + +char **imap_parse_folder_name (CamelImapStore *store, const char *folder_name); + +char *imap_create_flag_list (guint32 flags); +guint32 imap_parse_flag_list (char **flag_list); + enum { IMAP_STRING, IMAP_NSTRING, IMAP_ASTRING }; -char *imap_parse_string_generic (char **str_p, int *len, int type); + +char *imap_parse_string_generic (char **str_p, int *len, int type); + #define imap_parse_string(str_p, len_p) \ imap_parse_string_generic (str_p, len_p, IMAP_STRING) #define imap_parse_nstring(str_p, len_p) \ @@ -51,16 +58,16 @@ char *imap_parse_string_generic (char **str_p, int *len, int type); #define imap_parse_astring(str_p, len_p) \ imap_parse_string_generic (str_p, len_p, IMAP_ASTRING) -void imap_parse_body (char **body_p, CamelFolder *folder, - CamelMessageContentInfo *ci); +void imap_parse_body (char **body_p, CamelFolder *folder, + CamelMessageContentInfo *ci); -char *imap_quote_string (const char *str); +char *imap_quote_string (const char *str); -void imap_skip_list (char **str_p); +void imap_skip_list (char **str_p); -char * imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids); -GPtrArray *imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids); -void imap_uid_array_free (GPtrArray *arr); +char *imap_uid_array_to_set (CamelFolderSummary *summary, GPtrArray *uids); +GPtrArray *imap_uid_set_to_array (CamelFolderSummary *summary, const char *uids); +void imap_uid_array_free (GPtrArray *arr); char *imap_concat (CamelImapStore *imap_store, const char *prefix, const char *suffix); char *imap_namespace_concat (CamelImapStore *store, const char *name); -- cgit v1.2.3