xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Common/MultiStream.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // MultiStream.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_MULTI_STREAM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_MULTI_STREAM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyVector.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../IStream.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
13*f6dc9357SAndroid Build Coastguard Worker   CMultiStream
14*f6dc9357SAndroid Build Coastguard Worker )
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker   unsigned _streamIndex;
17*f6dc9357SAndroid Build Coastguard Worker   UInt64 _pos;
18*f6dc9357SAndroid Build Coastguard Worker   UInt64 _totalLength;
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker public:
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker   struct CSubStreamInfo
23*f6dc9357SAndroid Build Coastguard Worker   {
24*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IInStream> Stream;
25*f6dc9357SAndroid Build Coastguard Worker     UInt64 Size;
26*f6dc9357SAndroid Build Coastguard Worker     UInt64 GlobalOffset;
27*f6dc9357SAndroid Build Coastguard Worker     UInt64 LocalPos;
CSubStreamInfoCSubStreamInfo28*f6dc9357SAndroid Build Coastguard Worker     CSubStreamInfo(): Size(0), GlobalOffset(0), LocalPos(0) {}
29*f6dc9357SAndroid Build Coastguard Worker   };
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveUpdateCallbackFile> updateCallbackFile;
32*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CSubStreamInfo> Streams;
33*f6dc9357SAndroid Build Coastguard Worker 
Init()34*f6dc9357SAndroid Build Coastguard Worker   HRESULT Init()
35*f6dc9357SAndroid Build Coastguard Worker   {
36*f6dc9357SAndroid Build Coastguard Worker     UInt64 total = 0;
37*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Streams)
38*f6dc9357SAndroid Build Coastguard Worker     {
39*f6dc9357SAndroid Build Coastguard Worker       CSubStreamInfo &s = Streams[i];
40*f6dc9357SAndroid Build Coastguard Worker       s.GlobalOffset = total;
41*f6dc9357SAndroid Build Coastguard Worker       total += s.Size;
42*f6dc9357SAndroid Build Coastguard Worker       s.LocalPos = 0;
43*f6dc9357SAndroid Build Coastguard Worker       {
44*f6dc9357SAndroid Build Coastguard Worker         // it was already set to start
45*f6dc9357SAndroid Build Coastguard Worker         // RINOK(InStream_GetPos(s.Stream, s.LocalPos));
46*f6dc9357SAndroid Build Coastguard Worker       }
47*f6dc9357SAndroid Build Coastguard Worker     }
48*f6dc9357SAndroid Build Coastguard Worker     _totalLength = total;
49*f6dc9357SAndroid Build Coastguard Worker     _pos = 0;
50*f6dc9357SAndroid Build Coastguard Worker     _streamIndex = 0;
51*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
52*f6dc9357SAndroid Build Coastguard Worker   }
53*f6dc9357SAndroid Build Coastguard Worker };
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker /*
56*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(
57*f6dc9357SAndroid Build Coastguard Worker   COutMultiStream,
58*f6dc9357SAndroid Build Coastguard Worker   IOutStream
59*f6dc9357SAndroid Build Coastguard Worker )
60*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ISequentialOutStream)
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   unsigned _streamIndex; // required stream
63*f6dc9357SAndroid Build Coastguard Worker   UInt64 _offsetPos; // offset from start of _streamIndex index
64*f6dc9357SAndroid Build Coastguard Worker   UInt64 _absPos;
65*f6dc9357SAndroid Build Coastguard Worker   UInt64 _length;
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   struct CSubStreamInfo
68*f6dc9357SAndroid Build Coastguard Worker   {
69*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ISequentialOutStream> Stream;
70*f6dc9357SAndroid Build Coastguard Worker     UInt64 Size;
71*f6dc9357SAndroid Build Coastguard Worker     UInt64 Pos;
72*f6dc9357SAndroid Build Coastguard Worker  };
73*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CSubStreamInfo> Streams;
74*f6dc9357SAndroid Build Coastguard Worker public:
75*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveUpdateCallback2> VolumeCallback;
76*f6dc9357SAndroid Build Coastguard Worker   void Init()
77*f6dc9357SAndroid Build Coastguard Worker   {
78*f6dc9357SAndroid Build Coastguard Worker     _streamIndex = 0;
79*f6dc9357SAndroid Build Coastguard Worker     _offsetPos = 0;
80*f6dc9357SAndroid Build Coastguard Worker     _absPos = 0;
81*f6dc9357SAndroid Build Coastguard Worker     _length = 0;
82*f6dc9357SAndroid Build Coastguard Worker   }
83*f6dc9357SAndroid Build Coastguard Worker };
84*f6dc9357SAndroid Build Coastguard Worker */
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker #endif
87