1*f6dc9357SAndroid Build Coastguard Worker // ArchiveExtractCallback.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_EXTRACT_CALLBACK_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_EXTRACT_CALLBACK_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyLinux.h" 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/FileStreams.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/ProgressUtils.h" 14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamObjects.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker #include "ExtractMode.h" 19*f6dc9357SAndroid Build Coastguard Worker #include "IFileExtractCallback.h" 20*f6dc9357SAndroid Build Coastguard Worker #include "OpenArchive.h" 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker #include "HashCalc.h" 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_1( 27*f6dc9357SAndroid Build Coastguard Worker COutStreamWithHash 28*f6dc9357SAndroid Build Coastguard Worker , ISequentialOutStream 29*f6dc9357SAndroid Build Coastguard Worker ) 30*f6dc9357SAndroid Build Coastguard Worker bool _calculate; 31*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _stream; 32*f6dc9357SAndroid Build Coastguard Worker UInt64 _size; 33*f6dc9357SAndroid Build Coastguard Worker public: 34*f6dc9357SAndroid Build Coastguard Worker IHashCalc *_hash; 35*f6dc9357SAndroid Build Coastguard Worker SetStream(ISequentialOutStream * stream)36*f6dc9357SAndroid Build Coastguard Worker void SetStream(ISequentialOutStream *stream) { _stream = stream; } ReleaseStream()37*f6dc9357SAndroid Build Coastguard Worker void ReleaseStream() { _stream.Release(); } 38*f6dc9357SAndroid Build Coastguard Worker void Init(bool calculate = true) 39*f6dc9357SAndroid Build Coastguard Worker { 40*f6dc9357SAndroid Build Coastguard Worker InitCRC(); 41*f6dc9357SAndroid Build Coastguard Worker _size = 0; 42*f6dc9357SAndroid Build Coastguard Worker _calculate = calculate; 43*f6dc9357SAndroid Build Coastguard Worker } EnableCalc(bool calculate)44*f6dc9357SAndroid Build Coastguard Worker void EnableCalc(bool calculate) { _calculate = calculate; } InitCRC()45*f6dc9357SAndroid Build Coastguard Worker void InitCRC() { _hash->InitForNewFile(); } GetSize()46*f6dc9357SAndroid Build Coastguard Worker UInt64 GetSize() const { return _size; } 47*f6dc9357SAndroid Build Coastguard Worker }; 48*f6dc9357SAndroid Build Coastguard Worker 49*f6dc9357SAndroid Build Coastguard Worker #endif 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker struct CExtractNtOptions 52*f6dc9357SAndroid Build Coastguard Worker { 53*f6dc9357SAndroid Build Coastguard Worker CBoolPair NtSecurity; 54*f6dc9357SAndroid Build Coastguard Worker CBoolPair SymLinks; 55*f6dc9357SAndroid Build Coastguard Worker CBoolPair SymLinks_AllowDangerous; 56*f6dc9357SAndroid Build Coastguard Worker CBoolPair HardLinks; 57*f6dc9357SAndroid Build Coastguard Worker CBoolPair AltStreams; 58*f6dc9357SAndroid Build Coastguard Worker bool ReplaceColonForAltStream; 59*f6dc9357SAndroid Build Coastguard Worker bool WriteToAltStreamIfColon; 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker bool ExtractOwner; 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker bool PreAllocateOutFile; 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker // used for hash arcs only, when we open external files 66*f6dc9357SAndroid Build Coastguard Worker bool PreserveATime; 67*f6dc9357SAndroid Build Coastguard Worker bool OpenShareForWrite; 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker UInt64 MemLimit; 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker CExtractNtOptions(): 72*f6dc9357SAndroid Build Coastguard Worker ReplaceColonForAltStream(false), 73*f6dc9357SAndroid Build Coastguard Worker WriteToAltStreamIfColon(false), 74*f6dc9357SAndroid Build Coastguard Worker ExtractOwner(false), 75*f6dc9357SAndroid Build Coastguard Worker PreserveATime(false), 76*f6dc9357SAndroid Build Coastguard Worker OpenShareForWrite(false), 77*f6dc9357SAndroid Build Coastguard Worker MemLimit((UInt64)(Int64)-1) 78*f6dc9357SAndroid Build Coastguard Worker { 79*f6dc9357SAndroid Build Coastguard Worker SymLinks.Val = true; 80*f6dc9357SAndroid Build Coastguard Worker SymLinks_AllowDangerous.Val = false; 81*f6dc9357SAndroid Build Coastguard Worker HardLinks.Val = true; 82*f6dc9357SAndroid Build Coastguard Worker AltStreams.Val = true; 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker PreAllocateOutFile = 85*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 86*f6dc9357SAndroid Build Coastguard Worker true; 87*f6dc9357SAndroid Build Coastguard Worker #else 88*f6dc9357SAndroid Build Coastguard Worker false; 89*f6dc9357SAndroid Build Coastguard Worker #endif 90*f6dc9357SAndroid Build Coastguard Worker } 91*f6dc9357SAndroid Build Coastguard Worker }; 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 95*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 96*f6dc9357SAndroid Build Coastguard Worker #define SUPPORT_LINKS 97*f6dc9357SAndroid Build Coastguard Worker #endif 98*f6dc9357SAndroid Build Coastguard Worker #endif 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker 101*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS 102*f6dc9357SAndroid Build Coastguard Worker 103*f6dc9357SAndroid Build Coastguard Worker struct CHardLinkNode 104*f6dc9357SAndroid Build Coastguard Worker { 105*f6dc9357SAndroid Build Coastguard Worker UInt64 StreamId; 106*f6dc9357SAndroid Build Coastguard Worker UInt64 INode; 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Worker int Compare(const CHardLinkNode &a) const; 109*f6dc9357SAndroid Build Coastguard Worker }; 110*f6dc9357SAndroid Build Coastguard Worker 111*f6dc9357SAndroid Build Coastguard Worker class CHardLinks 112*f6dc9357SAndroid Build Coastguard Worker { 113*f6dc9357SAndroid Build Coastguard Worker public: 114*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CHardLinkNode> IDs; 115*f6dc9357SAndroid Build Coastguard Worker CObjectVector<FString> Links; 116*f6dc9357SAndroid Build Coastguard Worker 117*f6dc9357SAndroid Build Coastguard Worker void Clear() 118*f6dc9357SAndroid Build Coastguard Worker { 119*f6dc9357SAndroid Build Coastguard Worker IDs.Clear(); 120*f6dc9357SAndroid Build Coastguard Worker Links.Clear(); 121*f6dc9357SAndroid Build Coastguard Worker } 122*f6dc9357SAndroid Build Coastguard Worker 123*f6dc9357SAndroid Build Coastguard Worker void PrepareLinks() 124*f6dc9357SAndroid Build Coastguard Worker { 125*f6dc9357SAndroid Build Coastguard Worker while (Links.Size() < IDs.Size()) 126*f6dc9357SAndroid Build Coastguard Worker Links.AddNew(); 127*f6dc9357SAndroid Build Coastguard Worker } 128*f6dc9357SAndroid Build Coastguard Worker }; 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker #endif 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_ALT_STREAMS 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker struct CIndexToPathPair 135*f6dc9357SAndroid Build Coastguard Worker { 136*f6dc9357SAndroid Build Coastguard Worker UInt32 Index; 137*f6dc9357SAndroid Build Coastguard Worker FString Path; 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker CIndexToPathPair(UInt32 index): Index(index) {} 140*f6dc9357SAndroid Build Coastguard Worker CIndexToPathPair(UInt32 index, const FString &path): Index(index), Path(path) {} 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker int Compare(const CIndexToPathPair &pair) const 143*f6dc9357SAndroid Build Coastguard Worker { 144*f6dc9357SAndroid Build Coastguard Worker return MyCompare(Index, pair.Index); 145*f6dc9357SAndroid Build Coastguard Worker } 146*f6dc9357SAndroid Build Coastguard Worker }; 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker #endif 149*f6dc9357SAndroid Build Coastguard Worker 150*f6dc9357SAndroid Build Coastguard Worker 151*f6dc9357SAndroid Build Coastguard Worker 152*f6dc9357SAndroid Build Coastguard Worker struct CFiTimesCAM 153*f6dc9357SAndroid Build Coastguard Worker { 154*f6dc9357SAndroid Build Coastguard Worker CFiTime CTime; 155*f6dc9357SAndroid Build Coastguard Worker CFiTime ATime; 156*f6dc9357SAndroid Build Coastguard Worker CFiTime MTime; 157*f6dc9357SAndroid Build Coastguard Worker 158*f6dc9357SAndroid Build Coastguard Worker bool CTime_Defined; 159*f6dc9357SAndroid Build Coastguard Worker bool ATime_Defined; 160*f6dc9357SAndroid Build Coastguard Worker bool MTime_Defined; 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker bool IsSomeTimeDefined() const 163*f6dc9357SAndroid Build Coastguard Worker { 164*f6dc9357SAndroid Build Coastguard Worker return 165*f6dc9357SAndroid Build Coastguard Worker CTime_Defined | 166*f6dc9357SAndroid Build Coastguard Worker ATime_Defined | 167*f6dc9357SAndroid Build Coastguard Worker MTime_Defined; 168*f6dc9357SAndroid Build Coastguard Worker } 169*f6dc9357SAndroid Build Coastguard Worker }; 170*f6dc9357SAndroid Build Coastguard Worker 171*f6dc9357SAndroid Build Coastguard Worker struct CDirPathTime: public CFiTimesCAM 172*f6dc9357SAndroid Build Coastguard Worker { 173*f6dc9357SAndroid Build Coastguard Worker FString Path; 174*f6dc9357SAndroid Build Coastguard Worker 175*f6dc9357SAndroid Build Coastguard Worker bool SetDirTime() const; 176*f6dc9357SAndroid Build Coastguard Worker }; 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker 179*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS 180*f6dc9357SAndroid Build Coastguard Worker 181*f6dc9357SAndroid Build Coastguard Worker struct CLinkInfo 182*f6dc9357SAndroid Build Coastguard Worker { 183*f6dc9357SAndroid Build Coastguard Worker // bool isCopyLink; 184*f6dc9357SAndroid Build Coastguard Worker bool isHardLink; 185*f6dc9357SAndroid Build Coastguard Worker bool isJunction; 186*f6dc9357SAndroid Build Coastguard Worker bool isRelative; 187*f6dc9357SAndroid Build Coastguard Worker bool isWSL; 188*f6dc9357SAndroid Build Coastguard Worker UString linkPath; 189*f6dc9357SAndroid Build Coastguard Worker 190*f6dc9357SAndroid Build Coastguard Worker bool IsSymLink() const { return !isHardLink; } 191*f6dc9357SAndroid Build Coastguard Worker 192*f6dc9357SAndroid Build Coastguard Worker CLinkInfo(): 193*f6dc9357SAndroid Build Coastguard Worker // IsCopyLink(false), 194*f6dc9357SAndroid Build Coastguard Worker isHardLink(false), 195*f6dc9357SAndroid Build Coastguard Worker isJunction(false), 196*f6dc9357SAndroid Build Coastguard Worker isRelative(false), 197*f6dc9357SAndroid Build Coastguard Worker isWSL(false) 198*f6dc9357SAndroid Build Coastguard Worker {} 199*f6dc9357SAndroid Build Coastguard Worker 200*f6dc9357SAndroid Build Coastguard Worker void Clear() 201*f6dc9357SAndroid Build Coastguard Worker { 202*f6dc9357SAndroid Build Coastguard Worker // IsCopyLink = false; 203*f6dc9357SAndroid Build Coastguard Worker isHardLink = false; 204*f6dc9357SAndroid Build Coastguard Worker isJunction = false; 205*f6dc9357SAndroid Build Coastguard Worker isRelative = false; 206*f6dc9357SAndroid Build Coastguard Worker isWSL = false; 207*f6dc9357SAndroid Build Coastguard Worker linkPath.Empty(); 208*f6dc9357SAndroid Build Coastguard Worker } 209*f6dc9357SAndroid Build Coastguard Worker 210*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *data, size_t dataSize, bool isLinuxData); 211*f6dc9357SAndroid Build Coastguard Worker }; 212*f6dc9357SAndroid Build Coastguard Worker 213*f6dc9357SAndroid Build Coastguard Worker #endif // SUPPORT_LINKS 214*f6dc9357SAndroid Build Coastguard Worker 215*f6dc9357SAndroid Build Coastguard Worker 216*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32 217*f6dc9357SAndroid Build Coastguard Worker 218*f6dc9357SAndroid Build Coastguard Worker struct COwnerInfo 219*f6dc9357SAndroid Build Coastguard Worker { 220*f6dc9357SAndroid Build Coastguard Worker bool Id_Defined; 221*f6dc9357SAndroid Build Coastguard Worker UInt32 Id; 222*f6dc9357SAndroid Build Coastguard Worker AString Name; 223*f6dc9357SAndroid Build Coastguard Worker 224*f6dc9357SAndroid Build Coastguard Worker void Clear() 225*f6dc9357SAndroid Build Coastguard Worker { 226*f6dc9357SAndroid Build Coastguard Worker Id_Defined = false; 227*f6dc9357SAndroid Build Coastguard Worker Id = 0; 228*f6dc9357SAndroid Build Coastguard Worker Name.Empty(); 229*f6dc9357SAndroid Build Coastguard Worker } 230*f6dc9357SAndroid Build Coastguard Worker }; 231*f6dc9357SAndroid Build Coastguard Worker 232*f6dc9357SAndroid Build Coastguard Worker #endif 233*f6dc9357SAndroid Build Coastguard Worker 234*f6dc9357SAndroid Build Coastguard Worker 235*f6dc9357SAndroid Build Coastguard Worker class CArchiveExtractCallback Z7_final: 236*f6dc9357SAndroid Build Coastguard Worker public IArchiveExtractCallback, 237*f6dc9357SAndroid Build Coastguard Worker public IArchiveExtractCallbackMessage2, 238*f6dc9357SAndroid Build Coastguard Worker public ICryptoGetTextPassword, 239*f6dc9357SAndroid Build Coastguard Worker public ICompressProgressInfo, 240*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 241*f6dc9357SAndroid Build Coastguard Worker public IArchiveUpdateCallbackFile, 242*f6dc9357SAndroid Build Coastguard Worker public IArchiveGetDiskProperty, 243*f6dc9357SAndroid Build Coastguard Worker public IArchiveRequestMemoryUseCallback, 244*f6dc9357SAndroid Build Coastguard Worker #endif 245*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 246*f6dc9357SAndroid Build Coastguard Worker { 247*f6dc9357SAndroid Build Coastguard Worker /* IArchiveExtractCallback, */ 248*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN2(IArchiveExtractCallbackMessage2) 249*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICryptoGetTextPassword) 250*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressProgressInfo) 251*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 252*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveUpdateCallbackFile) 253*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveGetDiskProperty) 254*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveRequestMemoryUseCallback) 255*f6dc9357SAndroid Build Coastguard Worker #endif 256*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END 257*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE 258*f6dc9357SAndroid Build Coastguard Worker 259*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IProgress) 260*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveExtractCallback) 261*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveExtractCallbackMessage2) 262*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICryptoGetTextPassword) 263*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressProgressInfo) 264*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 265*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveUpdateCallbackFile) 266*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveGetDiskProperty) 267*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveRequestMemoryUseCallback) 268*f6dc9357SAndroid Build Coastguard Worker #endif 269*f6dc9357SAndroid Build Coastguard Worker 270*f6dc9357SAndroid Build Coastguard Worker // bool Write_CTime; 271*f6dc9357SAndroid Build Coastguard Worker // bool Write_ATime; 272*f6dc9357SAndroid Build Coastguard Worker // bool Write_MTime; 273*f6dc9357SAndroid Build Coastguard Worker bool _stdOutMode; 274*f6dc9357SAndroid Build Coastguard Worker bool _testMode; 275*f6dc9357SAndroid Build Coastguard Worker bool _removePartsForAltStreams; 276*f6dc9357SAndroid Build Coastguard Worker public: 277*f6dc9357SAndroid Build Coastguard Worker bool Is_elimPrefix_Mode; 278*f6dc9357SAndroid Build Coastguard Worker private: 279*f6dc9357SAndroid Build Coastguard Worker 280*f6dc9357SAndroid Build Coastguard Worker const CArc *_arc; 281*f6dc9357SAndroid Build Coastguard Worker CExtractNtOptions _ntOptions; 282*f6dc9357SAndroid Build Coastguard Worker 283*f6dc9357SAndroid Build Coastguard Worker bool _encrypted; 284*f6dc9357SAndroid Build Coastguard Worker bool _isSplit; 285*f6dc9357SAndroid Build Coastguard Worker bool _curSize_Defined; 286*f6dc9357SAndroid Build Coastguard Worker bool _fileLength_WasSet; 287*f6dc9357SAndroid Build Coastguard Worker 288*f6dc9357SAndroid Build Coastguard Worker bool _isRenamed; 289*f6dc9357SAndroid Build Coastguard Worker bool _extractMode; 290*f6dc9357SAndroid Build Coastguard Worker // bool _is_SymLink_in_Data; 291*f6dc9357SAndroid Build Coastguard Worker bool _is_SymLink_in_Data_Linux; // false = WIN32, true = LINUX 292*f6dc9357SAndroid Build Coastguard Worker bool _needSetAttrib; 293*f6dc9357SAndroid Build Coastguard Worker bool _isSymLinkCreated; 294*f6dc9357SAndroid Build Coastguard Worker bool _itemFailure; 295*f6dc9357SAndroid Build Coastguard Worker bool _some_pathParts_wereRemoved; 296*f6dc9357SAndroid Build Coastguard Worker 297*f6dc9357SAndroid Build Coastguard Worker bool _multiArchives; 298*f6dc9357SAndroid Build Coastguard Worker bool _keepAndReplaceEmptyDirPrefixes; // replace them to "_"; 299*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) && !defined(Z7_SFX) 300*f6dc9357SAndroid Build Coastguard Worker bool _saclEnabled; 301*f6dc9357SAndroid Build Coastguard Worker #endif 302*f6dc9357SAndroid Build Coastguard Worker 303*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum _pathMode; 304*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::EEnum _overwriteMode; 305*f6dc9357SAndroid Build Coastguard Worker 306*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2; 307*f6dc9357SAndroid Build Coastguard Worker const NWildcard::CCensorNode *_wildcardCensor; // we need wildcard for single pass mode (stdin) 308*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<ICompressProgressInfo> _compressProgress; 309*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<IArchiveExtractCallbackMessage2> _callbackMessage; 310*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback2> _folderArchiveExtractCallback2; 311*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword; 312*f6dc9357SAndroid Build Coastguard Worker 313*f6dc9357SAndroid Build Coastguard Worker FString _dirPathPrefix; 314*f6dc9357SAndroid Build Coastguard Worker FString _dirPathPrefix_Full; 315*f6dc9357SAndroid Build Coastguard Worker 316*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderExtractToStreamCallback> ExtractToStreamCallback; 319*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveRequestMemoryUseCallback> _requestMemoryUseCallback; 320*f6dc9357SAndroid Build Coastguard Worker 321*f6dc9357SAndroid Build Coastguard Worker #endif 322*f6dc9357SAndroid Build Coastguard Worker 323*f6dc9357SAndroid Build Coastguard Worker CReadArcItem _item; 324*f6dc9357SAndroid Build Coastguard Worker FString _diskFilePath; 325*f6dc9357SAndroid Build Coastguard Worker 326*f6dc9357SAndroid Build Coastguard Worker struct CProcessedFileInfo 327*f6dc9357SAndroid Build Coastguard Worker { 328*f6dc9357SAndroid Build Coastguard Worker CArcTime CTime; 329*f6dc9357SAndroid Build Coastguard Worker CArcTime ATime; 330*f6dc9357SAndroid Build Coastguard Worker CArcTime MTime; 331*f6dc9357SAndroid Build Coastguard Worker UInt32 Attrib; 332*f6dc9357SAndroid Build Coastguard Worker bool Attrib_Defined; 333*f6dc9357SAndroid Build Coastguard Worker 334*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32 335*f6dc9357SAndroid Build Coastguard Worker COwnerInfo Owner; 336*f6dc9357SAndroid Build Coastguard Worker COwnerInfo Group; 337*f6dc9357SAndroid Build Coastguard Worker #endif 338*f6dc9357SAndroid Build Coastguard Worker 339*f6dc9357SAndroid Build Coastguard Worker bool IsReparse() const 340*f6dc9357SAndroid Build Coastguard Worker { 341*f6dc9357SAndroid Build Coastguard Worker return (Attrib_Defined && (Attrib & FILE_ATTRIBUTE_REPARSE_POINT) != 0); 342*f6dc9357SAndroid Build Coastguard Worker } 343*f6dc9357SAndroid Build Coastguard Worker 344*f6dc9357SAndroid Build Coastguard Worker bool IsLinuxSymLink() const 345*f6dc9357SAndroid Build Coastguard Worker { 346*f6dc9357SAndroid Build Coastguard Worker return (Attrib_Defined && MY_LIN_S_ISLNK(Attrib >> 16)); 347*f6dc9357SAndroid Build Coastguard Worker } 348*f6dc9357SAndroid Build Coastguard Worker 349*f6dc9357SAndroid Build Coastguard Worker void SetFromPosixAttrib(UInt32 a) 350*f6dc9357SAndroid Build Coastguard Worker { 351*f6dc9357SAndroid Build Coastguard Worker // here we set only part of combined attribute required by SetFileAttrib() call 352*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 353*f6dc9357SAndroid Build Coastguard Worker // Windows sets FILE_ATTRIBUTE_NORMAL, if we try to set 0 as attribute. 354*f6dc9357SAndroid Build Coastguard Worker Attrib = MY_LIN_S_ISDIR(a) ? 355*f6dc9357SAndroid Build Coastguard Worker FILE_ATTRIBUTE_DIRECTORY : 356*f6dc9357SAndroid Build Coastguard Worker FILE_ATTRIBUTE_ARCHIVE; 357*f6dc9357SAndroid Build Coastguard Worker if ((a & 0222) == 0) // (& S_IWUSR) in p7zip 358*f6dc9357SAndroid Build Coastguard Worker Attrib |= FILE_ATTRIBUTE_READONLY; 359*f6dc9357SAndroid Build Coastguard Worker // 22.00 : we need type bits for (MY_LIN_S_IFLNK) for IsLinuxSymLink() 360*f6dc9357SAndroid Build Coastguard Worker a &= MY_LIN_S_IFMT; 361*f6dc9357SAndroid Build Coastguard Worker if (a == MY_LIN_S_IFLNK) 362*f6dc9357SAndroid Build Coastguard Worker Attrib |= (a << 16); 363*f6dc9357SAndroid Build Coastguard Worker #else 364*f6dc9357SAndroid Build Coastguard Worker Attrib = (a << 16) | FILE_ATTRIBUTE_UNIX_EXTENSION; 365*f6dc9357SAndroid Build Coastguard Worker #endif 366*f6dc9357SAndroid Build Coastguard Worker Attrib_Defined = true; 367*f6dc9357SAndroid Build Coastguard Worker } 368*f6dc9357SAndroid Build Coastguard Worker } _fi; 369*f6dc9357SAndroid Build Coastguard Worker 370*f6dc9357SAndroid Build Coastguard Worker UInt64 _position; 371*f6dc9357SAndroid Build Coastguard Worker UInt64 _curSize; 372*f6dc9357SAndroid Build Coastguard Worker UInt64 _fileLength_that_WasSet; 373*f6dc9357SAndroid Build Coastguard Worker UInt32 _index; 374*f6dc9357SAndroid Build Coastguard Worker 375*f6dc9357SAndroid Build Coastguard Worker // #ifdef SUPPORT_ALT_STREAMS 376*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) 377*f6dc9357SAndroid Build Coastguard Worker DWORD _altStream_NeedRestore_AttribVal; 378*f6dc9357SAndroid Build Coastguard Worker FString _altStream_NeedRestore_Attrib_for_parentFsPath; 379*f6dc9357SAndroid Build Coastguard Worker #endif 380*f6dc9357SAndroid Build Coastguard Worker // #endif 381*f6dc9357SAndroid Build Coastguard Worker 382*f6dc9357SAndroid Build Coastguard Worker COutFileStream *_outFileStreamSpec; 383*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _outFileStream; 384*f6dc9357SAndroid Build Coastguard Worker 385*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _outMemBuf; 386*f6dc9357SAndroid Build Coastguard Worker CBufPtrSeqOutStream *_bufPtrSeqOutStream_Spec; 387*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _bufPtrSeqOutStream; 388*f6dc9357SAndroid Build Coastguard Worker 389*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 390*f6dc9357SAndroid Build Coastguard Worker COutStreamWithHash *_hashStreamSpec; 391*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialOutStream> _hashStream; 392*f6dc9357SAndroid Build Coastguard Worker bool _hashStreamWasUsed; 393*f6dc9357SAndroid Build Coastguard Worker 394*f6dc9357SAndroid Build Coastguard Worker bool _use_baseParentFolder_mode; 395*f6dc9357SAndroid Build Coastguard Worker UInt32 _baseParentFolder; 396*f6dc9357SAndroid Build Coastguard Worker #endif 397*f6dc9357SAndroid Build Coastguard Worker 398*f6dc9357SAndroid Build Coastguard Worker UStringVector _removePathParts; 399*f6dc9357SAndroid Build Coastguard Worker 400*f6dc9357SAndroid Build Coastguard Worker UInt64 _packTotal; 401*f6dc9357SAndroid Build Coastguard Worker UInt64 _progressTotal; 402*f6dc9357SAndroid Build Coastguard Worker // bool _progressTotal_Defined; 403*f6dc9357SAndroid Build Coastguard Worker 404*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CDirPathTime> _extractedFolders; 405*f6dc9357SAndroid Build Coastguard Worker 406*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32 407*f6dc9357SAndroid Build Coastguard Worker // CObjectVector<NWindows::NFile::NDir::CDelayedSymLink> _delayedSymLinks; 408*f6dc9357SAndroid Build Coastguard Worker #endif 409*f6dc9357SAndroid Build Coastguard Worker 410*f6dc9357SAndroid Build Coastguard Worker void CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath); 411*f6dc9357SAndroid Build Coastguard Worker HRESULT GetTime(UInt32 index, PROPID propID, CArcTime &ft); 412*f6dc9357SAndroid Build Coastguard Worker HRESULT GetUnpackSize(); 413*f6dc9357SAndroid Build Coastguard Worker 414*f6dc9357SAndroid Build Coastguard Worker FString Hash_GetFullFilePath(); 415*f6dc9357SAndroid Build Coastguard Worker 416*f6dc9357SAndroid Build Coastguard Worker void SetAttrib(); 417*f6dc9357SAndroid Build Coastguard Worker 418*f6dc9357SAndroid Build Coastguard Worker public: 419*f6dc9357SAndroid Build Coastguard Worker HRESULT SendMessageError(const char *message, const FString &path); 420*f6dc9357SAndroid Build Coastguard Worker HRESULT SendMessageError_with_Error(HRESULT errorCode, const char *message, const FString &path); 421*f6dc9357SAndroid Build Coastguard Worker HRESULT SendMessageError_with_LastError(const char *message, const FString &path); 422*f6dc9357SAndroid Build Coastguard Worker HRESULT SendMessageError2(HRESULT errorCode, const char *message, const FString &path1, const FString &path2); 423*f6dc9357SAndroid Build Coastguard Worker 424*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) && !defined(Z7_SFX) 425*f6dc9357SAndroid Build Coastguard Worker NExtract::NZoneIdMode::EEnum ZoneMode; 426*f6dc9357SAndroid Build Coastguard Worker CByteBuffer ZoneBuf; 427*f6dc9357SAndroid Build Coastguard Worker #endif 428*f6dc9357SAndroid Build Coastguard Worker 429*f6dc9357SAndroid Build Coastguard Worker CMyComPtr2_Create<ICompressProgressInfo, CLocalProgress> LocalProgressSpec; 430*f6dc9357SAndroid Build Coastguard Worker 431*f6dc9357SAndroid Build Coastguard Worker UInt64 NumFolders; 432*f6dc9357SAndroid Build Coastguard Worker UInt64 NumFiles; 433*f6dc9357SAndroid Build Coastguard Worker UInt64 NumAltStreams; 434*f6dc9357SAndroid Build Coastguard Worker UInt64 UnpackSize; 435*f6dc9357SAndroid Build Coastguard Worker UInt64 AltStreams_UnpackSize; 436*f6dc9357SAndroid Build Coastguard Worker 437*f6dc9357SAndroid Build Coastguard Worker FString DirPathPrefix_for_HashFiles; 438*f6dc9357SAndroid Build Coastguard Worker 439*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback(); 440*f6dc9357SAndroid Build Coastguard Worker 441*f6dc9357SAndroid Build Coastguard Worker void InitForMulti(bool multiArchives, 442*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::EEnum pathMode, 443*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::EEnum overwriteMode, 444*f6dc9357SAndroid Build Coastguard Worker NExtract::NZoneIdMode::EEnum zoneMode, 445*f6dc9357SAndroid Build Coastguard Worker bool keepAndReplaceEmptyDirPrefixes) 446*f6dc9357SAndroid Build Coastguard Worker { 447*f6dc9357SAndroid Build Coastguard Worker _multiArchives = multiArchives; 448*f6dc9357SAndroid Build Coastguard Worker _pathMode = pathMode; 449*f6dc9357SAndroid Build Coastguard Worker _overwriteMode = overwriteMode; 450*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE) && !defined(Z7_SFX) 451*f6dc9357SAndroid Build Coastguard Worker ZoneMode = zoneMode; 452*f6dc9357SAndroid Build Coastguard Worker #else 453*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(zoneMode) 454*f6dc9357SAndroid Build Coastguard Worker #endif 455*f6dc9357SAndroid Build Coastguard Worker _keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes; 456*f6dc9357SAndroid Build Coastguard Worker NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0; 457*f6dc9357SAndroid Build Coastguard Worker } 458*f6dc9357SAndroid Build Coastguard Worker 459*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 460*f6dc9357SAndroid Build Coastguard Worker 461*f6dc9357SAndroid Build Coastguard Worker void SetHashMethods(IHashCalc *hash) 462*f6dc9357SAndroid Build Coastguard Worker { 463*f6dc9357SAndroid Build Coastguard Worker if (!hash) 464*f6dc9357SAndroid Build Coastguard Worker return; 465*f6dc9357SAndroid Build Coastguard Worker _hashStreamSpec = new COutStreamWithHash; 466*f6dc9357SAndroid Build Coastguard Worker _hashStream = _hashStreamSpec; 467*f6dc9357SAndroid Build Coastguard Worker _hashStreamSpec->_hash = hash; 468*f6dc9357SAndroid Build Coastguard Worker } 469*f6dc9357SAndroid Build Coastguard Worker 470*f6dc9357SAndroid Build Coastguard Worker #endif 471*f6dc9357SAndroid Build Coastguard Worker 472*f6dc9357SAndroid Build Coastguard Worker void InitBeforeNewArchive(); 473*f6dc9357SAndroid Build Coastguard Worker 474*f6dc9357SAndroid Build Coastguard Worker void Init( 475*f6dc9357SAndroid Build Coastguard Worker const CExtractNtOptions &ntOptions, 476*f6dc9357SAndroid Build Coastguard Worker const NWildcard::CCensorNode *wildcardCensor, 477*f6dc9357SAndroid Build Coastguard Worker const CArc *arc, 478*f6dc9357SAndroid Build Coastguard Worker IFolderArchiveExtractCallback *extractCallback2, 479*f6dc9357SAndroid Build Coastguard Worker bool stdOutMode, bool testMode, 480*f6dc9357SAndroid Build Coastguard Worker const FString &directoryPath, 481*f6dc9357SAndroid Build Coastguard Worker const UStringVector &removePathParts, bool removePartsForAltStreams, 482*f6dc9357SAndroid Build Coastguard Worker UInt64 packSize); 483*f6dc9357SAndroid Build Coastguard Worker 484*f6dc9357SAndroid Build Coastguard Worker 485*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS 486*f6dc9357SAndroid Build Coastguard Worker 487*f6dc9357SAndroid Build Coastguard Worker private: 488*f6dc9357SAndroid Build Coastguard Worker CHardLinks _hardLinks; 489*f6dc9357SAndroid Build Coastguard Worker CLinkInfo _link; 490*f6dc9357SAndroid Build Coastguard Worker 491*f6dc9357SAndroid Build Coastguard Worker // FString _copyFile_Path; 492*f6dc9357SAndroid Build Coastguard Worker // HRESULT MyCopyFile(ISequentialOutStream *outStream); 493*f6dc9357SAndroid Build Coastguard Worker HRESULT Link(const FString &fullProcessedPath); 494*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadLink(); 495*f6dc9357SAndroid Build Coastguard Worker 496*f6dc9357SAndroid Build Coastguard Worker public: 497*f6dc9357SAndroid Build Coastguard Worker // call PrepareHardLinks() after Init() 498*f6dc9357SAndroid Build Coastguard Worker HRESULT PrepareHardLinks(const CRecordVector<UInt32> *realIndices); // NULL means all items 499*f6dc9357SAndroid Build Coastguard Worker 500*f6dc9357SAndroid Build Coastguard Worker #endif 501*f6dc9357SAndroid Build Coastguard Worker 502*f6dc9357SAndroid Build Coastguard Worker 503*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_ALT_STREAMS 504*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CIndexToPathPair> _renamedFiles; 505*f6dc9357SAndroid Build Coastguard Worker #endif 506*f6dc9357SAndroid Build Coastguard Worker 507*f6dc9357SAndroid Build Coastguard Worker // call it after Init() 508*f6dc9357SAndroid Build Coastguard Worker 509*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 510*f6dc9357SAndroid Build Coastguard Worker void SetBaseParentFolderIndex(UInt32 indexInArc) 511*f6dc9357SAndroid Build Coastguard Worker { 512*f6dc9357SAndroid Build Coastguard Worker _baseParentFolder = indexInArc; 513*f6dc9357SAndroid Build Coastguard Worker _use_baseParentFolder_mode = true; 514*f6dc9357SAndroid Build Coastguard Worker } 515*f6dc9357SAndroid Build Coastguard Worker #endif 516*f6dc9357SAndroid Build Coastguard Worker 517*f6dc9357SAndroid Build Coastguard Worker HRESULT CloseArc(); 518*f6dc9357SAndroid Build Coastguard Worker 519*f6dc9357SAndroid Build Coastguard Worker private: 520*f6dc9357SAndroid Build Coastguard Worker void ClearExtractedDirsInfo() 521*f6dc9357SAndroid Build Coastguard Worker { 522*f6dc9357SAndroid Build Coastguard Worker _extractedFolders.Clear(); 523*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32 524*f6dc9357SAndroid Build Coastguard Worker // _delayedSymLinks.Clear(); 525*f6dc9357SAndroid Build Coastguard Worker #endif 526*f6dc9357SAndroid Build Coastguard Worker } 527*f6dc9357SAndroid Build Coastguard Worker 528*f6dc9357SAndroid Build Coastguard Worker HRESULT Read_fi_Props(); 529*f6dc9357SAndroid Build Coastguard Worker void CorrectPathParts(); 530*f6dc9357SAndroid Build Coastguard Worker void GetFiTimesCAM(CFiTimesCAM &pt); 531*f6dc9357SAndroid Build Coastguard Worker void CreateFolders(); 532*f6dc9357SAndroid Build Coastguard Worker 533*f6dc9357SAndroid Build Coastguard Worker HRESULT CheckExistFile(FString &fullProcessedPath, bool &needExit); 534*f6dc9357SAndroid Build Coastguard Worker HRESULT GetExtractStream(CMyComPtr<ISequentialOutStream> &outStreamLoc, bool &needExit); 535*f6dc9357SAndroid Build Coastguard Worker HRESULT GetItem(UInt32 index); 536*f6dc9357SAndroid Build Coastguard Worker 537*f6dc9357SAndroid Build Coastguard Worker HRESULT CloseFile(); 538*f6dc9357SAndroid Build Coastguard Worker HRESULT CloseReparseAndFile(); 539*f6dc9357SAndroid Build Coastguard Worker HRESULT CloseReparseAndFile2(); 540*f6dc9357SAndroid Build Coastguard Worker HRESULT SetDirsTimes(); 541*f6dc9357SAndroid Build Coastguard Worker 542*f6dc9357SAndroid Build Coastguard Worker const void *NtReparse_Data; 543*f6dc9357SAndroid Build Coastguard Worker UInt32 NtReparse_Size; 544*f6dc9357SAndroid Build Coastguard Worker 545*f6dc9357SAndroid Build Coastguard Worker #ifdef SUPPORT_LINKS 546*f6dc9357SAndroid Build Coastguard Worker HRESULT SetFromLinkPath( 547*f6dc9357SAndroid Build Coastguard Worker const FString &fullProcessedPath, 548*f6dc9357SAndroid Build Coastguard Worker const CLinkInfo &linkInfo, 549*f6dc9357SAndroid Build Coastguard Worker bool &linkWasSet); 550*f6dc9357SAndroid Build Coastguard Worker #endif 551*f6dc9357SAndroid Build Coastguard Worker }; 552*f6dc9357SAndroid Build Coastguard Worker 553*f6dc9357SAndroid Build Coastguard Worker 554*f6dc9357SAndroid Build Coastguard Worker struct CArchiveExtractCallback_Closer 555*f6dc9357SAndroid Build Coastguard Worker { 556*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback *_ref; 557*f6dc9357SAndroid Build Coastguard Worker 558*f6dc9357SAndroid Build Coastguard Worker CArchiveExtractCallback_Closer(CArchiveExtractCallback *ref): _ref(ref) {} 559*f6dc9357SAndroid Build Coastguard Worker 560*f6dc9357SAndroid Build Coastguard Worker HRESULT Close() 561*f6dc9357SAndroid Build Coastguard Worker { 562*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_OK; 563*f6dc9357SAndroid Build Coastguard Worker if (_ref) 564*f6dc9357SAndroid Build Coastguard Worker { 565*f6dc9357SAndroid Build Coastguard Worker res = _ref->CloseArc(); 566*f6dc9357SAndroid Build Coastguard Worker _ref = NULL; 567*f6dc9357SAndroid Build Coastguard Worker } 568*f6dc9357SAndroid Build Coastguard Worker return res; 569*f6dc9357SAndroid Build Coastguard Worker } 570*f6dc9357SAndroid Build Coastguard Worker 571*f6dc9357SAndroid Build Coastguard Worker ~CArchiveExtractCallback_Closer() 572*f6dc9357SAndroid Build Coastguard Worker { 573*f6dc9357SAndroid Build Coastguard Worker Close(); 574*f6dc9357SAndroid Build Coastguard Worker } 575*f6dc9357SAndroid Build Coastguard Worker }; 576*f6dc9357SAndroid Build Coastguard Worker 577*f6dc9357SAndroid Build Coastguard Worker 578*f6dc9357SAndroid Build Coastguard Worker bool CensorNode_CheckPath(const NWildcard::CCensorNode &node, const CReadArcItem &item); 579*f6dc9357SAndroid Build Coastguard Worker 580*f6dc9357SAndroid Build Coastguard Worker bool Is_ZoneId_StreamName(const wchar_t *s); 581*f6dc9357SAndroid Build Coastguard Worker void ReadZoneFile_Of_BaseFile(CFSTR fileName, CByteBuffer &buf); 582*f6dc9357SAndroid Build Coastguard Worker bool WriteZoneFile_To_BaseFile(CFSTR fileName, const CByteBuffer &buf); 583*f6dc9357SAndroid Build Coastguard Worker 584*f6dc9357SAndroid Build Coastguard Worker #endif 585