1*f6dc9357SAndroid Build Coastguard Worker // LimitedStreams.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LIMITED_STREAMS_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LIMITED_STREAMS_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 #include "../IStream.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "StreamUtils.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 14*f6dc9357SAndroid Build Coastguard Worker CLimitedSequentialInStream 15*f6dc9357SAndroid Build Coastguard Worker , ISequentialInStream 16*f6dc9357SAndroid Build Coastguard Worker ) 17*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> _stream; 18*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 19*f6dc9357SAndroid Build Coastguard Worker UInt64 _pos; 20*f6dc9357SAndroid Build Coastguard Worker bool _wasFinished; 21*f6dc9357SAndroid Build Coastguard Worker public: SetStream(ISequentialInStream * stream)22*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialInStream *stream) { _stream = stream; } ReleaseStream()23*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } Init(UInt64 streamSize)24*f6dc9357SAndroid Build Coastguard Worker void Init(UInt64 streamSize) 25*f6dc9357SAndroid Build Coastguard Worker { 26*f6dc9357SAndroid Build Coastguard Worker _size = streamSize; 27*f6dc9357SAndroid Build Coastguard Worker _pos = 0; 28*f6dc9357SAndroid Build Coastguard Worker _wasFinished = false; 29*f6dc9357SAndroid Build Coastguard Worker } GetSize()30*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _pos; } GetRem()31*f6dc9357SAndroid Build Coastguard Worker UInt64 GetRem() const { return _size - _pos; } WasFinished()32*f6dc9357SAndroid Build Coastguard Worker bool WasFinished() const { return _wasFinished; } 33*f6dc9357SAndroid Build Coastguard Worker }; 34*f6dc9357SAndroid Build Coastguard Worker 35*f6dc9357SAndroid Build Coastguard Worker 36*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 37*f6dc9357SAndroid Build Coastguard Worker CLimitedInStream 38*f6dc9357SAndroid Build Coastguard Worker ) 39*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> _stream; 40*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 41*f6dc9357SAndroid Build Coastguard Worker UInt64 _physPos; 42*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 43*f6dc9357SAndroid Build Coastguard Worker UInt64 _startOffset; 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); } 46*f6dc9357SAndroid Build Coastguard Worker public: 47*f6dc9357SAndroid Build Coastguard Worker void SetStream(IInStream *stream) { _stream = stream; } 48*f6dc9357SAndroid Build Coastguard Worker HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) 49*f6dc9357SAndroid Build Coastguard Worker { 50*f6dc9357SAndroid Build Coastguard Worker _startOffset = startOffset; 51*f6dc9357SAndroid Build Coastguard Worker _physPos = startOffset; 52*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 53*f6dc9357SAndroid Build Coastguard Worker _size = size; 54*f6dc9357SAndroid Build Coastguard Worker return SeekToPhys(); 55*f6dc9357SAndroid Build Coastguard Worker } 56*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } 57*f6dc9357SAndroid Build Coastguard Worker }; 58*f6dc9357SAndroid Build Coastguard Worker 59*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream); 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 63*f6dc9357SAndroid Build Coastguard Worker CClusterInStream 64*f6dc9357SAndroid Build Coastguard Worker ) 65*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 66*f6dc9357SAndroid Build Coastguard Worker UInt64 _physPos; 67*f6dc9357SAndroid Build Coastguard Worker UInt32 _curRem; 68*f6dc9357SAndroid Build Coastguard Worker public: 69*f6dc9357SAndroid Build Coastguard Worker unsigned BlockSizeLog; 70*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 71*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream; 72*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Vector; 73*f6dc9357SAndroid Build Coastguard Worker UInt64 StartOffset; 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToPhys() { return InStream_SeekSet(Stream, _physPos); } 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker HRESULT InitAndSeek() 78*f6dc9357SAndroid Build Coastguard Worker { 79*f6dc9357SAndroid Build Coastguard Worker _curRem = 0; 80*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 81*f6dc9357SAndroid Build Coastguard Worker _physPos = StartOffset; 82*f6dc9357SAndroid Build Coastguard Worker if (Vector.Size() > 0) 83*f6dc9357SAndroid Build Coastguard Worker { 84*f6dc9357SAndroid Build Coastguard Worker _physPos = StartOffset + (Vector[0] << BlockSizeLog); 85*f6dc9357SAndroid Build Coastguard Worker return SeekToPhys(); 86*f6dc9357SAndroid Build Coastguard Worker } 87*f6dc9357SAndroid Build Coastguard Worker return S_OK; 88*f6dc9357SAndroid Build Coastguard Worker } 89*f6dc9357SAndroid Build Coastguard Worker }; 90*f6dc9357SAndroid Build Coastguard Worker 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker const UInt64 k_SeekExtent_Phy_Type_ZeroFill = (UInt64)(Int64)-1; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker struct CSeekExtent 96*f6dc9357SAndroid Build Coastguard Worker { 97*f6dc9357SAndroid Build Coastguard Worker UInt64 Virt; 98*f6dc9357SAndroid Build Coastguard Worker UInt64 Phy; 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker void SetAs_ZeroFill() { Phy = k_SeekExtent_Phy_Type_ZeroFill; } 101*f6dc9357SAndroid Build Coastguard Worker bool Is_ZeroFill() const { return Phy == k_SeekExtent_Phy_Type_ZeroFill; } 102*f6dc9357SAndroid Build Coastguard Worker }; 103*f6dc9357SAndroid Build Coastguard Worker 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 106*f6dc9357SAndroid Build Coastguard Worker CExtentsStream 107*f6dc9357SAndroid Build Coastguard Worker ) 108*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 109*f6dc9357SAndroid Build Coastguard Worker UInt64 _phyPos; 110*f6dc9357SAndroid Build Coastguard Worker unsigned _prevExtentIndex; 111*f6dc9357SAndroid Build Coastguard Worker public: 112*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream; 113*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CSeekExtent> Extents; 114*f6dc9357SAndroid Build Coastguard Worker 115*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { Stream.Release(); } 116*f6dc9357SAndroid Build Coastguard Worker void Init() 117*f6dc9357SAndroid Build Coastguard Worker { 118*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 119*f6dc9357SAndroid Build Coastguard Worker _phyPos = (UInt64)0 - 1; // we need Seek() for Stream 120*f6dc9357SAndroid Build Coastguard Worker _prevExtentIndex = 0; 121*f6dc9357SAndroid Build Coastguard Worker } 122*f6dc9357SAndroid Build Coastguard Worker }; 123*f6dc9357SAndroid Build Coastguard Worker 124*f6dc9357SAndroid Build Coastguard Worker 125*f6dc9357SAndroid Build Coastguard Worker 126*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 127*f6dc9357SAndroid Build Coastguard Worker CLimitedSequentialOutStream 128*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 129*f6dc9357SAndroid Build Coastguard Worker ) 130*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _stream; 131*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 132*f6dc9357SAndroid Build Coastguard Worker bool _overflow; 133*f6dc9357SAndroid Build Coastguard Worker bool _overflowIsAllowed; 134*f6dc9357SAndroid Build Coastguard Worker public: 135*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } 136*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } 137*f6dc9357SAndroid Build Coastguard Worker void Init(UInt64 size, bool overflowIsAllowed = false) 138*f6dc9357SAndroid Build Coastguard Worker { 139*f6dc9357SAndroid Build Coastguard Worker _size = size; 140*f6dc9357SAndroid Build Coastguard Worker _overflow = false; 141*f6dc9357SAndroid Build Coastguard Worker _overflowIsAllowed = overflowIsAllowed; 142*f6dc9357SAndroid Build Coastguard Worker } 143*f6dc9357SAndroid Build Coastguard Worker bool IsFinishedOK() const { return (_size == 0 && !_overflow); } 144*f6dc9357SAndroid Build Coastguard Worker UInt64 GetRem() const { return _size; } 145*f6dc9357SAndroid Build Coastguard Worker }; 146*f6dc9357SAndroid Build Coastguard Worker 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 149*f6dc9357SAndroid Build Coastguard Worker CTailInStream 150*f6dc9357SAndroid Build Coastguard Worker ) 151*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 152*f6dc9357SAndroid Build Coastguard Worker public: 153*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream; 154*f6dc9357SAndroid Build Coastguard Worker UInt64 Offset; 155*f6dc9357SAndroid Build Coastguard Worker 156*f6dc9357SAndroid Build Coastguard Worker void Init() 157*f6dc9357SAndroid Build Coastguard Worker { 158*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 159*f6dc9357SAndroid Build Coastguard Worker } 160*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToStart() { return InStream_SeekSet(Stream, Offset); } 161*f6dc9357SAndroid Build Coastguard Worker }; 162*f6dc9357SAndroid Build Coastguard Worker 163*f6dc9357SAndroid Build Coastguard Worker 164*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream( 165*f6dc9357SAndroid Build Coastguard Worker CLimitedCachedInStream 166*f6dc9357SAndroid Build Coastguard Worker ) 167*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> _stream; 168*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 169*f6dc9357SAndroid Build Coastguard Worker UInt64 _physPos; 170*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 171*f6dc9357SAndroid Build Coastguard Worker UInt64 _startOffset; 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker const Byte *_cache; 174*f6dc9357SAndroid Build Coastguard Worker size_t _cacheSize; 175*f6dc9357SAndroid Build Coastguard Worker size_t _cachePhyPos; 176*f6dc9357SAndroid Build Coastguard Worker 177*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); } 178*f6dc9357SAndroid Build Coastguard Worker public: 179*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Buffer; 180*f6dc9357SAndroid Build Coastguard Worker 181*f6dc9357SAndroid Build Coastguard Worker void SetStream(IInStream *stream) { _stream = stream; } 182*f6dc9357SAndroid Build Coastguard Worker void SetCache(size_t cacheSize, size_t cachePos) 183*f6dc9357SAndroid Build Coastguard Worker { 184*f6dc9357SAndroid Build Coastguard Worker _cache = Buffer; 185*f6dc9357SAndroid Build Coastguard Worker _cacheSize = cacheSize; 186*f6dc9357SAndroid Build Coastguard Worker _cachePhyPos = cachePos; 187*f6dc9357SAndroid Build Coastguard Worker } 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) 190*f6dc9357SAndroid Build Coastguard Worker { 191*f6dc9357SAndroid Build Coastguard Worker _startOffset = startOffset; 192*f6dc9357SAndroid Build Coastguard Worker _physPos = startOffset; 193*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 194*f6dc9357SAndroid Build Coastguard Worker _size = size; 195*f6dc9357SAndroid Build Coastguard Worker return SeekToPhys(); 196*f6dc9357SAndroid Build Coastguard Worker } 197*f6dc9357SAndroid Build Coastguard Worker 198*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } 199*f6dc9357SAndroid Build Coastguard Worker }; 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker 202*f6dc9357SAndroid Build Coastguard Worker class CTailOutStream Z7_final : 203*f6dc9357SAndroid Build Coastguard Worker public IOutStream, 204*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 205*f6dc9357SAndroid Build Coastguard Worker { 206*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(ISequentialOutStream, IOutStream) 207*f6dc9357SAndroid Build Coastguard Worker 208*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtPos; 209*f6dc9357SAndroid Build Coastguard Worker UInt64 _virtSize; 210*f6dc9357SAndroid Build Coastguard Worker public: 211*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IOutStream> Stream; 212*f6dc9357SAndroid Build Coastguard Worker UInt64 Offset; 213*f6dc9357SAndroid Build Coastguard Worker 214*f6dc9357SAndroid Build Coastguard Worker void Init() 215*f6dc9357SAndroid Build Coastguard Worker { 216*f6dc9357SAndroid Build Coastguard Worker _virtPos = 0; 217*f6dc9357SAndroid Build Coastguard Worker _virtSize = 0; 218*f6dc9357SAndroid Build Coastguard Worker } 219*f6dc9357SAndroid Build Coastguard Worker }; 220*f6dc9357SAndroid Build Coastguard Worker 221*f6dc9357SAndroid Build Coastguard Worker #endif 222