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