コード例 #1
0
ファイル: MapiUtils.cs プロジェクト: YHZX2013/exchange_diff
 private static bool ExportMessageBatch(ISourceMailbox mailbox, List <MessageRec> messages, Func <IFxProxyPool> getProxyPool, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps, TestIntegration testIntegration, out Exception failure)
 {
     failure = null;
     try
     {
         using (IFxProxyPool fxProxyPool = getProxyPool())
         {
             mailbox.ExportMessages(messages, fxProxyPool, flags, propsToCopyExplicitly, excludeProps);
         }
         return(true);
     }
     catch (Exception ex)
     {
         if (!MapiUtils.IsBadItemIndicator(ex, out failure))
         {
             if (failure != ex)
             {
                 failure.PreserveExceptionStack();
                 throw failure;
             }
             throw;
         }
     }
     return(false);
 }
コード例 #2
0
 protected override void ConfigureProviders(bool continueAfterConfiguringProviders)
 {
     using (DisposeGuard disposeGuard = default(DisposeGuard))
     {
         ISourceMailbox sourceMailbox = this.ConfigureSourceMailbox();
         disposeGuard.Add <ISourceMailbox>(sourceMailbox);
         IDestinationMailbox destinationMailbox = this.ConfigureDestinationMailbox();
         disposeGuard.Add <IDestinationMailbox>(destinationMailbox);
         this.PrimaryHierarchyMbxWrapper = this.ConfigureHierarchyMailbox(sourceMailbox, destinationMailbox);
         string orgID = (base.CachedRequestJob.OrganizationId != null && base.CachedRequestJob.OrganizationId.OrganizationalUnit != null) ? (base.CachedRequestJob.OrganizationId.OrganizationalUnit.Name + "\\") : string.Empty;
         this.SourceMbxWrapper = new SourceMailboxWrapper(sourceMailbox, MailboxWrapperFlags.Source, MrsStrings.AuxFolderMoveTracingId(orgID, base.CachedRequestJob.SourceExchangeGuid));
         this.folderMover.SetMailboxWrappers(this.SourceMbxWrapper, destinationMailbox);
         disposeGuard.Success();
     }
     base.ConfigureProviders(continueAfterConfiguringProviders);
 }
コード例 #3
0
 public void MessageExport(ISourceMailbox mailbox, List <MessageRec> messages, ExportMessagesFlags flags, PropTag[] excludeProps)
 {
     this.RunExportThread(delegate
     {
         using (BufferedTransmitter bufferedTransmitter = new BufferedTransmitter(this, this.service.ExportBufferSizeFromMrsKB, false, this.service.UseBufferring, this.service.UseCompression))
         {
             using (AsynchronousTransmitter asynchronousTransmitter = new AsynchronousTransmitter(bufferedTransmitter, false))
             {
                 using (FxProxyPoolTransmitter fxProxyPoolTransmitter = new FxProxyPoolTransmitter(asynchronousTransmitter, false, this.service.ClientVersion))
                 {
                     mailbox.ExportMessages(messages, fxProxyPoolTransmitter, flags, null, excludeProps);
                 }
             }
         }
     });
 }
コード例 #4
0
 public void MailboxExport(ISourceMailbox mailbox, PropTag[] excludeTags)
 {
     this.RunExportThread(delegate
     {
         using (BufferedTransmitter bufferedTransmitter = new BufferedTransmitter(this, this.service.ExportBufferSizeFromMrsKB, false, this.service.UseBufferring, this.service.UseCompression))
         {
             using (AsynchronousTransmitter asynchronousTransmitter = new AsynchronousTransmitter(bufferedTransmitter, false))
             {
                 using (FxProxyTransmitter fxProxyTransmitter = new FxProxyTransmitter(asynchronousTransmitter, false))
                 {
                     mailbox.CopyTo(fxProxyTransmitter, excludeTags);
                 }
             }
         }
     });
 }
