(fix) improved EAS email flagging handling (#3140)

pull/91/head
Ludovic Marcotte 2015-07-22 09:46:06 -04:00
parent b6c6e09a5a
commit efd182f145
2 changed files with 62 additions and 33 deletions

View File

@ -283,7 +283,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]]; serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
inContainer: theCollection]; inContainer: theCollection];
o = [sogoObject component: YES secure: NO]; o = [sogoObject component: YES secure: NO];
} }
break; break;
case ActiveSyncMailFolder: case ActiveSyncMailFolder:
@ -311,10 +311,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syncCache = [folderMetadata objectForKey: @"SyncCache"]; syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"]; dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache setObject: [folderMetadata objectForKey: @"SyncKey"] forKey: serverId]; [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
[dateCache setObject: [NSCalendarDate date] forKey: serverId]; [dateCache setObject: [NSCalendarDate date] forKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
} }
} }
@ -365,6 +365,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSString *serverId; NSString *serverId;
NSArray *changes; NSArray *changes;
id aChange, o, sogoObject; id aChange, o, sogoObject;
NSMutableDictionary *folderMetadata, *syncCache;
int i; int i;
@ -372,6 +373,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ([changes count]) if ([changes count])
{ {
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
for (i = 0; i < [changes count]; i++) for (i = 0; i < [changes count]; i++)
{ {
aChange = [changes objectAtIndex: i]; aChange = [changes objectAtIndex: i];
@ -398,6 +402,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject vCard]; o = [sogoObject vCard];
[o takeActiveSyncValues: allChanges inContext: context]; [o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o]; [sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
} }
break; break;
case ActiveSyncEventFolder: case ActiveSyncEventFolder:
@ -406,15 +413,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject component: NO secure: NO]; o = [sogoObject component: NO secure: NO];
[o takeActiveSyncValues: allChanges inContext: context]; [o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o]; [sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
} }
break; break;
case ActiveSyncMailFolder: case ActiveSyncMailFolder:
default: default:
{ {
NSDictionary *result;
NSString *modseq;
[sogoObject takeActiveSyncValues: allChanges inContext: context]; [sogoObject takeActiveSyncValues: allChanges inContext: context];
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
if (modseq)
[syncCache setObject: modseq forKey: serverId];
} }
} }
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
[theBuffer appendString: @"<Change>"]; [theBuffer appendString: @"<Change>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId]; [theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1]; [theBuffer appendFormat: @"<Status>%d</Status>", 1];
@ -899,6 +921,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[syncCache removeObjectForKey: [aCacheObject uid]]; [syncCache removeObjectForKey: [aCacheObject uid]];
[dateCache removeObjectForKey: [aCacheObject uid]]; [dateCache removeObjectForKey: [aCacheObject uid]];
return_count++;
} }
else else
{ {
@ -908,17 +932,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inContext: context inContext: context
acquire: 0]; acquire: 0];
[s appendString: @"<Change xmlns=\"AirSync:\">"]; if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]])
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]]; {
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"]; [s appendString: @"<Change xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]]; [s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
[s appendString: @"</ApplicationData>"]; [s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: @"</Change>"]; [s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Change>"];
return_count++;
}
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]]; [syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
} }
return_count++;
} }
else else
{ {
@ -1193,22 +1220,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withMaxSyncResponseSize: theMaxSyncResponseSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
// //
// We process the commands from the request // We process the commands from the request
// //
@ -1226,12 +1237,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inBuffer: s inBuffer: s
processed: &processed]; processed: &processed];
// Windows phons don't empty Responses tags - such as: <Responses></Responses>. // Windows phones don't like empty Responses tags - such as: <Responses></Responses>.
// We onnly generate this tag when the command has generated a response. // We only generate this tag when there is a response
if (processed && [s length]) if (processed && [s length])
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s]; [commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
} }
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withMaxSyncResponseSize: theMaxSyncResponseSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
// If we got any changes or if we have applied any commands // If we got any changes or if we have applied any commands
@ -1256,7 +1284,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{ {
// Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync. // Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync.
syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"]; syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"];
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && ![davCollectionTag isEqualToString: @"-1"]) if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && !first_sync)
{ {
davCollectionTag = syncKeyInCache; davCollectionTag = syncKeyInCache;
*changeDetected = YES; *changeDetected = YES;

1
NEWS
View File

@ -17,6 +17,7 @@ Bug fixes
- fixed data ordering in events list of Calendar module (#3261) - fixed data ordering in events list of Calendar module (#3261)
- fixed data ordering in tasks list of Calendar module (#3267) - fixed data ordering in tasks list of Calendar module (#3267)
- Android EAS Lollipop fixes (#3268 and #3269) - Android EAS Lollipop fixes (#3268 and #3269)
- improved EAS email flagging handling (#3140)
2.3.0 (2015-06-01) 2.3.0 (2015-06-01)
------------------- -------------------