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.
This commit is contained in:
Enrique J. Hernández Blasco 2015-10-20 09:56:11 +02:00
parent a50758cc06
commit d998786ea6

View file

@ -1645,27 +1645,11 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
- (enum mapistore_error) setReadFlag: (uint8_t) flag - (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 */ /* TODO: notifications should probably be emitted from here */
if (flag & CLEAR_READ_FLAG) if (flag & CLEAR_READ_FLAG)
{ [properties setObject: [NSNumber numberWithBool: NO] forKey: @"read_flag_set"];
[sogoObject removeFlags: imapFlag];
modified = alreadyRead;
}
else else
{ [properties setObject: [NSNumber numberWithBool: YES] forKey: @"read_flag_set"];
[sogoObject addFlags: imapFlag];
modified = !alreadyRead;
}
if (modified)
[(MAPIStoreMailFolder *)[self container] synchroniseCache];
return MAPISTORE_SUCCESS; return MAPISTORE_SUCCESS;
} }
@ -1708,7 +1692,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
- (void) save: (TALLOC_CTX *) memCtx - (void) save: (TALLOC_CTX *) memCtx
{ {
BOOL modified = NO;
BOOL seen, storedSeenFlag;
NSNumber *value; NSNumber *value;
NSString *imapFlag = @"\\Seen";
value = [properties objectForKey: MAPIPropertyKey (PR_FLAG_STATUS)]; value = [properties objectForKey: MAPIPropertyKey (PR_FLAG_STATUS)];
if (value) if (value)
@ -1718,8 +1705,35 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
[sogoObject addFlags: @"\\Flagged"]; [sogoObject addFlags: @"\\Flagged"];
else /* 0: unflagged, 1: follow up complete */ else /* 0: unflagged, 1: follow up complete */
[sogoObject removeFlags: @"\\Flagged"]; [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) if (mailIsSharingObject)
[[self _sharingObject] saveWithMessage: self [[self _sharingObject] saveWithMessage: self
andSOGoObject: sogoObject]; andSOGoObject: sogoObject];