diff --git a/ChangeLog b/ChangeLog index 669f2a1d5..fecff2fe7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-08-21 Wolfgang Sourdeau + + * OpenChange/MAPIStoreGCSFolder.m + (-setChangeKey:forMessageWithKey:): removed useless method. + (-updateVersionsForMessageWithKey:withChangeKey:): set the change + key provided by the client as member of the predecessor + changelist, but never as the actual change key for the object. + This hopefully fixes the issue where Outlook deletes objects that + have a different change list than what they expect. + 2012-08-17 Wolfgang Sourdeau * OpenChange/MAPIStoreCalendarMessage.m diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index 6d25069ca..1f48e034a 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -45,11 +45,8 @@ withChangeKey: (NSData *) newChangeKey; - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum; - (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey; - - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey; - (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey; -- (void) setChangeKey: (NSData *) changeKey - forMessageWithKey: (NSString *) messageKey; - (NSArray *) activeUserRoles; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index d042dfcf0..a5702131f 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -261,6 +261,7 @@ static Class NSNumberK; - (void) _setChangeKey: (NSData *) changeKey forMessageEntry: (NSMutableDictionary *) messageEntry + inChangeListOnly: (BOOL) inChangeListOnly { struct XID *xid; NSString *guid; @@ -273,12 +274,15 @@ static Class NSNumberK; globCnt = [NSData dataWithBytes: xid->Data length: xid->Size]; talloc_free (xid); - /* 1. set change key association */ - changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: - guid, @"GUID", - globCnt, @"LocalId", - nil]; - [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; + if (!inChangeListOnly) + { + /* 1. set change key association */ + changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys: + guid, @"GUID", + globCnt, @"LocalId", + nil]; + [messageEntry setObject: changeKeyDict forKey: @"ChangeKey"]; + } /* 2. append/update predecessor change list */ changeList = [messageEntry objectForKey: @"PredecessorChangeList"]; @@ -286,11 +290,10 @@ static Class NSNumberK; { changeList = [NSMutableDictionary new]; [messageEntry setObject: changeList - forKey: @"PredecessorChangeList"]; + forKey: @"PredecessorChangeList"]; [changeList release]; } - [changeList setObject: globCnt - forKey: guid]; + [changeList setObject: globCnt forKey: guid]; } - (EOQualifier *) componentQualifier @@ -433,7 +436,8 @@ static Class NSNumberK; [messageEntry setObject: changeNumber forKey: @"version"]; changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16]; - [self _setChangeKey: changeKey forMessageEntry: messageEntry]; + [self _setChangeKey: changeKey forMessageEntry: messageEntry + inChangeListOnly: NO]; [mapping setObject: cLastModified forKey: changeNumber]; @@ -464,10 +468,21 @@ static Class NSNumberK; - (void) updateVersionsForMessageWithKey: (NSString *) messageKey withChangeKey: (NSData *) newChangeKey { - [self synchroniseCache]; + NSMutableDictionary *messages, *messageEntry; + [self synchroniseCache]; if (newChangeKey) - [self setChangeKey: newChangeKey forMessageWithKey: messageKey]; + { + messages = [[versionsMessage properties] objectForKey: @"Messages"]; + messageEntry = [messages objectForKey: messageKey]; + if (!messageEntry) + [NSException raise: @"MAPIStoreIOException" + format: @"no version record found for message '%@'", + messageKey]; + [self _setChangeKey: newChangeKey forMessageEntry: messageEntry + inChangeListOnly: YES]; + [versionsMessage save]; + } } - (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum @@ -493,26 +508,6 @@ static Class NSNumberK; return changeNumber; } -- (void) setChangeKey: (NSData *) changeKey - forMessageWithKey: (NSString *) messageKey -{ - NSMutableDictionary *messages; - NSMutableDictionary *messageEntry; - - messages = [[versionsMessage properties] objectForKey: @"Messages"]; - messageEntry = [messages objectForKey: messageKey]; - if (!messageEntry) - { - [self synchroniseCache]; - messageEntry = [messages objectForKey: messageKey]; - if (!messageEntry) - abort (); - } - [self _setChangeKey: changeKey forMessageEntry: messageEntry]; - - [versionsMessage save]; -} - - (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey { NSDictionary *messages, *changeKeyDict;