コード例 #5
0
 public void FoldersExport(ISourceMailbox mailbox, List <byte[]> folderIds, ExportFoldersDataToCopyFlags exportFoldersDataToCopyFlags, GetFolderRecFlags folderRecFlags, PropTag[] additionalFolderRecProps, CopyPropertiesFlags copyPropertiesFlags, PropTag[] excludeProps, AclFlags extendedAclFlags)
 {
     this.RunExportThread(delegate
     {
         using (BufferedTransmitter bufferedTransmitter = new BufferedTransmitter(this, this.service.ExportBufferSizeFromMrsKB, false, this.service.UseBufferring, this.service.UseCompression))
         {
             using (AsynchronousTransmitter asynchronousTransmitter = new AsynchronousTransmitter(bufferedTransmitter, false))
             {
                 using (FxProxyPoolTransmitter fxProxyPoolTransmitter = new FxProxyPoolTransmitter(asynchronousTransmitter, false, this.service.ClientVersion))
                 {
                     mailbox.ExportFolders(folderIds, fxProxyPoolTransmitter, exportFoldersDataToCopyFlags, folderRecFlags, additionalFolderRecProps, copyPropertiesFlags, excludeProps, extendedAclFlags);
                 }
             }
         }
     });
 }
コード例 #6
0
 private void Initialize(ISourceMailbox sourceMalibox, IReadOnlyCollection <FolderMapping> foldersToCopy, int maxFoldersOpened, int pageSize, int maxPageSize)
 {
     ArgumentValidator.ThrowIfNull("sourceMalibox", sourceMalibox);
     ArgumentValidator.ThrowIfNull("foldersToCopy", foldersToCopy);
     ArgumentValidator.ThrowIfZeroOrNegative("maxFolderOpened", maxFoldersOpened);
     ArgumentValidator.ThrowIfZeroOrNegative("pageSize", pageSize);
     ArgumentValidator.ThrowIfZeroOrNegative("maxPageSize", maxPageSize);
     this.sourceMalibox    = sourceMalibox;
     this.pageSize         = pageSize;
     this.maxPageSize      = maxPageSize;
     this.folderCount      = foldersToCopy.Count;
     this.maxFoldersOpened = maxFoldersOpened;
     this.folderEnumerator = foldersToCopy.GetEnumerator();
     this.crawlers         = new EntryIdMap <FolderContentsCrawler>(Math.Min(this.folderCount, this.maxFoldersOpened));
     this.crawledFolders   = new EntryIdMap <FolderMapping>(this.folderCount);
 }
コード例 #7
0
        private static void ConnectAndValidateSource(ISourceMailbox sourceDatabase, out MailboxServerInformation sourceMailboxServerInfo, out MailboxInformation sourceDatabaseInfo)
        {
            sourceDatabase.Connect(MailboxConnectFlags.None);
            sourceMailboxServerInfo = sourceDatabase.GetMailboxServerInformation();
            sourceDatabaseInfo      = sourceDatabase.GetMailboxInformation();
            MrsTracer.Service.Debug("Switching source public folder database {0} to SyncSource mode.", new object[]
            {
                sourceDatabaseInfo
            });
            bool flag;

            sourceDatabase.SetInTransitStatus(InTransitStatus.SyncSource, out flag);
            if (!flag)
            {
                throw new OfflinePublicFolderMigrationNotSupportedException();
            }
        }
コード例 #8
0
 public void MessageExportWithBadMessageDetection(ISourceMailbox mailbox, List <MessageRec> messages, ExportMessagesFlags flags, PropTag[] excludeProps, bool isDownlevelClient)
 {
     this.RunExportThread(delegate
     {
         List <BadMessageRec> list = new List <BadMessageRec>();
         MapiUtils.ExportMessagesWithBadItemDetection(mailbox, messages, delegate
         {
             BufferedTransmitter destination      = new BufferedTransmitter(this, this.service.ExportBufferSizeFromMrsKB, false, this.service.UseBufferring, this.service.UseCompression);
             AsynchronousTransmitter destination2 = new AsynchronousTransmitter(destination, true);
             return(new FxProxyPoolTransmitter(destination2, true, this.service.ClientVersion));
         }, flags, null, excludeProps, TestIntegration.Instance, ref list);
         if (list != null && list.Count > 0)
         {
             MessageExportResultTransmitter messageExportResultTransmitter = new MessageExportResultTransmitter(this, isDownlevelClient);
             messageExportResultTransmitter.SendMessageExportResults(list);
             ((IDataImport)this).SendMessageAndWaitForReply(FlushMessage.Instance);
         }
     });
 }
