diff --git a/ChangeLog b/ChangeLog index e6cf9af38..d8541a3f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2011-09-23 Wolfgang Sourdeau + + * OpenChange/SOGoMAPIFSMessage.m (-mapistoreMessageClass): method + implemented poorly (but work for now) and that differentiates + between the MAPIStoreMessage classes based on certain elements in + their folder path. + + * OpenChange/MAPIStoreFolder.m (-messageClass): removed method, + replaced with the new mechanism below. + + * OpenChange/NSObject+MAPIStore.h (-mapistoreMessageClass): new + category method that returns the proper MAPIStoreMessage wrapper + class from instances of SOGoObject and children classes. + 2011-09-22 Ludovic Marcotte * OpenChange/MAPIStoreContactsMessage.m diff --git a/OpenChange/MAPIStoreCalendarFolder.m b/OpenChange/MAPIStoreCalendarFolder.m index 1609ae63a..29ad5f16b 100644 --- a/OpenChange/MAPIStoreCalendarFolder.m +++ b/OpenChange/MAPIStoreCalendarFolder.m @@ -36,15 +36,8 @@ #import "MAPIStoreCalendarFolder.h" -static Class MAPIStoreCalendarMessageK; - @implementation MAPIStoreCalendarFolder -+ (void) initialize -{ - MAPIStoreCalendarMessageK = [MAPIStoreCalendarMessage class]; -} - - (id) initWithURL: (NSURL *) newURL inContext: (MAPIStoreContext *) newContext { @@ -76,11 +69,6 @@ static Class MAPIStoreCalendarMessageK; return self; } -- (Class) messageClass -{ - return MAPIStoreCalendarMessageK; -} - - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 1ded32e41..58acb9daa 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -68,6 +68,15 @@ // extern void ndr_print_AppointmentRecurrencePattern(struct ndr_print *ndr, const char *name, const struct AppointmentRecurrencePattern *r); +@implementation SOGoAppointmentObject (MAPIStoreExtension) + +- (Class) mapistoreMessageClass +{ + return [MAPIStoreCalendarMessage class]; +} + +@end + @implementation MAPIStoreCalendarMessage - (id) init diff --git a/OpenChange/MAPIStoreContactsFolder.m b/OpenChange/MAPIStoreContactsFolder.m index 67641d427..65801e5c1 100644 --- a/OpenChange/MAPIStoreContactsFolder.m +++ b/OpenChange/MAPIStoreContactsFolder.m @@ -33,20 +33,8 @@ #import "MAPIStoreContactsFolder.h" -static Class MAPIStoreContactsMessageK; - @implementation MAPIStoreContactsFolder -+ (void) initialize -{ - MAPIStoreContactsMessageK = [MAPIStoreContactsMessage class]; -} - -- (void) dealloc -{ - [super dealloc]; -} - - (id) initWithURL: (NSURL *) newURL inContext: (MAPIStoreContext *) newContext { @@ -78,11 +66,6 @@ static Class MAPIStoreContactsMessageK; return self; } -- (Class) messageClass -{ - return MAPIStoreContactsMessageK; -} - - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index 13dbc4fcc..894892ba6 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -49,6 +49,15 @@ #include #include +@implementation SOGoContactGCSEntry (MAPIStoreExtension) + +- (Class) mapistoreMessageClass +{ + return [MAPIStoreContactsMessage class]; +} + +@end + @implementation MAPIStoreContactsMessage // TODO: this should be combined with the version found diff --git a/OpenChange/MAPIStoreDraftsMessage.m b/OpenChange/MAPIStoreDraftsMessage.m index 5cb98a3a8..b3c8893a4 100644 --- a/OpenChange/MAPIStoreDraftsMessage.m +++ b/OpenChange/MAPIStoreDraftsMessage.m @@ -48,6 +48,15 @@ typedef void (*getMessageData_inMemCtx_) (MAPIStoreMessage *, SEL, struct mapistore_message **, TALLOC_CTX *); +@implementation SOGoDraftObject (MAPIStoreExtension) + +- (Class) mapistoreMessageClass +{ + return [MAPIStoreDraftsMessage class]; +} + +@end + @implementation MAPIStoreDraftsMessage + (void) initialize diff --git a/OpenChange/MAPIStoreFSFolder.m b/OpenChange/MAPIStoreFSFolder.m index eaa622710..12c7db253 100644 --- a/OpenChange/MAPIStoreFSFolder.m +++ b/OpenChange/MAPIStoreFSFolder.m @@ -43,14 +43,13 @@ // #include // #include -static Class EOKeyValueQualifierK, MAPIStoreFSMessageK; +static Class EOKeyValueQualifierK; @implementation MAPIStoreFSFolder + (void) initialize { EOKeyValueQualifierK = [EOKeyValueQualifier class]; - MAPIStoreFSMessageK = [MAPIStoreFSMessage class]; } - (id) initWithURL: (NSURL *) newURL @@ -72,11 +71,6 @@ static Class EOKeyValueQualifierK, MAPIStoreFSMessageK; return [MAPIStoreFSMessageTable tableForContainer: self]; } -- (Class) messageClass -{ - return MAPIStoreFSMessageK; -} - - (MAPIStoreFolderTable *) folderTable { return [MAPIStoreFSFolderTable tableForContainer: self]; diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index a7009e127..cf6f3e951 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -141,7 +141,6 @@ - (uint64_t) idForObjectWithKey: (NSString *) childKey; /* subclasses */ -- (Class) messageClass; - (MAPIStoreMessage *) createMessage; - (MAPIStoreMessageTable *) messageTable; - (NSArray *) messageKeysMatchingQualifier: (EOQualifier *) qualifier diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index beabf803c..7a4fd5b07 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -222,6 +222,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (id) lookupMessage: (NSString *) messageKey { MAPIStoreObject *childMessage = nil; + Class messageClass; SOGoObject *msgObject; if (messageKey) @@ -232,9 +233,10 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if (msgObject && ![msgObject isKindOfClass: NSExceptionK]) { [msgObject setContext: [[self context] woContext]]; + messageClass = [msgObject mapistoreMessageClass]; childMessage - = [[self messageClass] mapiStoreObjectWithSOGoObject: msgObject - inContainer: self]; + = [messageClass mapiStoreObjectWithSOGoObject: msgObject + inContainer: self]; } } @@ -1273,13 +1275,6 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return nil; } -- (Class) messageClass -{ - [self subclassResponsibility: _cmd]; - - return Nil; -} - - (MAPIStoreMessage *) createMessage { [self logWithFormat: @"ignored method: %s", __PRETTY_FUNCTION__]; diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 30072a219..82bdf2291 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -49,7 +49,6 @@ #import "MAPIStoreContext.h" #import "MAPIStoreDraftsMessage.h" #import "MAPIStoreFAIMessage.h" -#import "MAPIStoreMailMessage.h" #import "MAPIStoreMailMessageTable.h" #import "MAPIStoreMapping.h" #import "MAPIStoreTypes.h" @@ -64,8 +63,6 @@ #import "MAPIStoreMailFolder.h" -static Class MAPIStoreDraftsMessageK; -static Class MAPIStoreMailMessageK; static Class SOGoMailFolderK; #undef DEBUG @@ -77,7 +74,6 @@ static Class SOGoMailFolderK; + (void) initialize { - MAPIStoreMailMessageK = [MAPIStoreMailMessage class]; SOGoMailFolderK = [SOGoMailFolder class]; [MAPIStoreAppointmentWrapper class]; } @@ -171,11 +167,6 @@ static Class SOGoMailFolderK; return [MAPIStoreMailMessageTable tableForContainer: self]; } -- (Class) messageClass -{ - return MAPIStoreMailMessageK; -} - - (NSString *) createFolder: (struct SRow *) aRow withFID: (uint64_t) newFID inContainer: (id) subfolderParent @@ -1125,11 +1116,6 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) return [accountFolder draftsFolderInContext: woContext]; } -- (Class) messageClass -{ - return MAPIStoreDraftsMessageK; -} - - (MAPIStoreMessage *) createMessage { MAPIStoreDraftsMessage *newMessage; @@ -1161,22 +1147,12 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) // @implementation MAPIStoreOutboxFolder : MAPIStoreMailFolder -+ (void) initialize -{ - MAPIStoreDraftsMessageK = [MAPIStoreDraftsMessage class]; -} - - (SOGoMailFolder *) specialFolderFromAccount: (SOGoMailAccount *) accountFolder inContext: (WOContext *) woContext { return [accountFolder draftsFolderInContext: woContext]; } -- (Class) messageClass -{ - return MAPIStoreDraftsMessageK; -} - - (MAPIStoreMessage *) createMessage { MAPIStoreDraftsMessage *newMessage; diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 6bc2e56ef..3fba97852 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -86,6 +86,15 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; @end +@implementation SOGoMailObject (MAPIStoreExtension) + +- (Class) mapistoreMessageClass +{ + return [MAPIStoreMailMessage class]; +} + +@end + @implementation MAPIStoreMailMessage + (void) initialize diff --git a/OpenChange/MAPIStoreNotesFolder.m b/OpenChange/MAPIStoreNotesFolder.m index fec65c129..aafa79f51 100644 --- a/OpenChange/MAPIStoreNotesFolder.m +++ b/OpenChange/MAPIStoreNotesFolder.m @@ -26,18 +26,6 @@ #import "MAPIStoreNotesFolder.h" -static Class MAPIStoreNotesMessageK; - @implementation MAPIStoreNotesFolder -+ (void) initialize -{ - MAPIStoreNotesMessageK = [MAPIStoreNotesMessage class]; -} - -- (Class) messageClass -{ - return MAPIStoreNotesMessageK; -} - @end diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index be96b9ab9..deb02477d 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -36,15 +36,8 @@ #import "MAPIStoreTasksFolder.h" -static Class MAPIStoreTasksMessageK; - @implementation MAPIStoreTasksFolder -+ (void) initialize -{ - MAPIStoreTasksMessageK = [MAPIStoreTasksMessage class]; -} - - (id) initWithURL: (NSURL *) newURL inContext: (MAPIStoreContext *) newContext { @@ -76,11 +69,6 @@ static Class MAPIStoreTasksMessageK; return self; } -- (Class) messageClass -{ - return MAPIStoreTasksMessageK; -} - - (MAPIStoreMessageTable *) messageTable { [self synchroniseCache]; diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index f5fcd02ee..dafebc41b 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -33,7 +33,7 @@ #import #import #import -#import +#import #import "MAPIStoreTasksFolder.h" #import "MAPIStoreTypes.h" @@ -50,6 +50,15 @@ #include #include +@implementation SOGoTaskObject (MAPIStoreExtension) + +- (Class) mapistoreMessageClass +{ + return [MAPIStoreTasksMessage class]; +} + +@end + @implementation MAPIStoreTasksMessage - (int) getPrIconIndex: (void **) data // TODO diff --git a/OpenChange/NSObject+MAPIStore.h b/OpenChange/NSObject+MAPIStore.h index 339630296..32827724e 100644 --- a/OpenChange/NSObject+MAPIStore.h +++ b/OpenChange/NSObject+MAPIStore.h @@ -52,4 +52,10 @@ struct MAPIStoreTallocWrapper @end +@interface NSObject (MAPIStoreExtension) + +- (Class) mapistoreMessageClass; + +@end + #endif /* NSOBJECT_MAPISTORE_H */ diff --git a/OpenChange/SOGoMAPIFSMessage.m b/OpenChange/SOGoMAPIFSMessage.m index 10c3fe19c..3403d0ccb 100644 --- a/OpenChange/SOGoMAPIFSMessage.m +++ b/OpenChange/SOGoMAPIFSMessage.m @@ -54,6 +54,25 @@ [super dealloc]; } +- (Class) mapistoreMessageClass +{ + NSArray *dirMembers; + NSString *className; + + /* FIXME: this method is a bit dirty */ + dirMembers = [[container directory] componentsSeparatedByString: @"/"]; + if ([dirMembers containsObject: @"fai"]) /* should not occur as FAI message + are instantiated directly in + MAPIStoreFolder */ + className = @"MAPIStoreFAIMessage"; + else if ([dirMembers containsObject: @"notes"]) + className = @"MAPIStoreNotesMessage"; + else + className = @"MAPIStoreFSMessage"; + + return NSClassFromString (className); +} + - (NSString *) completeFilename { if (!completeFilename)