aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2001-08-20 15:30:25 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2001-08-20 15:30:25 +0800
commit3d36457b2cd4b52492f58e16914ca75d7932a46e (patch)
treef815041010f5e9a8e106cb9e5d36d52663854ba9
parent41dcb0c01b44af388aa51a200d411ea4fe2eeb83 (diff)
downloadgsoc2013-evolution-3d36457b2cd4b52492f58e16914ca75d7932a46e.tar.gz
gsoc2013-evolution-3d36457b2cd4b52492f58e16914ca75d7932a46e.tar.zst
gsoc2013-evolution-3d36457b2cd4b52492f58e16914ca75d7932a46e.zip
Get the entire directory structure for the folder we just created, meaning
2001-08-20 Jeffrey Stedfast <fejj@ximian.com> * 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
-rw-r--r--camel/providers/imap/camel-imap-store.c36
-rw-r--r--camel/providers/imap/camel-imap-utils.c50
-rw-r--r--camel/providers/imap/camel-imap-utils.h29
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);