Source code
Revision control
Copy as Markdown
Other Tools
// 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↩