private MimePartInfo FindMimePart(uint[] indices) { MimePartInfo mimePartInfo = this.GetMimeSkeleton(); int num = indices.Length; for (int num2 = 0; num2 != num; num2++) { int num3 = (int)(indices[num2] - 1U); if (num3 < 0) { throw new ArgumentException("indices"); } if (mimePartInfo.ContentType == MimePartContentType.ItemAttachment) { mimePartInfo = mimePartInfo.AttachedItemStructure; if (mimePartInfo == null) { return(null); } } if (mimePartInfo.Children == null || mimePartInfo.Children.Count <= num3) { return(null); } mimePartInfo = mimePartInfo.Children[num3]; } return(mimePartInfo); }
public override void GetBody(Stream outStream) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetBody.1"); this.CheckDisposed(null); if (outStream == null) { throw new ArgumentNullException("outStream"); } using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetBody.1)"); MimePartInfo mimeSkeleton = this.GetMimeSkeleton(); using (Stream stream = new StreamWrapper(outStream, false)) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter(stream, this.itemEncodingOptions, (MimeStreamWriter.Flags) 6)) { this.WriteMimePart(this.mimeProvider, mimeStreamWriter, this.options, mimeSkeleton, ItemToMimeConverter.MimeFlags.WriteMessageHeaders); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetBody.1)"); } } }
public override MimePartHeaders GetHeaders() { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetHeaders.1"); this.CheckDisposed(null); MimePartHeaders headers; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetHeaders.1)"); MimePartInfo mimeSkeleton = this.GetMimeSkeleton(); if (mimeSkeleton.Headers == null || mimeSkeleton.Headers.Count == 0) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter((MimeStreamWriter.Flags) 6, this.itemEncodingOptions)) { this.WriteMimePart(this.mimeProvider, mimeStreamWriter, this.options, mimeSkeleton, ItemToMimeConverter.MimeFlags.WriteMessageHeaders | ItemToMimeConverter.MimeFlags.SkipContent); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.1)"); headers = mimeSkeleton.Headers; } } return(headers); }
private MimePartInfo CalculateMimeSubStructure(MimePart part, Charset itemCharset, ref int partIndex) { MimePartInfo mimePartInfo = null; if (part.IsEmbeddedMessage) { mimePartInfo = new MimePartInfo(itemCharset, null, MimePartContentType.ItemAttachment, null, null, null, part, this.smimeDoc, ref partIndex); int num = 0; mimePartInfo.AttachedItemStructure = this.CalculateMimeSubStructure((MimePart)part.FirstChild, itemCharset, ref num); } else { mimePartInfo = new MimePartInfo(itemCharset, null, MimePartInfo.GetContentType(part.ContentType), null, null, null, part, this.smimeDoc, ref partIndex); foreach (MimePart part2 in part) { mimePartInfo.AddChild(this.CalculateMimeSubStructure(part2, itemCharset, ref partIndex)); } } foreach (Header header in part.Headers) { mimePartInfo.AddHeader(header); } MimeStreamWriter.CalculateBodySize(mimePartInfo, part); return(mimePartInfo); }
private bool GetText(Stream outStream, bool isSinglePartOnly) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetText.1"); this.CheckDisposed(null); if (outStream == null) { throw new ArgumentNullException("outStream"); } using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetText.1)"); MimePartInfo mimeSkeleton = this.GetMimeSkeleton(); if (isSinglePartOnly && mimeSkeleton.IsMultipart) { return(false); } using (Stream stream = new StreamWrapper(outStream, false)) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter(stream, this.itemEncodingOptions, (MimeStreamWriter.Flags) 3)) { this.WriteMimePart(this.mimeProvider, mimeStreamWriter, this.options, mimeSkeleton, ItemToMimeConverter.MimeFlags.SkipMessageHeaders); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetText.1)"); } } return(true); }
public override MimePartInfo GetMimeStructure() { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetMimeStructure."); this.CheckDisposed(null); MimePartInfo result; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetMimeStructure)"); MimePartInfo mimeSkeleton = this.GetMimeSkeleton(); if (mimeSkeleton.IsBodySizeComputed) { this.GetHeaders(); } else { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter((MimeStreamWriter.Flags) 6, this.itemEncodingOptions)) { this.WriteMimePart(this.mimeProvider, mimeStreamWriter, this.options, mimeSkeleton, ItemToMimeConverter.MimeFlags.WriteMessageHeaders); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetMimeStructure)"); result = mimeSkeleton; } } return(result); }
public override bool GetBody(Stream outStream, uint[] indices) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetBody.2"); this.CheckDisposed(null); bool result; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetBody.2)"); bool flag = false; if (indices == null || indices.Length == 0) { this.GetBody(outStream); flag = true; } else { List <IDisposable> disposeList = null; MimePartInfo partInfo = null; Item item = null; try { EncodingOptions encodingOptions; IImapMimeProvider subpartConverter = this.GetSubpartConverter(indices, out partInfo, out item, out encodingOptions, out disposeList); if (subpartConverter != null) { using (Stream stream = new StreamWrapper(outStream, false)) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter(stream, encodingOptions, (MimeStreamWriter.Flags) 3)) { this.WriteMimePart(subpartConverter, mimeStreamWriter, this.options, partInfo, ItemToMimeConverter.MimeFlags.SkipMessageHeaders); } } flag = true; } } finally { this.DisposeAll(disposeList); } } if (!flag) { int num = indices.Length - 1; if (indices[num] == 1U) { uint[] array = new uint[num]; Array.Copy(indices, array, num); flag = this.GetText(outStream, array, true); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetBody.2)"); result = flag; } } return(result); }
public void AddChild(MimePartInfo newChild) { if (this.children == null) { this.children = new List <MimePartInfo>(); } this.children.Add(newChild); }
private bool GetText(Stream outStream, uint[] indices, bool isSinglePartOnly) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetText.2"); this.CheckDisposed(null); bool result; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetText.2)"); bool flag = false; if (indices == null || indices.Length == 0) { flag = this.GetText(outStream, isSinglePartOnly); } else { List <IDisposable> disposeList = null; MimePartInfo mimePartInfo = null; Item item = null; EncodingOptions encodingOptions = null; try { IImapMimeProvider imapMimeProvider = this.GetSubpartConverter(indices, out mimePartInfo, out item, out encodingOptions, out disposeList); if (imapMimeProvider != null) { imapMimeProvider = this.GetAttachedItemConverter(ref mimePartInfo, ref item, ref encodingOptions, disposeList); if (imapMimeProvider != null && (!mimePartInfo.IsMultipart || !isSinglePartOnly)) { using (Stream stream = new StreamWrapper(outStream, false)) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter(stream, encodingOptions, MimeStreamWriter.Flags.SkipHeaders)) { this.WriteMimePart(imapMimeProvider, mimeStreamWriter, this.options, mimePartInfo, ItemToMimeConverter.MimeFlags.SkipMessageHeaders); } } flag = true; } } } finally { this.DisposeAll(disposeList); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetText.2)"); result = flag; } } return(result); }
internal static void CalculateBodySize(MimePartInfo partInfo, MimePart part) { if (partInfo.IsBodySizeComputed) { return; } using (Stream stream = new MimeStreamWriter.MimeBodySizeCounter(null, partInfo)) { using (Stream rawContentReadStream = part.GetRawContentReadStream()) { Util.StreamHandler.CopyStreamData(rawContentReadStream, stream); } } }
public override MimePartHeaders GetMime(uint[] indices) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetMime."); this.CheckDisposed(null); if (indices == null || indices.Length == 0) { return(null); } MimePartHeaders result; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetMime)"); MimePartHeaders mimePartHeaders = null; MimePartInfo mimePartInfo = this.FindMimePart(indices); if (mimePartInfo != null && mimePartInfo.Headers != null && mimePartInfo.Headers.Count != 0) { mimePartHeaders = mimePartInfo.Headers; } else { mimePartInfo = this.GetMimeSkeleton(); List <IDisposable> disposeList = null; Item item = null; EncodingOptions encodingOptions = null; try { IImapMimeProvider subpartConverter = this.GetSubpartConverter(indices, out mimePartInfo, out item, out encodingOptions, out disposeList); if (subpartConverter != null) { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter(MimeStreamWriter.Flags.ProduceMimeStructure, encodingOptions)) { this.WriteMimePart(subpartConverter, mimeStreamWriter, this.options, mimePartInfo, ItemToMimeConverter.MimeFlags.SkipContent); } mimePartHeaders = mimePartInfo.Headers; } } finally { this.DisposeAll(disposeList); } } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetMime)"); result = mimePartHeaders; } } return(result); }
private IImapMimeProvider GetSubpartConverter(uint[] indices, out MimePartInfo part, out Item item, out EncodingOptions encodingOptions, out List <IDisposable> disposeList) { part = null; item = null; disposeList = null; encodingOptions = null; List <IDisposable> list = new List <IDisposable>(); IImapMimeProvider result; try { IImapMimeProvider attachedItemConverter = this.mimeProvider; Item item2 = this.itemIn; EncodingOptions encodingOptions2 = this.itemEncodingOptions; MimePartInfo mimePartInfo = this.GetMimeSkeleton(); for (int num = 0; num != indices.Length; num++) { if (mimePartInfo.ContentType == MimePartContentType.ItemAttachment) { attachedItemConverter = this.GetAttachedItemConverter(ref mimePartInfo, ref item2, ref encodingOptions2, list); if (attachedItemConverter == null) { return(null); } } int num2 = (int)(indices[num] - 1U); if (num2 < 0) { throw new ArgumentException("indices"); } if (mimePartInfo.Children == null || mimePartInfo.Children.Count <= num2) { return(null); } mimePartInfo = mimePartInfo.Children[num2]; } part = mimePartInfo; item = item2; encodingOptions = encodingOptions2; disposeList = list; list = null; result = attachedItemConverter; } finally { this.DisposeAll(list); } return(result); }
internal void StartPart(MimePartInfo part, bool outputToSkeleton) { this.FlushCachedHeader(); if (this.currentPart != null) { this.StartWriting(); if ((this.flags & MimeStreamWriter.Flags.ProduceMimeStructure) == MimeStreamWriter.Flags.ProduceMimeStructure && this.currentPart.IsMultipart) { this.currentPart.ChildrenWrittenOut(); } } MimePartHeaders mimePartHeaders = (part == null) ? null : part.Headers; this.currentPart = part; this.hasAllHeaders = (mimePartHeaders != null); if (this.mimeWriter != null) { this.mimeWriter.StartPart(); if (this.hasAllHeaders) { this.CopyHeadersToWriter(mimePartHeaders, this.mimeWriter); } } if (this.mimeSkeletonWriter != null && outputToSkeleton) { this.mimeSkeletonWriter.StartPart(); if (mimePartHeaders != null) { this.CopyHeadersToWriter(mimePartHeaders, this.mimeSkeletonWriter); } } this.assembleHeaders = false; if (this.currentPart != null && (this.flags & MimeStreamWriter.Flags.ProduceMimeStructure) == MimeStreamWriter.Flags.ProduceMimeStructure) { if (mimePartHeaders == null) { this.assembleHeaders = true; if ((this.flags & MimeStreamWriter.Flags.ForceMime) == MimeStreamWriter.Flags.ForceMime) { Header header = Header.Create(HeaderId.MimeVersion); header.Value = "1.0"; this.currentPart.AddHeader(header); } } this.flags &= (MimeStreamWriter.Flags)(-5); } }
private IImapMimeProvider GetAttachedItemConverter(ref MimePartInfo part, ref Item item, ref EncodingOptions itemEncodingOptions, List <IDisposable> disposeList) { if (part.ContentType != MimePartContentType.ItemAttachment) { return(null); } IImapMimeProvider imapMimeProvider; if (part.SmimePart == null) { Attachment attachment = item.AttachmentCollection.Open(part.AttachmentId, InternalSchema.ContentConversionProperties); disposeList.Add(attachment); ItemAttachment itemAttachment = attachment as ItemAttachment; if (itemAttachment == null) { StorageGlobals.ContextTraceError(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetAttachedItemConverter: attachment is not an item."); ExAssert.RetailAssert(false, "ImapItemConverter::GetAttachedItemConverter: attachment is not an item."); return(null); } item = ConvertUtils.OpenAttachedItem(itemAttachment); if (item == null) { return(null); } disposeList.Add(item); ItemToMimeConverter itemToMimeConverter = new ItemToMimeConverter(item, this.options, ConverterFlags.IsEmbeddedMessage); imapMimeProvider = IImapMimeProvider.CreateInstance(itemToMimeConverter); disposeList.Add(imapMimeProvider); itemEncodingOptions = itemToMimeConverter.GetItemMimeEncodingOptions(this.options); if (part.AttachedItemStructure != null) { itemToMimeConverter.SetSkeletonAndSmimeDoc(part.AttachedItemStructure.Skeleton, part.AttachedItemStructure.SmimeDocument); } } else { imapMimeProvider = IImapMimeProvider.CreateInstance((MimePart)part.SmimePart.FirstChild, part.SmimeDocument); disposeList.Add(imapMimeProvider); itemEncodingOptions = this.itemEncodingOptions; } if (part.AttachedItemStructure == null) { part.AttachedItemStructure = imapMimeProvider.CalculateMimeStructure(Charset.GetCharset(itemEncodingOptions.CharsetName)); } part = part.AttachedItemStructure; return(imapMimeProvider); }
internal override void WriteMimePart(MimeStreamWriter mimeWriter, ConversionLimitsTracker limits, MimePartInfo part, ItemToMimeConverter.MimeFlags mimeFlags) { this.itemConverter.WriteMimePart(mimeWriter, limits, part, mimeFlags); }
public override MimePartHeaders GetHeaders(uint[] indices) { StorageGlobals.ContextTraceInformation(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::GetHeaders.2"); this.CheckDisposed(null); MimePartHeaders result; using (StorageGlobals.SetTraceContext(this.options)) { using (StorageGlobals.SetTraceContext(this.itemIn)) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Starting item (ImapItemConverter.GetHeaders.2)"); if (indices == null || indices.Length == 0) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); result = this.GetHeaders(); } else { MimePartInfo mimePartInfo = this.FindMimePart(indices); if (mimePartInfo != null) { if (mimePartInfo.ContentType != MimePartContentType.ItemAttachment) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); return(null); } mimePartInfo = mimePartInfo.AttachedItemStructure; if (mimePartInfo != null && mimePartInfo.Headers != null && mimePartInfo.Headers.Count != 0) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); return(mimePartInfo.Headers); } } mimePartInfo = this.GetMimeSkeleton(); List <IDisposable> disposeList = null; Item item = null; try { EncodingOptions encodingOptions; if (this.GetSubpartConverter(indices, out mimePartInfo, out item, out encodingOptions, out disposeList) == null) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); result = null; } else { IImapMimeProvider attachedItemConverter = this.GetAttachedItemConverter(ref mimePartInfo, ref item, ref encodingOptions, disposeList); if (attachedItemConverter == null) { StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); result = null; } else { using (MimeStreamWriter mimeStreamWriter = new MimeStreamWriter((MimeStreamWriter.Flags) 6, encodingOptions)) { this.WriteMimePart(attachedItemConverter, mimeStreamWriter, this.options, mimePartInfo, ItemToMimeConverter.MimeFlags.WriteMessageHeaders | ItemToMimeConverter.MimeFlags.SkipContent); } StorageGlobals.ContextTracePfd(ExTraceGlobals.CcPFDTracer, "Finishing item (ImapItemConverter.GetHeaders.2)"); result = mimePartInfo.Headers; } } } finally { this.DisposeAll(disposeList); } } } } return(result); }
internal override void WriteMimePart(MimeStreamWriter mimeWriter, ConversionLimitsTracker limits, MimePartInfo part, ItemToMimeConverter.MimeFlags mimeFlags) { if ((mimeFlags & ItemToMimeConverter.MimeFlags.SkipContent) != ItemToMimeConverter.MimeFlags.SkipContent) { mimeWriter.WritePartWithHeaders(part.SmimePart, false); return; } mimeWriter.WriteHeadersFromPart(part.SmimePart); }
internal abstract void WriteMimePart(MimeStreamWriter mimeWriter, ConversionLimitsTracker limits, MimePartInfo part, ItemToMimeConverter.MimeFlags mimeFlags);
internal MimeBodySizeCounter(Stream stream, MimePartInfo part) : base(stream, true, StreamBase.Capabilities.Writable) { this.part = part; this.lineCount = 0; this.byteCount = 0; }
internal void StartPart(MimePartInfo part) { this.StartPart(part, true); }
private void WriteMimePart(IImapMimeProvider mimeProvider, MimeStreamWriter writer, OutboundConversionOptions options, MimePartInfo partInfo, ItemToMimeConverter.MimeFlags conversionFlags) { try { ConvertUtils.CallCts(ExTraceGlobals.CcOutboundMimeTracer, "ImapItemConverter::WriteMimePart", ServerStrings.ConversionCorruptContent, delegate { ConversionLimitsTracker limits = new ConversionLimitsTracker(options.Limits); mimeProvider.WriteMimePart(writer, limits, partInfo, conversionFlags); }); } catch (StoragePermanentException exc) { ItemConversion.SaveFailedItem(this.itemIn, options, exc); throw; } }