xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/LimitedStreams.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LimitedStreams.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LIMITED_STREAMS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LIMITED_STREAMS_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyVector.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "StreamUtils.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(
14*f6dc9357SAndroid Build Coastguard Worker   CLimitedSequentialInStream
15*f6dc9357SAndroid Build Coastguard Worker   , ISequentialInStream
16*f6dc9357SAndroid Build Coastguard Worker )
17*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialInStream> _stream;
18*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
19*f6dc9357SAndroid Build Coastguard Worker   UInt64 _pos;
20*f6dc9357SAndroid Build Coastguard Worker   bool _wasFinished;
21*f6dc9357SAndroid Build Coastguard Worker public:
SetStream(ISequentialInStream * stream)22*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialInStream *stream) { _stream = stream; }
ReleaseStream()23*f6dc9357SAndroid Build Coastguard Worker   void ReleaseStream() { _stream.Release(); }
Init(UInt64 streamSize)24*f6dc9357SAndroid Build Coastguard Worker   void Init(UInt64 streamSize)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     _size = streamSize;
27*f6dc9357SAndroid Build Coastguard Worker     _pos = 0;
28*f6dc9357SAndroid Build Coastguard Worker     _wasFinished = false;
29*f6dc9357SAndroid Build Coastguard Worker   }
GetSize()30*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetSize() const { return _pos; }
GetRem()31*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetRem() const { return _size - _pos; }
WasFinished()32*f6dc9357SAndroid Build Coastguard Worker   bool WasFinished() const { return _wasFinished; }
33*f6dc9357SAndroid Build Coastguard Worker };
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
37*f6dc9357SAndroid Build Coastguard Worker   CLimitedInStream
38*f6dc9357SAndroid Build Coastguard Worker )
39*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> _stream;
40*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
41*f6dc9357SAndroid Build Coastguard Worker   UInt64 _physPos;
42*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
43*f6dc9357SAndroid Build Coastguard Worker   UInt64 _startOffset;
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); }
46*f6dc9357SAndroid Build Coastguard Worker public:
47*f6dc9357SAndroid Build Coastguard Worker   void SetStream(IInStream *stream) { _stream = stream; }
48*f6dc9357SAndroid Build Coastguard Worker   HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)
49*f6dc9357SAndroid Build Coastguard Worker   {
50*f6dc9357SAndroid Build Coastguard Worker     _startOffset = startOffset;
51*f6dc9357SAndroid Build Coastguard Worker     _physPos = startOffset;
52*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
53*f6dc9357SAndroid Build Coastguard Worker     _size = size;
54*f6dc9357SAndroid Build Coastguard Worker     return SeekToPhys();
55*f6dc9357SAndroid Build Coastguard Worker   }
56*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }
57*f6dc9357SAndroid Build Coastguard Worker };
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream);
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
63*f6dc9357SAndroid Build Coastguard Worker   CClusterInStream
64*f6dc9357SAndroid Build Coastguard Worker )
65*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
66*f6dc9357SAndroid Build Coastguard Worker   UInt64 _physPos;
67*f6dc9357SAndroid Build Coastguard Worker   UInt32 _curRem;
68*f6dc9357SAndroid Build Coastguard Worker public:
69*f6dc9357SAndroid Build Coastguard Worker   unsigned BlockSizeLog;
70*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
71*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> Stream;
72*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> Vector;
73*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartOffset;
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToPhys() { return InStream_SeekSet(Stream, _physPos); }
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker   HRESULT InitAndSeek()
78*f6dc9357SAndroid Build Coastguard Worker   {
79*f6dc9357SAndroid Build Coastguard Worker     _curRem = 0;
80*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
81*f6dc9357SAndroid Build Coastguard Worker     _physPos = StartOffset;
82*f6dc9357SAndroid Build Coastguard Worker     if (Vector.Size() > 0)
83*f6dc9357SAndroid Build Coastguard Worker     {
84*f6dc9357SAndroid Build Coastguard Worker       _physPos = StartOffset + (Vector[0] << BlockSizeLog);
85*f6dc9357SAndroid Build Coastguard Worker       return SeekToPhys();
86*f6dc9357SAndroid Build Coastguard Worker     }
87*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker };
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker const UInt64 k_SeekExtent_Phy_Type_ZeroFill = (UInt64)(Int64)-1;
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker struct CSeekExtent
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker   UInt64 Virt;
98*f6dc9357SAndroid Build Coastguard Worker   UInt64 Phy;
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   void SetAs_ZeroFill() { Phy = k_SeekExtent_Phy_Type_ZeroFill; }
101*f6dc9357SAndroid Build Coastguard Worker   bool Is_ZeroFill() const { return Phy == k_SeekExtent_Phy_Type_ZeroFill; }
102*f6dc9357SAndroid Build Coastguard Worker };
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
106*f6dc9357SAndroid Build Coastguard Worker   CExtentsStream
107*f6dc9357SAndroid Build Coastguard Worker )
108*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
109*f6dc9357SAndroid Build Coastguard Worker   UInt64 _phyPos;
110*f6dc9357SAndroid Build Coastguard Worker   unsigned _prevExtentIndex;
111*f6dc9357SAndroid Build Coastguard Worker public:
112*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> Stream;
113*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CSeekExtent> Extents;
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker   void ReleaseStream() { Stream.Release(); }
116*f6dc9357SAndroid Build Coastguard Worker   void Init()
117*f6dc9357SAndroid Build Coastguard Worker   {
118*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
119*f6dc9357SAndroid Build Coastguard Worker     _phyPos = (UInt64)0 - 1; // we need Seek() for Stream
120*f6dc9357SAndroid Build Coastguard Worker     _prevExtentIndex = 0;
121*f6dc9357SAndroid Build Coastguard Worker   }
122*f6dc9357SAndroid Build Coastguard Worker };
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1(
127*f6dc9357SAndroid Build Coastguard Worker   CLimitedSequentialOutStream
128*f6dc9357SAndroid Build Coastguard Worker   , ISequentialOutStream
129*f6dc9357SAndroid Build Coastguard Worker )
130*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ISequentialOutStream> _stream;
131*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
132*f6dc9357SAndroid Build Coastguard Worker   bool _overflow;
133*f6dc9357SAndroid Build Coastguard Worker   bool _overflowIsAllowed;
134*f6dc9357SAndroid Build Coastguard Worker public:
135*f6dc9357SAndroid Build Coastguard Worker   void SetStream(ISequentialOutStream *stream) { _stream = stream; }
136*f6dc9357SAndroid Build Coastguard Worker   void ReleaseStream() { _stream.Release(); }
137*f6dc9357SAndroid Build Coastguard Worker   void Init(UInt64 size, bool overflowIsAllowed = false)
138*f6dc9357SAndroid Build Coastguard Worker   {
139*f6dc9357SAndroid Build Coastguard Worker     _size = size;
140*f6dc9357SAndroid Build Coastguard Worker     _overflow = false;
141*f6dc9357SAndroid Build Coastguard Worker     _overflowIsAllowed = overflowIsAllowed;
142*f6dc9357SAndroid Build Coastguard Worker   }
143*f6dc9357SAndroid Build Coastguard Worker   bool IsFinishedOK() const { return (_size == 0 && !_overflow); }
144*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetRem() const { return _size; }
145*f6dc9357SAndroid Build Coastguard Worker };
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
149*f6dc9357SAndroid Build Coastguard Worker   CTailInStream
150*f6dc9357SAndroid Build Coastguard Worker )
151*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
152*f6dc9357SAndroid Build Coastguard Worker public:
153*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> Stream;
154*f6dc9357SAndroid Build Coastguard Worker   UInt64 Offset;
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker   void Init()
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
159*f6dc9357SAndroid Build Coastguard Worker   }
160*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToStart() { return InStream_SeekSet(Stream, Offset); }
161*f6dc9357SAndroid Build Coastguard Worker };
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker 
164*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_IInStream(
165*f6dc9357SAndroid Build Coastguard Worker   CLimitedCachedInStream
166*f6dc9357SAndroid Build Coastguard Worker )
167*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> _stream;
168*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
169*f6dc9357SAndroid Build Coastguard Worker   UInt64 _physPos;
170*f6dc9357SAndroid Build Coastguard Worker   UInt64 _size;
171*f6dc9357SAndroid Build Coastguard Worker   UInt64 _startOffset;
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   const Byte *_cache;
174*f6dc9357SAndroid Build Coastguard Worker   size_t _cacheSize;
175*f6dc9357SAndroid Build Coastguard Worker   size_t _cachePhyPos;
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToPhys() { return InStream_SeekSet(_stream, _physPos); }
178*f6dc9357SAndroid Build Coastguard Worker public:
179*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Buffer;
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker   void SetStream(IInStream *stream) { _stream = stream; }
182*f6dc9357SAndroid Build Coastguard Worker   void SetCache(size_t cacheSize, size_t cachePos)
183*f6dc9357SAndroid Build Coastguard Worker   {
184*f6dc9357SAndroid Build Coastguard Worker     _cache = Buffer;
185*f6dc9357SAndroid Build Coastguard Worker     _cacheSize = cacheSize;
186*f6dc9357SAndroid Build Coastguard Worker     _cachePhyPos = cachePos;
187*f6dc9357SAndroid Build Coastguard Worker   }
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   HRESULT InitAndSeek(UInt64 startOffset, UInt64 size)
190*f6dc9357SAndroid Build Coastguard Worker   {
191*f6dc9357SAndroid Build Coastguard Worker     _startOffset = startOffset;
192*f6dc9357SAndroid Build Coastguard Worker     _physPos = startOffset;
193*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
194*f6dc9357SAndroid Build Coastguard Worker     _size = size;
195*f6dc9357SAndroid Build Coastguard Worker     return SeekToPhys();
196*f6dc9357SAndroid Build Coastguard Worker   }
197*f6dc9357SAndroid Build Coastguard Worker 
198*f6dc9357SAndroid Build Coastguard Worker   HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); }
199*f6dc9357SAndroid Build Coastguard Worker };
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker class CTailOutStream Z7_final :
203*f6dc9357SAndroid Build Coastguard Worker   public IOutStream,
204*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_2(ISequentialOutStream, IOutStream)
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtPos;
209*f6dc9357SAndroid Build Coastguard Worker   UInt64 _virtSize;
210*f6dc9357SAndroid Build Coastguard Worker public:
211*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IOutStream> Stream;
212*f6dc9357SAndroid Build Coastguard Worker   UInt64 Offset;
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker   void Init()
215*f6dc9357SAndroid Build Coastguard Worker   {
216*f6dc9357SAndroid Build Coastguard Worker     _virtPos = 0;
217*f6dc9357SAndroid Build Coastguard Worker     _virtSize = 0;
218*f6dc9357SAndroid Build Coastguard Worker   }
219*f6dc9357SAndroid Build Coastguard Worker };
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker #endif
222