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:
parent
a50758cc06
commit
d998786ea6
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue