void ISourceMailbox.ExportMessages(List <MessageRec> messages, IFxProxyPool proxyPool, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps) { MrsTracer.Provider.Function("EasSourceMailbox.ExportMessages({0} messages)", new object[] { messages.Count }); base.VerifyMailboxConnection(VerifyMailboxConnectionFlags.None); this.CopyMessagesOneByOne(messages, proxyPool, propsToCopyExplicitly, excludeProps, null); }
void ISourceMailbox.ExportMessages(List <MessageRec> messages, IFxProxyPool destProxies, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps) { string text = "ISourceMailbox.ExportMessages"; TimeSpan targetDuration = TimeSpan.Zero; Stopwatch stopwatch = Stopwatch.StartNew(); base.CreateContext(text, new DataContext[] { new SimpleValueDataContext("Flags", flags), new PropTagsDataContext(excludeProps) }).Execute(delegate { using (FxProxyPoolFxCallbackWrapper fxProxyPoolFxCallbackWrapper = new FxProxyPoolFxCallbackWrapper(destProxies, true, delegate(TimeSpan duration) { targetDuration += duration; })) { ((ISourceMailbox)this.WrappedObject).ExportMessages(messages, fxProxyPoolFxCallbackWrapper, flags, propsToCopyExplicitly, excludeProps); } }, false); base.UpdateDuration(text, stopwatch.Elapsed.Subtract(targetDuration)); }
void ISourceMailbox.ExportMessages(List <MessageRec> messages, IFxProxyPool proxyPool, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps) { MrsTracer.Provider.Function("ImapSourceMailbox.ExportMessages({0} messages)", new object[] { messages.Count }); base.VerifyMailboxConnection(VerifyMailboxConnectionFlags.None); this.CopyMessagesOneByOne(messages, proxyPool, propsToCopyExplicitly, excludeProps, delegate(MessageRec curMsg) { using (ImapFolder folder = base.GetFolder <ImapSourceFolder>(curMsg.FolderId)) { if (folder == null) { throw new FolderIsMissingTransientException(); } folder.Folder.SelectImapFolder(base.ImapConnection); } }); }
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); } }); }
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); } } } }); }
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)); }
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); }
void ISourceMailbox.ExportMessages(List <MessageRec> messages, IFxProxyPool proxyPool, ExportMessagesFlags flags, PropTag[] propsToCopyExplicitly, PropTag[] excludeProps) { MrsTracer.ProxyClient.Function("RemoteSourceMailbox.ExportMessages({0} messages)", new object[] { messages.Count }); if (propsToCopyExplicitly != null) { throw new UnsupportedRemoteServerVersionWithOperationPermanentException(base.MrsProxyClient.ServerName, base.ServerVersion.ToString(), "ISourceMailbox_ExportMessages"); } base.VerifyMailboxConnection(); using (IDataImport dataImport = new FxProxyPoolReceiver(proxyPool, false)) { IDataMessage dataMessage = new FxProxyPoolGetFolderDataResponseMessage(proxyPool.GetFolderData()); DataMessageOpcode dataMessageOpcode; byte[] targetObjectData; dataMessage.Serialize(base.MrsProxyClient.UseCompression, out dataMessageOpcode, out targetObjectData); DataExportBatch dataExportBatch; if (!base.ServerVersion[8]) { if ((flags & ExportMessagesFlags.OneByOne) != ExportMessagesFlags.None || excludeProps != null) { throw new UnsupportedRemoteServerVersionWithOperationPermanentException(base.MrsProxyClient.ServerName, base.ServerVersion.ToString(), "ISourceMailbox_ExportMessages"); } dataExportBatch = base.MrsProxy.ISourceMailbox_ExportMessageBatch2(base.Handle, messages, targetObjectData); } else { int[] data = DataConverter <PropTagConverter, PropTag, int> .GetData(excludeProps); dataExportBatch = base.MrsProxy.ISourceMailbox_ExportMessages(base.Handle, messages, (int)flags, data, targetObjectData); } MessageExportResultReceiver messageExportResultReceiver = null; IDataImport destination = dataImport; if (!base.ServerVersion[16]) { messageExportResultReceiver = new MessageExportResultReceiver(destination, false); destination = messageExportResultReceiver; } using (messageExportResultReceiver) { using (BufferedReceiver bufferedReceiver = new BufferedReceiver(destination, false, base.MrsProxyClient.UseBuffering, base.MrsProxyClient.UseCompression)) { RemoteDataExport.ExportRoutine(base.MrsProxy, dataExportBatch.DataExportHandle, bufferedReceiver, dataExportBatch, base.MrsProxyClient.UseCompression); if (messageExportResultReceiver != null) { List <BadMessageRec> badMessages = messageExportResultReceiver.BadMessages; if (messageExportResultReceiver.MissingMessages != null) { foreach (MessageRec msg in messageExportResultReceiver.MissingMessages) { badMessages.Add(BadMessageRec.MissingItem(msg)); } } if (badMessages != null && badMessages.Count > 0) { throw new DownlevelBadItemsPermanentException(badMessages); } } } } } }