diff --git a/ChangeLog b/ChangeLog index fdf27b941..ccfc06202 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2011-07-27 Wolfgang Sourdeau + * OpenChange/MAPIStoreFSMessageTable.m + (-evaluatePropertyRestriction:intoQualifier:): overriden method to + handle PR_CHANGE_NUM, based on the messages version number. + + * OpenChange/MAPIStoreFSMessage.m (-objectVersion): overriden + method to retrieve the object version from the "version" attribute + in the properties list. + (-save): update the "version" attribute in the saved property list + from openchangedb. + * OpenChange/MAPIStoreAppointmentWrapper.m (-getPidLidGlobalObjectId:inMemCtx:): work-around certain buggy events which might now have a "CREATED" element. diff --git a/OpenChange/MAPIStoreFSMessage.m b/OpenChange/MAPIStoreFSMessage.m index c8c1a1bad..a67105a8f 100644 --- a/OpenChange/MAPIStoreFSMessage.m +++ b/OpenChange/MAPIStoreFSMessage.m @@ -24,6 +24,7 @@ #import #import +#import "MAPIStoreContext.h" #import "MAPIStorePropertySelectors.h" #import "MAPIStoreTypes.h" #import "NSObject+MAPIStore.h" @@ -33,6 +34,7 @@ #import "MAPIStoreFSMessage.h" #undef DEBUG +#include #include @implementation MAPIStoreFSMessage @@ -72,6 +74,15 @@ return self; } +- (uint64_t) objectVersion +{ + NSNumber *version; + + version = [[sogoObject properties] objectForKey: @"version"]; + + return exchange_globcnt ([version unsignedLongLongValue]); +} + - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx @@ -176,8 +187,14 @@ - (void) save { + uint64_t newVersion; + if ([attachmentKeys count] > 0) [newProperties setObject: attachmentParts forKey: @"attachments"]; + + newVersion = exchange_globcnt ([[self context] getNewChangeNumber] >> 16); + [newProperties setObject: [NSNumber numberWithUnsignedLongLong: newVersion] + forKey: @"version"]; [sogoObject appendProperties: newProperties]; [sogoObject save]; [self resetNewProperties]; diff --git a/OpenChange/MAPIStoreFSMessageTable.m b/OpenChange/MAPIStoreFSMessageTable.m index 6270166e2..1c665c7a9 100644 --- a/OpenChange/MAPIStoreFSMessageTable.m +++ b/OpenChange/MAPIStoreFSMessageTable.m @@ -20,17 +20,12 @@ * Boston, MA 02111-1307, USA. */ -#import -#import - +#import #import +#import -#import "EOQualifier+MAPIFS.h" #import "MAPIStoreTypes.h" #import "MAPIStoreFSMessage.h" -#import "NSObject+MAPIStore.h" -#import "SOGoMAPIFSFolder.h" -#import "SOGoMAPIFSMessage.h" #import "MAPIStoreFSMessageTable.h" @@ -56,4 +51,31 @@ static Class MAPIStoreFSMessageK = Nil; return [NSString stringWithFormat: @"%@", MAPIPropertyKey (property)]; } +- (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res + intoQualifier: (EOQualifier **) qualifier +{ + MAPIRestrictionState rc; + id value; + NSNumber *version; + uint64_t cVersion; + + if ((uint32_t) res->ulPropTag == PR_CHANGE_NUM) + { + value = NSObjectFromMAPISPropValue (&res->lpProp); + cVersion = exchange_globcnt ([value unsignedLongLongValue] >> 16); + version = [NSNumber numberWithUnsignedLongLong: cVersion]; + [self logWithFormat: @"change number from oxcfxics: %.16lx", [value unsignedLongLongValue]]; + [self logWithFormat: @" version: %.16lx", cVersion]; + *qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"version" + operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo + value: version]; + [*qualifier autorelease]; + rc = MAPIRestrictionStateNeedsEval; + } + else + rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; + + return rc; +} + @end