コード例 #9
0
 public TranslatorPFProxy(ISourceMailbox sourceMailbox, IDestinationMailbox destinationMailbox, IFxProxyPool destinationProxyPool) : base(destinationProxyPool, true)
 {
     this.sourceMailbox      = sourceMailbox;
     this.destinationMailbox = destinationMailbox;
 }
コード例 #10
0
		public PublicFolderMigrationSyncContext(ISourceMailbox sourceDatabase, FolderMap sourceFolderMap, IDestinationMailbox destinationMailbox, FolderMap targetFolderMap, bool isTargetPrimaryHierarchyMailbox) : base(sourceFolderMap, targetFolderMap)
		{
			this.sourceDatabase = sourceDatabase;
			this.destinationMailbox = destinationMailbox;
			this.isTargetPrimaryHierarchyMailbox = isTargetPrimaryHierarchyMailbox;
		}
コード例 #11
0
        public override void ConfigureProviders()
        {
            base.ConfigureProviders();
            RequestStatisticsBase cachedRequestJob   = base.MRSJob.CachedRequestJob;
            LocalMailboxFlags     localMailboxFlags  = LocalMailboxFlags.None;
            LocalMailboxFlags     localMailboxFlags2 = LocalMailboxFlags.None;

            if (cachedRequestJob.RequestType != MRSRequestType.MailboxRestore && cachedRequestJob.IgnoreRuleLimitErrors)
            {
                localMailboxFlags |= LocalMailboxFlags.StripLargeRulesForDownlevelTargets;
            }
            if (cachedRequestJob.OrganizationId == null)
            {
                OrganizationId forestWideOrgId = OrganizationId.ForestWideOrgId;
            }
            switch (cachedRequestJob.RequestType)
            {
            case MRSRequestType.Merge:
                if (cachedRequestJob.SourceIsLocal)
                {
                    localMailboxFlags |= LocalMailboxFlags.UseHomeMDB;
                }
                else
                {
                    localMailboxFlags |= LocalMailboxFlags.PureMAPI;
                }
                if (cachedRequestJob.TargetIsLocal)
                {
                    localMailboxFlags2 |= LocalMailboxFlags.UseHomeMDB;
                }
                else
                {
                    localMailboxFlags2 |= LocalMailboxFlags.PureMAPI;
                }
                break;

            case MRSRequestType.MailboxImport:
                localMailboxFlags2 |= LocalMailboxFlags.UseHomeMDB;
                break;

            case MRSRequestType.MailboxExport:
                localMailboxFlags |= LocalMailboxFlags.UseHomeMDB;
                break;

            case MRSRequestType.MailboxRestore:
                localMailboxFlags2 |= LocalMailboxFlags.UseHomeMDB;
                localMailboxFlags  |= LocalMailboxFlags.Restore;
                break;

            case MRSRequestType.Sync:
                localMailboxFlags2 |= LocalMailboxFlags.UseHomeMDB;
                if (cachedRequestJob.Flags.HasFlag(RequestFlags.TargetIsAggregatedMailbox))
                {
                    localMailboxFlags2 |= LocalMailboxFlags.AggregatedMailbox;
                }
                if (cachedRequestJob.SyncProtocol == SyncProtocol.Olc)
                {
                    localMailboxFlags2 |= LocalMailboxFlags.OlcSync;
                }
                break;
            }
            ISourceMailbox      sourceMailbox      = null;
            IDestinationMailbox destinationMailbox = null;

            switch (cachedRequestJob.RequestType)
            {
            case MRSRequestType.Merge:
            case MRSRequestType.MailboxExport:
            case MRSRequestType.MailboxRestore:
            {
                Guid primaryMailboxGuid = base.SourceMailboxGuid;
                Guid guid = cachedRequestJob.SourceMDBGuid;
                if (cachedRequestJob.SourceUser != null)
                {
                    primaryMailboxGuid = cachedRequestJob.SourceUser.ExchangeGuid;
                    if (localMailboxFlags.HasFlag(LocalMailboxFlags.UseHomeMDB))
                    {
                        ADObjectId adobjectId = cachedRequestJob.SourceIsArchive ? cachedRequestJob.SourceUser.ArchiveDatabase : cachedRequestJob.SourceUser.Database;
                        if (adobjectId != null)
                        {
                            guid = adobjectId.ObjectGuid;
                        }
                    }
                }
                sourceMailbox = this.GetSourceMailbox(new ADObjectId(guid, PartitionId.LocalForest.ForestFQDN), localMailboxFlags, null);
                sourceMailbox.Config(base.MRSJob.GetReservation(cachedRequestJob.SourceMDBGuid, ReservationFlags.Read), primaryMailboxGuid, base.SourceMailboxGuid, CommonUtils.GetPartitionHint(cachedRequestJob.OrganizationId), guid, MailboxType.SourceMailbox, null);
                if (cachedRequestJob.RequestType == MRSRequestType.MailboxRestore)
                {
                    sourceMailbox.ConfigRestore((cachedRequestJob.MailboxRestoreFlags != null) ? cachedRequestJob.MailboxRestoreFlags.Value : MailboxRestoreType.None);
                }
                break;
            }

            case MRSRequestType.MailboxImport:
                sourceMailbox = this.GetSourceMailbox(new ADObjectId(Guid.Empty), localMailboxFlags, null);
                sourceMailbox.ConfigPst(cachedRequestJob.FilePath, cachedRequestJob.ContentCodePage);
                break;

            case MRSRequestType.Sync:
            {
                sourceMailbox = this.GetSourceMailbox(new ADObjectId(Guid.Empty), localMailboxFlags, null);
                SyncProtocol syncProtocol = cachedRequestJob.SyncProtocol;
                if (syncProtocol == SyncProtocol.Eas)
                {
                    sourceMailbox.ConfigEas(cachedRequestJob.RemoteCredential, cachedRequestJob.EmailAddress, cachedRequestJob.TargetExchangeGuid, cachedRequestJob.SourceServer);
                }
                break;
            }
            }
            switch (cachedRequestJob.RequestType)
            {
            case MRSRequestType.Merge:
            case MRSRequestType.MailboxImport:
            case MRSRequestType.MailboxRestore:
            case MRSRequestType.Sync:
            {
                Guid primaryMailboxGuid2 = base.TargetMailboxGuid;
                Guid mdbGuid             = cachedRequestJob.TargetMDBGuid;
                if (cachedRequestJob.TargetUser != null)
                {
                    primaryMailboxGuid2 = cachedRequestJob.TargetUser.ExchangeGuid;
                    ADObjectId adobjectId2 = cachedRequestJob.TargetIsArchive ? cachedRequestJob.TargetUser.ArchiveDatabase : cachedRequestJob.TargetUser.Database;
                    if (adobjectId2 != null)
                    {
                        mdbGuid = adobjectId2.ObjectGuid;
                    }
                }
                destinationMailbox = this.GetDestinationMailbox(mdbGuid, localMailboxFlags2, null);
                if (cachedRequestJob.RequestType == MRSRequestType.Sync && localMailboxFlags2.HasFlag(LocalMailboxFlags.AggregatedMailbox) && !string.IsNullOrEmpty(cachedRequestJob.DomainControllerToUpdate))
                {
                    destinationMailbox.ConfigPreferredADConnection(cachedRequestJob.DomainControllerToUpdate);
                }
                destinationMailbox.Config(base.MRSJob.GetReservation(cachedRequestJob.TargetMDBGuid, ReservationFlags.Write), primaryMailboxGuid2, base.TargetMailboxGuid, CommonUtils.GetPartitionHint(cachedRequestJob.OrganizationId), mdbGuid, cachedRequestJob.TargetIsLocal ? MailboxType.DestMailboxIntraOrg : MailboxType.DestMailboxCrossOrg, null);
                if (cachedRequestJob.IsPublicFolderMailboxRestore && cachedRequestJob.RequestType == MRSRequestType.MailboxRestore)
                {
                    MailboxRestoreType restoreFlags = (cachedRequestJob.MailboxRestoreFlags != null) ? (cachedRequestJob.MailboxRestoreFlags.Value & ~MailboxRestoreType.Recovery) : MailboxRestoreType.None;
                    destinationMailbox.ConfigRestore(restoreFlags);
                }
                break;
            }

            case MRSRequestType.MailboxExport:
                destinationMailbox = this.GetDestinationMailbox(Guid.Empty, localMailboxFlags2, null);
                destinationMailbox.ConfigPst(cachedRequestJob.FilePath, null);
                destinationMailbox.Config(null, Guid.Empty, Guid.Empty, cachedRequestJob.PartitionHint, Guid.Empty, cachedRequestJob.TargetIsLocal ? MailboxType.DestMailboxIntraOrg : MailboxType.DestMailboxCrossOrg, null);
                break;
            }
            if (cachedRequestJob.RequestType == MRSRequestType.Merge && cachedRequestJob.RequestStyle == RequestStyle.CrossOrg)
            {
                bool credentialIsAdmin = cachedRequestJob.IsAdministrativeCredential == null || cachedRequestJob.IsAdministrativeCredential.Value;
                bool useNTLMAuth       = cachedRequestJob.AuthenticationMethod != null && cachedRequestJob.AuthenticationMethod.Value == AuthenticationMethod.Ntlm;
                if (cachedRequestJob.Direction == RequestDirection.Pull)
                {
                    ((MapiSourceMailbox)sourceMailbox).ConfigRPCHTTP(cachedRequestJob.RemoteMailboxLegacyDN, cachedRequestJob.RemoteUserLegacyDN, cachedRequestJob.RemoteMailboxServerLegacyDN, cachedRequestJob.OutlookAnywhereHostName, cachedRequestJob.RemoteCredential, credentialIsAdmin, useNTLMAuth);
                }
                else
                {
                    ((MapiDestinationMailbox)destinationMailbox).ConfigRPCHTTP(cachedRequestJob.RemoteMailboxLegacyDN, cachedRequestJob.RemoteUserLegacyDN, cachedRequestJob.RemoteMailboxServerLegacyDN, cachedRequestJob.OutlookAnywhereHostName, cachedRequestJob.RemoteCredential, credentialIsAdmin, useNTLMAuth);
                }
            }
            base.Config(sourceMailbox, destinationMailbox);
            FolderHierarchyFlags folderHierarchyFlags = FolderHierarchyFlags.None;

            if (cachedRequestJob.IsPublicFolderMailboxRestore)
            {
                folderHierarchyFlags |= FolderHierarchyFlags.PublicFolderMailbox;
            }
            this.SourceHierarchy = new FolderHierarchy(folderHierarchyFlags, base.SourceMailboxWrapper);
            this.DestHierarchy   = new FolderHierarchy(folderHierarchyFlags, base.DestMailboxWrapper);
            FolderIdTranslator  folderIdTranslator = new FolderIdTranslator(this.SourceHierarchy, this.DestHierarchy);
            PrincipalTranslator principalTranslator;

            if (cachedRequestJob.RequestStyle == RequestStyle.CrossOrg)
            {
                principalTranslator = new PrincipalTranslator(base.SourceMailboxWrapper.PrincipalMapper, base.DestMailboxWrapper.PrincipalMapper);
            }
            else
            {
                principalTranslator = null;
            }
            base.ConfigTranslators(principalTranslator, folderIdTranslator);
        }
