1*f6dc9357SAndroid Build Coastguard Worker // InBuffer.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_IN_BUFFER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_IN_BUFFER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyException.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_EXCEPTIONS 10*f6dc9357SAndroid Build Coastguard Worker struct CInBufferException: public CSystemException 11*f6dc9357SAndroid Build Coastguard Worker { CInBufferExceptionCInBufferException12*f6dc9357SAndroid Build Coastguard Worker CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} 13*f6dc9357SAndroid Build Coastguard Worker }; 14*f6dc9357SAndroid Build Coastguard Worker #endif 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker class CInBufferBase 17*f6dc9357SAndroid Build Coastguard Worker { 18*f6dc9357SAndroid Build Coastguard Worker protected: 19*f6dc9357SAndroid Build Coastguard Worker Byte *_buf; 20*f6dc9357SAndroid Build Coastguard Worker Byte *_bufLim; 21*f6dc9357SAndroid Build Coastguard Worker Byte *_bufBase; 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *_stream; 24*f6dc9357SAndroid Build Coastguard Worker UInt64 _processedSize; 25*f6dc9357SAndroid Build Coastguard Worker size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger 26*f6dc9357SAndroid Build Coastguard Worker // only up to 32-bits values now are supported! 27*f6dc9357SAndroid Build Coastguard Worker bool _wasFinished; 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker bool ReadBlock(); 30*f6dc9357SAndroid Build Coastguard Worker bool ReadByte_FromNewBlock(Byte &b); 31*f6dc9357SAndroid Build Coastguard Worker Byte ReadByte_FromNewBlock(); 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker public: 34*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_EXCEPTIONS 35*f6dc9357SAndroid Build Coastguard Worker HRESULT ErrorCode; 36*f6dc9357SAndroid Build Coastguard Worker #endif 37*f6dc9357SAndroid Build Coastguard Worker UInt32 NumExtraBytes; 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker CInBufferBase() throw(); 40*f6dc9357SAndroid Build Coastguard Worker 41*f6dc9357SAndroid Build Coastguard Worker // the size of portion of data in real stream that was already read from this object 42*f6dc9357SAndroid Build Coastguard Worker // it doesn't include unused data in buffer 43*f6dc9357SAndroid Build Coastguard Worker // it doesn't include virtual Extra bytes after the end of real stream data GetStreamSize()44*f6dc9357SAndroid Build Coastguard Worker UInt64 GetStreamSize() const { return _processedSize + (size_t)(_buf - _bufBase); } 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker // the size of virtual data that was read from this object 47*f6dc9357SAndroid Build Coastguard Worker // it doesn't include unused data in buffers 48*f6dc9357SAndroid Build Coastguard Worker // it includes any virtual Extra bytes after the end of real data GetProcessedSize()49*f6dc9357SAndroid Build Coastguard Worker UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (size_t)(_buf - _bufBase); } 50*f6dc9357SAndroid Build Coastguard Worker WasFinished()51*f6dc9357SAndroid Build Coastguard Worker bool WasFinished() const { return _wasFinished; } 52*f6dc9357SAndroid Build Coastguard Worker SetStream(ISequentialInStream * stream)53*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialInStream *stream) { _stream = stream; } ClearStreamPtr()54*f6dc9357SAndroid Build Coastguard Worker void ClearStreamPtr() { _stream = NULL; } 55*f6dc9357SAndroid Build Coastguard Worker SetBuf(Byte * buf,size_t bufSize,size_t end,size_t pos)56*f6dc9357SAndroid Build Coastguard Worker void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos) 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker _bufBase = buf; 59*f6dc9357SAndroid Build Coastguard Worker _bufSize = bufSize; 60*f6dc9357SAndroid Build Coastguard Worker _processedSize = 0; 61*f6dc9357SAndroid Build Coastguard Worker _buf = buf + pos; 62*f6dc9357SAndroid Build Coastguard Worker _bufLim = buf + end; 63*f6dc9357SAndroid Build Coastguard Worker _wasFinished = false; 64*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_EXCEPTIONS 65*f6dc9357SAndroid Build Coastguard Worker ErrorCode = S_OK; 66*f6dc9357SAndroid Build Coastguard Worker #endif 67*f6dc9357SAndroid Build Coastguard Worker NumExtraBytes = 0; 68*f6dc9357SAndroid Build Coastguard Worker } 69*f6dc9357SAndroid Build Coastguard Worker 70*f6dc9357SAndroid Build Coastguard Worker void Init() throw(); 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker Z7_FORCE_INLINE ReadByte(Byte & b)73*f6dc9357SAndroid Build Coastguard Worker bool ReadByte(Byte &b) 74*f6dc9357SAndroid Build Coastguard Worker { 75*f6dc9357SAndroid Build Coastguard Worker if (_buf >= _bufLim) 76*f6dc9357SAndroid Build Coastguard Worker return ReadByte_FromNewBlock(b); 77*f6dc9357SAndroid Build Coastguard Worker b = *_buf++; 78*f6dc9357SAndroid Build Coastguard Worker return true; 79*f6dc9357SAndroid Build Coastguard Worker } 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker Z7_FORCE_INLINE ReadByte_FromBuf(Byte & b)82*f6dc9357SAndroid Build Coastguard Worker bool ReadByte_FromBuf(Byte &b) 83*f6dc9357SAndroid Build Coastguard Worker { 84*f6dc9357SAndroid Build Coastguard Worker if (_buf >= _bufLim) 85*f6dc9357SAndroid Build Coastguard Worker return false; 86*f6dc9357SAndroid Build Coastguard Worker b = *_buf++; 87*f6dc9357SAndroid Build Coastguard Worker return true; 88*f6dc9357SAndroid Build Coastguard Worker } 89*f6dc9357SAndroid Build Coastguard Worker 90*f6dc9357SAndroid Build Coastguard Worker Z7_FORCE_INLINE ReadByte()91*f6dc9357SAndroid Build Coastguard Worker Byte ReadByte() 92*f6dc9357SAndroid Build Coastguard Worker { 93*f6dc9357SAndroid Build Coastguard Worker if (_buf >= _bufLim) 94*f6dc9357SAndroid Build Coastguard Worker return ReadByte_FromNewBlock(); 95*f6dc9357SAndroid Build Coastguard Worker return *_buf++; 96*f6dc9357SAndroid Build Coastguard Worker } 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker size_t ReadBytesPart(Byte *buf, size_t size); 99*f6dc9357SAndroid Build Coastguard Worker size_t ReadBytes(Byte *buf, size_t size); 100*f6dc9357SAndroid Build Coastguard Worker size_t Skip(size_t size); 101*f6dc9357SAndroid Build Coastguard Worker }; 102*f6dc9357SAndroid Build Coastguard Worker 103*f6dc9357SAndroid Build Coastguard Worker class CInBuffer: public CInBufferBase 104*f6dc9357SAndroid Build Coastguard Worker { 105*f6dc9357SAndroid Build Coastguard Worker public: ~CInBuffer()106*f6dc9357SAndroid Build Coastguard Worker ~CInBuffer() { Free(); } 107*f6dc9357SAndroid Build Coastguard Worker bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported! 108*f6dc9357SAndroid Build Coastguard Worker void Free() throw(); 109*f6dc9357SAndroid Build Coastguard Worker }; 110*f6dc9357SAndroid Build Coastguard Worker 111*f6dc9357SAndroid Build Coastguard Worker #endif 112