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);
        }
Beispiel #2
0
        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;
                }
            }
        }
Beispiel #3
0
 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
Beispiel #4
0
 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);
 }