Merge pull request #78 from Zentyal/jgarcia/sync-deleted-messages
Sync deleted messages
This commit is contained in:
commit
6ce4cc1919
|
@ -637,16 +637,18 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||||
fetchResults = [(SOGoMailFolder *) sogoObject
|
fetchResults = [(SOGoMailFolder *) sogoObject
|
||||||
fetchUIDsOfVanishedItems: lastModseqNbr];
|
fetchUIDsOfVanishedItems: lastModseqNbr];
|
||||||
max = [fetchResults count];
|
max = [fetchResults count];
|
||||||
changeNumbers = [[self context] getNewChangeNumbers: max];
|
|
||||||
changeNumber = nil;
|
changeNumber = nil;
|
||||||
for (count = 0; count < max; count++)
|
for (count = 0; count < max; count++)
|
||||||
{
|
{
|
||||||
uid = [[fetchResults objectAtIndex: count] stringValue];
|
uid = [[fetchResults objectAtIndex: count] stringValue];
|
||||||
if ([messages objectForKey: uid])
|
if ([messages objectForKey: uid])
|
||||||
{
|
{
|
||||||
newChangeNum = [[changeNumbers objectAtIndex: count]
|
if (!changeNumber)
|
||||||
unsignedLongLongValue];
|
{
|
||||||
changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum];
|
newChangeNum = [[self context] getNewChangeNumber];
|
||||||
|
changeNumber = [NSString stringWithUnsignedLongLong: newChangeNum];
|
||||||
|
}
|
||||||
[messages removeObjectForKey: uid];
|
[messages removeObjectForKey: uid];
|
||||||
[self logWithFormat: @"Removed message entry for UID %@", uid];
|
[self logWithFormat: @"Removed message entry for UID %@", uid];
|
||||||
}
|
}
|
||||||
|
@ -659,6 +661,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||||
{
|
{
|
||||||
[currentProperties setObject: changeNumber
|
[currentProperties setObject: changeNumber
|
||||||
forKey: @"SyncLastDeleteChangeNumber"];
|
forKey: @"SyncLastDeleteChangeNumber"];
|
||||||
|
[mapping setObject: lastModseq forKey: changeNumber];
|
||||||
foundChange = YES;
|
foundChange = YES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -759,7 +762,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||||
messageEntry = [messages objectForKey: messageUID];
|
messageEntry = [messages objectForKey: messageUID];
|
||||||
if (!messageEntry)
|
if (!messageEntry)
|
||||||
{
|
{
|
||||||
changeNumber = [[self context] getNewChangeNumber];
|
|
||||||
fetchResults = [(NSDictionary *) [sogoObject fetchUIDs: [NSArray arrayWithObject: messageUID]
|
fetchResults = [(NSDictionary *) [sogoObject fetchUIDs: [NSArray arrayWithObject: messageUID]
|
||||||
parts: [NSArray arrayWithObject: @"modseq"]]
|
parts: [NSArray arrayWithObject: @"modseq"]]
|
||||||
objectForKey: @"fetch"];
|
objectForKey: @"fetch"];
|
||||||
|
@ -767,6 +769,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||||
{
|
{
|
||||||
result = [fetchResults objectAtIndex: 0];
|
result = [fetchResults objectAtIndex: 0];
|
||||||
modseq = [result objectForKey: @"modseq"];
|
modseq = [result objectForKey: @"modseq"];
|
||||||
|
changeNumber = [[self context] getNewChangeNumber];
|
||||||
changeNumberStr = [NSString stringWithUnsignedLongLong: changeNumber];
|
changeNumberStr = [NSString stringWithUnsignedLongLong: changeNumber];
|
||||||
|
|
||||||
/* Create new message entry in Messages dict */
|
/* Create new message entry in Messages dict */
|
||||||
|
@ -799,13 +802,43 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSNumber *) modseqFromMessageChangeNumber: (NSString *) changeNum
|
- (NSNumber *) modseqFromMessageChangeNumber: (NSString *) changeNum
|
||||||
{
|
{
|
||||||
NSDictionary *mapping;
|
NSDictionary *mapping;
|
||||||
NSNumber *modseq;
|
NSNumber *modseq;
|
||||||
|
NSEnumerator *enumerator;
|
||||||
|
id key;
|
||||||
|
uint64_t found, target, current, replica_id, current_cn;
|
||||||
|
NSString *closestChangeNum;
|
||||||
|
|
||||||
mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"];
|
mapping = [[versionsMessage properties] objectForKey: @"VersionMapping"];
|
||||||
modseq = [mapping objectForKey: changeNum];
|
modseq = [mapping objectForKey: changeNum];
|
||||||
|
if (modseq) return modseq;
|
||||||
|
|
||||||
|
// Not found from stored change numbers for this folder.
|
||||||
|
// Get the closest modseq for the change number given.
|
||||||
|
// O(n) cost but will be unusual behaviour.
|
||||||
|
target = exchange_globcnt([changeNum unsignedLongLongValue] >> 16);
|
||||||
|
replica_id = [changeNum unsignedLongLongValue] & 0xFFFF;
|
||||||
|
found = 0;
|
||||||
|
enumerator = [mapping keyEnumerator];
|
||||||
|
while ((key = [enumerator nextObject]))
|
||||||
|
{
|
||||||
|
current_cn = [(NSString *)key unsignedLongLongValue];
|
||||||
|
if ((current_cn & 0xFFFF) != replica_id)
|
||||||
|
continue;
|
||||||
|
current = exchange_globcnt(current_cn >> 16);
|
||||||
|
if (current < target && current > found)
|
||||||
|
found = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
closestChangeNum = [NSString stringWithUnsignedLongLong:
|
||||||
|
(exchange_globcnt(found) << 16 | replica_id)];
|
||||||
|
modseq = [mapping objectForKey: closestChangeNum];
|
||||||
|
}
|
||||||
|
|
||||||
return modseq;
|
return modseq;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue