// InBuffer.h #ifndef __IN_BUFFER_H #define __IN_BUFFER_H #include "../../Common/MyException.h" #include "../IStream.h" #ifndef _NO_EXCEPTIONS struct CInBufferException: public CSystemException { CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} }; #endif class CInBufferBase { protected: Byte *_buf; Byte *_bufLim; Byte *_bufBase; ISequentialInStream *_stream; UInt64 _processedSize; size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger // only up to 32-bits values now are supported! bool _wasFinished; bool ReadBlock(); bool ReadByte_FromNewBlock(Byte &b); Byte ReadByte_FromNewBlock(); public: #ifdef _NO_EXCEPTIONS HRESULT ErrorCode; #endif UInt32 NumExtraBytes; CInBufferBase() throw(); UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); } UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); } bool WasFinished() const { return _wasFinished; } void SetStream(ISequentialInStream *stream) { _stream = stream; } void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos) { _bufBase = buf; _bufSize = bufSize; _processedSize = 0; _buf = buf + pos; _bufLim = buf + end; _wasFinished = false; #ifdef _NO_EXCEPTIONS ErrorCode = S_OK; #endif NumExtraBytes = 0; } void Init() throw(); bool ReadByte(Byte &b) { if (_buf >= _bufLim) return ReadByte_FromNewBlock(b); b = *_buf++; return true; } Byte ReadByte() { if (_buf >= _bufLim) return ReadByte_FromNewBlock(); return *_buf++; } size_t ReadBytes(Byte *buf, size_t size); size_t Skip(size_t size); }; class CInBuffer: public CInBufferBase { public: ~CInBuffer() { Free(); } bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported! void Free() throw(); }; #endif