From 86f34550709b2f0b1f6f81f4b8fc17b35299823b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 Feb 2011 23:44:47 +0000 Subject: [PATCH] Monotone-Parent: 2434c6ad1961a254ac8fb9c01f787ace6e863ae3 Monotone-Revision: 42c7ffe1a106a44025c36523e969a629541821f7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-02-14T23:44:47 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++ OpenChange/GNUmakefile | 1 + OpenChange/MAPIStoreFSMessageTable.m | 52 +--------------- OpenChange/NSObject+MAPIStore.h | 38 ++++++++++++ OpenChange/NSObject+MAPIStore.m | 89 ++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 49 deletions(-) create mode 100644 OpenChange/NSObject+MAPIStore.h create mode 100644 OpenChange/NSObject+MAPIStore.m diff --git a/ChangeLog b/ChangeLog index 80a143b95..df10cff39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-02-14 Wolfgang Sourdeau + * OpenChange/MAPIStoreFSMessageTable.m + (-getChildProperty:forKey:withTag:): move type conversion code + into NSObject+MAPIStore. + + * OpenChange/NSObject+MAPIStore.[hm]: new category module that + provides type methods common to all NSObject descendants. + * OpenChange/MAPIStoreContext.m (-createMessagePropertiesWithMID:inFID:isAssociated:): create a fake PR_SEARCH_KEY on new message to make Outlook happy when diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index d8a433dea..cd9972447 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -82,6 +82,7 @@ $(SOGOBACKEND)_OBJC_FILES += \ NSAutoreleasePool+MAPIStore.m \ NSCalendarDate+MAPIStore.m \ NSData+MAPIStore.m \ + NSObject+MAPIStore.m \ NSString+MAPIStore.m \ NSValue+MAPIStore.m \ \ diff --git a/OpenChange/MAPIStoreFSMessageTable.m b/OpenChange/MAPIStoreFSMessageTable.m index fa4cdc9ca..453e403ce 100644 --- a/OpenChange/MAPIStoreFSMessageTable.m +++ b/OpenChange/MAPIStoreFSMessageTable.m @@ -27,14 +27,11 @@ #import "EOQualifier+MAPIFS.h" #import "MAPIStoreTypes.h" +#import "NSObject+MAPIStore.h" #import "SOGoMAPIFSFolder.h" #import "SOGoMAPIFSMessage.h" #import "MAPIStoreFSMessageTable.h" -#import "NSCalendarDate+MAPIStore.h" -#import "NSData+MAPIStore.h" -#import "NSString+MAPIStore.h" -#import "NSValue+MAPIStore.h" #undef DEBUG #include @@ -47,57 +44,14 @@ { NSDictionary *properties; SOGoMAPIFSMessage *child; - uint16_t valueType; id value; - int rc; - - rc = MAPI_E_SUCCESS; + enum MAPISTATUS rc; child = [self lookupChild: childKey]; properties = [child properties]; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) - { - // [self logWithFormat: @"property %.8x found", propTag]; - valueType = (propTag & 0xffff); - switch (valueType) - { - case PT_NULL: - *data = NULL; - break; - case PT_SHORT: - *data = [value asShortInMemCtx: memCtx]; - break; - case PT_LONG: - *data = [value asLongInMemCtx: memCtx]; - break; - case PT_BOOLEAN: - *data = [value asBooleanInMemCtx: memCtx]; - break; - case PT_DOUBLE: - *data = [value asDoubleInMemCtx: memCtx]; - break; - case PT_UNICODE: - case PT_STRING8: - *data = [value asUnicodeInMemCtx: memCtx]; - break; - case PT_SYSTIME: - *data = [value asFileTimeInMemCtx: memCtx]; - break; - case PT_BINARY: - *data = [value asShortBinaryInMemCtx: memCtx]; - break; - case PT_CLSID: - *data = [value asGUIDInMemCtx: memCtx]; - break; - - default: - [self errorWithFormat: @"object type not handled: %d (0x%.4x)", - valueType, valueType]; - *data = NULL; - rc = MAPI_E_NO_SUPPORT; - } - } + rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; else rc = [super getChildProperty: data forKey: childKey withTag: propTag]; diff --git a/OpenChange/NSObject+MAPIStore.h b/OpenChange/NSObject+MAPIStore.h new file mode 100644 index 000000000..48345e2ae --- /dev/null +++ b/OpenChange/NSObject+MAPIStore.h @@ -0,0 +1,38 @@ +/* NSObject+MAPIStore.h - this file is part of SOGo + * + * Copyright (C) 2011 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 NSOBJECT_MAPISTORE_H +#define NSOBJECT_MAPISTORE_H + +#import + +#include + +@interface NSObject (MAPIStoreDataTypes) + +- (enum MAPISTATUS) getMAPIValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx; + +@end + +#endif /* NSOBJECT_MAPISTORE_H */ diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m new file mode 100644 index 000000000..ce058ea30 --- /dev/null +++ b/OpenChange/NSObject+MAPIStore.m @@ -0,0 +1,89 @@ +/* NSObject+MAPIStore.m - this file is part of SOGo + * + * Copyright (C) 2011 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. + */ + +#import + +#import "NSData+MAPIStore.h" +#import "NSCalendarDate+MAPIStore.h" +#import "NSValue+MAPIStore.h" +#import "NSString+MAPIStore.h" + +#import "NSObject+MAPIStore.h" + +#undef DEBUG +#include + +@implementation NSObject (MAPIStoreDataTypes) + +- (enum MAPISTATUS) getMAPIValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx +{ + uint16_t valueType; + enum MAPISTATUS rc; + + rc = MAPI_E_SUCCESS; + + // [self logWithFormat: @"property %.8x found", propTag]; + valueType = (propTag & 0xffff); + switch (valueType) + { + case PT_NULL: + *data = NULL; + break; + case PT_SHORT: + *data = [(NSNumber *) self asShortInMemCtx: memCtx]; + break; + case PT_LONG: + *data = [(NSNumber *) self asLongInMemCtx: memCtx]; + break; + case PT_BOOLEAN: + *data = [(NSNumber *) self asBooleanInMemCtx: memCtx]; + break; + case PT_DOUBLE: + *data = [(NSNumber *) self asDoubleInMemCtx: memCtx]; + break; + case PT_UNICODE: + case PT_STRING8: + *data = [(NSString *) self asUnicodeInMemCtx: memCtx]; + break; + case PT_SYSTIME: + *data = [(NSCalendarDate * ) self asFileTimeInMemCtx: memCtx]; + break; + case PT_BINARY: + *data = [(NSData *) self asShortBinaryInMemCtx: memCtx]; + break; + case PT_CLSID: + *data = [(NSData *) self asGUIDInMemCtx: memCtx]; + break; + + default: + [self errorWithFormat: @"object type not handled: %d (0x%.4x)", + valueType, valueType]; + *data = NULL; + rc = MAPI_E_NO_SUPPORT; + } + + return rc; +} + +@end