// LimitedStreams.h #ifndef ZIP7_INC_LIMITED_STREAMS_H #define ZIP7_INC_LIMITED_STREAMS_H #include "../../Common/MyBuffer.h" #include "../../Common/MyCom.h" #include "../../Common/MyVector.h" #include "../IStream.h" #include "StreamUtils.h" Z7_CLASS_IMP_COM_1( CLimitedSequentialInStream , ISequentialInStream ) CMyComPtr _stream; UInt64 _size; UInt64 _pos; bool _wasFinished; public: void SetStream(ISequentialInStream *stream) { _stream = stream; } void ReleaseStream() { _stream.Release(); } void Init(UInt64 streamSize) { _size = streamSize; _pos = 0; _wasFinished = false; } UInt64 GetSize() const { return _pos; } UInt64 GetRem() const { return _size - _pos; } bool WasFinished() const { return _wasFinished; } }; Z7_CLASS_IMP_IInStream( CLimitedInStream ) CMyComPtr _stream; UInt64 _virtPos; UInt64 _physPos; UInt64 _size; UInt64 _startOffset; HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); } public: void SetStream(IInStream *stream) { _stream = stream; } HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) { _startOffset = startOffset; _physPos = startOffset; _virtPos = 0; _size = size; return SeekToPhys(); } HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } }; HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream); Z7_CLASS_IMP_IInStream( CClusterInStream ) UInt64 _virtPos; UInt64 _physPos; UInt32 _curRem; public: unsigned BlockSizeLog; UInt64 Size; CMyComPtr Stream; CRecordVector Vector; UInt64 StartOffset; HRESULT SeekToPhys() { return InStream_SeekSet(Stream, _physPos); } HRESULT InitAndSeek() { _curRem = 0; _virtPos = 0; _physPos = StartOffset; if (Vector.Size() > 0) { _physPos = StartOffset + (Vector[0] << BlockSizeLog); return SeekToPhys(); } return S_OK; } }; const UInt64 k_SeekExtent_Phy_Type_ZeroFill = (UInt64)(Int64)-1; struct CSeekExtent { UInt64 Virt; UInt64 Phy; void SetAs_ZeroFill() { Phy = k_SeekExtent_Phy_Type_ZeroFill; } bool Is_ZeroFill() const { return Phy == k_SeekExtent_Phy_Type_ZeroFill; } }; Z7_CLASS_IMP_IInStream( CExtentsStream ) UInt64 _virtPos; UInt64 _phyPos; unsigned _prevExtentIndex; public: CMyComPtr Stream; CRecordVector Extents; void ReleaseStream() { Stream.Release(); } void Init() { _virtPos = 0; _phyPos = (UInt64)0 - 1; // we need Seek() for Stream _prevExtentIndex = 0; } }; Z7_CLASS_IMP_COM_1( CLimitedSequentialOutStream , ISequentialOutStream ) CMyComPtr _stream; UInt64 _size; bool _overflow; bool _overflowIsAllowed; public: void SetStream(ISequentialOutStream *stream) { _stream = stream; } void ReleaseStream() { _stream.Release(); } void Init(UInt64 size, bool overflowIsAllowed = false) { _size = size; _overflow = false; _overflowIsAllowed = overflowIsAllowed; } bool IsFinishedOK() const { return (_size == 0 && !_overflow); } UInt64 GetRem() const { return _size; } }; Z7_CLASS_IMP_IInStream( CTailInStream ) UInt64 _virtPos; public: CMyComPtr Stream; UInt64 Offset; void Init() { _virtPos = 0; } HRESULT SeekToStart() { return InStream_SeekSet(Stream, Offset); } }; Z7_CLASS_IMP_IInStream( CLimitedCachedInStream ) CMyComPtr _stream; UInt64 _virtPos; UInt64 _physPos; UInt64 _size; UInt64 _startOffset; const Byte *_cache; size_t _cacheSize; size_t _cachePhyPos; HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); } public: CByteBuffer Buffer; void SetStream(IInStream *stream) { _stream = stream; } void SetCache(size_t cacheSize, size_t cachePos) { _cache = Buffer; _cacheSize = cacheSize; _cachePhyPos = cachePos; } HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) { _startOffset = startOffset; _physPos = startOffset; _virtPos = 0; _size = size; return SeekToPhys(); } HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } }; class CTailOutStream Z7_final : public IOutStream, public CMyUnknownImp { Z7_IFACES_IMP_UNK_2(ISequentialOutStream, IOutStream) UInt64 _virtPos; UInt64 _virtSize; public: CMyComPtr Stream; UInt64 Offset; void Init() { _virtPos = 0; _virtSize = 0; } }; #endif