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()); }
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); }
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); }
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); }
public GetItemParameter(EwsItemType ewsItemType) { this.ewsItemType = ewsItemType; this.ItemIdentifiers = new List <EwsItemIdentifier>(); }