private async Task <List <EwsItemIdentifier> > ApplyRemoteChanges(ExchangeChangeSet changeSet, EwsSyncServer server, List <ExchangeMapId> mapId, EwsFolderIdentifier folderIdentifier, EwsItemType ewsItemType) { // enumerate remote content var remoteIdentifiers = await server.EnumerateFolderContentAsync(folderIdentifier, ewsItemType); var editedItems = new List <EwsItemIdentifier>(); var newItems = new List <EwsItemIdentifier>(); // check for remote identifiers that have a new change key (ie. updated elements in Exchange) foreach (var task in this.workbook.Tasks.Where(t => t.SyncId != null)) { // check if we can find this task that exists in the workbook in the remote identifiers var remoteId = remoteIdentifiers.FirstOrDefault(i => i.Id == task.SyncId.GetId()); // we find this task in the remote identifiers, check if the change key has changed since last sync if (remoteId != null && remoteId.ChangeKey != task.SyncId.GetEwsItemIdentifier().ChangeKey) { // local item found on server with a different ChangeKey because it was updated => update editedItems.Add(new EwsItemIdentifier(remoteId.Id, remoteId.ChangeKey)); } } // check for remote identifiers that we don't have in the workbook and that were not added during this sync operation foreach (var identifier in remoteIdentifiers.Where(i => mapId.All(id => id.ExchangeId != null && id.ExchangeId.GetId() != i.Id))) { var task = this.workbook.Tasks.Where(t => t.SyncId != null).FirstOrDefault(t => t.SyncId.GetId() == identifier.Id); if (task == null) { // item found on server but not locally => new item newItems.Add(identifier); } } var items = new List <EwsItemIdentifier>(); items.AddRange(editedItems); items.AddRange(newItems); var ewsTasks = await server.DownloadFolderContentAsync(items, ewsItemType); foreach (var ewsTask in ewsTasks) { if (editedItems.Any(i => i.Id == ewsTask.Id)) { changeSet.ModifiedTasks.Add(ewsTask.BuildExchangeTask()); } else if (newItems.Any(i => i.Id == ewsTask.Id)) { changeSet.AddedTasks.Add(ewsTask.BuildExchangeTask()); } else { throw new NotSupportedException(); } } return(remoteIdentifiers); }