diff options
-rw-r--r-- | camel/ChangeLog | 6 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap4-store.c | 63 |
2 files changed, 63 insertions, 6 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 6f75862c09..675892f47e 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,11 @@ 2004-06-23 Jeffrey Stedfast <fejj@novell.com> + * providers/imap4/camel-imap4-store.c (imap4_get_folder_info): + First LIST/LSUB the toplevel folder, and then LIST/LSUB the + subfolders (it needs to be 2 commands to work properly). + (imap4_delete_folder): CLOSE the folder we are about to DELETE if + it is currently SELECTED. + * providers/imap/camel-imap-provider.c (imap_url_equal): Same. * providers/imap4/camel-imap4-provider.c (imap4_url_equal): Check diff --git a/camel/providers/imap4/camel-imap4-store.c b/camel/providers/imap4/camel-imap4-store.c index 834ff93252..26a9186a03 100644 --- a/camel/providers/imap4/camel-imap4-store.c +++ b/camel/providers/imap4/camel-imap4-store.c @@ -871,7 +871,8 @@ static void imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; - CamelIMAP4Command *ic; + CamelFolder *selected = (CamelFolder *) engine->folder; + CamelIMAP4Command *ic, *ic0 = NULL; CamelFolderInfo *fi; char *utf7_name; CamelURL *url; @@ -888,6 +889,9 @@ imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException CAMEL_SERVICE_LOCK (store, connect_lock); + if (selected && !strcmp (folder_name, selected->full_name)) + ic0 = camel_imap4_engine_queue (engine, NULL, "CLOSE\r\n"); + utf7_name = imap4_folder_utf7_name (store, folder_name, '\0'); ic = camel_imap4_engine_queue (engine, NULL, "DELETE %S\r\n", utf7_name); g_free (utf7_name); @@ -896,12 +900,22 @@ imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException ; if (id == -1 || ic->status != CAMEL_IMAP4_COMMAND_COMPLETE) { - camel_exception_xfer (ex, &ic->ex); + if (ic0 && ic0->status != CAMEL_IMAP4_COMMAND_COMPLETE) + camel_exception_xfer (ex, &ic0->ex); + else + camel_exception_xfer (ex, &ic->ex); + + if (ic0 != NULL) + camel_imap4_command_unref (ic0); + camel_imap4_command_unref (ic); CAMEL_SERVICE_UNLOCK (store, connect_lock); return; } + if (ic0 != NULL) + camel_imap4_command_unref (ic0); + switch (ic->result) { case CAMEL_IMAP4_RESULT_OK: /* deleted */ @@ -1115,6 +1129,7 @@ imap4_build_folder_info (CamelStore *store, const char *top, guint32 flags, GPtr if (!(flags & CAMEL_STORE_FOLDER_INFO_FAST)) { if (folder && !strcmp (folder->full_name, fi->full_name)) { + /* can't STATUS this folder since it is SELECTED, besides - it would be wasteful */ CamelMessageInfo *info; int index; @@ -1154,12 +1169,13 @@ static CamelFolderInfo * imap4_get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelException *ex) { CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + CamelIMAP4Command *ic, *ic0 = NULL; CamelFolderInfo *fi = NULL; camel_imap4_list_t *list; - CamelIMAP4Command *ic; GPtrArray *array; const char *cmd; char *pattern; + char wildcard; int id, i; CAMEL_SERVICE_LOCK (store, connect_lock); @@ -1179,22 +1195,57 @@ imap4_get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelE if (top == NULL) top = ""; - pattern = imap4_folder_utf7_name (store, top, (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) ? '*' : '%'); + wildcard = (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) ? '*' : '%'; + pattern = imap4_folder_utf7_name (store, top, wildcard); + array = g_ptr_array_new (); + + if (*top != '\0') { + size_t len; + char sep; + + len = strlen (pattern); + sep = pattern[len - 2]; + pattern[len - 2] = '\0'; + + ic0 = camel_imap4_engine_queue (engine, NULL, "%s \"\" %S\r\n", cmd, pattern); + camel_imap4_command_register_untagged (ic0, cmd, camel_imap4_untagged_list); + ic0->user_data = array; + + pattern[len - 2] = sep; + } + ic = camel_imap4_engine_queue (engine, NULL, "%s \"\" %S\r\n", cmd, pattern); camel_imap4_command_register_untagged (ic, cmd, camel_imap4_untagged_list); - ic->user_data = array = g_ptr_array_new (); + ic->user_data = array; while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1) ; if (id == -1 || ic->status != CAMEL_IMAP4_COMMAND_COMPLETE) { - camel_exception_xfer (ex, &ic->ex); + if (ic0 && ic0->status != CAMEL_IMAP4_COMMAND_COMPLETE) + camel_exception_xfer (ex, &ic0->ex); + else + camel_exception_xfer (ex, &ic->ex); + + if (ic0 != NULL) + camel_imap4_command_unref (ic0); camel_imap4_command_unref (ic); + + for (i = 0; i < array->len; i++) { + list = array->pdata[i]; + g_free (list->name); + g_free (list); + } + g_ptr_array_free (array, TRUE); g_free (pattern); + goto done; } + if (ic0 != NULL) + camel_imap4_command_unref (ic0); + if (ic->result != CAMEL_IMAP4_RESULT_OK) { camel_imap4_command_unref (ic); |