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.
pull/69/head
Enrique J. Hernández Blasco 2014-10-07 00:51:45 +02:00 committed by Julio García
parent 258444bb93
commit 7e0cddc06b
1 changed files with 30 additions and 1 deletions

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];
}
}
}