From 5a7b42ddf43a26cc3f176d6ca20262a340582fbd Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 22 Nov 2011 17:48:46 +0000 Subject: [PATCH] Monotone-Parent: 4f36a1c10a12396aed17d84ab4be1adc520d1663 Monotone-Revision: dbda0a122c502c53d25654eada72e93bc8865a35 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-22T17:48:46 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 12 ++ OpenChange/MAPIStoreContactsMessage.m | 2 +- OpenChange/MAPIStoreFolder.m | 2 +- OpenChange/MAPIStoreObject.m | 2 +- OpenChange/MAPIStoreTypes.m | 48 +++++- OpenChange/MAPIStoreVolatileMessage.m | 2 +- OpenChange/NSArray+MAPIStore.h | 18 ++- OpenChange/NSArray+MAPIStore.m | 214 +++++++++++++++++++++++++- OpenChange/NSObject+MAPIStore.h | 6 +- OpenChange/NSObject+MAPIStore.m | 12 +- 10 files changed, 303 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index e411c5152..8c3c5b97e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-11-22 Wolfgang Sourdeau + + * OpenChange/NSObject+MAPIStore.m (-getValue:forTag:inMemCtx:): + renamed from "getMAPIValue:...". + (-asArrayOfUnicodeStringsInMemCtx:) renamed from "asArrayOfUnicodeStringsInCtx". + (-arrayFromMAPIMVLong:, +arrayFromMAPIMVUnicode:) + (+arrayFromMAPIMVString:, +arrayFromMAPIMVBinary:) + (+arrayFromMAPIMVGuid:, +arrayFromMVShort:, +arrayFromMVLong:) + (+arrayFromMVI8:, +arrayFromMVUnicode:, +arrayFromMVString:) + (+arrayFromMVBinary:, +arrayFromMVGuid:, +arrayFromMVFileTime:) + new constructors for multivalue types. + 2011-11-20 Wolfgang Sourdeau * OpenChange/MAPIStoreFolder.m (-lookupFolder:): explicitly set diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index f2732ecb7..3f6ac687e 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -245,7 +245,7 @@ if (!stringValue) stringValue = @""; *data = [[NSArray arrayWithObject: stringValue] - asArrayOfUnicodeStringsInCtx: memCtx]; + asArrayOfUnicodeStringsInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 5fa9dacdf..43c56dd46 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -1201,7 +1201,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe value = [[propsMessage properties] objectForKey: MAPIPropertyKey (propTag)]; if (value) - rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; + rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index f2ac7374e..045f2c742 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -247,7 +247,7 @@ static Class NSExceptionK, MAPIStoreFolderK; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) - rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; + rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else { propValue = (propTag & 0xffff0000) >> 16; diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index 87e01792a..703ac198d 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -26,6 +26,7 @@ #import #import +#import "NSArray+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" @@ -123,6 +124,22 @@ NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) result = [NSData dataWithGUID: &value->value.lpguid]; break; + case PT_MV_LONG: + result = [NSArray arrayFromMAPIMVLong: &value->value.MVl]; + break; + case PT_MV_STRING8: + result = [NSArray arrayFromMAPIMVString: &value->value.MVszA]; + break; + case PT_MV_UNICODE: + result = [NSArray arrayFromMAPIMVUnicode: &value->value.MVszW]; + break; + case PT_MV_CLSID: + result = [NSArray arrayFromMAPIMVGuid: &value->value.MVguid]; + break; + case PT_MV_BINARY: + result = [NSArray arrayFromMAPIMVBinary: &value->value.MVbin]; + break; + default: // #define PT_UNSPECIFIED 0x0 // #define PT_I2 0x2 @@ -135,8 +152,9 @@ NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) // #define PT_SRESTRICT 0xFD // #define PT_ACTIONS 0xFE result = [NSNull null]; + abort(); NSLog (@"%s: object type not handled: %d (0x%.4x)", - __PRETTY_FUNCTION__, valueType, valueType); + __PRETTY_FUNCTION__, valueType, valueType); } return result; @@ -189,6 +207,30 @@ NSObjectFromSPropValue (const struct SPropValue *value) case PT_CLSID: result = [NSData dataWithFlatUID: value->value.lpguid]; break; + case PT_MV_SHORT: + result = [NSArray arrayFromMVShort: &value->value.MVi]; + break; + case PT_MV_LONG: + result = [NSArray arrayFromMVLong: &value->value.MVl]; + break; + case PT_MV_I8: + result = [NSArray arrayFromMVI8: &value->value.MVi8]; + break; + case PT_MV_STRING8: + result = [NSArray arrayFromMVString: &value->value.MVszA]; + break; + case PT_MV_UNICODE: + result = [NSArray arrayFromMVUnicode: &value->value.MVszW]; + break; + case PT_MV_CLSID: + result = [NSArray arrayFromMVGuid: &value->value.MVguid]; + break; + case PT_MV_BINARY: + result = [NSArray arrayFromMVBinary: &value->value.MVbin]; + break; + case PT_MV_SYSTIME: + result = [NSArray arrayFromMVFileTime: &value->value.MVft]; + break; default: // #define PT_UNSPECIFIED 0x0 @@ -202,8 +244,9 @@ NSObjectFromSPropValue (const struct SPropValue *value) // #define PT_SRESTRICT 0xFD // #define PT_ACTIONS 0xFE result = [NSNull null]; + abort(); NSLog (@"%s: object type not handled: %d (0x%.4x)", - __PRETTY_FUNCTION__, valueType, valueType); + __PRETTY_FUNCTION__, valueType, valueType); } return result; @@ -265,6 +308,7 @@ NSObjectFromValuePointer (enum MAPITAGS propTag, void *data) // #define PT_SRESTRICT 0xFD // #define PT_ACTIONS 0xFE result = [NSNull null]; + abort(); NSLog (@"%s: object type not handled: %d (0x%.8x)", __PRETTY_FUNCTION__, propTag, propTag); } diff --git a/OpenChange/MAPIStoreVolatileMessage.m b/OpenChange/MAPIStoreVolatileMessage.m index 56bfe6984..8bfc3b578 100644 --- a/OpenChange/MAPIStoreVolatileMessage.m +++ b/OpenChange/MAPIStoreVolatileMessage.m @@ -114,7 +114,7 @@ Class NSNumberK; value = [[sogoObject properties] objectForKey: MAPIPropertyKey (propTag)]; if (value) - rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; + rc = [value getValue: data forTag: propTag inMemCtx: memCtx]; else rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; diff --git a/OpenChange/NSArray+MAPIStore.h b/OpenChange/NSArray+MAPIStore.h index d92095cc6..86123a896 100644 --- a/OpenChange/NSArray+MAPIStore.h +++ b/OpenChange/NSArray+MAPIStore.h @@ -27,8 +27,22 @@ @interface NSArray (MAPIStoreFolders) -- (struct WStringArray_r *) asArrayOfUnicodeStringsInCtx: (void *) memCtx; -// - (struct mapi_SPLSTRArrayW *) asArrayOfUnicodeStringsInCtx: (void *) memCtx; +/* mapi structs */ ++ (id) arrayFromMAPIMVLong: (const struct mapi_MV_LONG_STRUCT *) mvLong; ++ (id) arrayFromMAPIMVUnicode: (const struct mapi_SPLSTRArrayW *) mvUnicode; ++ (id) arrayFromMAPIMVString: (const struct mapi_SLPSTRArray *) mvString; ++ (id) arrayFromMAPIMVBinary: (const struct mapi_SBinaryArray *) mvBinary; ++ (id) arrayFromMAPIMVGuid: (const struct mapi_SGuidArray *) mvGuid; + ++ (id) arrayFromMVShort: (const struct ShortArray_r *) mvShort; ++ (id) arrayFromMVLong: (const struct LongArray_r *) mvLong; ++ (id) arrayFromMVI8: (const struct I8Array_r *) mvI8; ++ (id) arrayFromMVString: (const struct StringArray_r *) mvString; ++ (id) arrayFromMVUnicode: (const struct WStringArray_r *) mvUnicode; +- (struct WStringArray_r *) asArrayOfUnicodeStringsInMemCtx: (void *) memCtx; ++ (id) arrayFromMVBinary: (const struct BinaryArray_r *) mvBinary; ++ (id) arrayFromMVGuid: (const struct FlatUIDArray_r *) mvGuid; ++ (id) arrayFromMVFileTime: (const struct DateTimeArray_r *) mvGuid; @end diff --git a/OpenChange/NSArray+MAPIStore.m b/OpenChange/NSArray+MAPIStore.m index 000bc3ec7..1b9880d13 100644 --- a/OpenChange/NSArray+MAPIStore.m +++ b/OpenChange/NSArray+MAPIStore.m @@ -22,6 +22,8 @@ #import +#import "NSDate+MAPIStore.h" +#import "NSData+MAPIStore.h" #import "NSString+MAPIStore.h" #import "NSArray+MAPIStore.h" @@ -29,11 +31,157 @@ #undef DEBUG #include #include +#include #include @implementation NSArray (MAPIStoreFolders) -- (struct WStringArray_r *) asArrayOfUnicodeStringsInCtx: (void *) memCtx ++ (id) arrayFromMAPIMVLong: (struct mapi_MV_LONG_STRUCT *) mvLong +{ + NSUInteger count; + NSNumber *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvLong->cValues]; + for (count = 0; count < mvLong->cValues; count++) + { + subObject = [NSNumber numberWithLong: mvLong->lpl[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMAPIMVUnicode: (struct mapi_SPLSTRArrayW *) mvUnicode +{ + NSUInteger count; + NSString *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvUnicode->cValues]; + for (count = 0; count < mvUnicode->cValues; count++) + { + subObject + = [NSString stringWithUTF8String: mvUnicode->strings[count].lppszW]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMAPIMVString: (struct mapi_SLPSTRArray *) mvString +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvString->cValues]; + for (count = 0; count < mvString->cValues; count++) + { + subObject = [NSString stringWithUTF8String: mvString->strings[count].lppszA]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMAPIMVBinary: (struct mapi_SBinaryArray *) mvBinary +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvBinary->cValues]; + for (count = 0; count < mvBinary->cValues; count++) + { + subObject = [NSData dataWithShortBinary: mvBinary->bin + count]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMAPIMVGuid: (struct mapi_SGuidArray *) mvGuid +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvGuid->cValues]; + for (count = 0; count < mvGuid->cValues; count++) + { + subObject = [NSData dataWithGUID: mvGuid->lpguid + count]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVShort: (const struct ShortArray_r *) mvShort +{ + NSUInteger count; + NSNumber *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvShort->cValues]; + for (count = 0; count < mvShort->cValues; count++) + { + subObject = [NSNumber numberWithShort: mvShort->lpi[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVLong: (const struct LongArray_r *) mvLong +{ + NSUInteger count; + NSNumber *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvLong->cValues]; + for (count = 0; count < mvLong->cValues; count++) + { + subObject = [NSNumber numberWithLong: mvLong->lpl[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVI8: (const struct I8Array_r *) mvI8 +{ + NSUInteger count; + NSNumber *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvI8->cValues]; + for (count = 0; count < mvI8->cValues; count++) + { + subObject = [NSNumber numberWithLongLong: mvI8->lpi8[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVUnicode: (const struct WStringArray_r *) mvUnicode +{ + NSUInteger count; + NSString *subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvUnicode->cValues]; + for (count = 0; count < mvUnicode->cValues; count++) + { + subObject = [NSString stringWithUTF8String: mvUnicode->lppszW[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + +- (struct WStringArray_r *) asArrayOfUnicodeStringsInMemCtx: (void *) memCtx { struct WStringArray_r *list; NSInteger count, max; @@ -50,4 +198,68 @@ return list; } ++ (id) arrayFromMVString: (const struct StringArray_r *) mvString +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvString->cValues]; + for (count = 0; count < mvString->cValues; count++) + { + subObject = [NSString stringWithUTF8String: mvString->lppszA[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVBinary: (const struct BinaryArray_r *) mvBinary +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvBinary->cValues]; + for (count = 0; count < mvBinary->cValues; count++) + { + subObject = [NSData dataWithBinary: mvBinary->lpbin + count]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVGuid: (const struct FlatUIDArray_r *) mvGuid +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvGuid->cValues]; + for (count = 0; count < mvGuid->cValues; count++) + { + subObject = [NSData dataWithFlatUID: mvGuid->lpguid[count]]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + ++ (id) arrayFromMVFileTime: (const struct DateTimeArray_r *) mvFileTime +{ + NSUInteger count; + id subObject; + NSMutableArray *mvResult; + + mvResult = [NSMutableArray arrayWithCapacity: mvFileTime->cValues]; + for (count = 0; count < mvFileTime->cValues; count++) + { + subObject = [NSDate dateFromFileTime: mvFileTime->lpft + count]; + [mvResult addObject: subObject]; + } + + return mvResult; +} + @end diff --git a/OpenChange/NSObject+MAPIStore.h b/OpenChange/NSObject+MAPIStore.h index 32827724e..19254456f 100644 --- a/OpenChange/NSObject+MAPIStore.h +++ b/OpenChange/NSObject+MAPIStore.h @@ -40,9 +40,9 @@ struct MAPIStoreTallocWrapper @interface NSObject (MAPIStoreDataTypes) -- (int) getMAPIValue: (void **) data - forTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx; /* getter helpers */ - (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index 678b80070..aff1d8a6c 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -24,6 +24,7 @@ #import #import "MAPIStoreTypes.h" +#import "NSArray+MAPIStore.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" #import "NSValue+MAPIStore.h" @@ -68,9 +69,9 @@ static int MAPIStoreTallocWrapperDestroy (void *data) @implementation NSObject (MAPIStoreDataTypes) -- (int) getMAPIValue: (void **) data - forTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { uint16_t valueType; int rc = MAPISTORE_SUCCESS; @@ -111,9 +112,14 @@ static int MAPIStoreTallocWrapperDestroy (void *data) *data = [(NSData *) self asGUIDInMemCtx: memCtx]; break; + case PT_MV_UNICODE: + *data = [(NSArray *) self asArrayOfUnicodeStringsInMemCtx: memCtx]; + break; + default: [self errorWithFormat: @"object type not handled: %d (0x%.4x)", valueType, valueType]; + abort(); *data = NULL; rc = MAPISTORE_ERR_NOT_FOUND; }