From 5d652701b3aeb624e60a5ca1a31b47964af35bb1 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 19 Nov 2010 20:56:11 +0000 Subject: [PATCH] Monotone-Parent: da7301d3c0a55520b84d234529b84e3741006bf0 Monotone-Revision: f0d1b16bd7d62ae794114e9df5377a901fba1a74 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-11-19T20:56:11 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 + OpenChange/MAPIStoreTypes.h | 57 ++++++++++++++ OpenChange/MAPIStoreTypes.m | 153 ++++++++++++++++++++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 OpenChange/MAPIStoreTypes.h create mode 100644 OpenChange/MAPIStoreTypes.m diff --git a/ChangeLog b/ChangeLog index 0125614ae..a5f7d7c0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2010-11-19 Wolfgang Sourdeau + * OpenChange/MAPIStoreTypes.m: new helper module designed to + handle type conversion between MAPI types and NS types. + * OpenChange/NSDate+MAPIStore: renamed back to NSCalendarDate+MAPIStore. diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h new file mode 100644 index 000000000..a4149835f --- /dev/null +++ b/OpenChange/MAPIStoreTypes.h @@ -0,0 +1,57 @@ +/* MAPIStoreTypes.h - this file is part of SOGo + * + * Copyright (C) 2010 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef MAPISTORETYPES_H +#define MAPISTORETYPES_H + +#import + +#include +#include + +@class NSDictionary; + +uint8_t *MAPIBoolValue (void *memCtx, BOOL value); +uint32_t *MAPILongValue (void *memCtx, uint32_t value); +uint64_t *MAPILongLongValue (void *memCtx, uint64_t value); + +id NSObjectFromSPropValue (const struct SPropValue *); + +#if (GS_SIZEOF_LONG == 4) +static inline NSNumber * +MAPIPropertyNumber (unsigned long propTag) +{ + return [NSNumber numberWithUnsignedLong: propTag]; +} +#elif (GS_SIZEOF_INT == 4) +static inline NSNumber * +MAPIPropertyNumber (unsigned int propTag) +{ + return [NSNumber numberWithUnsignedInt: propTag]; +} +#else +#error No suitable type for 4 bytes integers +#endif + +void MAPIStoreDumpMessageProperties (NSDictionary *properties); + +#endif /* MAPISTORETYPES_H */ diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m new file mode 100644 index 000000000..4dfd9997d --- /dev/null +++ b/OpenChange/MAPIStoreTypes.m @@ -0,0 +1,153 @@ +/* MAPIStoreTypes.m - this file is part of SOGo + * + * Copyright (C) 2010 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef DEBUG +#include +#include +#include +#include +#include + +#import +#import +#import +#import + +#import "NSCalendarDate+MAPIStore.h" + +#import "MAPIStoreTypes.h" + +uint8_t * +MAPIBoolValue (void *memCtx, BOOL value) +{ + uint8_t *boolValue; + + boolValue = talloc_zero (memCtx, uint8_t); + *boolValue = value; + + return boolValue; +} + +uint32_t * +MAPILongValue (void *memCtx, uint32_t value) +{ + uint32_t *longValue; + + longValue = talloc_zero (memCtx, uint32_t); + *longValue = value; + + return longValue; +} + +uint64_t * +MAPILongLongValue (void *memCtx, uint64_t value) +{ + uint64_t *llongValue; + + llongValue = talloc_zero (memCtx, uint64_t); + *llongValue = value; + + return llongValue; +} + +id +NSObjectFromSPropValue (const struct 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; + 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 +// #define PT_BINARY 0x102 + result = [NSNull null]; + NSLog (@"object type not handled: %d", valueType); + } + + return result; +} + +void +MAPIStoreDumpMessageProperties (NSDictionary *properties) +{ + NSNumber *key; + NSArray *allKeys; + NSUInteger keyAsInt, count, max; + const char *name; + id value; + + allKeys = [properties allKeys]; + max = [allKeys count]; + + NSLog (@"message properties (%d):", max); + for (count = 0; count < max; count++) + { + key = [allKeys objectAtIndex: count]; + if ([key isKindOfClass: [NSNumber class]]) + { + keyAsInt = [key intValue]; + value = [properties objectForKey: key]; + name = get_proptag_name (keyAsInt); + if (!name) + name = "unknown"; + NSLog (@" 0x%.8x (%s): %@ (%@)", + keyAsInt, name, + value, NSStringFromClass ([value class])); + } + } +}