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