Source code

Revision control

Copy as Markdown

Other Tools

// LimitedStreams.h↩
#ifndef __LIMITED_STREAMS_H↩
#define __LIMITED_STREAMS_H↩
#include "../../Common/MyBuffer.h"
#include "../../Common/MyCom.h"
#include "../../Common/MyVector.h"
#include "../IStream.h"
class CLimitedSequentialInStream:↩
public ISequentialInStream,↩
public CMyUnknownImp↩
{↩
CMyComPtr<ISequentialInStream> _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;↩
}↩
MY_UNKNOWN_IMP1(ISequentialInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
UInt64 GetSize() const { return _pos; }↩
UInt64 GetRem() const { return _size - _pos; }↩
bool WasFinished() const { return _wasFinished; }↩
};↩
class CLimitedInStream:↩
public IInStream,↩
public CMyUnknownImp↩
{↩
CMyComPtr<IInStream> _stream;↩
UInt64 _virtPos;↩
UInt64 _physPos;↩
UInt64 _size;↩
UInt64 _startOffset;↩
HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }↩
public:↩
void SetStream(IInStream *stream) { _stream = stream; }↩
HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)↩
{↩
_startOffset = startOffset;↩
_physPos = startOffset;↩
_virtPos = 0;↩
_size = size;↩
return SeekToPhys();↩
}↩
MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }↩
};↩
HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream);↩
class CClusterInStream:↩
public IInStream,↩
public CMyUnknownImp↩
{↩
UInt64 _virtPos;↩
UInt64 _physPos;↩
UInt32 _curRem;↩
public:↩
unsigned BlockSizeLog;↩
UInt64 Size;↩
CMyComPtr<IInStream> Stream;↩
CRecordVector<UInt32> Vector;↩
UInt64 StartOffset;↩
HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }↩
HRESULT InitAndSeek()↩
{↩
_curRem = 0;↩
_virtPos = 0;↩
_physPos = StartOffset;↩
if (Vector.Size() > 0)↩
{↩
_physPos = StartOffset + (Vector[0] << BlockSizeLog);↩
return SeekToPhys();↩
}↩
return S_OK;↩
}↩
MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
};↩
struct CSeekExtent↩
{↩
UInt64 Phy;↩
UInt64 Virt;↩
};↩
class CExtentsStream:↩
public IInStream,↩
public CMyUnknownImp↩
{↩
UInt64 _phyPos;↩
UInt64 _virtPos;↩
bool _needStartSeek;↩
HRESULT SeekToPhys() { return Stream->Seek(_phyPos, STREAM_SEEK_SET, NULL); }↩
public:↩
CMyComPtr<IInStream> Stream;↩
CRecordVector<CSeekExtent> Extents;↩
MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
void ReleaseStream() { Stream.Release(); }↩
void Init()↩
{↩
_virtPos = 0;↩
_phyPos = 0;↩
_needStartSeek = true;↩
}↩
};↩
class CLimitedSequentialOutStream:↩
public ISequentialOutStream,↩
public CMyUnknownImp↩
{↩
CMyComPtr<ISequentialOutStream> _stream;↩
UInt64 _size;↩
bool _overflow;↩
bool _overflowIsAllowed;↩
public:↩
MY_UNKNOWN_IMP1(ISequentialOutStream)↩
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);↩
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; }↩
};↩
class CTailInStream:↩
public IInStream,↩
public CMyUnknownImp↩
{↩
UInt64 _virtPos;↩
public:↩
CMyComPtr<IInStream> Stream;↩
UInt64 Offset;↩
void Init()↩
{↩
_virtPos = 0;↩
}↩
MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
HRESULT SeekToStart() { return Stream->Seek(Offset, STREAM_SEEK_SET, NULL); }↩
};↩
class CLimitedCachedInStream:↩
public IInStream,↩
public CMyUnknownImp↩
{↩
CMyComPtr<IInStream> _stream;↩
UInt64 _virtPos;↩
UInt64 _physPos;↩
UInt64 _size;↩
UInt64 _startOffset;↩
const Byte *_cache;↩
size_t _cacheSize;↩
size_t _cachePhyPos;↩
HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); }↩
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();↩
}↩
MY_UNKNOWN_IMP2(ISequentialInStream, IInStream)↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }↩
};↩
class CTailOutStream:↩
public IOutStream,↩
public CMyUnknownImp↩
{↩
UInt64 _virtPos;↩
UInt64 _virtSize;↩
public:↩
CMyComPtr<IOutStream> Stream;↩
UInt64 Offset;↩
virtual ~CTailOutStream() {}↩
MY_UNKNOWN_IMP2(ISequentialOutStream, IOutStream)↩
void Init()↩
{↩
_virtPos = 0;↩
_virtSize = 0;↩
}↩
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition);↩
STDMETHOD(SetSize)(UInt64 newSize);↩
};↩
#endif