Exemple #1
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);
        }
Exemple #2
0
        public async Task <EwsTask> GetTask(string subject, EwsFolderIdentifier folderIdentifier)
        {
            var itemIdentifiers = await this.EnumerateFolderContentAsync(folderIdentifier, EwsItemType.Task);

            var tasks = await this.DownloadFolderContentAsync(itemIdentifiers, EwsItemType.Task);

            var task = tasks.FirstOrDefault(t => t.Subject == subject);

            return(task);
        }
Exemple #3
0
        public async Task <FindFolderResult> GetSubFoldersAsync(EwsFolderIdentifier identifier)
        {
            var parameter = new FindFolderParameter {
                ParentFolderIdentifier = identifier
            };

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

            var result = await command.Execute();

            return(result.Data);
        }
Exemple #4
0
        public static string GetXmlForFolderIdentifier(EwsFolderIdentifier identifier)
        {
            const string template = "<t:{0} Id='{1}' />";

            if (identifier.IsDistinguishedFolderId)
            {
                return(string.Format(template, "DistinguishedFolderId", identifier.Id));
            }
            else
            {
                return(string.Format(template, "FolderId", identifier.Id));
            }
        }
Exemple #5
0
        public async Task <CreateEmailResult> CreateEmailAsync(EwsFolderIdentifier folderIdentifier, string subject, string body, string recipient)
        {
            var parameter = new CreateEmailParameter(folderIdentifier)
            {
                Subject = subject, Body = body, Recipient = recipient
            };

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

            var result = await command.Execute();

            return(result.Data);
        }
Exemple #6
0
        public CreateItemsParameter(IEnumerable <EwsTask> tasks, EwsFolderIdentifier parentFolder)
        {
            if (tasks == null)
            {
                throw new ArgumentNullException("tasks");
            }
            if (parentFolder == null)
            {
                throw new ArgumentNullException("parentFolder");
            }

            this.Tasks        = new List <EwsTask>(tasks);
            this.ParentFolder = parentFolder;
        }
        protected override void ParseResponseCore(List <EwsResponseMessage> responseMessages)
        {
            var identifiers = new List <EwsFolderIdentifier>();

            foreach (var responseMessage in responseMessages.Select(m => m.Content))
            {
                foreach (var folder in responseMessage.XGetChildrenOf("Folders"))
                {
                    string id               = folder.XGetChildNodeAttributeValue <string>("FolderId", "Id");
                    string changeKey        = folder.XGetChildNodeAttributeValue <string>("FolderId", "ChangeKey");
                    string displayName      = folder.XGetChildValue <string>("DisplayName");
                    int    totalCount       = folder.XGetChildValue <int>("TotalCount");
                    int    childFolderCount = folder.XGetChildValue <int>("ChildFolderCount");
                    int    unreadCount      = folder.XGetChildValue <int>("UnreadCount");

                    identifiers.Add(new EwsFolderIdentifier(id, changeKey, displayName, totalCount, childFolderCount, unreadCount));
                }
            }

            if (identifiers.Count == 0)
            {
                throw new CommandResponseException("No folder identifiers were found");
            }

            this.TaskFolderIdentifier = identifiers[0];

            if (identifiers.Count > 0)
            {
                this.DeletedItemsFolderIdentifier = identifiers[1];
            }

            if (identifiers.Count > 1)
            {
                this.DraftItemsFolderIdentifier = identifiers[2];
            }

            if (identifiers.Count > 2)
            {
                this.InboxFolderIdentifier = identifiers[3];
            }
        }
        public async Task <EwsTask> CreateFlaggedItem(string subject)
        {
            // setup
            var createResult = await this.server.CreateEmailAsync(EwsKnownFolderIdentifiers.Inbox, subject, "world", "*****@*****.**");

            Assert.IsNotNull(createResult);

            this.searchFolderIdentifier = await this.service.EnsureSearchFolderAsync(this.server);

            Assert.IsNotNull(this.searchFolderIdentifier);

            var ewsTask = new EwsTask
            {
                Type = EwsItemType.Item,

                Id                    = createResult.Identifiers[0].Id,
                ChangeKey             = createResult.Identifiers[0].ChangeKey,
                ParentFolderId        = createResult.Identifiers[0].ParentFolderId,
                ParentFolderChangeKey = createResult.Identifiers[0].ParentFolderChangeKey,

                DueDate    = DateTime.Now.Date,
                Categories = new[] { "cat1", "cat2 " },
                Changes    = EwsFields.DueDate | EwsFields.Categories
            };

            // act
            var updateResult = await this.server.UpdateItemAsync(ewsTask);

            // check
            Assert.IsNotNull(updateResult);
            Assert.AreEqual(1, updateResult.Identifiers.Count);
            Assert.AreEqual(ewsTask.Id, updateResult.Identifiers[0].Id);

            ewsTask.ChangeKey = updateResult.Identifiers[0].ChangeKey;

            return(ewsTask);
        }
 public CreateEmailParameter(EwsFolderIdentifier parentFolder)
 {
     this.ParentFolder = parentFolder;
 }