コード例 #12
0
        public override void ConfigureProviders()
        {
            base.ConfigureProviders();
            RequestStatisticsBase       cachedRequestJob  = base.MRSJob.CachedRequestJob;
            LocalMailboxFlags           localMailboxFlags = LocalMailboxFlags.Move;
            List <MRSProxyCapabilities> list = new List <MRSProxyCapabilities>();

            if (cachedRequestJob.IgnoreRuleLimitErrors)
            {
                localMailboxFlags |= LocalMailboxFlags.StripLargeRulesForDownlevelTargets;
            }
            if (cachedRequestJob.IsSplitPrimaryAndArchive)
            {
                list.Add(MRSProxyCapabilities.ArchiveSeparation);
            }
            if (cachedRequestJob.TargetContainerGuid != null)
            {
                list.Add(MRSProxyCapabilities.ContainerOperations);
            }
            LocalMailboxFlags localMailboxFlags2 = LocalMailboxFlags.Move;

            if (base.Flags.HasFlag(MailboxCopierFlags.ContainerAggregated))
            {
                localMailboxFlags  |= LocalMailboxFlags.AggregatedMailbox;
                localMailboxFlags2 |= LocalMailboxFlags.AggregatedMailbox;
            }
            if (cachedRequestJob.RequestType == MRSRequestType.Move && base.IsRoot && base.IsPrimary && base.TargetMailboxContainerGuid != null)
            {
                localMailboxFlags2 |= LocalMailboxFlags.CreateNewPartition;
            }
            ADObjectId adobjectId = base.IsRoot ? cachedRequestJob.SourceDatabase : cachedRequestJob.SourceArchiveDatabase;

            if (base.Flags.HasFlag(MailboxCopierFlags.SourceIsArchive) && cachedRequestJob.JobType >= MRSJobType.RequestJobE14R5_PrimaryOrArchiveExclusiveMoves)
            {
                MrsTracer.Service.Debug("Overwriting archive guid in Archive MailboxMover...", new object[0]);
                ADObjectId adobjectId2;
                if ((adobjectId2 = cachedRequestJob.SourceArchiveDatabase) == null)
                {
                    adobjectId2 = new ADObjectId(cachedRequestJob.RemoteArchiveDatabaseGuid ?? Guid.Empty);
                }
                adobjectId         = adobjectId2;
                base.SourceMdbGuid = adobjectId.ObjectGuid;
                base.DestMdbGuid   = ((cachedRequestJob.TargetArchiveDatabase != null) ? cachedRequestJob.TargetArchiveDatabase.ObjectGuid : (cachedRequestJob.RemoteArchiveDatabaseGuid ?? Guid.Empty));
            }
            ISourceMailbox      sourceMailbox      = this.GetSourceMailbox(adobjectId, localMailboxFlags, list);
            IDestinationMailbox destinationMailbox = this.GetDestinationMailbox(base.DestMdbGuid, localMailboxFlags2, list);

            if (cachedRequestJob.RequestStyle == RequestStyle.CrossOrg && (cachedRequestJob.Flags & RequestFlags.RemoteLegacy) != RequestFlags.None)
            {
                if (cachedRequestJob.Direction == RequestDirection.Push)
                {
                    destinationMailbox.ConfigADConnection(cachedRequestJob.TargetDCName, cachedRequestJob.TargetDCName, cachedRequestJob.TargetCredential);
                }
                else
                {
                    sourceMailbox.ConfigADConnection(cachedRequestJob.SourceDCName, cachedRequestJob.SourceDCName, cachedRequestJob.SourceCredential);
                }
            }
            TenantPartitionHint partitionHint  = (cachedRequestJob.SourceIsLocal || cachedRequestJob.CrossResourceForest) ? this.partitionHintToUse : null;
            TenantPartitionHint partitionHint2 = (cachedRequestJob.TargetIsLocal || cachedRequestJob.CrossResourceForest) ? this.partitionHintToUse : null;

            if (base.MRSJob.TestIntegration.RemoteExchangeGuidOverride != Guid.Empty)
            {
                if (!cachedRequestJob.SourceIsLocal)
                {
                    partitionHint = this.partitionHintToUse;
                }
                if (!cachedRequestJob.TargetIsLocal)
                {
                    partitionHint2 = this.partitionHintToUse;
                }
            }
            Guid primaryMailboxGuid = base.Flags.HasFlag(MailboxCopierFlags.ContainerOrg) ? base.SourceMailboxGuid : cachedRequestJob.ExchangeGuid;

            sourceMailbox.Config(base.MRSJob.GetReservation(base.SourceMdbGuid, ReservationFlags.Read), primaryMailboxGuid, base.SourceMailboxGuid, partitionHint, base.SourceMdbGuid, MailboxType.SourceMailbox, null);
            destinationMailbox.Config(base.MRSJob.GetReservation(base.DestMdbGuid, ReservationFlags.Write), primaryMailboxGuid, base.TargetMailboxGuid, partitionHint2, base.DestMdbGuid, (cachedRequestJob.RequestStyle == RequestStyle.CrossOrg) ? MailboxType.DestMailboxCrossOrg : MailboxType.DestMailboxIntraOrg, base.TargetMailboxContainerGuid);
            base.Config(sourceMailbox, destinationMailbox);
        }
