diff --git a/ChangeLog b/ChangeLog index c71c5a775..f638884c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2010-12-03 Wolfgang Sourdeau + * OpenChange/MAPIStoreTypes.m (NSObjectFromMAPISPropValue): new + helper function, similar in semantics to NSObjectFromSPropValue + but taking a struct mapi_SPropValue * as parameter. + * OpenChange/NSData+MAPIStore.m: (+dataWithShortBinary:): new constructor for returning an NSData instance from a struct SBinary_short. diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 79bea8c21..04c71207a 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -36,6 +36,7 @@ uint32_t *MAPILongValue (void *memCtx, uint32_t value); uint64_t *MAPILongLongValue (void *memCtx, uint64_t value); id NSObjectFromSPropValue (const struct SPropValue *); +id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *); id NSObjectFromStreamData (enum MAPITAGS property, NSData *streamData); static inline NSNumber * diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index d2bd7f593..41b18fddb 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -71,6 +71,63 @@ MAPILongLongValue (void *memCtx, uint64_t value) return llongValue; } +id +NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) +{ + short int valueType; + id result; + + valueType = (value->ulPropTag & 0xffff); + switch (valueType) + { + case PT_NULL: + result = [NSNull null]; + break; + case PT_SHORT: + result = [NSNumber numberWithShort: value->value.i]; + break; + case PT_LONG: + result = [NSNumber numberWithLong: value->value.l]; + break; + case PT_BOOLEAN: + result = [NSNumber numberWithBool: value->value.b]; + break; + case PT_DOUBLE: + result = [NSNumber numberWithDouble: value->value.dbl]; + break; + case PT_UNICODE: + result = [NSString stringWithUTF8String: value->value.lpszW]; + break; + case PT_STRING8: + result = [NSString stringWithUTF8String: value->value.lpszA]; + break; + case PT_SYSTIME: + result = [NSCalendarDate dateFromFileTime: &(value->value.ft)]; + break; + case PT_BINARY: + // lpProps->value.bin = *((const struct Binary_r *)data); + + result = [NSData dataWithShortBinary: &value->value.bin]; + break; + default: +// #define PT_UNSPECIFIED 0x0 +// #define PT_I2 0x2 +// #define PT_CURRENCY 0x6 +// #define PT_APPTIME 0x7 +// #define PT_ERROR 0xa +// #define PT_OBJECT 0xd +// #define PT_I8 0x14 +// #define PT_CLSID 0x48 +// #define PT_SVREID 0xFB +// #define PT_SRESTRICT 0xFD +// #define PT_ACTIONS 0xFE + result = [NSNull null]; + NSLog (@"object type not handled: %d (0x.4x)", valueType, valueType); + } + + return result; +} + id NSObjectFromSPropValue (const struct SPropValue *value) { @@ -151,7 +208,8 @@ id NSObjectFromStreamData (enum MAPITAGS property, NSData* streamData) break; default: [NSException raise: @"MAPIStoreStreamTypeException" - format: @"invalid data type"]; + format: @"invalid data type"]; + result = nil; } return result;