Esempio n. 1
0
        public RewindableStreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen,
                                      bool omitCrFromNewLine)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            if (!stream.CanRead)
            {
                throw new ArgumentException("The stream does not support reading.", "stream");
            }

            if (!stream.CanSeek)
            {
                throw new ArgumentException("The stream does not support seeking.", "stream");
            }

            if (bufferSize < 1)
            {
                throw new ArgumentOutOfRangeException("bufferSize", "Buffer size must be greater than zero.");
            }

            _leaveOpen  = leaveOpen;
            _rawBuffer  = new ValueBuffer <byte>(bufferSize);
            _charBuffer = new ValueBuffer <char>(bufferSize);

            if (detectEncodingFromByteOrderMarks)
            {
                int readLen;
                try
                {
                    ReadOnlyCollection <Tuple <Encoding, byte[]> > detectableEncodings = DetectableEncodings;
                    readLen = DetectableEncodings[0].Item2.Length;
                    EnsureRawBuffer(readLen);
                }
                catch (ObjectDisposedException exception)
                {
                    throw new InvalidOperationException("Stream has already been disposed", exception);
                }
                if (_rawBuffer.Count >= DetectableEncodings[DetectableEncodings.Count - 1].Item2.Length)
                {
                    byte[]   bom = _rawBuffer.Peek(readLen);
                    Encoding e   = (bom.Length > 0) ? DetectEncodingFromBytes(bom, 0, bom.Length) : null;
                    if (e != null)
                    {
                        bom = e.GetPreamble();
                        if (bom.Length > 0 && _rawBuffer.StartsWith(bom))
                        {
                            _rawBuffer.Purge(bom.Length);
                        }
                        encoding = e;
                    }
                }
            }

            if (encoding == null)
            {
                encoding = DefaultEncoding;
            }
            _encoding = encoding.Clone() as Encoding;
            _encoding.DecoderFallback = new DecoderExceptionFallback();
            _encoding.EncoderFallback = new EncoderExceptionFallback();
            _maxSingleCharByteCount   = (_encoding.IsSingleByte) ? 1 : _encoding.GetMaxByteCount(1);
            _omitCrFromNewLine        = omitCrFromNewLine;
            _newLineCharSequence      = (omitCrFromNewLine) ? new char[] { '\n' } : new char[] { '\r', '\n' };
            _newLineByteSequence      = _encoding.GetBytes(_newLineCharSequence);
            _innerStream = stream;
        }