xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/OpenArchive.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // OpenArchive.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_OPEN_ARCHIVE_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_OPEN_ARCHIVE_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "ArchiveOpenCallback.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "LoadCodecs.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "Property.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "DirItem.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #define SUPPORT_ALT_STREAMS
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #endif
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker HRESULT Archive_GetItemBoolProp(IInArchive *arc, UInt32 index, PROPID propID, bool &result) throw();
20*f6dc9357SAndroid Build Coastguard Worker HRESULT Archive_IsItem_Dir(IInArchive *arc, UInt32 index, bool &result) throw();
21*f6dc9357SAndroid Build Coastguard Worker HRESULT Archive_IsItem_Aux(IInArchive *arc, UInt32 index, bool &result) throw();
22*f6dc9357SAndroid Build Coastguard Worker HRESULT Archive_IsItem_AltStream(IInArchive *arc, UInt32 index, bool &result) throw();
23*f6dc9357SAndroid Build Coastguard Worker HRESULT Archive_IsItem_Deleted(IInArchive *arc, UInt32 index, bool &deleted) throw();
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_ALT_STREAMS
26*f6dc9357SAndroid Build Coastguard Worker int FindAltStreamColon_in_Path(const wchar_t *path);
27*f6dc9357SAndroid Build Coastguard Worker #endif
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker /*
30*f6dc9357SAndroid Build Coastguard Worker struct COptionalOpenProperties
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   UString FormatName;
33*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CProperty> Props;
34*f6dc9357SAndroid Build Coastguard Worker };
35*f6dc9357SAndroid Build Coastguard Worker */
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_SFX
38*f6dc9357SAndroid Build Coastguard Worker #define OPEN_PROPS_DECL
39*f6dc9357SAndroid Build Coastguard Worker #else
40*f6dc9357SAndroid Build Coastguard Worker #define OPEN_PROPS_DECL const CObjectVector<CProperty> *props;
41*f6dc9357SAndroid Build Coastguard Worker // #define OPEN_PROPS_DECL , const CObjectVector<COptionalOpenProperties> *props
42*f6dc9357SAndroid Build Coastguard Worker #endif
43*f6dc9357SAndroid Build Coastguard Worker 
44*f6dc9357SAndroid Build Coastguard Worker struct COpenSpecFlags
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   // bool CanReturnFull;
47*f6dc9357SAndroid Build Coastguard Worker   bool CanReturnFrontal;
48*f6dc9357SAndroid Build Coastguard Worker   bool CanReturnTail;
49*f6dc9357SAndroid Build Coastguard Worker   bool CanReturnMid;
50*f6dc9357SAndroid Build Coastguard Worker 
CanReturn_NonStartCOpenSpecFlags51*f6dc9357SAndroid Build Coastguard Worker   bool CanReturn_NonStart() const { return CanReturnTail || CanReturnMid; }
52*f6dc9357SAndroid Build Coastguard Worker 
COpenSpecFlagsCOpenSpecFlags53*f6dc9357SAndroid Build Coastguard Worker   COpenSpecFlags():
54*f6dc9357SAndroid Build Coastguard Worker     // CanReturnFull(true),
55*f6dc9357SAndroid Build Coastguard Worker     CanReturnFrontal(false),
56*f6dc9357SAndroid Build Coastguard Worker     CanReturnTail(false),
57*f6dc9357SAndroid Build Coastguard Worker     CanReturnMid(false)
58*f6dc9357SAndroid Build Coastguard Worker     {}
59*f6dc9357SAndroid Build Coastguard Worker };
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker struct COpenType
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker   int FormatIndex;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   COpenSpecFlags SpecForcedType;
66*f6dc9357SAndroid Build Coastguard Worker   COpenSpecFlags SpecMainType;
67*f6dc9357SAndroid Build Coastguard Worker   COpenSpecFlags SpecWrongExt;
68*f6dc9357SAndroid Build Coastguard Worker   COpenSpecFlags SpecUnknownExt;
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   bool Recursive;
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker   bool CanReturnArc;
73*f6dc9357SAndroid Build Coastguard Worker   bool CanReturnParser;
74*f6dc9357SAndroid Build Coastguard Worker   bool IsHashType;
75*f6dc9357SAndroid Build Coastguard Worker   bool EachPos;
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker   // bool SkipSfxStub;
78*f6dc9357SAndroid Build Coastguard Worker   // bool ExeAsUnknown;
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker   bool ZerosTailIsAllowed;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   bool MaxStartOffset_Defined;
83*f6dc9357SAndroid Build Coastguard Worker   UInt64 MaxStartOffset;
84*f6dc9357SAndroid Build Coastguard Worker 
GetSpecCOpenType85*f6dc9357SAndroid Build Coastguard Worker   const COpenSpecFlags &GetSpec(bool isForced, bool isMain, bool isUnknown) const
86*f6dc9357SAndroid Build Coastguard Worker   {
87*f6dc9357SAndroid Build Coastguard Worker     return isForced ? SpecForcedType : (isMain ? SpecMainType : (isUnknown ? SpecUnknownExt : SpecWrongExt));
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker 
COpenTypeCOpenType90*f6dc9357SAndroid Build Coastguard Worker   COpenType():
91*f6dc9357SAndroid Build Coastguard Worker       FormatIndex(-1),
92*f6dc9357SAndroid Build Coastguard Worker       Recursive(true),
93*f6dc9357SAndroid Build Coastguard Worker       CanReturnArc(true),
94*f6dc9357SAndroid Build Coastguard Worker       CanReturnParser(false),
95*f6dc9357SAndroid Build Coastguard Worker       IsHashType(false),
96*f6dc9357SAndroid Build Coastguard Worker       EachPos(false),
97*f6dc9357SAndroid Build Coastguard Worker       // SkipSfxStub(true),
98*f6dc9357SAndroid Build Coastguard Worker       // ExeAsUnknown(true),
99*f6dc9357SAndroid Build Coastguard Worker       ZerosTailIsAllowed(false),
100*f6dc9357SAndroid Build Coastguard Worker       MaxStartOffset_Defined(false),
101*f6dc9357SAndroid Build Coastguard Worker       MaxStartOffset(0)
102*f6dc9357SAndroid Build Coastguard Worker   {
103*f6dc9357SAndroid Build Coastguard Worker     SpecForcedType.CanReturnFrontal = true;
104*f6dc9357SAndroid Build Coastguard Worker     SpecForcedType.CanReturnTail = true;
105*f6dc9357SAndroid Build Coastguard Worker     SpecForcedType.CanReturnMid = true;
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker     SpecMainType.CanReturnFrontal = true;
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker     SpecUnknownExt.CanReturnTail = true; // for sfx
110*f6dc9357SAndroid Build Coastguard Worker     SpecUnknownExt.CanReturnMid = true;
111*f6dc9357SAndroid Build Coastguard Worker     SpecUnknownExt.CanReturnFrontal = true; // for alt streams of sfx with pad
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker     // ZerosTailIsAllowed = true;
114*f6dc9357SAndroid Build Coastguard Worker   }
115*f6dc9357SAndroid Build Coastguard Worker };
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker struct COpenOptions
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs;
120*f6dc9357SAndroid Build Coastguard Worker   COpenType openType;
121*f6dc9357SAndroid Build Coastguard Worker   const CObjectVector<COpenType> *types;
122*f6dc9357SAndroid Build Coastguard Worker   const CIntVector *excludedFormats;
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker   IInStream *stream;
125*f6dc9357SAndroid Build Coastguard Worker   ISequentialInStream *seqStream;
126*f6dc9357SAndroid Build Coastguard Worker   IArchiveOpenCallback *callback;
127*f6dc9357SAndroid Build Coastguard Worker   COpenCallbackImp *callbackSpec; // it's used for SFX only
128*f6dc9357SAndroid Build Coastguard Worker   OPEN_PROPS_DECL
129*f6dc9357SAndroid Build Coastguard Worker   // bool openOnlySpecifiedByExtension,
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker   bool stdInMode;
132*f6dc9357SAndroid Build Coastguard Worker   UString filePath;
133*f6dc9357SAndroid Build Coastguard Worker 
COpenOptionsCOpenOptions134*f6dc9357SAndroid Build Coastguard Worker   COpenOptions():
135*f6dc9357SAndroid Build Coastguard Worker       codecs(NULL),
136*f6dc9357SAndroid Build Coastguard Worker       types(NULL),
137*f6dc9357SAndroid Build Coastguard Worker       excludedFormats(NULL),
138*f6dc9357SAndroid Build Coastguard Worker       stream(NULL),
139*f6dc9357SAndroid Build Coastguard Worker       seqStream(NULL),
140*f6dc9357SAndroid Build Coastguard Worker       callback(NULL),
141*f6dc9357SAndroid Build Coastguard Worker       callbackSpec(NULL),
142*f6dc9357SAndroid Build Coastguard Worker       stdInMode(false)
143*f6dc9357SAndroid Build Coastguard Worker     {}
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker };
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker UInt32 GetOpenArcErrorFlags(const NWindows::NCOM::CPropVariant &prop, bool *isDefinedProp = NULL);
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker struct CArcErrorInfo
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsTail;
152*f6dc9357SAndroid Build Coastguard Worker   bool UnexpecedEnd;
153*f6dc9357SAndroid Build Coastguard Worker   bool IgnoreTail; // all are zeros
154*f6dc9357SAndroid Build Coastguard Worker   // bool NonZerosTail;
155*f6dc9357SAndroid Build Coastguard Worker   bool ErrorFlags_Defined;
156*f6dc9357SAndroid Build Coastguard Worker   UInt32 ErrorFlags;
157*f6dc9357SAndroid Build Coastguard Worker   UInt32 WarningFlags;
158*f6dc9357SAndroid Build Coastguard Worker   int ErrorFormatIndex; // - 1 means no Error.
159*f6dc9357SAndroid Build Coastguard Worker                         // if FormatIndex == ErrorFormatIndex, the archive is open with offset
160*f6dc9357SAndroid Build Coastguard Worker   UInt64 TailSize;
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker   /* if CArc is Open OK with some format:
163*f6dc9357SAndroid Build Coastguard Worker         - ErrorFormatIndex shows error format index, if extension is incorrect
164*f6dc9357SAndroid Build Coastguard Worker         - other variables show message and warnings of archive that is open */
165*f6dc9357SAndroid Build Coastguard Worker 
166*f6dc9357SAndroid Build Coastguard Worker   UString ErrorMessage;
167*f6dc9357SAndroid Build Coastguard Worker   UString WarningMessage;
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker   // call IsArc_After_NonOpen only if Open returns S_FALSE
IsArc_After_NonOpenCArcErrorInfo170*f6dc9357SAndroid Build Coastguard Worker   bool IsArc_After_NonOpen() const
171*f6dc9357SAndroid Build Coastguard Worker   {
172*f6dc9357SAndroid Build Coastguard Worker     return (ErrorFlags_Defined && (ErrorFlags & kpv_ErrorFlags_IsNotArc) == 0);
173*f6dc9357SAndroid Build Coastguard Worker   }
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker 
CArcErrorInfoCArcErrorInfo176*f6dc9357SAndroid Build Coastguard Worker   CArcErrorInfo():
177*f6dc9357SAndroid Build Coastguard Worker       ThereIsTail(false),
178*f6dc9357SAndroid Build Coastguard Worker       UnexpecedEnd(false),
179*f6dc9357SAndroid Build Coastguard Worker       IgnoreTail(false),
180*f6dc9357SAndroid Build Coastguard Worker       // NonZerosTail(false),
181*f6dc9357SAndroid Build Coastguard Worker       ErrorFlags_Defined(false),
182*f6dc9357SAndroid Build Coastguard Worker       ErrorFlags(0),
183*f6dc9357SAndroid Build Coastguard Worker       WarningFlags(0),
184*f6dc9357SAndroid Build Coastguard Worker       ErrorFormatIndex(-1),
185*f6dc9357SAndroid Build Coastguard Worker       TailSize(0)
186*f6dc9357SAndroid Build Coastguard Worker     {}
187*f6dc9357SAndroid Build Coastguard Worker 
188*f6dc9357SAndroid Build Coastguard Worker   void ClearErrors();
189*f6dc9357SAndroid Build Coastguard Worker 
ClearErrors_FullCArcErrorInfo190*f6dc9357SAndroid Build Coastguard Worker   void ClearErrors_Full()
191*f6dc9357SAndroid Build Coastguard Worker   {
192*f6dc9357SAndroid Build Coastguard Worker     ErrorFormatIndex = -1;
193*f6dc9357SAndroid Build Coastguard Worker     ClearErrors();
194*f6dc9357SAndroid Build Coastguard Worker   }
195*f6dc9357SAndroid Build Coastguard Worker 
IsThereErrorOrWarningCArcErrorInfo196*f6dc9357SAndroid Build Coastguard Worker   bool IsThereErrorOrWarning() const
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     return ErrorFlags != 0
199*f6dc9357SAndroid Build Coastguard Worker         || WarningFlags != 0
200*f6dc9357SAndroid Build Coastguard Worker         || NeedTailWarning()
201*f6dc9357SAndroid Build Coastguard Worker         || UnexpecedEnd
202*f6dc9357SAndroid Build Coastguard Worker         || !ErrorMessage.IsEmpty()
203*f6dc9357SAndroid Build Coastguard Worker         || !WarningMessage.IsEmpty();
204*f6dc9357SAndroid Build Coastguard Worker   }
205*f6dc9357SAndroid Build Coastguard Worker 
AreThereErrorsCArcErrorInfo206*f6dc9357SAndroid Build Coastguard Worker   bool AreThereErrors() const { return ErrorFlags != 0 || UnexpecedEnd; }
AreThereWarningsCArcErrorInfo207*f6dc9357SAndroid Build Coastguard Worker   bool AreThereWarnings() const { return WarningFlags != 0 || NeedTailWarning(); }
208*f6dc9357SAndroid Build Coastguard Worker 
NeedTailWarningCArcErrorInfo209*f6dc9357SAndroid Build Coastguard Worker   bool NeedTailWarning() const { return !IgnoreTail && ThereIsTail; }
210*f6dc9357SAndroid Build Coastguard Worker 
GetWarningFlagsCArcErrorInfo211*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetWarningFlags() const
212*f6dc9357SAndroid Build Coastguard Worker   {
213*f6dc9357SAndroid Build Coastguard Worker     UInt32 a = WarningFlags;
214*f6dc9357SAndroid Build Coastguard Worker     if (NeedTailWarning() && (ErrorFlags & kpv_ErrorFlags_DataAfterEnd) == 0)
215*f6dc9357SAndroid Build Coastguard Worker       a |= kpv_ErrorFlags_DataAfterEnd;
216*f6dc9357SAndroid Build Coastguard Worker     return a;
217*f6dc9357SAndroid Build Coastguard Worker   }
218*f6dc9357SAndroid Build Coastguard Worker 
GetErrorFlagsCArcErrorInfo219*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetErrorFlags() const
220*f6dc9357SAndroid Build Coastguard Worker   {
221*f6dc9357SAndroid Build Coastguard Worker     UInt32 a = ErrorFlags;
222*f6dc9357SAndroid Build Coastguard Worker     if (UnexpecedEnd)
223*f6dc9357SAndroid Build Coastguard Worker       a |= kpv_ErrorFlags_UnexpectedEnd;
224*f6dc9357SAndroid Build Coastguard Worker     return a;
225*f6dc9357SAndroid Build Coastguard Worker   }
226*f6dc9357SAndroid Build Coastguard Worker };
227*f6dc9357SAndroid Build Coastguard Worker 
228*f6dc9357SAndroid Build Coastguard Worker struct CReadArcItem
229*f6dc9357SAndroid Build Coastguard Worker {
230*f6dc9357SAndroid Build Coastguard Worker   UString Path;            // Path from root (including alt stream name, if alt stream)
231*f6dc9357SAndroid Build Coastguard Worker   UStringVector PathParts; // without altStream name, path from root or from _baseParentFolder, if _use_baseParentFolder_mode
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker   #ifdef SUPPORT_ALT_STREAMS
234*f6dc9357SAndroid Build Coastguard Worker   UString MainPath;
235*f6dc9357SAndroid Build Coastguard Worker                 /* MainPath = Path for non-AltStream,
236*f6dc9357SAndroid Build Coastguard Worker                    MainPath = Path of parent, if there is parent for AltStream. */
237*f6dc9357SAndroid Build Coastguard Worker   UString AltStreamName;
238*f6dc9357SAndroid Build Coastguard Worker   bool IsAltStream;
239*f6dc9357SAndroid Build Coastguard Worker   bool WriteToAltStreamIfColon;
240*f6dc9357SAndroid Build Coastguard Worker   #endif
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   bool IsDir;
243*f6dc9357SAndroid Build Coastguard Worker   bool MainIsDir;
244*f6dc9357SAndroid Build Coastguard Worker   UInt32 ParentIndex; // use it, if IsAltStream
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
247*f6dc9357SAndroid Build Coastguard Worker   bool _use_baseParentFolder_mode;
248*f6dc9357SAndroid Build Coastguard Worker   int _baseParentFolder;
249*f6dc9357SAndroid Build Coastguard Worker   #endif
250*f6dc9357SAndroid Build Coastguard Worker 
CReadArcItemCReadArcItem251*f6dc9357SAndroid Build Coastguard Worker   CReadArcItem()
252*f6dc9357SAndroid Build Coastguard Worker   {
253*f6dc9357SAndroid Build Coastguard Worker     #ifdef SUPPORT_ALT_STREAMS
254*f6dc9357SAndroid Build Coastguard Worker     WriteToAltStreamIfColon = false;
255*f6dc9357SAndroid Build Coastguard Worker     #endif
256*f6dc9357SAndroid Build Coastguard Worker 
257*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
258*f6dc9357SAndroid Build Coastguard Worker     _use_baseParentFolder_mode = false;
259*f6dc9357SAndroid Build Coastguard Worker     _baseParentFolder = -1;
260*f6dc9357SAndroid Build Coastguard Worker     #endif
261*f6dc9357SAndroid Build Coastguard Worker   }
262*f6dc9357SAndroid Build Coastguard Worker };
263*f6dc9357SAndroid Build Coastguard Worker 
264*f6dc9357SAndroid Build Coastguard Worker 
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker 
267*f6dc9357SAndroid Build Coastguard Worker class CArc
268*f6dc9357SAndroid Build Coastguard Worker {
269*f6dc9357SAndroid Build Coastguard Worker   HRESULT PrepareToOpen(const COpenOptions &op, unsigned formatIndex, CMyComPtr<IInArchive> &archive);
270*f6dc9357SAndroid Build Coastguard Worker   HRESULT CheckZerosTail(const COpenOptions &op, UInt64 offset);
271*f6dc9357SAndroid Build Coastguard Worker   HRESULT OpenStream2(const COpenOptions &options);
272*f6dc9357SAndroid Build Coastguard Worker 
273*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
274*f6dc9357SAndroid Build Coastguard Worker   // parts.Back() can contain alt stream name "nams:AltName"
275*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_PathToParent(UInt32 index, UInt32 parent, UStringVector &parts) const;
276*f6dc9357SAndroid Build Coastguard Worker   #endif
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker public:
279*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInArchive> Archive;
280*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> InStream;
281*f6dc9357SAndroid Build Coastguard Worker           // we use InStream in 2 cases (ArcStreamOffset != 0):
282*f6dc9357SAndroid Build Coastguard Worker           // 1) if we use additional cache stream
283*f6dc9357SAndroid Build Coastguard Worker           // 2) we reopen sfx archive with CTailInStream
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveGetRawProps> GetRawProps;
286*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveGetRootProps> GetRootProps;
287*f6dc9357SAndroid Build Coastguard Worker 
288*f6dc9357SAndroid Build Coastguard Worker   bool IsParseArc;
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker   bool IsTree;
291*f6dc9357SAndroid Build Coastguard Worker   bool IsReadOnly;
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker   bool Ask_Deleted;
294*f6dc9357SAndroid Build Coastguard Worker   bool Ask_AltStream;
295*f6dc9357SAndroid Build Coastguard Worker   bool Ask_Aux;
296*f6dc9357SAndroid Build Coastguard Worker   bool Ask_INode;
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   bool IgnoreSplit; // don't try split handler
299*f6dc9357SAndroid Build Coastguard Worker 
300*f6dc9357SAndroid Build Coastguard Worker   UString Path;
301*f6dc9357SAndroid Build Coastguard Worker   UString filePath;
302*f6dc9357SAndroid Build Coastguard Worker   UString DefaultName;
303*f6dc9357SAndroid Build Coastguard Worker   int FormatIndex;     // -1 means Parser
304*f6dc9357SAndroid Build Coastguard Worker   UInt32 SubfileIndex; // (UInt32)(Int32)-1; means no subfile
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker   // CFiTime MTime;
307*f6dc9357SAndroid Build Coastguard Worker   // bool MTime_Defined;
308*f6dc9357SAndroid Build Coastguard Worker   CArcTime MTime;
309*f6dc9357SAndroid Build Coastguard Worker 
310*f6dc9357SAndroid Build Coastguard Worker   Int64 Offset; // it's offset of start of archive inside stream that is open by Archive Handler
311*f6dc9357SAndroid Build Coastguard Worker   UInt64 PhySize;
312*f6dc9357SAndroid Build Coastguard Worker   // UInt64 OkPhySize;
313*f6dc9357SAndroid Build Coastguard Worker   bool PhySize_Defined;
314*f6dc9357SAndroid Build Coastguard Worker   // bool OkPhySize_Defined;
315*f6dc9357SAndroid Build Coastguard Worker   UInt64 FileSize;
316*f6dc9357SAndroid Build Coastguard Worker   UInt64 AvailPhySize; // PhySize, but it's reduced if exceed end of file
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker   CArcErrorInfo ErrorInfo; // for OK archives
319*f6dc9357SAndroid Build Coastguard Worker   CArcErrorInfo NonOpen_ErrorInfo; // ErrorInfo for mainArchive (false OPEN)
320*f6dc9357SAndroid Build Coastguard Worker 
GetEstmatedPhySize()321*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetEstmatedPhySize() const { return PhySize_Defined ? PhySize : FileSize; }
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker   UInt64 ArcStreamOffset; // offset of stream that is open by Archive Handler
GetGlobalOffset()324*f6dc9357SAndroid Build Coastguard Worker   Int64 GetGlobalOffset() const { return (Int64)ArcStreamOffset + Offset; } // it's global offset of archive
325*f6dc9357SAndroid Build Coastguard Worker 
326*f6dc9357SAndroid Build Coastguard Worker   // AString ErrorFlagsText;
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker   // void Set_ErrorFlagsText();
329*f6dc9357SAndroid Build Coastguard Worker 
CArc()330*f6dc9357SAndroid Build Coastguard Worker   CArc():
331*f6dc9357SAndroid Build Coastguard Worker     // MTime_Defined(false),
332*f6dc9357SAndroid Build Coastguard Worker     IsTree(false),
333*f6dc9357SAndroid Build Coastguard Worker     IsReadOnly(false),
334*f6dc9357SAndroid Build Coastguard Worker     Ask_Deleted(false),
335*f6dc9357SAndroid Build Coastguard Worker     Ask_AltStream(false),
336*f6dc9357SAndroid Build Coastguard Worker     Ask_Aux(false),
337*f6dc9357SAndroid Build Coastguard Worker     Ask_INode(false),
338*f6dc9357SAndroid Build Coastguard Worker     IgnoreSplit(false)
339*f6dc9357SAndroid Build Coastguard Worker     {}
340*f6dc9357SAndroid Build Coastguard Worker 
341*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadBasicProps(IInArchive *archive, UInt64 startPos, HRESULT openRes);
342*f6dc9357SAndroid Build Coastguard Worker 
Close()343*f6dc9357SAndroid Build Coastguard Worker   HRESULT Close()
344*f6dc9357SAndroid Build Coastguard Worker   {
345*f6dc9357SAndroid Build Coastguard Worker     InStream.Release();
346*f6dc9357SAndroid Build Coastguard Worker     return Archive->Close();
347*f6dc9357SAndroid Build Coastguard Worker   }
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_Path(UInt32 index, UString &result) const;
350*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_DefaultPath(UInt32 index, UString &result) const;
351*f6dc9357SAndroid Build Coastguard Worker 
352*f6dc9357SAndroid Build Coastguard Worker   // GetItemPath2 adds [DELETED] dir prefix for deleted items.
353*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_Path2(UInt32 index, UString &result) const;
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem(UInt32 index, CReadArcItem &item) const;
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_Size(UInt32 index, UInt64 &size, bool &defined) const;
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   /* if (GetProperty() returns vt==VT_EMPTY), this function sets
360*f6dc9357SAndroid Build Coastguard Worker      timestamp from archive file timestamp (MTime).
361*f6dc9357SAndroid Build Coastguard Worker      So (at) will be set in most cases (at.Def == true)
362*f6dc9357SAndroid Build Coastguard Worker      if (at.Prec == 0)
363*f6dc9357SAndroid Build Coastguard Worker      {
364*f6dc9357SAndroid Build Coastguard Worker        it means that (Prec == 0) was returned for (kpidMTime),
365*f6dc9357SAndroid Build Coastguard Worker        and no value was returned for (kpidTimeType).
366*f6dc9357SAndroid Build Coastguard Worker        it can mean Windows precision or unknown precision.
367*f6dc9357SAndroid Build Coastguard Worker      }
368*f6dc9357SAndroid Build Coastguard Worker   */
369*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetItem_MTime(UInt32 index, CArcTime &at) const;
370*f6dc9357SAndroid Build Coastguard Worker 
IsItem_Anti(UInt32 index,bool & result)371*f6dc9357SAndroid Build Coastguard Worker   HRESULT IsItem_Anti(UInt32 index, bool &result) const
372*f6dc9357SAndroid Build Coastguard Worker     { return Archive_GetItemBoolProp(Archive, index, kpidIsAnti, result); }
373*f6dc9357SAndroid Build Coastguard Worker 
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker   HRESULT OpenStream(const COpenOptions &options);
376*f6dc9357SAndroid Build Coastguard Worker   HRESULT OpenStreamOrFile(COpenOptions &options);
377*f6dc9357SAndroid Build Coastguard Worker 
378*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReOpen(const COpenOptions &options, IArchiveOpenCallback *openCallback_Additional);
379*f6dc9357SAndroid Build Coastguard Worker 
380*f6dc9357SAndroid Build Coastguard Worker   HRESULT CreateNewTailStream(CMyComPtr<IInStream> &stream);
381*f6dc9357SAndroid Build Coastguard Worker 
IsHashHandler(const COpenOptions & options)382*f6dc9357SAndroid Build Coastguard Worker   bool IsHashHandler(const COpenOptions &options) const
383*f6dc9357SAndroid Build Coastguard Worker   {
384*f6dc9357SAndroid Build Coastguard Worker     if (FormatIndex < 0)
385*f6dc9357SAndroid Build Coastguard Worker       return false;
386*f6dc9357SAndroid Build Coastguard Worker     return options.codecs->Formats[(unsigned)FormatIndex].Flags_HashHandler();
387*f6dc9357SAndroid Build Coastguard Worker   }
388*f6dc9357SAndroid Build Coastguard Worker };
389*f6dc9357SAndroid Build Coastguard Worker 
390*f6dc9357SAndroid Build Coastguard Worker struct CArchiveLink
391*f6dc9357SAndroid Build Coastguard Worker {
392*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArc> Arcs;
393*f6dc9357SAndroid Build Coastguard Worker   UStringVector VolumePaths;
394*f6dc9357SAndroid Build Coastguard Worker   UInt64 VolumesSize;
395*f6dc9357SAndroid Build Coastguard Worker   bool IsOpen;
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker   bool PasswordWasAsked;
398*f6dc9357SAndroid Build Coastguard Worker   // UString Password;
399*f6dc9357SAndroid Build Coastguard Worker 
400*f6dc9357SAndroid Build Coastguard Worker   // int NonOpenErrorFormatIndex; // - 1 means no Error.
401*f6dc9357SAndroid Build Coastguard Worker   UString NonOpen_ArcPath;
402*f6dc9357SAndroid Build Coastguard Worker 
403*f6dc9357SAndroid Build Coastguard Worker   CArcErrorInfo NonOpen_ErrorInfo;
404*f6dc9357SAndroid Build Coastguard Worker 
405*f6dc9357SAndroid Build Coastguard Worker   // UString ErrorsText;
406*f6dc9357SAndroid Build Coastguard Worker   // void Set_ErrorsText();
407*f6dc9357SAndroid Build Coastguard Worker 
CArchiveLinkCArchiveLink408*f6dc9357SAndroid Build Coastguard Worker   CArchiveLink():
409*f6dc9357SAndroid Build Coastguard Worker       VolumesSize(0),
410*f6dc9357SAndroid Build Coastguard Worker       IsOpen(false),
411*f6dc9357SAndroid Build Coastguard Worker       PasswordWasAsked(false)
412*f6dc9357SAndroid Build Coastguard Worker       {}
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker   void KeepModeForNextOpen();
415*f6dc9357SAndroid Build Coastguard Worker   HRESULT Close();
416*f6dc9357SAndroid Build Coastguard Worker   void Release();
~CArchiveLinkCArchiveLink417*f6dc9357SAndroid Build Coastguard Worker   ~CArchiveLink() { Release(); }
418*f6dc9357SAndroid Build Coastguard Worker 
GetArcCArchiveLink419*f6dc9357SAndroid Build Coastguard Worker   const CArc *GetArc() const { return &Arcs.Back(); }
GetArchiveCArchiveLink420*f6dc9357SAndroid Build Coastguard Worker   IInArchive *GetArchive() const { return Arcs.Back().Archive; }
GetArchiveGetRawPropsCArchiveLink421*f6dc9357SAndroid Build Coastguard Worker   IArchiveGetRawProps *GetArchiveGetRawProps() const { return Arcs.Back().GetRawProps; }
GetArchiveGetRootPropsCArchiveLink422*f6dc9357SAndroid Build Coastguard Worker   IArchiveGetRootProps *GetArchiveGetRootProps() const { return Arcs.Back().GetRootProps; }
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker   /*
425*f6dc9357SAndroid Build Coastguard Worker   Open() opens archive and COpenOptions::callback
426*f6dc9357SAndroid Build Coastguard Worker   Open2() uses COpenCallbackImp that implements Volumes and password callback
427*f6dc9357SAndroid Build Coastguard Worker   Open3() calls Open2() and callbackUI->Open_Finished();
428*f6dc9357SAndroid Build Coastguard Worker   Open_Strict() returns S_FALSE also in case, if there is non-open expected nested archive.
429*f6dc9357SAndroid Build Coastguard Worker   */
430*f6dc9357SAndroid Build Coastguard Worker 
431*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open(COpenOptions &options);
432*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open2(COpenOptions &options, IOpenCallbackUI *callbackUI);
433*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open3(COpenOptions &options, IOpenCallbackUI *callbackUI);
434*f6dc9357SAndroid Build Coastguard Worker 
Open_StrictCArchiveLink435*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open_Strict(COpenOptions &options, IOpenCallbackUI *callbackUI)
436*f6dc9357SAndroid Build Coastguard Worker   {
437*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = Open3(options, callbackUI);
438*f6dc9357SAndroid Build Coastguard Worker     if (result == S_OK && NonOpen_ErrorInfo.ErrorFormatIndex >= 0)
439*f6dc9357SAndroid Build Coastguard Worker       result = S_FALSE;
440*f6dc9357SAndroid Build Coastguard Worker     return result;
441*f6dc9357SAndroid Build Coastguard Worker   }
442*f6dc9357SAndroid Build Coastguard Worker 
443*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReOpen(COpenOptions &options);
444*f6dc9357SAndroid Build Coastguard Worker };
445*f6dc9357SAndroid Build Coastguard Worker 
446*f6dc9357SAndroid Build Coastguard Worker bool ParseOpenTypes(CCodecs &codecs, const UString &s, CObjectVector<COpenType> &types);
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker // bool IsHashType(const CObjectVector<COpenType> &types);
449*f6dc9357SAndroid Build Coastguard Worker 
450*f6dc9357SAndroid Build Coastguard Worker 
451*f6dc9357SAndroid Build Coastguard Worker struct CDirPathSortPair
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker   unsigned Len;
454*f6dc9357SAndroid Build Coastguard Worker   unsigned Index;
455*f6dc9357SAndroid Build Coastguard Worker 
456*f6dc9357SAndroid Build Coastguard Worker   void SetNumSlashes(const FChar *s);
457*f6dc9357SAndroid Build Coastguard Worker 
CompareCDirPathSortPair458*f6dc9357SAndroid Build Coastguard Worker   int Compare(const CDirPathSortPair &a) const
459*f6dc9357SAndroid Build Coastguard Worker   {
460*f6dc9357SAndroid Build Coastguard Worker     // We need sorting order where parent items will be after child items
461*f6dc9357SAndroid Build Coastguard Worker     if (Len < a.Len) return 1;
462*f6dc9357SAndroid Build Coastguard Worker     if (Len > a.Len) return -1;
463*f6dc9357SAndroid Build Coastguard Worker     if (Index < a.Index) return -1;
464*f6dc9357SAndroid Build Coastguard Worker     if (Index > a.Index) return 1;
465*f6dc9357SAndroid Build Coastguard Worker     return 0;
466*f6dc9357SAndroid Build Coastguard Worker   }
467*f6dc9357SAndroid Build Coastguard Worker };
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker #endif
470