// MultiStream.h | |
#ifndef __MULTI_STREAM_H | |
#define __MULTI_STREAM_H | |
#include "../../../Common/MyCom.h" | |
#include "../../../Common/MyVector.h" | |
#include "../../IStream.h" | |
class CMultiStream: | |
public IInStream, | |
public CMyUnknownImp | |
{ | |
UInt64 _pos; | |
UInt64 _totalLength; | |
unsigned _streamIndex; | |
public: | |
struct CSubStreamInfo | |
{ | |
CMyComPtr<IInStream> Stream; | |
UInt64 Size; | |
UInt64 GlobalOffset; | |
UInt64 LocalPos; | |
CSubStreamInfo(): Size(0), GlobalOffset(0), LocalPos(0) {} | |
}; | |
CObjectVector<CSubStreamInfo> Streams; | |
HRESULT Init() | |
{ | |
UInt64 total = 0; | |
FOR_VECTOR (i, Streams) | |
{ | |
CSubStreamInfo &s = Streams[i]; | |
s.GlobalOffset = total; | |
total += Streams[i].Size; | |
RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos)); | |
} | |
_totalLength = total; | |
_pos = 0; | |
_streamIndex = 0; | |
return S_OK; | |
} | |
MY_UNKNOWN_IMP1(IInStream) | |
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); | |
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); | |
}; | |
/* | |
class COutMultiStream: | |
public IOutStream, | |
public CMyUnknownImp | |
{ | |
unsigned _streamIndex; // required stream | |
UInt64 _offsetPos; // offset from start of _streamIndex index | |
UInt64 _absPos; | |
UInt64 _length; | |
struct CSubStreamInfo | |
{ | |
CMyComPtr<ISequentialOutStream> Stream; | |
UInt64 Size; | |
UInt64 Pos; | |
}; | |
CObjectVector<CSubStreamInfo> Streams; | |
public: | |
CMyComPtr<IArchiveUpdateCallback2> VolumeCallback; | |
void Init() | |
{ | |
_streamIndex = 0; | |
_offsetPos = 0; | |
_absPos = 0; | |
_length = 0; | |
} | |
MY_UNKNOWN_IMP1(IOutStream) | |
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); | |
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); | |
}; | |
*/ | |
#endif |