From 32ee60c025cd00b2cf3f404418f931e53b986ffa Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 2 Feb 2012 01:45:17 +0000 Subject: [PATCH] Monotone-Parent: be64ce923b1780a6ed810e7250748d84ad4425bb Monotone-Revision: 7f9dd19e7f17c342c380ab2a0c551594be6d8762 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-02-02T01:45:17 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 10 ++++++++++ OpenChange/MAPIStoreFolder.h | 2 +- OpenChange/MAPIStoreFolder.m | 8 +++++--- OpenChange/MAPIStoreGCSFolder.m | 30 ++++++++++++++++++++++++++++++ OpenChange/MAPIStoreSOGo.m | 6 +++--- OpenChange/SOGoMAPIFSFolder.m | 17 +++++++++++++++++ OpenChange/SOGoMAPIFSMessage.m | 10 +++++++--- 7 files changed, 73 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ab02014d7..d15bec30a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2012-02-01 Wolfgang Sourdeau + * OpenChange/SOGoMAPIFSMessage.m (-delete): returns the exception + rather than raising it. + + * OpenChange/SOGoMAPIFSFolder.m (-delete): new method that removes + the directory from the filesystem. + + * OpenChange/MAPIStoreGCSFolder.m (-deleteFolder): overriden method. + + * OpenChange/MAPIStoreFolder.m (-deleteFolder): implemented method. + * SoObjects/SOGo/SOGoParentFolder.m (-removeSubFolder): new method that removes a subfolder entry from the folder cache. diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index 48e6f5f29..178bb36fd 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -96,7 +96,7 @@ - (int) createFolder: (MAPIStoreFolder **) childFolderPtr withRow: (struct SRow *) aRow andFID: (uint64_t) fid; -- (int) deleteFolderWithFID: (uint64_t) fid; +- (int) deleteFolder; - (int) getChildCount: (uint32_t *) rowCount ofTableType: (enum mapistore_table_type) tableType; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 2f5279ba0..20670225d 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -384,11 +384,13 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) deleteFolderWithFID: (uint64_t) fid +- (int) deleteFolder { - [self logWithFormat: @"UNIMPLEMENTED METHOD '%s' (%d)", __FUNCTION__, __LINE__]; + [propsMessage delete]; + [propsFolder delete]; + [faiFolder delete]; - return MAPISTORE_ERROR; + return MAPISTORE_SUCCESS; } - (int) getChildCount: (uint32_t *) rowCount diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index 47e7ce24f..f41aa5eb3 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -22,6 +22,7 @@ #import #import +#import #import #import #import @@ -29,6 +30,7 @@ #import #import #import +#import #import #import @@ -44,6 +46,7 @@ #undef DEBUG #include +#include @implementation MAPIStoreGCSFolder @@ -72,6 +75,33 @@ [super dealloc]; } +- (int) deleteFolder +{ + int rc; + NSException *error; + NSString *name; + + name = [self nameInContainer]; + if ([name isEqualToString: @"personal"]) + rc = MAPISTORE_ERR_DENIED; + else + { + [[sogoObject container] removeSubFolder: name]; + error = [(SOGoGCSFolder *) sogoObject delete]; + if (error) + rc = MAPISTORE_ERROR; + else + { + if (![versionsMessage delete]) + rc = MAPISTORE_SUCCESS; + else + rc = MAPISTORE_ERROR; + } + } + + return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; +} + - (void) addProperties: (NSDictionary *) newProperties { NSString *newDisplayName; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index a5fbf7982..1c8bc75a9 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -333,7 +333,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE_ERROR */ static enum mapistore_error -sogo_folder_delete_folder(void *folder_object, uint64_t fid) +sogo_folder_delete(void *folder_object) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; @@ -347,7 +347,7 @@ sogo_folder_delete_folder(void *folder_object, uint64_t fid) wrapper = folder_object; folder = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [folder deleteFolderWithFID: fid]; + rc = [folder deleteFolder]; [pool release]; } else @@ -1244,7 +1244,7 @@ int mapistore_init_backend(void) backend.context.get_root_folder = sogo_context_get_root_folder; backend.folder.open_folder = sogo_folder_open_folder; backend.folder.create_folder = sogo_folder_create_folder; - backend.folder.delete_folder = sogo_folder_delete_folder; + backend.folder.delete = sogo_folder_delete; backend.folder.open_message = sogo_folder_open_message; backend.folder.create_message = sogo_folder_create_message; backend.folder.delete_message = sogo_folder_delete_message; diff --git a/OpenChange/SOGoMAPIFSFolder.m b/OpenChange/SOGoMAPIFSFolder.m index 7969d9e65..429e23f93 100644 --- a/OpenChange/SOGoMAPIFSFolder.m +++ b/OpenChange/SOGoMAPIFSFolder.m @@ -314,6 +314,23 @@ static NSString *privateDir = nil; return [self _fileAttributeForKey: NSFileModificationDate]; } +- (NSException *) delete +{ + NSFileManager *fm; + NSException *error; + + fm = [NSFileManager defaultManager]; + + if (![fm removeFileAtPath: directory handler: NULL]) + error = [NSException exceptionWithName: @"MAPIStoreIOException" + reason: @"could not delete folder" + userInfo: nil]; + else + error = nil; + + return error; +} + /* acl */ - (NSString *) defaultUserID { diff --git a/OpenChange/SOGoMAPIFSMessage.m b/OpenChange/SOGoMAPIFSMessage.m index 971e6ba99..15fe4afa7 100644 --- a/OpenChange/SOGoMAPIFSMessage.m +++ b/OpenChange/SOGoMAPIFSMessage.m @@ -141,14 +141,18 @@ - (NSException *) delete { NSFileManager *fm; + NSException *error; fm = [NSFileManager defaultManager]; if (![fm removeFileAtPath: [self completeFilename] handler: NULL]) - [NSException raise: @"MAPIStoreIOException" - format: @"could not delete message"]; + error = [NSException exceptionWithName: @"MAPIStoreIOException" + reason: @"could not delete message" + userInfo: nil]; + else + error = nil; - return nil; + return error; } - (id) _fileAttributeForKey: (NSString *) key