diff --git a/ChangeLog b/ChangeLog index 17a204199..4fc342ce7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-04-05 Wolfgang Sourdeau + * OpenChange/MAPIStoreMailFolder.m (-createFolder:): implemented + method by adapting old code that was still commented out. + (-folderKeys): implemented method. + (-lookupChild:): overriden method to return a folder object when + the child key is contained in the folder keys. + * OpenChange/MAPIStoreContext.m (_tableForFID:andTableType:): make use of lookupFolder: to retrieve the right folder based on the FID. (-setPropertiesWithFMID:ofTableType:inRow:): silently discard by diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 7ffe40ca2..54522e02b 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -26,6 +26,7 @@ #import #import #import +#import #import #import #import @@ -33,6 +34,7 @@ #import #import #import +#import #import "MAPIApplication.h" #import "MAPIStoreContext.h" @@ -47,12 +49,17 @@ static Class MAPIStoreDraftsMessageK; static Class MAPIStoreMailMessageK; +static Class SOGoMailFolderK; + +#undef DEBUG +#include @implementation MAPIStoreMailFolder + (void) initialize { MAPIStoreMailMessageK = [MAPIStoreMailMessage class]; + SOGoMailFolderK = [SOGoMailFolder class]; } - (id) initWithURL: (NSURL *) newURL @@ -121,44 +128,32 @@ static Class MAPIStoreMailMessageK; - (NSString *) createFolder: (struct SRow *) aRow { - return nil; - // NSString *newFolderURL; - // NSString *folderName, *nameInContainer; - // SOGoFolder *parentFolder, *newFolder; - // int i; + NSString *folderName, *nameInContainer; + SOGoMailFolder *newFolder; + int i; - // newFolderURL = nil; + nameInContainer = nil; - // folderName = nil; - // for (i = 0; !folderName && i < aRow->cValues; i++) - // { - // if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME_UNICODE) - // folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszW]; - // else if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME) - // folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszA]; - // } + folderName = nil; + for (i = 0; !folderName && i < aRow->cValues; i++) + { + if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME_UNICODE) + folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszW]; + else if (aRow->lpProps[i].ulPropTag == PR_DISPLAY_NAME) + folderName = [NSString stringWithUTF8String: aRow->lpProps[i].value.lpszA]; + } - // if (folderName) - // { - // parentFolder = [self lookupObject: parentFolderURL]; - // if (parentFolder) - // { - // if ([parentFolder isKindOfClass: SOGoMailAccountK] - // || [parentFolder isKindOfClass: SOGoMailFolderK]) - // { - // nameInContainer = [NSString stringWithFormat: @"folder%@", - // [folderName asCSSIdentifier]]; - // newFolder = [SOGoMailFolderK objectWithName: nameInContainer - // inContainer: parentFolder]; - // if ([newFolder create]) - // newFolderURL = [NSString stringWithFormat: @"%@/%@", - // parentFolderURL, - // [nameInContainer stringByEscapingURL]]; - // } - // } - // } + if (folderName) + { + nameInContainer = [NSString stringWithFormat: @"folder%@", + [folderName asCSSIdentifier]]; + newFolder = [SOGoMailFolderK objectWithName: nameInContainer + inContainer: sogoObject]; + if (![newFolder create]) + nameInContainer = nil; + } - // return newFolderURL; + return nameInContainer; } - (enum MAPISTATUS) getProperty: (void **) data @@ -182,6 +177,17 @@ static Class MAPIStoreMailMessageK; *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; break; default: + { + const char *propName; + + propName = get_proptag_name (propTag); + if (!propName) + propName = ""; + [self warnWithFormat: @"get folder tag: %s (0x%.8x)", propName, + propTag]; + } + + rc = [super getProperty: data withTag: propTag]; } @@ -225,6 +231,38 @@ static Class MAPIStoreMailMessageK; return [uidKeys stringsWithFormat: @"%@.eml"]; } +- (NSArray *) folderKeys +{ + if (!folderKeys) + folderKeys = [[sogoObject toManyRelationshipKeys] mutableCopy]; + + return folderKeys; +} + +- (MAPIStoreFAIMessageTable *) folderTable +{ + return [MAPIStoreMailFolderTable tableForContainer: self]; +} + +- (id) lookupChild: (NSString *) childKey +{ + id childObject; + SOGoMailFolder *childFolder; + + [self folderKeys]; + if ([folderKeys containsObject: childKey]) + { + childFolder = [sogoObject lookupName: childKey inContext: nil + acquire: NO]; + childObject = [MAPIStoreMailFolder mapiStoreObjectWithSOGoObject: childFolder + inContainer: self]; + } + else + childObject = [super lookupChild: childKey]; + + return childObject; +} + @end @implementation MAPIStoreInboxFolder : MAPIStoreMailFolder