mirror of
https://github.com/holub/mame
synced 2025-06-03 19:36:26 +03:00
222 lines
4.4 KiB
C++
222 lines
4.4 KiB
C++
// 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<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;
|
|
}
|
|
UInt64 GetSize() const { return _pos; }
|
|
UInt64 GetRem() const { return _size - _pos; }
|
|
bool WasFinished() const { return _wasFinished; }
|
|
};
|
|
|
|
|
|
Z7_CLASS_IMP_IInStream(
|
|
CLimitedInStream
|
|
)
|
|
CMyComPtr<IInStream> _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<IInStream> Stream;
|
|
CRecordVector<UInt32> 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<IInStream> Stream;
|
|
CRecordVector<CSeekExtent> 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<ISequentialOutStream> _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<IInStream> Stream;
|
|
UInt64 Offset;
|
|
|
|
void Init()
|
|
{
|
|
_virtPos = 0;
|
|
}
|
|
HRESULT SeekToStart() { return InStream_SeekSet(Stream, Offset); }
|
|
};
|
|
|
|
|
|
Z7_CLASS_IMP_IInStream(
|
|
CLimitedCachedInStream
|
|
)
|
|
CMyComPtr<IInStream> _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<IOutStream> Stream;
|
|
UInt64 Offset;
|
|
|
|
void Init()
|
|
{
|
|
_virtPos = 0;
|
|
_virtSize = 0;
|
|
}
|
|
};
|
|
|
|
#endif
|