public bool ComputeMappingPaged(FolderContentsCrawler folderCrawler, EntryIdMap <BadItemMarker> badItemMarkers, out int skippedItemCount, out ulong skippedItemSize, out List <MessageRec> itemsToCopy, out List <MessageRec> targetMessagePropsChanges) { MrsTracer.Service.Function("FolderContentsMapper.ComputeMappingPaged", new object[0]); MrsTracer.Service.Debug("Loading source folder contents", new object[0]); IReadOnlyCollection <MessageRec> messagesNextPage = folderCrawler.GetMessagesNextPage(); if (messagesNextPage.Count == 0) { itemsToCopy = null; targetMessagePropsChanges = null; skippedItemCount = 0; skippedItemSize = 0UL; return(false); } List <byte[]> list = new List <byte[]>(messagesNextPage.Count); foreach (MessageRec messageRec in messagesNextPage) { list.Add(messageRec.EntryId); } MrsTracer.Service.Debug("Looking up target messages", new object[0]); List <MessageRec> targetMessages = this.destFolder.LookupMessages(this.destHierarchy.SourceEntryIDPtag, list, this.GetTargetPTagsInitialSync()); this.ComputeMapping(messagesNextPage, targetMessages, badItemMarkers, out skippedItemCount, out skippedItemSize, out itemsToCopy, out targetMessagePropsChanges); return(true); }
public void MergeFolderContentsPaged(FolderMapping folder, FolderContentsCrawler sourceFolderCrawler, IDestinationFolder destFolder, TimeSpan maxOperationDuration) { MrsTracer.Service.Function("MailboxMerger.MergeFolderContentsPaged({0})", new object[] { folder.FullFolderName }); ISourceFolder wrappedObject = sourceFolderCrawler.WrappedObject; if (this.ContentRestriction != null) { wrappedObject.SetContentsRestriction(this.ContentRestriction); } FolderContentsMapper folderContentsMapper = FolderContentsMapper.Create(folder, wrappedObject, this.SourceHierarchy, destFolder, this.DestHierarchy, this.GetConflictResolutionOption(folder), base.MRSJob.CachedRequestJob.AssociatedMessagesCopyOption ?? FAICopyOption.DoNotCopy, (base.MRSJob.CachedRequestJob.SyncProtocol == SyncProtocol.Imap) ? FolderContentsMapperFlags.ImapSync : FolderContentsMapperFlags.None); DateTime utcNow = DateTime.UtcNow; int alreadyCopiedCount; ulong alreadyCopiedSize; List <MessageRec> itemsToCopy; List <MessageRec> list; while (folderContentsMapper.ComputeMappingPaged(sourceFolderCrawler, (base.SyncState == null) ? null : base.SyncState.BadItems, out alreadyCopiedCount, out alreadyCopiedSize, out itemsToCopy, out list)) { SyncProtocol syncProtocol = base.MRSJob.CachedRequestJob.SyncProtocol; foreach (MessageRec messageRec in list) { destFolder.SetMessageProps(messageRec.EntryId, messageRec.AdditionalProps); } base.MailboxSizeTracker.TrackFolder(folder.EntryId, sourceFolderCrawler.TotalMessageCount, alreadyCopiedCount, alreadyCopiedSize); base.MRSJob.MessagesWritten += base.MailboxSizeTracker.AlreadyCopiedCount; base.MRSJob.MessageSizeWritten += base.MailboxSizeTracker.AlreadyCopiedSize; base.MRSJob.TotalMessages = base.MailboxSizeTracker.MessageCount; base.MRSJob.TotalMessageByteSize = base.MailboxSizeTracker.TotalMessageSize; this.CopyMessageBatch(folderContentsMapper, itemsToCopy, folder); DateTime utcNow2 = DateTime.UtcNow; if (utcNow2 - utcNow >= maxOperationDuration) { MrsTracer.Service.Debug("MergeFolderContentsPaged times out for assigned duration {0}. Start:{1}, End:{2}", new object[] { maxOperationDuration, utcNow, utcNow2 }); return; } } }
private void CopyFolderPropertiesAndContents(FolderMapping folder, FolderContentsCrawler sourceFolderCrawler, bool shouldCopyProperties, TimeSpan maxOperationDuration) { PagedMergeJob.< > c__DisplayClass1 CS$ < > 8__locals1 = new PagedMergeJob.< > c__DisplayClass1(); CS$ < > 8__locals1.folder = folder; CS$ < > 8__locals1.sourceFolderCrawler = sourceFolderCrawler; CS$ < > 8__locals1.shouldCopyProperties = shouldCopyProperties; CS$ < > 8__locals1.maxOperationDuration = maxOperationDuration; CS$ < > 8__locals1.< > 4__this = this; using (IDestinationFolder destFolder = base.MailboxMerger.DestMailbox.GetFolder(CS$ < > 8__locals1.folder.TargetFolder.EntryId)) { if (destFolder == null) { base.Report.Append(MrsStrings.ReportTargetFolderDeleted(CS$ < > 8__locals1.folder.TargetFolder.FullFolderName, TraceUtils.DumpEntryId(CS$ < > 8__locals1.folder.TargetFolder.EntryId), CS$ < > 8__locals1.folder.FullFolderName)); return; } ExecutionContext.Create(new DataContext[] { new FolderRecWrapperDataContext(CS$ < > 8__locals1.folder) }).Execute(delegate
public void CopyFolderPropertiesAndContents(FolderMapping folder, FolderContentsCrawler sourceFolderCrawler, IDestinationFolder destFolder, bool copyProperties, TimeSpan maxOperationDuration) { MrsTracer.Service.Function("CopyFolderPropertiesAndContents('{0}')", new object[] { folder.FullFolderName }); if (copyProperties) { MrsTracer.Service.Debug("Loading mappable folder properties", new object[0]); FolderRecDataFlags dataToCopy = FolderRecDataFlags.SearchCriteria; if (!base.MRSJob.CachedRequestJob.IsPublicFolderMailboxRestore) { bool flag; this.CopyFolderProperties(folder, sourceFolderCrawler.WrappedObject, destFolder, dataToCopy, out flag); } } if (folder.FolderType != FolderType.Search) { this.MergeFolderContentsPaged(folder, sourceFolderCrawler, destFolder, maxOperationDuration); } }
internal FolderMapping GetNextFolderToCopy(out FolderContentsCrawler folderContentsCrawler, out bool shouldCopyProperties) { MrsTracer.Service.Function("MailboxContentsCrawler.GetNextFolderToCopy", new object[0]); base.CheckDisposed(); folderContentsCrawler = null; shouldCopyProperties = false; for (int i = 0; i <= this.folderCount; i++) { if (!this.folderEnumerator.MoveNext()) { MrsTracer.Service.Debug("Tail is reached, move to head", new object[0]); this.folderEnumerator.Reset(); if (!this.folderEnumerator.MoveNext()) { break; } } FolderMapping folderMapping = this.folderEnumerator.Current; if (folderMapping.FolderType != FolderType.Search && folderMapping.IsIncluded && !this.crawledFolders.ContainsKey(folderMapping.EntryId)) { FolderContentsCrawler folderContentsCrawler2; if (!this.crawlers.TryGetValue(folderMapping.EntryId, out folderContentsCrawler2) && this.crawlers.Count < this.maxFoldersOpened) { MrsTracer.Service.Debug("Add crawler for the folder: '{0}'", new object[] { folderMapping.FullFolderName }); ISourceFolder folder = this.sourceMalibox.GetFolder(folderMapping.EntryId); if (folder != null) { folderContentsCrawler2 = new FolderContentsCrawler(folder, this.pageSize, this.maxPageSize) { MailboxCopier = this.mailboxCopier }; using (DisposeGuard disposeGuard = folderContentsCrawler2.Guard()) { this.crawlers.Add(folderMapping.EntryId, folderContentsCrawler2); disposeGuard.Success(); shouldCopyProperties = true; } } } if (folderContentsCrawler2 != null) { if (folderContentsCrawler2.HasMoreMessages) { MrsTracer.Service.Debug("Return the folder to copy: '{0}'", new object[] { folderMapping.FullFolderName }); folderContentsCrawler = folderContentsCrawler2; return(folderMapping); } MrsTracer.Service.Debug("The folder has completed crawling: '{0}'", new object[] { folderMapping.FullFolderName }); this.crawledFolders.Add(folderMapping.EntryId, folderMapping); folderContentsCrawler2.Dispose(); this.crawlers.Remove(folderMapping.EntryId); } } } MrsTracer.Service.Debug("No more folders", new object[0]); return(null); }