diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 972c1aa49..275233c6d 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -283,7 +283,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]]; sogoObject = [[SOGoTaskObject alloc] initWithName: serverId inContainer: theCollection]; - o = [sogoObject component: YES secure: NO]; + o = [sogoObject component: YES secure: NO]; } break; case ActiveSyncMailFolder: @@ -311,10 +311,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. syncCache = [folderMetadata objectForKey: @"SyncCache"]; 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]; - + [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; NSArray *changes; id aChange, o, sogoObject; + NSMutableDictionary *folderMetadata, *syncCache; int i; @@ -372,6 +373,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([changes count]) { + folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; + syncCache = [folderMetadata objectForKey: @"SyncCache"]; + for (i = 0; i < [changes count]; i++) { aChange = [changes objectAtIndex: i]; @@ -398,6 +402,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. o = [sogoObject vCard]; [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; + + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; + } break; case ActiveSyncEventFolder: @@ -406,15 +413,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. o = [sogoObject component: NO secure: NO]; [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; + + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; + } break; case ActiveSyncMailFolder: default: { + NSDictionary *result; + NSString *modseq; + [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: @""]; [theBuffer appendFormat: @"%@", serverId]; [theBuffer appendFormat: @"%d", 1]; @@ -899,6 +921,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [syncCache removeObjectForKey: [aCacheObject uid]]; [dateCache removeObjectForKey: [aCacheObject uid]]; + + return_count++; } else { @@ -908,17 +932,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inContext: context acquire: 0]; - [s appendString: @""]; - [s appendFormat: @"%@", [aCacheObject uid]]; - [s appendString: @""]; - [s appendString: [mailObject activeSyncRepresentationInContext: context]]; - [s appendString: @""]; - [s appendString: @""]; - + if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]]) + { + [s appendString: @""]; + [s appendFormat: @"%@", [aCacheObject uid]]; + [s appendString: @""]; + [s appendString: [mailObject activeSyncRepresentationInContext: context]]; + [s appendString: @""]; + [s appendString: @""]; + + return_count++; + } + [syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]]; } - - return_count++; } else { @@ -1193,22 +1220,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [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 // @@ -1226,12 +1237,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inBuffer: s processed: &processed]; - // Windows phons don't empty Responses tags - such as: . - // We onnly generate this tag when the command has generated a response. + // Windows phones don't like empty Responses tags - such as: . + // We only generate this tag when there is a response if (processed && [s length]) [commandsBuffer appendFormat: @"%@", 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]]; // 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. syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"]; - if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && ![davCollectionTag isEqualToString: @"-1"]) + if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && !first_sync) { davCollectionTag = syncKeyInCache; *changeDetected = YES; diff --git a/NEWS b/NEWS index 6f5018167..d3e5f48f1 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Bug fixes - fixed data ordering in events list of Calendar module (#3261) - fixed data ordering in tasks list of Calendar module (#3267) - Android EAS Lollipop fixes (#3268 and #3269) + - improved EAS email flagging handling (#3140) 2.3.0 (2015-06-01) -------------------