コード例 #13
0
ファイル: MapiUtils.cs プロジェクト: YHZX2013/exchange_diff
        public static void LookupBadMessagesInMailbox(ISourceMailbox mailbox, List <MessageRec> messages, out EntryIdMap <MessageRec> lookedUpMsgs, out EntryIdMap <FolderRec> folderRecs)
        {
            EntryIdMap <EntryIdMap <MessageRec> > entryIdMap = new EntryIdMap <EntryIdMap <MessageRec> >();

            folderRecs   = new EntryIdMap <FolderRec>();
            lookedUpMsgs = new EntryIdMap <MessageRec>();
            foreach (MessageRec messageRec in messages)
            {
                EntryIdMap <MessageRec> entryIdMap2;
                if (!entryIdMap.TryGetValue(messageRec.FolderId, out entryIdMap2))
                {
                    entryIdMap2 = new EntryIdMap <MessageRec>();
                    entryIdMap.Add(messageRec.FolderId, entryIdMap2);
                }
                entryIdMap2[messageRec.EntryId] = null;
            }
            MrsTracer.Common.Debug("Looking up {0} messages in {1} folders.", new object[]
            {
                messages.Count,
                entryIdMap.Count
            });
            foreach (KeyValuePair <byte[], EntryIdMap <MessageRec> > keyValuePair in entryIdMap)
            {
                using (ISourceFolder folder = mailbox.GetFolder(keyValuePair.Key))
                {
                    if (folder == null)
                    {
                        MrsTracer.Common.Warning("Folder {0} disappeared.", new object[]
                        {
                            TraceUtils.DumpEntryId(keyValuePair.Key)
                        });
                    }
                    else
                    {
                        FolderRec folderRec = folder.GetFolderRec(null, GetFolderRecFlags.None);
                        folderRecs[folderRec.EntryId] = folderRec;
                        EntryIdMap <MessageRec> value = keyValuePair.Value;
                        MrsTracer.Common.Debug("Looking up {0} messages in folder '{1}'.", new object[]
                        {
                            value.Count,
                            folderRec.FolderName
                        });
                        int num = 0;
                        if (mailbox.IsCapabilitySupported(MRSProxyCapabilities.SimpleExport))
                        {
                            List <byte[]>     keysToLookup = new List <byte[]>(value.Keys);
                            List <MessageRec> list         = folder.LookupMessages(PropTag.EntryId, keysToLookup, BadMessageRec.BadItemPtags);
                            if (list == null)
                            {
                                goto IL_230;
                            }
                            using (List <MessageRec> .Enumerator enumerator3 = list.GetEnumerator())
                            {
                                while (enumerator3.MoveNext())
                                {
                                    MessageRec messageRec2 = enumerator3.Current;
                                    lookedUpMsgs[messageRec2.EntryId] = messageRec2;
                                    num++;
                                }
                                goto IL_230;
                            }
                        }
                        List <MessageRec> list2 = folder.EnumerateMessages(EnumerateMessagesFlags.RegularMessages, BadMessageRec.BadItemPtags);
                        foreach (MessageRec messageRec3 in list2)
                        {
                            if (value.ContainsKey(messageRec3.EntryId))
                            {
                                lookedUpMsgs[messageRec3.EntryId] = messageRec3;
                                num++;
                            }
                        }
IL_230:
                        MrsTracer.Common.Debug("Found {0} messages.", new object[]
                        {
                            num
                        });
                    }
                }
            }
            MrsTracer.Common.Debug("Looked up {0} messages.", new object[]
            {
                lookedUpMsgs.Count
            });
        }
