diff --git a/ChangeLog b/ChangeLog index 7ee21810d..089c6bab3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2012-07-19 Wolfgang Sourdeau + * OpenChange/MAPIStoreObject.m (-addProxy:): new method that keeps + proxy objects in the new "proxies" ivar. + (-getProperty:withTag:inMemCtx:): added code that pass the request + to the available object proxies, when the property getters have + not been found in the local class. + + * OpenChange/MAPIStoreObjectProxy.[hm]: new class module that + provide a facility for providing property getters in the name of + another class, working around the fact that Objective-C does not + provide multiple-inheritance. + * OpenChange/NSObject+MAPIStore.m (+getAvailableProperties:inMemCtx:) (-getAvailableProperties:inMemCtx:, canGetProperty:): methods diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 6f4803ba9..7054f8998 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -55,6 +55,7 @@ $(SOGOBACKEND)_OBJC_FILES += \ MAPIStoreFolder.m \ MAPIStoreMessage.m \ MAPIStoreObject.m \ + MAPIStoreObjectProxy.m \ MAPIStoreSOGoObject.m \ MAPIStoreTable.m \ MAPIStoreMessageTable.m \ diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 6db864de4..bd30a77a0 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -35,6 +35,7 @@ @class MAPIStoreContext; @class MAPIStoreMapping; +@class MAPIStoreObjectProxy; @class MAPIStoreUserContext; @class MAPIStoreSOGoObject; @@ -43,6 +44,7 @@ const IMP *classGetters; NSMutableArray *parentContainersBag; + NSMutableArray *proxies; id container; NSMutableDictionary *properties; } @@ -50,6 +52,7 @@ + (id) mapiStoreObjectInContainer: (MAPIStoreObject *) newContainer; - (id) initInContainer: (MAPIStoreObject *) newContainer; +- (void) addProxy: (MAPIStoreObjectProxy *) newProxy; - (MAPIStoreObject *) container; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index 994a74893..b092bbe03 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -143,6 +143,7 @@ static Class NSExceptionK, MAPIStoreFolderK; SEL methodSel; id value; int rc = MAPISTORE_ERR_NOT_FOUND; + NSUInteger count, max; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) @@ -156,6 +157,16 @@ static Class NSExceptionK, MAPIStoreFolderK; rc = method (self, methodSel, data, memCtx); } + if (rc == MAPISTORE_ERR_NOT_FOUND) + { + max = [proxies count]; + for (count = 0; rc == MAPISTORE_ERR_NOT_FOUND && count < max; count++) + rc = [[proxies objectAtIndex: count] + getProperty: data + withTag: propTag + inMemCtx: memCtx]; + } + return rc; } @@ -200,6 +211,11 @@ static Class NSExceptionK, MAPIStoreFolderK; return MAPISTORE_SUCCESS; } +- (void) addProxy: (MAPIStoreObjectProxy *) newProxy +{ + [proxies addObject: newProxy]; +} + - (int) addPropertiesFromRow: (struct SRow *) aRow { struct SPropValue *cValue; diff --git a/OpenChange/MAPIStoreObjectProxy.h b/OpenChange/MAPIStoreObjectProxy.h new file mode 100644 index 000000000..6e9aee13e --- /dev/null +++ b/OpenChange/MAPIStoreObjectProxy.h @@ -0,0 +1,41 @@ +/* MAPIStoreObjectProxy.h - this file is part of SOGo + * + * Copyright (C) 2012 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 MAPISTOREOBJECTPROXY_H +#define MAPISTOREOBJECTPROXY_H + +#include + +#import + +@interface MAPIStoreObjectProxy : NSObject +{ + const IMP *classGetters; +} + +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) localMemCtx; + +@end + +#endif /* MAPISTOREOBJECTPROXY_H */ diff --git a/OpenChange/MAPIStoreObjectProxy.m b/OpenChange/MAPIStoreObjectProxy.m new file mode 100644 index 000000000..415d26df6 --- /dev/null +++ b/OpenChange/MAPIStoreObjectProxy.m @@ -0,0 +1,66 @@ +/* MAPIStoreObjectProxy.m - this file is part of SOGo + * + * Copyright (C) 2012 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 "MAPIStorePropertySelectors.h" + +#import "MAPIStoreObjectProxy.h" + +#undef DEBUG +#include +#include +#include +#include +#include + +@implementation MAPIStoreObjectProxy + +- (id) init +{ + if ((self = [super init])) + { + classGetters = (IMP *) MAPIStorePropertyGettersForClass (isa); + } + + return self; +} + +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx +{ + MAPIStorePropertyGetter method; + uint16_t propValue; + SEL methodSel; + int rc; + + propValue = (propTag & 0xffff0000) >> 16; + methodSel = MAPIStoreSelectorForPropertyGetter (propValue); + method = (MAPIStorePropertyGetter) classGetters[propValue]; + if (method) + rc = method (self, methodSel, data, memCtx); + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + +@end