From d584e7e56897886e417563473dee00e409def0b3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 7 Jun 2004 00:30:49 +0000 Subject: Implemented, mostly. Still need to update state on the renamed folder 2004-06-06 Jeffrey Stedfast * providers/imap4/camel-imap4-store.c (imap4_rename_folder): Implemented, mostly. Still need to update state on the renamed folder object if instantiated and rename the on-disk cache directory. * providers/imap4/camel-imap4-folder.c (camel_imap4_folder_finalize): Free the cachedir. (camel_imap4_folder_new): Init the cachedir and load the saved summary before updating it against the server summary. * providers/imap4/camel-imap4-store.c (camel_imap4_store_finalize): Free the storage_path. (imap4_construct): Init the storage_path. svn path=/trunk/; revision=26233 --- camel/providers/imap4/camel-imap4-store.c | 64 ++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) (limited to 'camel/providers/imap4/camel-imap4-store.c') diff --git a/camel/providers/imap4/camel-imap4-store.c b/camel/providers/imap4/camel-imap4-store.c index e9caff509a..fbead28e68 100644 --- a/camel/providers/imap4/camel-imap4-store.c +++ b/camel/providers/imap4/camel-imap4-store.c @@ -149,13 +149,21 @@ camel_imap4_store_finalize (CamelObject *object) if (store->engine) camel_object_unref (store->engine); + + g_free (store->storage_path); } static void imap4_construct (CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex) { + CamelIMAP4Store *imap_store = (CamelIMAP4Store *) service; + CAMEL_SERVICE_CLASS (parent_class)->construct (service, session, provider, url, ex); + if (camel_exception_is_set (ex)) + return; + + imap_store->storage_path = camel_session_get_storage_path (session, service, ex); } static char * @@ -884,6 +892,7 @@ imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException switch (ic->result) { case CAMEL_IMAP4_RESULT_OK: /* deleted */ + /* FIXME: emit the "folder_deleted" signal? */ /*fi = imap4_build_folder_info (store, folder_name); camel_object_trigger_event (store, "folder_deleted", fi); camel_folder_info_free (fi);*/ @@ -909,7 +918,58 @@ imap4_delete_folder (CamelStore *store, const char *folder_name, CamelException static void imap4_rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex) { - + CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine; + char *old_uname, *new_uname; + CamelIMAP4Command *ic; + int id; + + if (!g_ascii_strcasecmp (old_name, "INBOX")) { + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Cannot rename folder `%s' to `%s': Special folder"), + old_name, new_name); + + return; + } + + CAMEL_SERVICE_LOCK (store, connect_lock); + + old_uname = imap4_folder_utf7_name (store, old_name, '\0'); + new_uname = imap4_folder_utf7_name (store, new_name, '\0'); + + ic = camel_imap4_engine_queue (engine, NULL, "RENAME %S %S\r\n", old_uname, new_uname); + g_free (old_uname); + g_free (new_uname); + + 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); + camel_imap4_command_unref (ic); + CAMEL_SERVICE_UNLOCK (store, connect_lock); + return; + } + + switch (ic->result) { + case CAMEL_IMAP4_RESULT_OK: + /* FIXME: need to update state on the renamed folder object */ + break; + case CAMEL_IMAP4_RESULT_NO: + /* FIXME: would be good to save the NO reason into the err message */ + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Cannot rename folder `%s' to `%s': Invalid mailbox name"), + old_name, new_name); + break; + case CAMEL_IMAP4_RESULT_BAD: + camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, + _("Cannot rename folder `%s' to `%s': Bad command"), + old_name, new_name); + break; + } + + camel_imap4_command_unref (ic); + + CAMEL_SERVICE_UNLOCK (store, connect_lock); } static int @@ -1093,6 +1153,7 @@ imap4_subscribe_folder (CamelStore *store, const char *folder_name, CamelExcepti switch (ic->result) { case CAMEL_IMAP4_RESULT_OK: /* subscribed */ + /* FIXME: emit the "folder_subscribed" signal? */ /*fi = imap4_build_folder_info (store, folder_name); fi->flags |= CAMEL_FOLDER_NOCHILDREN; camel_object_trigger_event (store, "folder_subscribed", fi); @@ -1143,6 +1204,7 @@ imap4_unsubscribe_folder (CamelStore *store, const char *folder_name, CamelExcep switch (ic->result) { case CAMEL_IMAP4_RESULT_OK: /* unsubscribed */ + /* FIXME: emit the "folder_unsubscribed" signal? */ /*fi = imap4_build_folder_info (store, folder_name); camel_object_trigger_event (store, "folder_unsubscribed", fi); camel_folder_info_free (fi);*/ -- cgit v1.2.3