1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MultiStream.h 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef __MULTI_STREAM_H 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define __MULTI_STREAM_H 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "../../../Common/MyCom.h" 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "../../../Common/MyVector.h" 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "../../IStream.h" 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CMultiStream: 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public IInStream, 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public CMyUnknownImp 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville{ 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 _pos; 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 _totalLength; 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int _streamIndex; 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic: 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville struct CSubStreamInfo 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CMyComPtr<IInStream> Stream; 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 Size; 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 GlobalOffset; 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 LocalPos; 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CObjectVector<CSubStreamInfo> Streams; 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville HRESULT Init() 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 total = 0; 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < Streams.Size(); i++) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CSubStreamInfo &s = Streams[i]; 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville s.GlobalOffset = total; 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville total += Streams[i].Size; 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos)); 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _totalLength = total; 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _pos = 0; 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _streamIndex = 0; 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return S_OK; 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MY_UNKNOWN_IMP1(IInStream) 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/* 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass COutMultiStream: 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public IOutStream, 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public CMyUnknownImp 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville{ 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int _streamIndex; // required stream 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 _offsetPos; // offset from start of _streamIndex index 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 _absPos; 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 _length; 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville struct CSubStreamInfo 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CMyComPtr<ISequentialOutStream> Stream; 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 Size; 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UInt64 Pos; 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CObjectVector<CSubStreamInfo> Streams; 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic: 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CMyComPtr<IArchiveUpdateCallback2> VolumeCallback; 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Init() 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _streamIndex = 0; 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _offsetPos = 0; 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _absPos = 0; 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _length = 0; 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MY_UNKNOWN_IMP1(IOutStream) 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville*/ 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville