File: net\System\Net\mail\EncodedStreamFactory.cs
Project: ndp\fx\src\System.csproj (System)
namespace System.Net.Mime
{
    using System;
    using System.IO;
    using System.Text;
 
    internal class EncodedStreamFactory
    {
        //RFC 2822: no encoded-word line should be longer than 76 characters not including the soft CRLF
        //since the header length is unknown (if there even is one) we're going to be slightly more conservative
        //and cut off at 70.  This will also prevent any other folding behavior from being triggered anywhere
        //in the code
        private const int defaultMaxLineLength = 70;
        
        //default buffer size for encoder
        private const int initialBufferSize = 1024;
 
        internal static int DefaultMaxLineLength
        {
            get
            {
                return defaultMaxLineLength;
            }
        }
        
        //get a raw encoder, not for use with header encoding
        internal IEncodableStream GetEncoder(TransferEncoding encoding, Stream stream)
        {
            //raw encoder
            if (encoding == TransferEncoding.Base64)
                return new Base64Stream(stream, new Base64WriteStateInfo());
 
            //return a QuotedPrintable stream because this is not being used for header encoding
            if (encoding == TransferEncoding.QuotedPrintable)
                return new QuotedPrintableStream(stream, true);
 
            if (encoding == TransferEncoding.SevenBit || encoding == TransferEncoding.EightBit)
                return new EightBitStream(stream);
 
            throw new NotSupportedException("Encoding Stream");
        }
        
        //use for encoding headers
        internal IEncodableStream GetEncoderForHeader(Encoding encoding, bool useBase64Encoding, int headerTextLength)
        {
            WriteStateInfoBase writeState;
            byte[] header = CreateHeader(encoding, useBase64Encoding);
            byte[] footer = CreateFooter();
 
            if (useBase64Encoding)
            {
                writeState = new Base64WriteStateInfo(initialBufferSize, header, footer, DefaultMaxLineLength, headerTextLength);
                return new Base64Stream((Base64WriteStateInfo)writeState);
            }
 
            writeState = new WriteStateInfoBase(initialBufferSize, header, footer, DefaultMaxLineLength, headerTextLength);
            
            return new QEncodedStream(writeState);
        }
 
        //Create the header for what type of byte encoding is going to be used
        //based on the encoding type and if base64 encoding should be forced
        //sample header: =?utf-8?B? 
        protected byte[] CreateHeader(Encoding encoding, bool useBase64Encoding)
        {
            //create encoded work header
            string header = String.Format("=?{0}?{1}?", encoding.HeaderName, useBase64Encoding ? "B" : "Q");            
            return Encoding.ASCII.GetBytes(header);
        }
 
        //creates the footer that marks the end of a quoted string of some sort
        protected byte[] CreateFooter()
        {
            byte[] footer = {(byte)'?', (byte)'='};
            return footer;
        }
    }
}