1*f6dc9357SAndroid Build Coastguard Worker // StreamObjects.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_STREAM_OBJECTS_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_STREAM_OBJECTS_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyVector.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 13*f6dc9357SAndroid Build Coastguard Worker CBufferInStream 14*f6dc9357SAndroid Build Coastguard Worker ) 15*f6dc9357SAndroid Build Coastguard Worker UInt64 _pos; 16*f6dc9357SAndroid Build Coastguard Worker public: 17*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Buf; Init()18*f6dc9357SAndroid Build Coastguard Worker void Init() { _pos = 0; } 19*f6dc9357SAndroid Build Coastguard Worker }; 20*f6dc9357SAndroid Build Coastguard Worker 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_0( 23*f6dc9357SAndroid Build Coastguard Worker CReferenceBuf 24*f6dc9357SAndroid Build Coastguard Worker ) 25*f6dc9357SAndroid Build Coastguard Worker public: 26*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Buf; 27*f6dc9357SAndroid Build Coastguard Worker }; 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 31*f6dc9357SAndroid Build Coastguard Worker CBufInStream 32*f6dc9357SAndroid Build Coastguard Worker ) 33*f6dc9357SAndroid Build Coastguard Worker const Byte *_data; 34*f6dc9357SAndroid Build Coastguard Worker UInt64 _pos; 35*f6dc9357SAndroid Build Coastguard Worker size_t _size; 36*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IUnknown> _ref; 37*f6dc9357SAndroid Build Coastguard Worker public: 38*f6dc9357SAndroid Build Coastguard Worker void Init(const Byte *data, size_t size, IUnknown *ref = NULL) 39*f6dc9357SAndroid Build Coastguard Worker { 40*f6dc9357SAndroid Build Coastguard Worker _data = data; 41*f6dc9357SAndroid Build Coastguard Worker _size = size; 42*f6dc9357SAndroid Build Coastguard Worker _pos = 0; 43*f6dc9357SAndroid Build Coastguard Worker _ref = ref; 44*f6dc9357SAndroid Build Coastguard Worker } 45*f6dc9357SAndroid Build Coastguard Worker void Init(CReferenceBuf *ref) { Init(ref->Buf, ref->Buf.Size(), ref); } 46*f6dc9357SAndroid Build Coastguard Worker 47*f6dc9357SAndroid Build Coastguard Worker // Seek() is allowed here. So reading order could be changed 48*f6dc9357SAndroid Build Coastguard Worker bool WasFinished() const { return _pos == _size; } 49*f6dc9357SAndroid Build Coastguard Worker }; 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker 52*f6dc9357SAndroid Build Coastguard Worker void Create_BufInStream_WithReference(const void *data, size_t size, IUnknown *ref, ISequentialInStream **stream); 53*f6dc9357SAndroid Build Coastguard Worker void Create_BufInStream_WithNewBuffer(const void *data, size_t size, ISequentialInStream **stream); 54*f6dc9357SAndroid Build Coastguard Worker inline void Create_BufInStream_WithNewBuffer(const CByteBuffer &buf, ISequentialInStream **stream) 55*f6dc9357SAndroid Build Coastguard Worker { Create_BufInStream_WithNewBuffer(buf, buf.Size(), stream); } 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker 58*f6dc9357SAndroid Build Coastguard Worker class CByteDynBuffer Z7_final 59*f6dc9357SAndroid Build Coastguard Worker { 60*f6dc9357SAndroid Build Coastguard Worker size_t _capacity; 61*f6dc9357SAndroid Build Coastguard Worker Byte *_buf; 62*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CByteDynBuffer) 63*f6dc9357SAndroid Build Coastguard Worker public: 64*f6dc9357SAndroid Build Coastguard Worker CByteDynBuffer(): _capacity(0), _buf(NULL) {} 65*f6dc9357SAndroid Build Coastguard Worker // there is no copy constructor. So don't copy this object. 66*f6dc9357SAndroid Build Coastguard Worker ~CByteDynBuffer() { Free(); } 67*f6dc9357SAndroid Build Coastguard Worker void Free() throw(); 68*f6dc9357SAndroid Build Coastguard Worker size_t GetCapacity() const { return _capacity; } 69*f6dc9357SAndroid Build Coastguard Worker operator Byte*() const { return _buf; } 70*f6dc9357SAndroid Build Coastguard Worker operator const Byte*() const { return _buf; } 71*f6dc9357SAndroid Build Coastguard Worker bool EnsureCapacity(size_t capacity) throw(); 72*f6dc9357SAndroid Build Coastguard Worker }; 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 76*f6dc9357SAndroid Build Coastguard Worker CDynBufSeqOutStream 77*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 78*f6dc9357SAndroid Build Coastguard Worker ) 79*f6dc9357SAndroid Build Coastguard Worker CByteDynBuffer _buffer; 80*f6dc9357SAndroid Build Coastguard Worker size_t _size; 81*f6dc9357SAndroid Build Coastguard Worker public: 82*f6dc9357SAndroid Build Coastguard Worker CDynBufSeqOutStream(): _size(0) {} 83*f6dc9357SAndroid Build Coastguard Worker void Init() { _size = 0; } 84*f6dc9357SAndroid Build Coastguard Worker size_t GetSize() const { return _size; } 85*f6dc9357SAndroid Build Coastguard Worker const Byte *GetBuffer() const { return _buffer; } 86*f6dc9357SAndroid Build Coastguard Worker void CopyToBuffer(CByteBuffer &dest) const; 87*f6dc9357SAndroid Build Coastguard Worker Byte *GetBufPtrForWriting(size_t addSize); 88*f6dc9357SAndroid Build Coastguard Worker void UpdateSize(size_t addSize) { _size += addSize; } 89*f6dc9357SAndroid Build Coastguard Worker }; 90*f6dc9357SAndroid Build Coastguard Worker 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 93*f6dc9357SAndroid Build Coastguard Worker CBufPtrSeqOutStream 94*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 95*f6dc9357SAndroid Build Coastguard Worker ) 96*f6dc9357SAndroid Build Coastguard Worker Byte *_buffer; 97*f6dc9357SAndroid Build Coastguard Worker size_t _size; 98*f6dc9357SAndroid Build Coastguard Worker size_t _pos; 99*f6dc9357SAndroid Build Coastguard Worker public: 100*f6dc9357SAndroid Build Coastguard Worker void Init(Byte *buffer, size_t size) 101*f6dc9357SAndroid Build Coastguard Worker { 102*f6dc9357SAndroid Build Coastguard Worker _buffer = buffer; 103*f6dc9357SAndroid Build Coastguard Worker _pos = 0; 104*f6dc9357SAndroid Build Coastguard Worker _size = size; 105*f6dc9357SAndroid Build Coastguard Worker } 106*f6dc9357SAndroid Build Coastguard Worker size_t GetPos() const { return _pos; } 107*f6dc9357SAndroid Build Coastguard Worker }; 108*f6dc9357SAndroid Build Coastguard Worker 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 111*f6dc9357SAndroid Build Coastguard Worker CSequentialOutStreamSizeCount 112*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 113*f6dc9357SAndroid Build Coastguard Worker ) 114*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _stream; 115*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 116*f6dc9357SAndroid Build Coastguard Worker public: 117*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } 118*f6dc9357SAndroid Build Coastguard Worker void Init() { _size = 0; } 119*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; } 120*f6dc9357SAndroid Build Coastguard Worker }; 121*f6dc9357SAndroid Build Coastguard Worker 122*f6dc9357SAndroid Build Coastguard Worker 123*f6dc9357SAndroid Build Coastguard Worker class CCachedInStream: 124*f6dc9357SAndroid Build Coastguard Worker public IInStream, 125*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 126*f6dc9357SAndroid Build Coastguard Worker { 127*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(ISequentialInStream, IInStream) 128*f6dc9357SAndroid Build Coastguard Worker 129*f6dc9357SAndroid Build Coastguard Worker UInt64 *_tags; 130*f6dc9357SAndroid Build Coastguard Worker Byte *_data; 131*f6dc9357SAndroid Build Coastguard Worker size_t _dataSize; 132*f6dc9357SAndroid Build Coastguard Worker unsigned _blockSizeLog; 133*f6dc9357SAndroid Build Coastguard Worker unsigned _numBlocksLog; 134*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 135*f6dc9357SAndroid Build Coastguard Worker UInt64 _pos; 136*f6dc9357SAndroid Build Coastguard Worker protected: 137*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize) = 0; 138*f6dc9357SAndroid Build Coastguard Worker public: 139*f6dc9357SAndroid Build Coastguard Worker CCachedInStream(): _tags(NULL), _data(NULL) {} 140*f6dc9357SAndroid Build Coastguard Worker virtual ~CCachedInStream() { Free(); } // the destructor must be virtual (Release() calls it) !!! 141*f6dc9357SAndroid Build Coastguard Worker void Free() throw(); 142*f6dc9357SAndroid Build Coastguard Worker bool Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw(); 143*f6dc9357SAndroid Build Coastguard Worker void Init(UInt64 size) throw(); 144*f6dc9357SAndroid Build Coastguard Worker }; 145*f6dc9357SAndroid Build Coastguard Worker 146*f6dc9357SAndroid Build Coastguard Worker #endif 147