Example #1
0
        internal static string GetAllFieldXml(EwsItemType ewsItemType)
        {
            var builder = new StringBuilder();

            foreach (var definition in definitions.Where(d =>
                                                         d.FieldUri != EwsFieldUri.CommonEnd &&
                                                         d.FieldUri != EwsFieldUri.CommonStart &&
                                                         d.FieldUri != EwsFieldUri.TagSubject &&
                                                         d.FieldUri != EwsFieldUri.TagSubjectPrefix &&
                                                         d.FieldUri != EwsFieldUri.TagIconIndex &&
                                                         d.FieldUri != EwsFieldUri.NormalizedSubject &&
                                                         d.FieldUri != EwsFieldUri.FlagRequest &&
                                                         d.FieldUri != EwsFieldUri.ReplyRequested &&
                                                         d.FieldUri != EwsFieldUri.ResponseRequested &&
                                                         d.FieldUri != EwsFieldUri.TagFlagStatus &&
                                                         d.FieldUri != EwsFieldUri.TagFlagCompleteTime &&
                                                         d.FieldUri != EwsFieldUri.TagToDoItemFlags &&
                                                         d.FieldUri != EwsFieldUri.ReminderSet &&
                                                         d.FieldUri != EwsFieldUri.TagFollowupIcon
                                                         ))
            {
                // if item type is "item" (like flagged email, recurrence is not supported)
                bool skipDefinition = ewsItemType == EwsItemType.Item && definition.FieldUri == EwsFieldUri.Recurrence;
                if (!skipDefinition)
                {
                    builder.AppendLine(definition.GetXml());
                }
            }

            return(builder.ToString());
        }
Example #2
0
        public async Task <List <EwsItemIdentifier> > EnumerateFolderContentAsync(EwsFolderIdentifier identifier, EwsItemType itemType = EwsItemType.Task)
        {
            var parameter = new EnumerateFolderContentParameter {
                FolderIdentifier = identifier
            };

            var command = new EnumerateFolderContentCommand(parameter, this.settings);

            var result = await command.Execute();

            var identifiers = result.Data.ItemIdentifiers;

            if (itemType == EwsItemType.Item)
            {
                // remove from the returned item identifiers those that are in the 'Deleted Items' folders
                if (identifiers != null && cachedFolderIdentifiersResult != null && cachedFolderIdentifiersResult.DeletedItemsFolderIdentifier != null && identifier != cachedFolderIdentifiersResult.DeletedItemsFolderIdentifier)
                {
                    int countBefore = identifiers.Count;
                    identifiers = identifiers.Where(id => id.ParentFolderId != cachedFolderIdentifiersResult.DeletedItemsFolderIdentifier.Id).ToList();
                    if (identifiers.Count != countBefore)
                    {
                        LogService.Log("EwsSyncServer", $"Removed {countBefore - identifiers.Count} identifiers that are in the 'Delete Folder' folder");
                    }
                }
            }

            return(identifiers);
        }
Example #3
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);
        }
Example #4
0
        public async Task <List <EwsTask> > DownloadFolderContentAsync(IEnumerable <EwsItemIdentifier> identifiers, EwsItemType ewsItemType)
        {
            if (!identifiers.Any())
            {
                return(new List <EwsTask>());
            }

            var parameter = new GetItemParameter(ewsItemType);

            foreach (var identifier in identifiers)
            {
                parameter.ItemIdentifiers.Add(identifier);
            }

            var command = new GetItemCommand(parameter, this.settings);

            var result = await command.Execute();

            // set item type
            foreach (var ewsTask in result.Data.Tasks)
            {
                ewsTask.Type = ewsItemType;
            }

            return(result.Data.Tasks);
        }
Example #5
0
 public GetItemParameter(EwsItemType ewsItemType)
 {
     this.ewsItemType     = ewsItemType;
     this.ItemIdentifiers = new List <EwsItemIdentifier>();
 }