Exemple #1
0
        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);
        }