oc-mailfolder: Avoid setting seen flag on preloading message bodies

Fetching a body[text] property using IMAP makes IMAP server set seen flag.

This commit fetches the flag beforehand to restore the previous state
once the body has been fetched.
This commit is contained in:
Enrique J. Hernández Blasco 2014-10-07 00:51:45 +02:00 committed by Julio García
parent 258444bb93
commit 7e0cddc06b

View file

@ -1274,8 +1274,10 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
NSUInteger count, max;
NSString *messageKey, *messageUid, *bodyPartKey;
NGImap4Client *client;
NSArray *fetch;
NSArray *fetch, *flags;
NSData *bodyContent;
BOOL unseen;
NSMutableArray *unseenUIDs;
if (tableType == MAPISTORE_MESSAGE_TABLE)
{
@ -1305,6 +1307,25 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
client = [[(SOGoMailFolder *) sogoObject imap4Connection] client];
[client select: [sogoObject absoluteImap4Name]];
/* Fetch flags to remove seen flag if required,
as fetching a message body set the seen flag */
response = [client fetchUids: [keyAssoc allKeys]
parts: [NSArray arrayWithObjects: @"flags", nil]];
fetch = [response objectForKey: @"fetch"];
max = [fetch count];
unseenUIDs = [NSMutableArray arrayWithCapacity: max];
for (count = 0; count < max; count++)
{
response = [fetch objectAtIndex: count];
messageUid = [[response objectForKey: @"uid"] stringValue];
flags = [response objectForKey: @"flags"];
unseen = [flags indexOfObject: @"seen"] == NSNotFound;
if (unseen) {
[unseenUIDs addObject: messageUid];
}
}
response = [client fetchUids: [keyAssoc allKeys]
parts: [bodyPartKeys allObjects]];
fetch = [response objectForKey: @"fetch"];
@ -1326,6 +1347,14 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
}
}
}
// Restore unseen state once the body has been fetched
if ([unseenUIDs count] > 0)
{
response = [client storeFlags: [NSArray arrayWithObjects: @"seen", nil]
forUIDs: unseenUIDs
addOrRemove: NO];
}
}
}