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