diff options
-rw-r--r-- | camel/ChangeLog | 8 | ||||
-rw-r--r-- | camel/camel-store.c | 33 | ||||
-rw-r--r-- | camel/camel-vee-store.c | 1 |
3 files changed, 28 insertions, 14 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 8ec5a4f3b7..db705d2b8e 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,11 @@ +2001-10-04 <NotZed@Ximian.com> + + * camel-store.c (camel_store_delete_folder): Change the order of + execution slightly. We delete the folder first, then call the + classes delete folder, then cleanup the hashtable afterwards. + This is so deletes of vfolders work, since vee-store uses the + folder hashtable to store all of is vfolders :-/ + 2001-10-04 Jeffrey Stedfast <fejj@ximian.com> * camel-service.c (camel_service_connect): Unregister the diff --git a/camel/camel-store.c b/camel/camel-store.c index 96c6a0c8bc..792dd6c6f9 100644 --- a/camel/camel-store.c +++ b/camel/camel-store.c @@ -320,32 +320,39 @@ void camel_store_delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) { CamelFolder *folder = NULL; + char *key; CAMEL_STORE_LOCK(store, folder_lock); /* if we deleted a folder, force it out of the cache, and also out of the vtrash if setup */ if (store->folders) { - char *key; - + CAMEL_STORE_LOCK(store, cache_lock); + folder = g_hash_table_lookup(store->folders, folder_name); + if (folder) + camel_object_ref((CamelObject *)folder); + CAMEL_STORE_UNLOCK(store, cache_lock); + + if (folder) { + if (store->vtrash) + camel_vee_folder_remove_folder((CamelVeeFolder *)store->vtrash, folder); + camel_folder_delete (folder); + } + } + + CS_CLASS (store)->delete_folder (store, folder_name, ex); + + if (folder) + camel_object_unref((CamelObject *)folder); + + if (store->folders) { CAMEL_STORE_LOCK(store, cache_lock); if (g_hash_table_lookup_extended(store->folders, folder_name, (void **)&key, (void **)&folder)) { g_hash_table_remove (store->folders, key); g_free (key); - camel_object_ref (CAMEL_OBJECT (folder)); } - CAMEL_STORE_UNLOCK(store, cache_lock); } - if (folder) { - if (store->vtrash) - camel_vee_folder_remove_folder((CamelVeeFolder *)store->vtrash, folder); - camel_folder_delete (folder); - camel_object_unref (CAMEL_OBJECT (folder)); - } - - CS_CLASS (store)->delete_folder (store, folder_name, ex); - CAMEL_STORE_UNLOCK(store, folder_lock); } diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c index a5e2a43070..4530c34ee2 100644 --- a/camel/camel-vee-store.c +++ b/camel/camel-vee-store.c @@ -261,7 +261,6 @@ vee_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex if (store->vtrash) camel_vee_folder_remove_folder((CamelVeeFolder *)store->vtrash, folder); - /* FIXME: deleted event shoudl just pass out the folder name, not all this shit?? */ if (update) { CamelFolderInfo *fi = g_malloc0(sizeof(*fi)); |