xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/IArchive.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // IArchive.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_IARCHIVE_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_IARCHIVE_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../IProgress.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../IStream.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../PropID.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACE_CONSTR_ARCHIVE_SUB(i, base, n) \
14*f6dc9357SAndroid Build Coastguard Worker   Z7_DECL_IFACE_7ZIP_SUB(i, base, 6, n) \
15*f6dc9357SAndroid Build Coastguard Worker   { Z7_IFACE_COM7_PURE(i) };
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACE_CONSTR_ARCHIVE(i, n) \
18*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_CONSTR_ARCHIVE_SUB(i, IUnknown, n)
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker /*
21*f6dc9357SAndroid Build Coastguard Worker How the function in 7-Zip returns object for output parameter via pointer
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker 1) The caller sets the value of variable before function call:
24*f6dc9357SAndroid Build Coastguard Worker   PROPVARIANT  :  vt = VT_EMPTY
25*f6dc9357SAndroid Build Coastguard Worker   BSTR         :  NULL
26*f6dc9357SAndroid Build Coastguard Worker   IUnknown* and derived interfaces  :  NULL
27*f6dc9357SAndroid Build Coastguard Worker   another scalar types  :  any non-initialized value is allowed
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker 2) The callee in current 7-Zip code now can free input object for output parameter:
30*f6dc9357SAndroid Build Coastguard Worker   PROPVARIANT   : the callee calls VariantClear(propvaiant_ptr) for input
31*f6dc9357SAndroid Build Coastguard Worker                   value stored in variable
32*f6dc9357SAndroid Build Coastguard Worker   another types : the callee ignores stored value.
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker 3) The callee writes new value to variable for output parameter and
35*f6dc9357SAndroid Build Coastguard Worker   returns execution to caller.
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker 4) The caller must free or release object returned by the callee:
38*f6dc9357SAndroid Build Coastguard Worker   PROPVARIANT   : VariantClear(&propvaiant)
39*f6dc9357SAndroid Build Coastguard Worker   BSTR          : SysFreeString(bstr)
40*f6dc9357SAndroid Build Coastguard Worker   IUnknown* and derived interfaces  :  if (ptr) ptr->Relase()
41*f6dc9357SAndroid Build Coastguard Worker */
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker 
44*f6dc9357SAndroid Build Coastguard Worker namespace NFileTimeType
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   enum EEnum
47*f6dc9357SAndroid Build Coastguard Worker   {
48*f6dc9357SAndroid Build Coastguard Worker     kNotDefined = -1,
49*f6dc9357SAndroid Build Coastguard Worker     kWindows = 0,
50*f6dc9357SAndroid Build Coastguard Worker     kUnix,
51*f6dc9357SAndroid Build Coastguard Worker     kDOS,
52*f6dc9357SAndroid Build Coastguard Worker     k1ns
53*f6dc9357SAndroid Build Coastguard Worker   };
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker namespace NArcInfoFlags
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kKeepName        = 1 << 0;  // keep name of file in archive name
59*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kAltStreams      = 1 << 1;  // the handler supports alt streams
60*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kNtSecure        = 1 << 2;  // the handler supports NT security
61*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kFindSignature   = 1 << 3;  // the handler can find start of archive
62*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMultiSignature  = 1 << 4;  // there are several signatures
63*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kUseGlobalOffset = 1 << 5;  // the seek position of stream must be set as global offset
64*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kStartOpen       = 1 << 6;  // call handler for each start position
65*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kPureStartOpen   = 1 << 7;  // call handler only for start of file
66*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kBackwardOpen    = 1 << 8;  // archive can be open backward
67*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kPreArc          = 1 << 9;  // such archive can be stored before real archive (like SFX stub)
68*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kSymLinks        = 1 << 10; // the handler supports symbolic links
69*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kHardLinks       = 1 << 11; // the handler supports hard links
70*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kByExtOnlyOpen   = 1 << 12; // call handler only if file extension matches
71*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kHashHandler     = 1 << 13; // the handler contains the hashes (checksums)
72*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kCTime           = 1 << 14;
73*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kCTime_Default   = 1 << 15;
74*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kATime           = 1 << 16;
75*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kATime_Default   = 1 << 17;
76*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMTime           = 1 << 18;
77*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMTime_Default   = 1 << 19;
78*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 kTTime_Reserved         = 1 << 20;
79*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 kTTime_Reserved_Default = 1 << 21;
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker namespace NArcInfoTimeFlags
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker   const unsigned kTime_Prec_Mask_bit_index = 0;
85*f6dc9357SAndroid Build Coastguard Worker   const unsigned kTime_Prec_Mask_num_bits = 26;
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker   const unsigned kTime_Prec_Default_bit_index = 27;
88*f6dc9357SAndroid Build Coastguard Worker   const unsigned kTime_Prec_Default_num_bits = 5;
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker #define TIME_PREC_TO_ARC_FLAGS_MASK(v) \
92*f6dc9357SAndroid Build Coastguard Worker   ((UInt32)1 << (NArcInfoTimeFlags::kTime_Prec_Mask_bit_index + (v)))
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker #define TIME_PREC_TO_ARC_FLAGS_TIME_DEFAULT(v) \
95*f6dc9357SAndroid Build Coastguard Worker   ((UInt32)(v) << NArcInfoTimeFlags::kTime_Prec_Default_bit_index)
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker namespace NArchive
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker   namespace NHandlerPropID
100*f6dc9357SAndroid Build Coastguard Worker   {
101*f6dc9357SAndroid Build Coastguard Worker     enum
102*f6dc9357SAndroid Build Coastguard Worker     {
103*f6dc9357SAndroid Build Coastguard Worker       kName = 0,        // VT_BSTR
104*f6dc9357SAndroid Build Coastguard Worker       kClassID,         // binary GUID in VT_BSTR
105*f6dc9357SAndroid Build Coastguard Worker       kExtension,       // VT_BSTR
106*f6dc9357SAndroid Build Coastguard Worker       kAddExtension,    // VT_BSTR
107*f6dc9357SAndroid Build Coastguard Worker       kUpdate,          // VT_BOOL
108*f6dc9357SAndroid Build Coastguard Worker       kKeepName,        // VT_BOOL
109*f6dc9357SAndroid Build Coastguard Worker       kSignature,       // binary in VT_BSTR
110*f6dc9357SAndroid Build Coastguard Worker       kMultiSignature,  // binary in VT_BSTR
111*f6dc9357SAndroid Build Coastguard Worker       kSignatureOffset, // VT_UI4
112*f6dc9357SAndroid Build Coastguard Worker       kAltStreams,      // VT_BOOL
113*f6dc9357SAndroid Build Coastguard Worker       kNtSecure,        // VT_BOOL
114*f6dc9357SAndroid Build Coastguard Worker       kFlags,           // VT_UI4
115*f6dc9357SAndroid Build Coastguard Worker       kTimeFlags        // VT_UI4
116*f6dc9357SAndroid Build Coastguard Worker     };
117*f6dc9357SAndroid Build Coastguard Worker   }
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   namespace NExtract
120*f6dc9357SAndroid Build Coastguard Worker   {
121*f6dc9357SAndroid Build Coastguard Worker     namespace NAskMode
122*f6dc9357SAndroid Build Coastguard Worker     {
123*f6dc9357SAndroid Build Coastguard Worker       enum
124*f6dc9357SAndroid Build Coastguard Worker       {
125*f6dc9357SAndroid Build Coastguard Worker         kExtract = 0,
126*f6dc9357SAndroid Build Coastguard Worker         kTest,
127*f6dc9357SAndroid Build Coastguard Worker         kSkip,
128*f6dc9357SAndroid Build Coastguard Worker         kReadExternal
129*f6dc9357SAndroid Build Coastguard Worker       };
130*f6dc9357SAndroid Build Coastguard Worker     }
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker     namespace NOperationResult
133*f6dc9357SAndroid Build Coastguard Worker     {
134*f6dc9357SAndroid Build Coastguard Worker       enum
135*f6dc9357SAndroid Build Coastguard Worker       {
136*f6dc9357SAndroid Build Coastguard Worker         kOK = 0,
137*f6dc9357SAndroid Build Coastguard Worker         kUnsupportedMethod,
138*f6dc9357SAndroid Build Coastguard Worker         kDataError,
139*f6dc9357SAndroid Build Coastguard Worker         kCRCError,
140*f6dc9357SAndroid Build Coastguard Worker         kUnavailable,
141*f6dc9357SAndroid Build Coastguard Worker         kUnexpectedEnd,
142*f6dc9357SAndroid Build Coastguard Worker         kDataAfterEnd,
143*f6dc9357SAndroid Build Coastguard Worker         kIsNotArc,
144*f6dc9357SAndroid Build Coastguard Worker         kHeadersError,
145*f6dc9357SAndroid Build Coastguard Worker         kWrongPassword
146*f6dc9357SAndroid Build Coastguard Worker         // , kMemError
147*f6dc9357SAndroid Build Coastguard Worker       };
148*f6dc9357SAndroid Build Coastguard Worker     }
149*f6dc9357SAndroid Build Coastguard Worker   }
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker   namespace NEventIndexType
152*f6dc9357SAndroid Build Coastguard Worker   {
153*f6dc9357SAndroid Build Coastguard Worker     enum
154*f6dc9357SAndroid Build Coastguard Worker     {
155*f6dc9357SAndroid Build Coastguard Worker       kNoIndex = 0,
156*f6dc9357SAndroid Build Coastguard Worker       kInArcIndex,
157*f6dc9357SAndroid Build Coastguard Worker       kBlockIndex,
158*f6dc9357SAndroid Build Coastguard Worker       kOutArcIndex
159*f6dc9357SAndroid Build Coastguard Worker       // kArcProp
160*f6dc9357SAndroid Build Coastguard Worker     };
161*f6dc9357SAndroid Build Coastguard Worker   }
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker   namespace NUpdate
164*f6dc9357SAndroid Build Coastguard Worker   {
165*f6dc9357SAndroid Build Coastguard Worker     namespace NOperationResult
166*f6dc9357SAndroid Build Coastguard Worker     {
167*f6dc9357SAndroid Build Coastguard Worker       enum
168*f6dc9357SAndroid Build Coastguard Worker       {
169*f6dc9357SAndroid Build Coastguard Worker         kOK = 0
170*f6dc9357SAndroid Build Coastguard Worker         // kError = 1,
171*f6dc9357SAndroid Build Coastguard Worker         // kError_FileChanged
172*f6dc9357SAndroid Build Coastguard Worker       };
173*f6dc9357SAndroid Build Coastguard Worker     }
174*f6dc9357SAndroid Build Coastguard Worker   }
175*f6dc9357SAndroid Build Coastguard Worker }
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveOpenCallback(x) \
178*f6dc9357SAndroid Build Coastguard Worker   x(SetTotal(const UInt64 *files, const UInt64 *bytes)) \
179*f6dc9357SAndroid Build Coastguard Worker   x(SetCompleted(const UInt64 *files, const UInt64 *bytes)) \
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveOpenCallback, 0x10)
182*f6dc9357SAndroid Build Coastguard Worker 
183*f6dc9357SAndroid Build Coastguard Worker /*
184*f6dc9357SAndroid Build Coastguard Worker IArchiveExtractCallback::
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker 7-Zip doesn't call IArchiveExtractCallback functions
187*f6dc9357SAndroid Build Coastguard Worker   GetStream()
188*f6dc9357SAndroid Build Coastguard Worker   PrepareOperation()
189*f6dc9357SAndroid Build Coastguard Worker   SetOperationResult()
190*f6dc9357SAndroid Build Coastguard Worker from different threads simultaneously.
191*f6dc9357SAndroid Build Coastguard Worker But 7-Zip can call functions for IProgress or ICompressProgressInfo functions
192*f6dc9357SAndroid Build Coastguard Worker from another threads simultaneously with calls for IArchiveExtractCallback interface.
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker IArchiveExtractCallback::GetStream()
195*f6dc9357SAndroid Build Coastguard Worker   UInt32 index - index of item in Archive
196*f6dc9357SAndroid Build Coastguard Worker   Int32 askExtractMode  (Extract::NAskMode)
197*f6dc9357SAndroid Build Coastguard Worker     if (askMode != NExtract::NAskMode::kExtract)
198*f6dc9357SAndroid Build Coastguard Worker     {
199*f6dc9357SAndroid Build Coastguard Worker       then the callee doesn't write data to stream: (*outStream == NULL)
200*f6dc9357SAndroid Build Coastguard Worker     }
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker   Out:
203*f6dc9357SAndroid Build Coastguard Worker       (*outStream == NULL) - for directories
204*f6dc9357SAndroid Build Coastguard Worker       (*outStream == NULL) - if link (hard link or symbolic link) was created
205*f6dc9357SAndroid Build Coastguard Worker       if (*outStream == NULL && askMode == NExtract::NAskMode::kExtract)
206*f6dc9357SAndroid Build Coastguard Worker       {
207*f6dc9357SAndroid Build Coastguard Worker         then the caller must skip extracting of that file.
208*f6dc9357SAndroid Build Coastguard Worker       }
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker   returns:
211*f6dc9357SAndroid Build Coastguard Worker     S_OK     : OK
212*f6dc9357SAndroid Build Coastguard Worker     S_FALSE  : data error (for decoders)
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker if (IProgress::SetTotal() was called)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker   IProgress::SetCompleted(completeValue) uses
217*f6dc9357SAndroid Build Coastguard Worker     packSize   - for some stream formats (xz, gz, bz2, lzma, z, ppmd).
218*f6dc9357SAndroid Build Coastguard Worker     unpackSize - for another formats.
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker else
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker   IProgress::SetCompleted(completeValue) uses packSize.
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker SetOperationResult()
226*f6dc9357SAndroid Build Coastguard Worker   7-Zip calls SetOperationResult at the end of extracting,
227*f6dc9357SAndroid Build Coastguard Worker   so the callee can close the file, set attributes, timestamps and security information.
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker   Int32 opRes (NExtract::NOperationResult)
230*f6dc9357SAndroid Build Coastguard Worker */
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker // INTERFACE_IProgress(x)
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveExtractCallback(x) \
235*f6dc9357SAndroid Build Coastguard Worker   x(GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode)) \
236*f6dc9357SAndroid Build Coastguard Worker   x(PrepareOperation(Int32 askExtractMode)) \
237*f6dc9357SAndroid Build Coastguard Worker   x(SetOperationResult(Int32 opRes)) \
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE_SUB(IArchiveExtractCallback, IProgress, 0x20)
240*f6dc9357SAndroid Build Coastguard Worker 
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker /*
244*f6dc9357SAndroid Build Coastguard Worker v23:
245*f6dc9357SAndroid Build Coastguard Worker IArchiveExtractCallbackMessage2 can be requested from IArchiveExtractCallback object
246*f6dc9357SAndroid Build Coastguard Worker   by Extract() or UpdateItems() functions to report about extracting errors
247*f6dc9357SAndroid Build Coastguard Worker ReportExtractResult()
248*f6dc9357SAndroid Build Coastguard Worker   UInt32 indexType (NEventIndexType)
249*f6dc9357SAndroid Build Coastguard Worker   UInt32 index
250*f6dc9357SAndroid Build Coastguard Worker   Int32 opRes (NExtract::NOperationResult)
251*f6dc9357SAndroid Build Coastguard Worker */
252*f6dc9357SAndroid Build Coastguard Worker /*
253*f6dc9357SAndroid Build Coastguard Worker before v23:
254*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveExtractCallbackMessage(x) \
255*f6dc9357SAndroid Build Coastguard Worker   x(ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes))
256*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE_SUB(IArchiveExtractCallbackMessage, IProgress, 0x21)
257*f6dc9357SAndroid Build Coastguard Worker */
258*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveExtractCallbackMessage2(x) \
259*f6dc9357SAndroid Build Coastguard Worker   x(ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes))
260*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveExtractCallbackMessage2, 0x22)
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveOpenVolumeCallback(x) \
263*f6dc9357SAndroid Build Coastguard Worker   x(GetProperty(PROPID propID, PROPVARIANT *value)) \
264*f6dc9357SAndroid Build Coastguard Worker   x(GetStream(const wchar_t *name, IInStream **inStream))
265*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveOpenVolumeCallback, 0x30)
266*f6dc9357SAndroid Build Coastguard Worker 
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IInArchiveGetStream(x) \
269*f6dc9357SAndroid Build Coastguard Worker   x(GetStream(UInt32 index, ISequentialInStream **stream))
270*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IInArchiveGetStream, 0x40)
271*f6dc9357SAndroid Build Coastguard Worker 
272*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveOpenSetSubArchiveName(x) \
273*f6dc9357SAndroid Build Coastguard Worker   x(SetSubArchiveName(const wchar_t *name))
274*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveOpenSetSubArchiveName, 0x50)
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker /*
278*f6dc9357SAndroid Build Coastguard Worker IInArchive::Open
279*f6dc9357SAndroid Build Coastguard Worker     stream
280*f6dc9357SAndroid Build Coastguard Worker       if (kUseGlobalOffset), stream current position can be non 0.
281*f6dc9357SAndroid Build Coastguard Worker       if (!kUseGlobalOffset), stream current position is 0.
282*f6dc9357SAndroid Build Coastguard Worker     if (maxCheckStartPosition == NULL), the handler can try to search archive start in stream
283*f6dc9357SAndroid Build Coastguard Worker     if (*maxCheckStartPosition == 0), the handler must check only current position as archive start
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker IInArchive::Extract:
286*f6dc9357SAndroid Build Coastguard Worker   indices must be sorted
287*f6dc9357SAndroid Build Coastguard Worker   numItems = (UInt32)(Int32)-1 = 0xFFFFFFFF means "all files"
288*f6dc9357SAndroid Build Coastguard Worker   testMode != 0 means "test files without writing to outStream"
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker IInArchive::GetArchiveProperty:
291*f6dc9357SAndroid Build Coastguard Worker   kpidOffset  - start offset of archive.
292*f6dc9357SAndroid Build Coastguard Worker       VT_EMPTY : means offset = 0.
293*f6dc9357SAndroid Build Coastguard Worker       VT_UI4, VT_UI8, VT_I8 : result offset; negative values is allowed
294*f6dc9357SAndroid Build Coastguard Worker   kpidPhySize - size of archive. VT_EMPTY means unknown size.
295*f6dc9357SAndroid Build Coastguard Worker     kpidPhySize is allowed to be larger than file size. In that case it must show
296*f6dc9357SAndroid Build Coastguard Worker     supposed size.
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   kpidIsDeleted:
299*f6dc9357SAndroid Build Coastguard Worker   kpidIsAltStream:
300*f6dc9357SAndroid Build Coastguard Worker   kpidIsAux:
301*f6dc9357SAndroid Build Coastguard Worker   kpidINode:
302*f6dc9357SAndroid Build Coastguard Worker     must return VARIANT_TRUE (VT_BOOL), if archive can support that property in GetProperty.
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker Notes:
306*f6dc9357SAndroid Build Coastguard Worker   Don't call IInArchive functions for same IInArchive object from different threads simultaneously.
307*f6dc9357SAndroid Build Coastguard Worker   Some IInArchive handlers will work incorrectly in that case.
308*f6dc9357SAndroid Build Coastguard Worker */
309*f6dc9357SAndroid Build Coastguard Worker 
310*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__)
311*f6dc9357SAndroid Build Coastguard Worker   #define MY_NO_THROW_DECL_ONLY  Z7_COM7F_E
312*f6dc9357SAndroid Build Coastguard Worker #else
313*f6dc9357SAndroid Build Coastguard Worker   #define MY_NO_THROW_DECL_ONLY
314*f6dc9357SAndroid Build Coastguard Worker #endif
315*f6dc9357SAndroid Build Coastguard Worker 
316*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IInArchive(x) \
317*f6dc9357SAndroid Build Coastguard Worker   x(Open(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback)) \
318*f6dc9357SAndroid Build Coastguard Worker   x(Close()) \
319*f6dc9357SAndroid Build Coastguard Worker   x(GetNumberOfItems(UInt32 *numItems)) \
320*f6dc9357SAndroid Build Coastguard Worker   x(GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \
321*f6dc9357SAndroid Build Coastguard Worker   x(Extract(const UInt32 *indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback)) \
322*f6dc9357SAndroid Build Coastguard Worker   x(GetArchiveProperty(PROPID propID, PROPVARIANT *value)) \
323*f6dc9357SAndroid Build Coastguard Worker   x(GetNumberOfProperties(UInt32 *numProps)) \
324*f6dc9357SAndroid Build Coastguard Worker   x(GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
325*f6dc9357SAndroid Build Coastguard Worker   x(GetNumberOfArchiveProperties(UInt32 *numProps)) \
326*f6dc9357SAndroid Build Coastguard Worker   x(GetArchivePropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IInArchive, 0x60)
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker namespace NParentType
331*f6dc9357SAndroid Build Coastguard Worker {
332*f6dc9357SAndroid Build Coastguard Worker   enum
333*f6dc9357SAndroid Build Coastguard Worker   {
334*f6dc9357SAndroid Build Coastguard Worker     kDir = 0,
335*f6dc9357SAndroid Build Coastguard Worker     kAltStream
336*f6dc9357SAndroid Build Coastguard Worker   };
337*f6dc9357SAndroid Build Coastguard Worker }
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker namespace NPropDataType
340*f6dc9357SAndroid Build Coastguard Worker {
341*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMask_ZeroEnd   = 1 << 4;
342*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 kMask_BigEndian = 1 << 5;
343*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMask_Utf       = 1 << 6;
344*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMask_Utf8  = kMask_Utf | 0;
345*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kMask_Utf16 = kMask_Utf | 1;
346*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 kMask_Utf32 = kMask_Utf | 2;
347*f6dc9357SAndroid Build Coastguard Worker 
348*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kNotDefined = 0;
349*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kRaw = 1;
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kUtf8z  = kMask_Utf8  | kMask_ZeroEnd;
352*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kUtf16z = kMask_Utf16 | kMask_ZeroEnd;
353*f6dc9357SAndroid Build Coastguard Worker }
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker // UTF string (pointer to wchar_t) with zero end and little-endian.
356*f6dc9357SAndroid Build Coastguard Worker #define PROP_DATA_TYPE_wchar_t_PTR_Z_LE ((NPropDataType::kMask_Utf | NPropDataType::kMask_ZeroEnd) + (sizeof(wchar_t) >> 1))
357*f6dc9357SAndroid Build Coastguard Worker 
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker /*
360*f6dc9357SAndroid Build Coastguard Worker GetRawProp:
361*f6dc9357SAndroid Build Coastguard Worker   Result:
362*f6dc9357SAndroid Build Coastguard Worker     S_OK - even if property is not set
363*f6dc9357SAndroid Build Coastguard Worker */
364*f6dc9357SAndroid Build Coastguard Worker 
365*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveGetRawProps(x) \
366*f6dc9357SAndroid Build Coastguard Worker   x(GetParent(UInt32 index, UInt32 *parent, UInt32 *parentType)) \
367*f6dc9357SAndroid Build Coastguard Worker   x(GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)) \
368*f6dc9357SAndroid Build Coastguard Worker   x(GetNumRawProps(UInt32 *numProps)) \
369*f6dc9357SAndroid Build Coastguard Worker   x(GetRawPropInfo(UInt32 index, BSTR *name, PROPID *propID))
370*f6dc9357SAndroid Build Coastguard Worker 
371*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveGetRawProps, 0x70)
372*f6dc9357SAndroid Build Coastguard Worker 
373*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveGetRootProps(x) \
374*f6dc9357SAndroid Build Coastguard Worker   x(GetRootProp(PROPID propID, PROPVARIANT *value)) \
375*f6dc9357SAndroid Build Coastguard Worker   x(GetRootRawProp(PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)) \
376*f6dc9357SAndroid Build Coastguard Worker 
377*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveGetRootProps, 0x71)
378*f6dc9357SAndroid Build Coastguard Worker 
379*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveOpenSeq(x) \
380*f6dc9357SAndroid Build Coastguard Worker   x(OpenSeq(ISequentialInStream *stream)) \
381*f6dc9357SAndroid Build Coastguard Worker 
382*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveOpenSeq, 0x61)
383*f6dc9357SAndroid Build Coastguard Worker 
384*f6dc9357SAndroid Build Coastguard Worker /*
385*f6dc9357SAndroid Build Coastguard Worker   OpenForSize
386*f6dc9357SAndroid Build Coastguard Worker   Result:
387*f6dc9357SAndroid Build Coastguard Worker     S_FALSE - is not archive
388*f6dc9357SAndroid Build Coastguard Worker     ? - DATA error
389*f6dc9357SAndroid Build Coastguard Worker */
390*f6dc9357SAndroid Build Coastguard Worker 
391*f6dc9357SAndroid Build Coastguard Worker /*
392*f6dc9357SAndroid Build Coastguard Worker const UInt32 kOpenFlags_RealPhySize = 1 << 0;
393*f6dc9357SAndroid Build Coastguard Worker const UInt32 kOpenFlags_NoSeek = 1 << 1;
394*f6dc9357SAndroid Build Coastguard Worker // const UInt32 kOpenFlags_BeforeExtract = 1 << 2;
395*f6dc9357SAndroid Build Coastguard Worker */
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker /*
398*f6dc9357SAndroid Build Coastguard Worker Flags:
399*f6dc9357SAndroid Build Coastguard Worker    0 - opens archive with IInStream, if IInStream interface is supported
400*f6dc9357SAndroid Build Coastguard Worker      - if phySize is not available, it doesn't try to make full parse to get phySize
401*f6dc9357SAndroid Build Coastguard Worker    kOpenFlags_NoSeek -  ArcOpen2 function doesn't use IInStream interface, even if it's available
402*f6dc9357SAndroid Build Coastguard Worker    kOpenFlags_RealPhySize - the handler will try to get PhySize, even if it requires full decompression for file
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   if handler is not allowed to use IInStream and the flag kOpenFlags_RealPhySize is not specified,
405*f6dc9357SAndroid Build Coastguard Worker   the handler can return S_OK, but it doesn't check even Signature.
406*f6dc9357SAndroid Build Coastguard Worker   So next Extract can be called for that sequential stream.
407*f6dc9357SAndroid Build Coastguard Worker */
408*f6dc9357SAndroid Build Coastguard Worker /*
409*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveOpen2(x) \
410*f6dc9357SAndroid Build Coastguard Worker   x(ArcOpen2(ISequentialInStream *stream, UInt32 flags, IArchiveOpenCallback *openCallback))
411*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveOpen2, 0x62)
412*f6dc9357SAndroid Build Coastguard Worker */
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker // ---------- UPDATE ----------
415*f6dc9357SAndroid Build Coastguard Worker 
416*f6dc9357SAndroid Build Coastguard Worker /*
417*f6dc9357SAndroid Build Coastguard Worker GetUpdateItemInfo outs:
418*f6dc9357SAndroid Build Coastguard Worker *newData  *newProps
419*f6dc9357SAndroid Build Coastguard Worker    0        0      - Copy data and properties from archive
420*f6dc9357SAndroid Build Coastguard Worker    0        1      - Copy data from archive, request new properties
421*f6dc9357SAndroid Build Coastguard Worker    1        0      - that combination is unused now
422*f6dc9357SAndroid Build Coastguard Worker    1        1      - Request new data and new properties. It can be used even for folders
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker   indexInArchive = -1 if there is no item in archive, or if it doesn't matter.
425*f6dc9357SAndroid Build Coastguard Worker 
426*f6dc9357SAndroid Build Coastguard Worker 
427*f6dc9357SAndroid Build Coastguard Worker GetStream out:
428*f6dc9357SAndroid Build Coastguard Worker   Result:
429*f6dc9357SAndroid Build Coastguard Worker     S_OK:
430*f6dc9357SAndroid Build Coastguard Worker       (*inStream == NULL) - only for directories
431*f6dc9357SAndroid Build Coastguard Worker                           - the bug was fixed in 9.33: (*Stream == NULL) was in case of anti-file
432*f6dc9357SAndroid Build Coastguard Worker       (*inStream != NULL) - for any file, even for empty file or anti-file
433*f6dc9357SAndroid Build Coastguard Worker     S_FALSE - skip that file (don't add item to archive) - (client code can't open stream of that file by some reason)
434*f6dc9357SAndroid Build Coastguard Worker       (*inStream == NULL)
435*f6dc9357SAndroid Build Coastguard Worker 
436*f6dc9357SAndroid Build Coastguard Worker The order of calling for hard links:
437*f6dc9357SAndroid Build Coastguard Worker   - GetStream()
438*f6dc9357SAndroid Build Coastguard Worker   - GetProperty(kpidHardLink)
439*f6dc9357SAndroid Build Coastguard Worker 
440*f6dc9357SAndroid Build Coastguard Worker SetOperationResult()
441*f6dc9357SAndroid Build Coastguard Worker   Int32 opRes (NExtract::NOperationResult::kOK)
442*f6dc9357SAndroid Build Coastguard Worker */
443*f6dc9357SAndroid Build Coastguard Worker 
444*f6dc9357SAndroid Build Coastguard Worker // INTERFACE_IProgress(x)
445*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveUpdateCallback(x) \
446*f6dc9357SAndroid Build Coastguard Worker   x(GetUpdateItemInfo(UInt32 index, Int32 *newData, Int32 *newProps, UInt32 *indexInArchive)) \
447*f6dc9357SAndroid Build Coastguard Worker   x(GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \
448*f6dc9357SAndroid Build Coastguard Worker   x(GetStream(UInt32 index, ISequentialInStream **inStream)) \
449*f6dc9357SAndroid Build Coastguard Worker   x(SetOperationResult(Int32 operationResult)) \
450*f6dc9357SAndroid Build Coastguard Worker 
451*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE_SUB(IArchiveUpdateCallback, IProgress, 0x80)
452*f6dc9357SAndroid Build Coastguard Worker 
453*f6dc9357SAndroid Build Coastguard Worker // INTERFACE_IArchiveUpdateCallback(x)
454*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveUpdateCallback2(x) \
455*f6dc9357SAndroid Build Coastguard Worker   x(GetVolumeSize(UInt32 index, UInt64 *size)) \
456*f6dc9357SAndroid Build Coastguard Worker   x(GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)) \
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)
459*f6dc9357SAndroid Build Coastguard Worker 
460*f6dc9357SAndroid Build Coastguard Worker namespace NUpdateNotifyOp
461*f6dc9357SAndroid Build Coastguard Worker {
462*f6dc9357SAndroid Build Coastguard Worker   enum
463*f6dc9357SAndroid Build Coastguard Worker   {
464*f6dc9357SAndroid Build Coastguard Worker     kAdd = 0,
465*f6dc9357SAndroid Build Coastguard Worker     kUpdate,
466*f6dc9357SAndroid Build Coastguard Worker     kAnalyze,
467*f6dc9357SAndroid Build Coastguard Worker     kReplicate,
468*f6dc9357SAndroid Build Coastguard Worker     kRepack,
469*f6dc9357SAndroid Build Coastguard Worker     kSkip,
470*f6dc9357SAndroid Build Coastguard Worker     kDelete,
471*f6dc9357SAndroid Build Coastguard Worker     kHeader,
472*f6dc9357SAndroid Build Coastguard Worker     kHashRead,
473*f6dc9357SAndroid Build Coastguard Worker     kInFileChanged
474*f6dc9357SAndroid Build Coastguard Worker     // , kOpFinished
475*f6dc9357SAndroid Build Coastguard Worker     // , kNumDefined
476*f6dc9357SAndroid Build Coastguard Worker   };
477*f6dc9357SAndroid Build Coastguard Worker }
478*f6dc9357SAndroid Build Coastguard Worker 
479*f6dc9357SAndroid Build Coastguard Worker /*
480*f6dc9357SAndroid Build Coastguard Worker IArchiveUpdateCallbackFile::ReportOperation
481*f6dc9357SAndroid Build Coastguard Worker   UInt32 indexType (NEventIndexType)
482*f6dc9357SAndroid Build Coastguard Worker   UInt32 index
483*f6dc9357SAndroid Build Coastguard Worker   UInt32 notifyOp (NUpdateNotifyOp)
484*f6dc9357SAndroid Build Coastguard Worker */
485*f6dc9357SAndroid Build Coastguard Worker 
486*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveUpdateCallbackFile(x) \
487*f6dc9357SAndroid Build Coastguard Worker   x(GetStream2(UInt32 index, ISequentialInStream **inStream, UInt32 notifyOp)) \
488*f6dc9357SAndroid Build Coastguard Worker   x(ReportOperation(UInt32 indexType, UInt32 index, UInt32 notifyOp)) \
489*f6dc9357SAndroid Build Coastguard Worker 
490*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveUpdateCallbackFile, 0x83)
491*f6dc9357SAndroid Build Coastguard Worker 
492*f6dc9357SAndroid Build Coastguard Worker 
493*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveGetDiskProperty(x) \
494*f6dc9357SAndroid Build Coastguard Worker   x(GetDiskProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \
495*f6dc9357SAndroid Build Coastguard Worker 
496*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveGetDiskProperty, 0x84)
497*f6dc9357SAndroid Build Coastguard Worker 
498*f6dc9357SAndroid Build Coastguard Worker /*
499*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveUpdateCallbackArcProp(x) \
500*f6dc9357SAndroid Build Coastguard Worker   x(ReportProp(UInt32 indexType, UInt32 index, PROPID propID, const PROPVARIANT *value)) \
501*f6dc9357SAndroid Build Coastguard Worker   x(ReportRawProp(UInt32 indexType, UInt32 index, PROPID propID, const void *data, UInt32 dataSize, UInt32 propType)) \
502*f6dc9357SAndroid Build Coastguard Worker   x(ReportFinished(UInt32 indexType, UInt32 index, Int32 opRes)) \
503*f6dc9357SAndroid Build Coastguard Worker   x(DoNeedArcProp(PROPID propID, Int32 *answer)) \
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveUpdateCallbackArcProp, 0x85)
506*f6dc9357SAndroid Build Coastguard Worker */
507*f6dc9357SAndroid Build Coastguard Worker 
508*f6dc9357SAndroid Build Coastguard Worker /*
509*f6dc9357SAndroid Build Coastguard Worker UpdateItems()
510*f6dc9357SAndroid Build Coastguard Worker -------------
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker   outStream: output stream. (the handler) MUST support the case when
513*f6dc9357SAndroid Build Coastguard Worker     Seek position in outStream is not ZERO.
514*f6dc9357SAndroid Build Coastguard Worker     but the caller calls with empty outStream and seek position is ZERO??
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker   archives with stub:
517*f6dc9357SAndroid Build Coastguard Worker 
518*f6dc9357SAndroid Build Coastguard Worker   If archive is open and the handler and (Offset > 0), then the handler
519*f6dc9357SAndroid Build Coastguard Worker   knows about stub size.
520*f6dc9357SAndroid Build Coastguard Worker   UpdateItems():
521*f6dc9357SAndroid Build Coastguard Worker   1) the handler MUST copy that stub to outStream
522*f6dc9357SAndroid Build Coastguard Worker   2) the caller MUST NOT copy the stub to outStream, if
523*f6dc9357SAndroid Build Coastguard Worker      "rsfx" property is set with SetProperties
524*f6dc9357SAndroid Build Coastguard Worker 
525*f6dc9357SAndroid Build Coastguard Worker   the handler must support the case where
526*f6dc9357SAndroid Build Coastguard Worker     ISequentialOutStream *outStream
527*f6dc9357SAndroid Build Coastguard Worker */
528*f6dc9357SAndroid Build Coastguard Worker 
529*f6dc9357SAndroid Build Coastguard Worker 
530*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IOutArchive(x) \
531*f6dc9357SAndroid Build Coastguard Worker   x(UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback)) \
532*f6dc9357SAndroid Build Coastguard Worker   x(GetFileTimeType(UInt32 *type))
533*f6dc9357SAndroid Build Coastguard Worker 
534*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IOutArchive, 0xA0)
535*f6dc9357SAndroid Build Coastguard Worker 
536*f6dc9357SAndroid Build Coastguard Worker 
537*f6dc9357SAndroid Build Coastguard Worker /*
538*f6dc9357SAndroid Build Coastguard Worker ISetProperties::SetProperties()
539*f6dc9357SAndroid Build Coastguard Worker   PROPVARIANT values[i].vt:
540*f6dc9357SAndroid Build Coastguard Worker     VT_EMPTY
541*f6dc9357SAndroid Build Coastguard Worker     VT_BOOL
542*f6dc9357SAndroid Build Coastguard Worker     VT_UI4   - if 32-bit number
543*f6dc9357SAndroid Build Coastguard Worker     VT_UI8   - if 64-bit number
544*f6dc9357SAndroid Build Coastguard Worker     VT_BSTR
545*f6dc9357SAndroid Build Coastguard Worker */
546*f6dc9357SAndroid Build Coastguard Worker 
547*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ISetProperties(x) \
548*f6dc9357SAndroid Build Coastguard Worker   x(SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps))
549*f6dc9357SAndroid Build Coastguard Worker 
550*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(ISetProperties, 0x03)
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveKeepModeForNextOpen(x) \
553*f6dc9357SAndroid Build Coastguard Worker   x(KeepModeForNextOpen()) \
554*f6dc9357SAndroid Build Coastguard Worker 
555*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveKeepModeForNextOpen, 0x04)
556*f6dc9357SAndroid Build Coastguard Worker 
557*f6dc9357SAndroid Build Coastguard Worker /* Exe handler: the handler for executable format (PE, ELF, Mach-O).
558*f6dc9357SAndroid Build Coastguard Worker    SFX archive: executable stub + some tail data.
559*f6dc9357SAndroid Build Coastguard Worker      before 9.31: exe handler didn't parse SFX archives as executable format.
560*f6dc9357SAndroid Build Coastguard Worker      for 9.31+: exe handler parses SFX archives as executable format, only if AllowTail(1) was called */
561*f6dc9357SAndroid Build Coastguard Worker 
562*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveAllowTail(x) \
563*f6dc9357SAndroid Build Coastguard Worker   x(AllowTail(Int32 allowTail)) \
564*f6dc9357SAndroid Build Coastguard Worker 
565*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveAllowTail, 0x05)
566*f6dc9357SAndroid Build Coastguard Worker 
567*f6dc9357SAndroid Build Coastguard Worker 
568*f6dc9357SAndroid Build Coastguard Worker namespace NRequestMemoryUseFlags
569*f6dc9357SAndroid Build Coastguard Worker {
570*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_AllowedSize_WasForced    = 1 << 0;  // (*allowedSize) was forced by -mmemx or -smemx
571*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_DefaultLimit_Exceeded    = 1 << 1;  // default limit of archive format was exceeded
572*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_MLimit_Exceeded          = 1 << 2;  // -mmemx value was exceeded
573*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_SLimit_Exceeded          = 1 << 3;  // -smemx value was exceeded
574*f6dc9357SAndroid Build Coastguard Worker 
575*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_NoErrorMessage           = 1 << 10; // do not show error message, and show only request
576*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_IsReport                 = 1 << 11; // only report is required, without user request
577*f6dc9357SAndroid Build Coastguard Worker 
578*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_SkipArc_IsExpected       = 1 << 12; // NRequestMemoryAnswerFlags::k_SkipArc flag answer is expected
579*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_Report_SkipArc           = 1 << 13; // report about SkipArc operation
580*f6dc9357SAndroid Build Coastguard Worker 
581*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_SkipBigFile_IsExpected   = 1 << 14; // NRequestMemoryAnswerFlags::k_SkipBigFiles flag answer is expected (unused)
582*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_Report_SkipBigFile       = 1 << 15; // report about SkipFile operation (unused)
583*f6dc9357SAndroid Build Coastguard Worker 
584*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_SkipBigFiles_IsExpected  = 1 << 16; // NRequestMemoryAnswerFlags::k_SkipBigFiles flag answer is expected (unused)
585*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_Report_SkipBigFiles      = 1 << 17; // report that all big files will be skipped (unused)
586*f6dc9357SAndroid Build Coastguard Worker }
587*f6dc9357SAndroid Build Coastguard Worker 
588*f6dc9357SAndroid Build Coastguard Worker namespace NRequestMemoryAnswerFlags
589*f6dc9357SAndroid Build Coastguard Worker {
590*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_Allow          = 1 << 0;  // allow further archive extraction
591*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_Stop           = 1 << 1;  // for exit (and return_code == E_ABORT is used)
592*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_SkipArc        = 1 << 2;  // skip current archive extraction
593*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_SkipBigFile    = 1 << 4;  // skip extracting of files that exceed limit (unused)
594*f6dc9357SAndroid Build Coastguard Worker   // const UInt32 k_SkipBigFiles   = 1 << 5;  // skip extracting of files that exceed limit (unused)
595*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_Limit_Exceeded  = 1 << 10;  // limit was exceeded
596*f6dc9357SAndroid Build Coastguard Worker }
597*f6dc9357SAndroid Build Coastguard Worker 
598*f6dc9357SAndroid Build Coastguard Worker /*
599*f6dc9357SAndroid Build Coastguard Worker   *allowedSize is in/out:
600*f6dc9357SAndroid Build Coastguard Worker     in  : default allowed memory usage size or forced size, if it was changed by switch -mmemx.
601*f6dc9357SAndroid Build Coastguard Worker     out : value specified by user or unchanged value.
602*f6dc9357SAndroid Build Coastguard Worker 
603*f6dc9357SAndroid Build Coastguard Worker   *answerFlags is in/out:
604*f6dc9357SAndroid Build Coastguard Worker     *answerFlags must be set by caller before calling for default action,
605*f6dc9357SAndroid Build Coastguard Worker 
606*f6dc9357SAndroid Build Coastguard Worker   indexType : must be set with NEventIndexType::* constant
607*f6dc9357SAndroid Build Coastguard Worker           (indexType == kNoIndex), if request for whole archive.
608*f6dc9357SAndroid Build Coastguard Worker   index : must be set for some (indexType) types (if
609*f6dc9357SAndroid Build Coastguard Worker           fileIndex , if (indexType == NEventIndexType::kInArcIndex)
610*f6dc9357SAndroid Build Coastguard Worker           0, if       if (indexType == kNoIndex)
611*f6dc9357SAndroid Build Coastguard Worker   path : NULL can be used for any indexType.
612*f6dc9357SAndroid Build Coastguard Worker */
613*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IArchiveRequestMemoryUseCallback(x) \
614*f6dc9357SAndroid Build Coastguard Worker   x(RequestMemoryUse(UInt32 flags, UInt32 indexType, UInt32 index, const wchar_t *path, \
615*f6dc9357SAndroid Build Coastguard Worker     UInt64 requiredSize, UInt64 *allowedSize, UInt32 *answerFlags))
616*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_ARCHIVE(IArchiveRequestMemoryUseCallback, 0x09)
617*f6dc9357SAndroid Build Coastguard Worker 
618*f6dc9357SAndroid Build Coastguard Worker 
619*f6dc9357SAndroid Build Coastguard Worker struct CStatProp
620*f6dc9357SAndroid Build Coastguard Worker {
621*f6dc9357SAndroid Build Coastguard Worker   const char *Name;
622*f6dc9357SAndroid Build Coastguard Worker   UInt32 PropID;
623*f6dc9357SAndroid Build Coastguard Worker   VARTYPE vt;
624*f6dc9357SAndroid Build Coastguard Worker };
625*f6dc9357SAndroid Build Coastguard Worker 
626*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
627*f6dc9357SAndroid Build Coastguard Worker namespace NCOM {
628*f6dc9357SAndroid Build Coastguard Worker // PropVariant.cpp
629*f6dc9357SAndroid Build Coastguard Worker BSTR AllocBstrFromAscii(const char *s) throw();
630*f6dc9357SAndroid Build Coastguard Worker }}
631*f6dc9357SAndroid Build Coastguard Worker 
632*f6dc9357SAndroid Build Coastguard Worker 
633*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_GetProp_Base(fn, f, k) \
634*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(CHandler::fn(UInt32 *numProps)) \
635*f6dc9357SAndroid Build Coastguard Worker     { *numProps = Z7_ARRAY_SIZE(k); return S_OK; } \
636*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(CHandler::f(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
637*f6dc9357SAndroid Build Coastguard Worker     { if (index >= Z7_ARRAY_SIZE(k)) return E_INVALIDARG; \
638*f6dc9357SAndroid Build Coastguard Worker 
639*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_GetProp_NO_NAME(fn, f, k) \
640*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_Base(fn, f, k) \
641*f6dc9357SAndroid Build Coastguard Worker     *propID = k[index]; \
642*f6dc9357SAndroid Build Coastguard Worker     *varType = k7z_PROPID_To_VARTYPE[(unsigned)*propID]; \
643*f6dc9357SAndroid Build Coastguard Worker     *name = NULL; return S_OK; } \
644*f6dc9357SAndroid Build Coastguard Worker 
645*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_GetProp_WITH_NAME(fn, f, k) \
646*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_Base(fn, f, k) \
647*f6dc9357SAndroid Build Coastguard Worker     const CStatProp &prop = k[index]; \
648*f6dc9357SAndroid Build Coastguard Worker     *propID = (PROPID)prop.PropID; \
649*f6dc9357SAndroid Build Coastguard Worker     *varType = prop.vt; \
650*f6dc9357SAndroid Build Coastguard Worker     *name = NWindows::NCOM::AllocBstrFromAscii(prop.Name); return S_OK; } \
651*f6dc9357SAndroid Build Coastguard Worker 
652*f6dc9357SAndroid Build Coastguard Worker 
653*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_Props \
654*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_NO_NAME(GetNumberOfProperties, GetPropertyInfo, kProps)
655*f6dc9357SAndroid Build Coastguard Worker 
656*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_Props_WITH_NAME \
657*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_WITH_NAME(GetNumberOfProperties, GetPropertyInfo, kProps)
658*f6dc9357SAndroid Build Coastguard Worker 
659*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_ArcProps \
660*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_NO_NAME(GetNumberOfArchiveProperties, GetArchivePropertyInfo, kArcProps)
661*f6dc9357SAndroid Build Coastguard Worker 
662*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_ArcProps_WITH_NAME \
663*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_GetProp_WITH_NAME(GetNumberOfArchiveProperties, GetArchivePropertyInfo, kArcProps)
664*f6dc9357SAndroid Build Coastguard Worker 
665*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_ArcProps_NO_Table \
666*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(CHandler::GetNumberOfArchiveProperties(UInt32 *numProps)) \
667*f6dc9357SAndroid Build Coastguard Worker     { *numProps = 0; return S_OK; } \
668*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *)) \
669*f6dc9357SAndroid Build Coastguard Worker     { return E_NOTIMPL; } \
670*f6dc9357SAndroid Build Coastguard Worker 
671*f6dc9357SAndroid Build Coastguard Worker #define IMP_IInArchive_ArcProps_NO \
672*f6dc9357SAndroid Build Coastguard Worker   IMP_IInArchive_ArcProps_NO_Table \
673*f6dc9357SAndroid Build Coastguard Worker   Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value)) \
674*f6dc9357SAndroid Build Coastguard Worker     { value->vt = VT_EMPTY; return S_OK; }
675*f6dc9357SAndroid Build Coastguard Worker 
676*f6dc9357SAndroid Build Coastguard Worker 
677*f6dc9357SAndroid Build Coastguard Worker #define Z7_class_CHandler_final \
678*f6dc9357SAndroid Build Coastguard Worker         Z7_class_final(CHandler)
679*f6dc9357SAndroid Build Coastguard Worker 
680*f6dc9357SAndroid Build Coastguard Worker 
681*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_0 \
682*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_1(CHandler, IInArchive)
683*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_1(i1) \
684*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_2(CHandler, IInArchive, i1)
685*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_2(i1, i2) \
686*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_3(CHandler, IInArchive, i1, i2)
687*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_3(i1, i2, i3) \
688*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_4(CHandler, IInArchive, i1, i2, i3)
689*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_4(i1, i2, i3, i4) \
690*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_5(CHandler, IInArchive, i1, i2, i3, i4)
691*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_CHandler_IInArchive_5(i1, i2, i3, i4, i5) \
692*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_IMP_COM_6(CHandler, IInArchive, i1, i2, i3, i4, i5)
693*f6dc9357SAndroid Build Coastguard Worker 
694*f6dc9357SAndroid Build Coastguard Worker 
695*f6dc9357SAndroid Build Coastguard Worker 
696*f6dc9357SAndroid Build Coastguard Worker #define k_IsArc_Res_NO   0
697*f6dc9357SAndroid Build Coastguard Worker #define k_IsArc_Res_YES  1
698*f6dc9357SAndroid Build Coastguard Worker #define k_IsArc_Res_NEED_MORE 2
699*f6dc9357SAndroid Build Coastguard Worker // #define k_IsArc_Res_YES_LOW_PROB 3
700*f6dc9357SAndroid Build Coastguard Worker 
701*f6dc9357SAndroid Build Coastguard Worker #define API_FUNC_IsArc EXTERN_C UInt32 WINAPI
702*f6dc9357SAndroid Build Coastguard Worker #define API_FUNC_static_IsArc extern "C" { static UInt32 WINAPI
703*f6dc9357SAndroid Build Coastguard Worker 
704*f6dc9357SAndroid Build Coastguard Worker extern "C"
705*f6dc9357SAndroid Build Coastguard Worker {
706*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_CreateObject)(const GUID *clsID, const GUID *iid, void **outObject);
707*f6dc9357SAndroid Build Coastguard Worker 
708*f6dc9357SAndroid Build Coastguard Worker   typedef UInt32 (WINAPI *Func_IsArc)(const Byte *p, size_t size);
709*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_GetIsArc)(UInt32 formatIndex, Func_IsArc *isArc);
710*f6dc9357SAndroid Build Coastguard Worker 
711*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_GetNumberOfFormats)(UInt32 *numFormats);
712*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_GetHandlerProperty)(PROPID propID, PROPVARIANT *value);
713*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_GetHandlerProperty2)(UInt32 index, PROPID propID, PROPVARIANT *value);
714*f6dc9357SAndroid Build Coastguard Worker 
715*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_SetCaseSensitive)(Int32 caseSensitive);
716*f6dc9357SAndroid Build Coastguard Worker   typedef HRESULT (WINAPI *Func_SetLargePageMode)();
717*f6dc9357SAndroid Build Coastguard Worker   // typedef HRESULT (WINAPI *Func_SetClientVersion)(UInt32 version);
718*f6dc9357SAndroid Build Coastguard Worker 
719*f6dc9357SAndroid Build Coastguard Worker   typedef IOutArchive * (*Func_CreateOutArchive)();
720*f6dc9357SAndroid Build Coastguard Worker   typedef IInArchive * (*Func_CreateInArchive)();
721*f6dc9357SAndroid Build Coastguard Worker }
722*f6dc9357SAndroid Build Coastguard Worker 
723*f6dc9357SAndroid Build Coastguard Worker 
724*f6dc9357SAndroid Build Coastguard Worker /*
725*f6dc9357SAndroid Build Coastguard Worker   if there is no time in archive, external MTime of archive
726*f6dc9357SAndroid Build Coastguard Worker   will be used instead of _item.Time from archive.
727*f6dc9357SAndroid Build Coastguard Worker   For 7-zip before 22.00 we need to return some supported value.
728*f6dc9357SAndroid Build Coastguard Worker   But (kpidTimeType > kDOS) is not allowed in 7-Zip before 22.00.
729*f6dc9357SAndroid Build Coastguard Worker   So we return highest precision value supported by old 7-Zip.
730*f6dc9357SAndroid Build Coastguard Worker   new 7-Zip 22.00 doesn't use that value in usual cases.
731*f6dc9357SAndroid Build Coastguard Worker */
732*f6dc9357SAndroid Build Coastguard Worker 
733*f6dc9357SAndroid Build Coastguard Worker 
734*f6dc9357SAndroid Build Coastguard Worker #define DECLARE_AND_SET_CLIENT_VERSION_VAR
735*f6dc9357SAndroid Build Coastguard Worker #define GET_FileTimeType_NotDefined_for_GetFileTimeType \
736*f6dc9357SAndroid Build Coastguard Worker       NFileTimeType::kWindows
737*f6dc9357SAndroid Build Coastguard Worker 
738*f6dc9357SAndroid Build Coastguard Worker /*
739*f6dc9357SAndroid Build Coastguard Worker extern UInt32 g_ClientVersion;
740*f6dc9357SAndroid Build Coastguard Worker 
741*f6dc9357SAndroid Build Coastguard Worker #define GET_CLIENT_VERSION(major, minor)  \
742*f6dc9357SAndroid Build Coastguard Worker   ((UInt32)(((UInt32)(major) << 16) | (UInt32)(minor)))
743*f6dc9357SAndroid Build Coastguard Worker 
744*f6dc9357SAndroid Build Coastguard Worker #define DECLARE_AND_SET_CLIENT_VERSION_VAR \
745*f6dc9357SAndroid Build Coastguard Worker   UInt32 g_ClientVersion = GET_CLIENT_VERSION(MY_VER_MAJOR, MY_VER_MINOR);
746*f6dc9357SAndroid Build Coastguard Worker 
747*f6dc9357SAndroid Build Coastguard Worker #define GET_FileTimeType_NotDefined_for_GetFileTimeType \
748*f6dc9357SAndroid Build Coastguard Worker       ((UInt32)(g_ClientVersion >= GET_CLIENT_VERSION(22, 0) ? \
749*f6dc9357SAndroid Build Coastguard Worker         (UInt32)(Int32)NFileTimeType::kNotDefined : \
750*f6dc9357SAndroid Build Coastguard Worker         NFileTimeType::kWindows))
751*f6dc9357SAndroid Build Coastguard Worker */
752*f6dc9357SAndroid Build Coastguard Worker 
753*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
754*f6dc9357SAndroid Build Coastguard Worker #endif
755