| // 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 |