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