From d998786ea61d39c3ad3bfa27a9587bc1c12ad279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Tue, 20 Oct 2015 09:56:11 +0200 Subject: [PATCH] oc-mail: Always increase the CN when setting the message read flag And perform the real IMAP operation on save method as described by [MS-OXCFXICS] and [MS-OXCMSG] Section 2.2.3.3, these operations must be committed when SaveChangesMessage is called. As it is expected by Outlook to increase the change number when performing the `SetMessageReadFlag` ROP, if it is not done, the client tries indefinitely to store that. --- OpenChange/MAPIStoreMailMessage.m | 50 ++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 7ae2bd1d9..55ad92bd0 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -1645,27 +1645,11 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) - (enum mapistore_error) setReadFlag: (uint8_t) flag { - BOOL modified = NO; - BOOL alreadyRead = NO; - NSString *imapFlag = @"\\Seen"; - - alreadyRead = [[[sogoObject fetchCoreInfos] objectForKey: @"flags"] - containsObject: @"seen"]; - /* TODO: notifications should probably be emitted from here */ if (flag & CLEAR_READ_FLAG) - { - [sogoObject removeFlags: imapFlag]; - modified = alreadyRead; - } + [properties setObject: [NSNumber numberWithBool: NO] forKey: @"read_flag_set"]; else - { - [sogoObject addFlags: imapFlag]; - modified = !alreadyRead; - } - - if (modified) - [(MAPIStoreMailFolder *)[self container] synchroniseCache]; + [properties setObject: [NSNumber numberWithBool: YES] forKey: @"read_flag_set"]; return MAPISTORE_SUCCESS; } @@ -1708,7 +1692,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) - (void) save: (TALLOC_CTX *) memCtx { + BOOL modified = NO; + BOOL seen, storedSeenFlag; NSNumber *value; + NSString *imapFlag = @"\\Seen"; value = [properties objectForKey: MAPIPropertyKey (PR_FLAG_STATUS)]; if (value) @@ -1718,8 +1705,35 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) [sogoObject addFlags: @"\\Flagged"]; else /* 0: unflagged, 1: follow up complete */ [sogoObject removeFlags: @"\\Flagged"]; + + modified = YES; } + /* Manage seen flag on save */ + value = [properties objectForKey: @"read_flag_set"]; + if (value) + { + seen = [value boolValue]; + storedSeenFlag = [[[sogoObject fetchCoreInfos] objectForKey: @"flags"] containsObject: @"seen"]; + /* We modify the flags anyway to generate a new change number */ + if (seen) + { + if (storedSeenFlag) + [sogoObject removeFlags: imapFlag]; + [sogoObject addFlags: imapFlag]; + } + else + { + if (!storedSeenFlag) + [sogoObject addFlags: imapFlag]; + [sogoObject removeFlags: imapFlag]; + } + modified = YES; + } + + if (modified) + [(MAPIStoreMailFolder *)[self container] synchroniseCache]; + if (mailIsSharingObject) [[self _sharingObject] saveWithMessage: self andSOGoObject: sogoObject];