private void CreateDetectionStream(BodyStreamFormat format, Charset contentCharset, string extraData, bool trustHtmlMetaTag) { this.detectorCache = new PooledMemoryStream(8192); if (extraData != null) { byte[] bytes = ConvertUtils.UnicodeEncoding.GetBytes(extraData); this.detectorCache.Write(bytes, 0, bytes.Length); } switch (format) { case BodyStreamFormat.Text: { if (contentCharset.CodePage == 1200) { this.detectorConversionStream = new StreamWrapper(this.detectorCache, false); return; } TextToText textToText = new TextToText(TextToTextConversionMode.ConvertCodePageOnly); textToText.InputEncoding = contentCharset.GetEncoding(); textToText.OutputEncoding = ConvertUtils.UnicodeEncoding; textToText.OutputStreamBufferSize = 1024; textToText.InputStreamBufferSize = 1024; this.detectorConversionStream = new ConverterStream(new StreamWrapper(this.detectorCache, false), textToText, ConverterStreamAccess.Write); return; } case BodyStreamFormat.Html: { HtmlToText htmlToText = new HtmlToText(TextExtractionMode.ExtractText); htmlToText.InputEncoding = contentCharset.GetEncoding(); htmlToText.OutputEncoding = ConvertUtils.UnicodeEncoding; htmlToText.DetectEncodingFromMetaTag = trustHtmlMetaTag; htmlToText.OutputStreamBufferSize = 1024; htmlToText.InputStreamBufferSize = 1024; this.detectorConversionStream = new ConverterStream(new StreamWrapper(this.detectorCache, false), htmlToText, ConverterStreamAccess.Write); return; } case BodyStreamFormat.RtfCompressed: case BodyStreamFormat.RtfUncompressed: { RtfToText rtfToText = new RtfToText(TextExtractionMode.ExtractText); rtfToText.OutputEncoding = ConvertUtils.UnicodeEncoding; rtfToText.OutputStreamBufferSize = 1024; rtfToText.InputStreamBufferSize = 1024; this.detectorConversionStream = new ConverterStream(new StreamWrapper(this.detectorCache, false), rtfToText, ConverterStreamAccess.Write); if (format == BodyStreamFormat.RtfCompressed) { RtfCompressedToRtf rtfCompressedToRtf = new RtfCompressedToRtf(); rtfCompressedToRtf.OutputStreamBufferSize = 1024; rtfCompressedToRtf.InputStreamBufferSize = 1024; this.detectorConversionStream = new ConverterStream(this.detectorConversionStream, rtfCompressedToRtf, ConverterStreamAccess.Write); } return; } default: return; } }
internal Stream ConvertReadStreamFormat(Stream stream) { if (this.internalFormat == (InternalBodyFormat)this.format) { return(stream); } TextConverter converter = null; if (this.internalFormat == InternalBodyFormat.RtfCompressed) { if (!(stream is RtfPreviewStream)) { stream = new ConverterStream(stream, new RtfCompressedToRtf(), ConverterStreamAccess.Read); } if (BodyFormat.Rtf == this.BodyFormat) { return(stream); } if (BodyFormat.Html == this.BodyFormat) { converter = new RtfToHtml { OutputEncoding = this.Encoding }; } else { converter = new RtfToText { OutputEncoding = this.Encoding }; } } else if (this.internalFormat == InternalBodyFormat.Enriched) { converter = new EnrichedToHtml { InputEncoding = this.Encoding, OutputEncoding = this.Encoding }; } return(new ConverterStream(stream, converter, ConverterStreamAccess.Read)); }
public override Stream OpenReadStream(long start, long end) { base.ThrowIfDisposed(); BodyFormatConversionStorage.BodyFormatConversion conversion = BodyFormatConversionStorage.GetConversion(this.originalFormat, this.targetFormat); TextConverter converter = null; Encoding inputEncoding = null; if (this.originalCharset != null) { inputEncoding = this.originalCharset.GetEncoding(); } Encoding outputEncoding = null; if (this.targetCharset != null) { outputEncoding = this.targetCharset.GetEncoding(); } Stream stream = this.originalStorage.OpenReadStream(this.originalStart, this.originalEnd); switch (conversion) { case BodyFormatConversionStorage.BodyFormatConversion.HtmlToText: converter = new HtmlToText { InputEncoding = inputEncoding, OutputEncoding = outputEncoding }; break; case BodyFormatConversionStorage.BodyFormatConversion.HtmlToEnriched: converter = new HtmlToEnriched { InputEncoding = inputEncoding, OutputEncoding = outputEncoding }; break; case BodyFormatConversionStorage.BodyFormatConversion.RtfCompressedToText: stream = new ConverterStream(stream, new RtfCompressedToRtf(), ConverterStreamAccess.Read); converter = new RtfToText { OutputEncoding = outputEncoding }; break; case BodyFormatConversionStorage.BodyFormatConversion.TextToText: converter = new TextToText { InputEncoding = inputEncoding, OutputEncoding = outputEncoding }; break; case BodyFormatConversionStorage.BodyFormatConversion.HtmlToHtml: converter = new HtmlToHtml { InputEncoding = inputEncoding, OutputEncoding = outputEncoding }; break; case BodyFormatConversionStorage.BodyFormatConversion.EnrichedToText: converter = new EnrichedToText { InputEncoding = inputEncoding, OutputEncoding = outputEncoding }; break; } return(new ConverterStream(stream, converter, ConverterStreamAccess.Read)); }