Exemple #10
0
        public async Task <CreateFolderResult> CreateFoldersAsync(IEnumerable <string> names, EwsFolderIdentifier identifier)
        {
            var parameter = new CreateFolderParameter {
                ParentFolderIdentifier = identifier
            };

            parameter.Names.AddRange(names);

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

            var result = await command.Execute();

            return(result.Data);
        }
Exemple #11
0
        public async Task <CreateItemsResult> CreateItemAsync(IEnumerable <EwsTask> tasks, EwsFolderIdentifier parentFolder = null)
        {
            if (parentFolder == null)
            {
                parentFolder = EwsKnownFolderIdentifiers.Tasks;
            }

            var command = new CreateItemsCommand(new CreateItemsParameter(tasks, parentFolder), this.settings);

            var result = await command.Execute();

            return(result.Data);
        }
Exemple #12
0
 public async Task <CreateItemsResult> CreateItemAsync(EwsTask task, EwsFolderIdentifier parentFolder = null)
 {
     return(await this.CreateItemAsync(new[] { task }, parentFolder));
 }
Exemple #13
0
        private async Task PushLocalChanges(ExchangeChangeSet changeSet, EwsSyncServer server, List <ExchangeMapId> mapId, EwsFolderIdentifier folder)
        {
            // send local add content
            if (changeSet.AddedTasks.Count > 0)
            {
                var ewsTasks         = changeSet.AddedTasks.Select(exchangeTask => exchangeTask.BuildEwsTask()).ToList();
                var createItemResult = await server.CreateItemAsync(ewsTasks, folder);

                if (changeSet.AddedTasks.Count == createItemResult.Identifiers.Count)
                {
                    for (int i = 0; i < createItemResult.Identifiers.Count; i++)
                    {
                        var identifier = createItemResult.Identifiers[i];
                        if (identifier.IsValid)
                        {
                            mapId.Add(new ExchangeMapId {
                                LocalId = changeSet.AddedTasks[i].LocalId, ExchangeId = identifier.GetFullId()
                            });
                        }
                        else
                        {
                            LogService.Log("EwsSyncService", "Error while creating task: " + changeSet.AddedTasks[i].Subject + " error: " + identifier.ErrorMessage);
                        }
                    }
                }
                else
                {
                    LogService.Log("EwsSyncService", string.Format("Request to create {0} items but result only has {1} items", changeSet.AddedTasks.Count, createItemResult.Identifiers.Count));
                }
            }

            // send local modification content
            if (changeSet.ModifiedTasks.Count > 0)
            {
                var ewsTasks         = changeSet.ModifiedTasks.Select(exchangeTask => exchangeTask.BuildEwsTask()).ToList();
                var updateItemResult = await server.UpdateItemsAsync(ewsTasks);

                // todo ews: we don't update change key here... not optimal because then we're going to ask
                // the server to enumerate items, we will find different change keys for update items and so
                // we're going to download them again from the server
            }

            // send local delete content
            if (changeSet.DeletedTasks.Count > 0)
            {
                var ewsIdentifiers = new List <EwsItemIdentifier>();
                foreach (var deletedAsset in changeSet.DeletedTasks)
                {
                    ewsIdentifiers.Add(deletedAsset.Id.GetEwsItemIdentifier());
                }

                await server.DeleteItemsAsync(ewsIdentifiers);
            }
        }
Exemple #14
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);
        }