aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/ChangeLog9
-rw-r--r--camel/providers/imap/camel-imap-store.c103
2 files changed, 108 insertions, 4 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 37c85c6e20..ec2d5118a6 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,12 @@
+2004-04-08 Jeffrey Stedfast <fejj@ximian.com>
+
+ * providers/imap/camel-imap-store.c (get_folder_online): Changed
+ (!flags & _CREATE) to (!(flags & _CREATE))
+ (get_folder_online): Do what create_folder() does and if the
+ parent folder has \NoInferiors set but contains no messages,
+ delete the parent folder and recreate it before creating the child
+ folder. Fixes bug #56651.
+
2004-04-08 Not Zed <NotZed@Ximian.com>
* camel-folder.h (camel_folder_delete_message): always set the
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 163e8f0360..5b083972be 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -1774,7 +1774,7 @@ get_folder_online (CamelStore *store, const char *folder_name, guint32 flags, Ca
}
response = camel_imap_command (imap_store, NULL, ex, "SELECT %F", folder_name);
if (!response) {
- char *folder_real;
+ char *folder_real, *parent_name, *parent_real;
const char *c;
if (camel_exception_get_id(ex) == CAMEL_EXCEPTION_USER_CANCEL) {
@@ -1784,7 +1784,7 @@ get_folder_online (CamelStore *store, const char *folder_name, guint32 flags, Ca
camel_exception_clear (ex);
- if (!flags & CAMEL_STORE_FOLDER_CREATE) {
+ if (!(flags & CAMEL_STORE_FOLDER_CREATE)) {
CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
camel_exception_setv (ex, CAMEL_EXCEPTION_STORE_NO_FOLDER,
_("No such folder %s"), folder_name);
@@ -1803,10 +1803,105 @@ get_folder_online (CamelStore *store, const char *folder_name, guint32 flags, Ca
return NULL;
}
+ if ((parent_name = strrchr (folder_name, '/'))) {
+ parent_name = g_strndup (folder_name, parent_name - folder_name);
+ parent_real = camel_imap_store_summary_path_to_full (imap_store->summary, parent_name, store->dir_sep);
+ } else {
+ parent_real = NULL;
+ }
+
+ if (parent_real != NULL) {
+ gboolean need_convert = FALSE;
+ char *resp, *thisone;
+ guint32 flags;
+ int i;
+
+ if (!(response = camel_imap_command (imap_store, NULL, ex, "LIST \"\" %S", parent_real))) {
+ CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
+ g_free (parent_name);
+ g_free (parent_real);
+ return NULL;
+ }
+
+ /* FIXME: does not handle unexpected circumstances very well */
+ for (i = 0; i < response->untagged->len; i++) {
+ resp = response->untagged->pdata[i];
+
+ if (!imap_parse_list_response (imap_store, resp, &flags, NULL, &thisone))
+ continue;
+
+ if (!strcmp (parent_name, thisone)) {
+ if (flags & CAMEL_FOLDER_NOINFERIORS)
+ need_convert = TRUE;
+ }
+
+ g_free (thisone);
+ }
+
+ camel_imap_response_free (imap_store, response);
+
+ /* if not, check if we can delete it and recreate it */
+ if (need_convert) {
+ struct imap_status_item *items, *item;
+ guint32 messages = 0;
+ CamelException lex;
+ char *name;
+
+ item = items = get_folder_status (imap_store, parent_name, "MESSAGES");
+ while (item != NULL) {
+ if (!g_ascii_strcasecmp (item->name, "MESSAGES")) {
+ messages = item->value;
+ break;
+ }
+
+ item = item->next;
+ }
+
+ imap_status_item_free (items);
+
+ if (messages > 0) {
+ camel_exception_set (ex, CAMEL_EXCEPTION_FOLDER_INVALID_STATE,
+ _("The parent folder is not allowed to contain subfolders"));
+ CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
+ g_free (parent_name);
+ g_free (parent_real);
+ return NULL;
+ }
+
+ /* delete the old parent and recreate it */
+ camel_exception_init (&lex);
+ delete_folder (store, parent_name, &lex);
+ if (camel_exception_is_set (&lex)) {
+ CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
+ camel_exception_xfer (ex, &lex);
+ g_free (parent_name);
+ g_free (parent_real);
+ return NULL;
+ }
+
+ /* add the dirsep to the end of parent_name */
+ name = g_strdup_printf ("%s%c", parent_real, imap_store->dir_sep);
+ response = camel_imap_command (imap_store, NULL, ex, "CREATE %S",
+ name);
+ g_free (name);
+
+ if (!response) {
+ CAMEL_SERVICE_UNLOCK (imap_store, connect_lock);
+ g_free (parent_name);
+ g_free (parent_real);
+ return NULL;
+ } else
+ camel_imap_response_free (imap_store, response);
+ }
+
+ g_free (parent_real);
+ }
+
+ g_free (parent_name);
+
folder_real = camel_imap_store_summary_path_to_full(imap_store->summary, folder_name, store->dir_sep);
-
response = camel_imap_command (imap_store, NULL, ex, "CREATE %S", folder_real);
-
+
if (response) {
camel_imap_store_summary_add_from_full(imap_store->summary, folder_real, store->dir_sep);