1// InBuffer.h 2 3#ifndef __IN_BUFFER_H 4#define __IN_BUFFER_H 5 6#include "../../Common/MyException.h" 7#include "../IStream.h" 8 9#ifndef _NO_EXCEPTIONS 10struct CInBufferException: public CSystemException 11{ 12 CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} 13}; 14#endif 15 16class CInBufferBase 17{ 18protected: 19 Byte *_buf; 20 Byte *_bufLim; 21 Byte *_bufBase; 22 23 ISequentialInStream *_stream; 24 UInt64 _processedSize; 25 size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger 26 // only up to 32-bits values now are supported! 27 bool _wasFinished; 28 29 bool ReadBlock(); 30 bool ReadByte_FromNewBlock(Byte &b); 31 Byte ReadByte_FromNewBlock(); 32 33public: 34 #ifdef _NO_EXCEPTIONS 35 HRESULT ErrorCode; 36 #endif 37 UInt32 NumExtraBytes; 38 39 CInBufferBase() throw(); 40 41 UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); } 42 UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); } 43 bool WasFinished() const { return _wasFinished; } 44 45 void SetStream(ISequentialInStream *stream) { _stream = stream; } 46 47 void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos) 48 { 49 _bufBase = buf; 50 _bufSize = bufSize; 51 _processedSize = 0; 52 _buf = buf + pos; 53 _bufLim = buf + end; 54 _wasFinished = false; 55 #ifdef _NO_EXCEPTIONS 56 ErrorCode = S_OK; 57 #endif 58 NumExtraBytes = 0; 59 } 60 61 void Init() throw(); 62 63 bool ReadByte(Byte &b) 64 { 65 if (_buf >= _bufLim) 66 return ReadByte_FromNewBlock(b); 67 b = *_buf++; 68 return true; 69 } 70 71 Byte ReadByte() 72 { 73 if (_buf >= _bufLim) 74 return ReadByte_FromNewBlock(); 75 return *_buf++; 76 } 77 78 size_t ReadBytes(Byte *buf, size_t size); 79 size_t Skip(size_t size); 80}; 81 82class CInBuffer: public CInBufferBase 83{ 84public: 85 ~CInBuffer() { Free(); } 86 bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported! 87 void Free() throw(); 88}; 89 90#endif 91