1*f6dc9357SAndroid Build Coastguard Worker // OutBuffer.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_OUT_BUFFER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_OUT_BUFFER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyException.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_EXCEPTIONS 11*f6dc9357SAndroid Build Coastguard Worker struct COutBufferException: public CSystemException 12*f6dc9357SAndroid Build Coastguard Worker { COutBufferExceptionCOutBufferException13*f6dc9357SAndroid Build Coastguard Worker COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} 14*f6dc9357SAndroid Build Coastguard Worker }; 15*f6dc9357SAndroid Build Coastguard Worker #endif 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker class COutBuffer 18*f6dc9357SAndroid Build Coastguard Worker { 19*f6dc9357SAndroid Build Coastguard Worker protected: 20*f6dc9357SAndroid Build Coastguard Worker Byte *_buf; 21*f6dc9357SAndroid Build Coastguard Worker UInt32 _pos; 22*f6dc9357SAndroid Build Coastguard Worker UInt32 _limitPos; 23*f6dc9357SAndroid Build Coastguard Worker UInt32 _streamPos; 24*f6dc9357SAndroid Build Coastguard Worker UInt32 _bufSize; 25*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream *_stream; 26*f6dc9357SAndroid Build Coastguard Worker UInt64 _processedSize; 27*f6dc9357SAndroid Build Coastguard Worker Byte *_buf2; 28*f6dc9357SAndroid Build Coastguard Worker bool _overDict; 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker HRESULT FlushPart() throw(); 31*f6dc9357SAndroid Build Coastguard Worker public: 32*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_EXCEPTIONS 33*f6dc9357SAndroid Build Coastguard Worker HRESULT ErrorCode; 34*f6dc9357SAndroid Build Coastguard Worker #endif 35*f6dc9357SAndroid Build Coastguard Worker COutBuffer()36*f6dc9357SAndroid Build Coastguard Worker COutBuffer(): _buf(NULL), _pos(0), _stream(NULL), _buf2(NULL) {} ~COutBuffer()37*f6dc9357SAndroid Build Coastguard Worker ~COutBuffer() { Free(); } 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker bool Create(UInt32 bufSize) throw(); 40*f6dc9357SAndroid Build Coastguard Worker void Free() throw(); 41*f6dc9357SAndroid Build Coastguard Worker SetMemStream(Byte * buf)42*f6dc9357SAndroid Build Coastguard Worker void SetMemStream(Byte *buf) { _buf2 = buf; } SetStream(ISequentialOutStream * stream)43*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } 44*f6dc9357SAndroid Build Coastguard Worker void Init() throw(); 45*f6dc9357SAndroid Build Coastguard Worker HRESULT Flush() throw(); 46*f6dc9357SAndroid Build Coastguard Worker void FlushWithCheck(); 47*f6dc9357SAndroid Build Coastguard Worker WriteByte(Byte b)48*f6dc9357SAndroid Build Coastguard Worker void WriteByte(Byte b) 49*f6dc9357SAndroid Build Coastguard Worker { 50*f6dc9357SAndroid Build Coastguard Worker UInt32 pos = _pos; 51*f6dc9357SAndroid Build Coastguard Worker _buf[pos] = b; 52*f6dc9357SAndroid Build Coastguard Worker pos++; 53*f6dc9357SAndroid Build Coastguard Worker _pos = pos; 54*f6dc9357SAndroid Build Coastguard Worker if (pos == _limitPos) 55*f6dc9357SAndroid Build Coastguard Worker FlushWithCheck(); 56*f6dc9357SAndroid Build Coastguard Worker } WriteBytes(const void * data,size_t size)57*f6dc9357SAndroid Build Coastguard Worker void WriteBytes(const void *data, size_t size) 58*f6dc9357SAndroid Build Coastguard Worker { 59*f6dc9357SAndroid Build Coastguard Worker for (size_t i = 0; i < size; i++) 60*f6dc9357SAndroid Build Coastguard Worker WriteByte(((const Byte *)data)[i]); 61*f6dc9357SAndroid Build Coastguard Worker } 62*f6dc9357SAndroid Build Coastguard Worker GetOutBuffer(size_t & avail)63*f6dc9357SAndroid Build Coastguard Worker Byte *GetOutBuffer(size_t &avail) 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker const UInt32 pos = _pos; 66*f6dc9357SAndroid Build Coastguard Worker avail = (size_t)(_limitPos - pos); 67*f6dc9357SAndroid Build Coastguard Worker return _buf + pos; 68*f6dc9357SAndroid Build Coastguard Worker } 69*f6dc9357SAndroid Build Coastguard Worker SkipWrittenBytes(size_t num)70*f6dc9357SAndroid Build Coastguard Worker void SkipWrittenBytes(size_t num) 71*f6dc9357SAndroid Build Coastguard Worker { 72*f6dc9357SAndroid Build Coastguard Worker const UInt32 pos = _pos; 73*f6dc9357SAndroid Build Coastguard Worker const UInt32 rem = _limitPos - pos; 74*f6dc9357SAndroid Build Coastguard Worker if (rem > num) 75*f6dc9357SAndroid Build Coastguard Worker { 76*f6dc9357SAndroid Build Coastguard Worker _pos = pos + (UInt32)num; 77*f6dc9357SAndroid Build Coastguard Worker return; 78*f6dc9357SAndroid Build Coastguard Worker } 79*f6dc9357SAndroid Build Coastguard Worker // (rem <= num) 80*f6dc9357SAndroid Build Coastguard Worker // the caller must not call it with (rem < num) 81*f6dc9357SAndroid Build Coastguard Worker // so (rem == num) 82*f6dc9357SAndroid Build Coastguard Worker _pos = _limitPos; 83*f6dc9357SAndroid Build Coastguard Worker FlushWithCheck(); 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker /* 86*f6dc9357SAndroid Build Coastguard Worker void WriteBytesBig(const void *data, size_t size) 87*f6dc9357SAndroid Build Coastguard Worker { 88*f6dc9357SAndroid Build Coastguard Worker while (size) 89*f6dc9357SAndroid Build Coastguard Worker { 90*f6dc9357SAndroid Build Coastguard Worker UInt32 pos = _pos; 91*f6dc9357SAndroid Build Coastguard Worker UInt32 rem = _limitPos - pos; 92*f6dc9357SAndroid Build Coastguard Worker if (rem > size) 93*f6dc9357SAndroid Build Coastguard Worker { 94*f6dc9357SAndroid Build Coastguard Worker _pos = pos + size; 95*f6dc9357SAndroid Build Coastguard Worker memcpy(_buf + pos, data, size); 96*f6dc9357SAndroid Build Coastguard Worker return; 97*f6dc9357SAndroid Build Coastguard Worker } 98*f6dc9357SAndroid Build Coastguard Worker memcpy(_buf + pos, data, rem); 99*f6dc9357SAndroid Build Coastguard Worker _pos = pos + rem; 100*f6dc9357SAndroid Build Coastguard Worker FlushWithCheck(); 101*f6dc9357SAndroid Build Coastguard Worker } 102*f6dc9357SAndroid Build Coastguard Worker } 103*f6dc9357SAndroid Build Coastguard Worker */ 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker UInt64 GetProcessedSize() const throw(); 106*f6dc9357SAndroid Build Coastguard Worker }; 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Worker #endif 109