コード例 #14
0
ファイル: MapiUtils.cs プロジェクト: YHZX2013/exchange_diff
        public static void ExportMessagesWithBadItemDetection(ISourceMailbox mailbox, List <MessageRec> messages, Func <IFxProxyPool> getProxyPool, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps, TestIntegration testIntegration, ref List <BadMessageRec> badMessages)
        {
            MrsTracer.Common.Debug("ExportMessagesWithBadItemDetection: Exporting {0} messages", new object[]
            {
                messages.Count
            });
            Exception ex;

            if (MapiUtils.ExportMessageBatch(mailbox, messages, getProxyPool, flags, propsToCopyExplicitly, excludeProps, testIntegration, out ex))
            {
                return;
            }
            MrsTracer.Common.Warning("ExportMessages failed with a bad item error. Current batch count {0}. Will retry copying messages in smaller batches. {1}", new object[]
            {
                messages.Count,
                CommonUtils.FullExceptionMessage(ex)
            });
            if (messages.Count != 1)
            {
                int num = messages.Count / 2;
                List <MessageRec> list  = new List <MessageRec>(num);
                List <MessageRec> list2 = new List <MessageRec>(messages.Count - num);
                for (int i = 0; i < messages.Count; i++)
                {
                    if (i < num)
                    {
                        list.Add(messages[i]);
                    }
                    else
                    {
                        list2.Add(messages[i]);
                    }
                }
                MapiUtils.ExportMessagesWithBadItemDetection(mailbox, list, getProxyPool, flags, propsToCopyExplicitly, excludeProps, testIntegration, ref badMessages);
                MapiUtils.ExportMessagesWithBadItemDetection(mailbox, list2, getProxyPool, flags, propsToCopyExplicitly, excludeProps, testIntegration, ref badMessages);
                return;
            }
            MessageRec messageRec = messages[0];

            MrsTracer.Common.Warning("Single message {0} copy failed. Error {1}", new object[]
            {
                TraceUtils.DumpEntryId(messageRec.EntryId),
                CommonUtils.FullExceptionMessage(ex)
            });
            EntryIdMap <MessageRec> entryIdMap;
            EntryIdMap <FolderRec>  entryIdMap2;

            MapiUtils.LookupBadMessagesInMailbox(mailbox, messages, out entryIdMap, out entryIdMap2);
            MessageRec msgData;

            if (!entryIdMap.TryGetValue(messageRec.EntryId, out msgData))
            {
                badMessages.Add(BadMessageRec.MissingItem(messageRec));
                return;
            }
            DownlevelBadItemsPermanentException ex2 = ex as DownlevelBadItemsPermanentException;

            if (ex2 != null)
            {
                badMessages.Add(ex2.BadItems[0]);
                return;
            }
            FolderRec folderRec = entryIdMap2[messageRec.FolderId];

            badMessages.Add(BadMessageRec.Item(msgData, folderRec, ex));
        }
コード例 #15
0
 public PublicFolderMoveSyncContext(ISourceMailbox sourceMailbox, FolderMap sourceFolderMap, IDestinationMailbox destinationMailbox, FolderMap targetFolderMap) : base(sourceFolderMap, targetFolderMap)
 {
     this.sourceMailbox      = sourceMailbox;
     this.destinationMailbox = destinationMailbox;
 }
コード例 #16
0
 internal MailboxContentsCrawler(ISourceMailbox sourceMalibox, IReadOnlyCollection <FolderMapping> foldersToCopy, int maxFoldersOpened, int pageSize, int maxPageSize)
 {
     this.Initialize(sourceMalibox, foldersToCopy, maxFoldersOpened, pageSize, maxPageSize);
 }