1*f6dc9357SAndroid Build Coastguard Worker // Rar5Handler.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_RAR5_HANDLER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_RAR5_HANDLER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/Blake2.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h" 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker #include "../IArchive.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 17*f6dc9357SAndroid Build Coastguard Worker namespace NRar5 { 18*f6dc9357SAndroid Build Coastguard Worker 19*f6dc9357SAndroid Build Coastguard Worker namespace NHeaderFlags 20*f6dc9357SAndroid Build Coastguard Worker { 21*f6dc9357SAndroid Build Coastguard Worker const unsigned kExtra = 1 << 0; 22*f6dc9357SAndroid Build Coastguard Worker const unsigned kData = 1 << 1; 23*f6dc9357SAndroid Build Coastguard Worker // const unsigned kUnknown = 1 << 2; 24*f6dc9357SAndroid Build Coastguard Worker const unsigned kPrevVol = 1 << 3; 25*f6dc9357SAndroid Build Coastguard Worker const unsigned kNextVol = 1 << 4; 26*f6dc9357SAndroid Build Coastguard Worker // const unsigned kIsChild = 1 << 5; 27*f6dc9357SAndroid Build Coastguard Worker // const unsigned kPreserveChild = 1 << 6; 28*f6dc9357SAndroid Build Coastguard Worker } 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker namespace NHeaderType 31*f6dc9357SAndroid Build Coastguard Worker { 32*f6dc9357SAndroid Build Coastguard Worker enum 33*f6dc9357SAndroid Build Coastguard Worker { 34*f6dc9357SAndroid Build Coastguard Worker kArc = 1, 35*f6dc9357SAndroid Build Coastguard Worker kFile, 36*f6dc9357SAndroid Build Coastguard Worker kService, 37*f6dc9357SAndroid Build Coastguard Worker kArcEncrypt, 38*f6dc9357SAndroid Build Coastguard Worker kEndOfArc 39*f6dc9357SAndroid Build Coastguard Worker }; 40*f6dc9357SAndroid Build Coastguard Worker } 41*f6dc9357SAndroid Build Coastguard Worker 42*f6dc9357SAndroid Build Coastguard Worker namespace NArcFlags 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker const unsigned kVol = 1 << 0; 45*f6dc9357SAndroid Build Coastguard Worker const unsigned kVolNumber = 1 << 1; 46*f6dc9357SAndroid Build Coastguard Worker const unsigned kSolid = 1 << 2; 47*f6dc9357SAndroid Build Coastguard Worker // const unsigned kRecovery = 1 << 3; 48*f6dc9357SAndroid Build Coastguard Worker // const unsigned kLocked = 1 << 4; 49*f6dc9357SAndroid Build Coastguard Worker } 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker const unsigned kArcExtraRecordType_Locator = 1; 52*f6dc9357SAndroid Build Coastguard Worker const unsigned kArcExtraRecordType_Metadata = 2; 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker namespace NLocatorFlags 55*f6dc9357SAndroid Build Coastguard Worker { 56*f6dc9357SAndroid Build Coastguard Worker const unsigned kQuickOpen = 1 << 0; 57*f6dc9357SAndroid Build Coastguard Worker const unsigned kRecovery = 1 << 1; 58*f6dc9357SAndroid Build Coastguard Worker } 59*f6dc9357SAndroid Build Coastguard Worker 60*f6dc9357SAndroid Build Coastguard Worker namespace NMetadataFlags 61*f6dc9357SAndroid Build Coastguard Worker { 62*f6dc9357SAndroid Build Coastguard Worker const unsigned kArcName = 1 << 0; 63*f6dc9357SAndroid Build Coastguard Worker const unsigned kCTime = 1 << 1; 64*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnixTime = 1 << 2; 65*f6dc9357SAndroid Build Coastguard Worker const unsigned kNanoSec = 1 << 3; 66*f6dc9357SAndroid Build Coastguard Worker } 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker namespace NFileFlags 69*f6dc9357SAndroid Build Coastguard Worker { 70*f6dc9357SAndroid Build Coastguard Worker const unsigned kIsDir = 1 << 0; 71*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnixTime = 1 << 1; 72*f6dc9357SAndroid Build Coastguard Worker const unsigned kCrc32 = 1 << 2; 73*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnknownSize = 1 << 3; 74*f6dc9357SAndroid Build Coastguard Worker } 75*f6dc9357SAndroid Build Coastguard Worker 76*f6dc9357SAndroid Build Coastguard Worker namespace NMethodFlags 77*f6dc9357SAndroid Build Coastguard Worker { 78*f6dc9357SAndroid Build Coastguard Worker // const unsigned kVersionMask = 0x3F; 79*f6dc9357SAndroid Build Coastguard Worker const unsigned kSolid = 1 << 6; 80*f6dc9357SAndroid Build Coastguard Worker const unsigned kRar5_Compat = 1u << 20; 81*f6dc9357SAndroid Build Coastguard Worker } 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker namespace NArcEndFlags 84*f6dc9357SAndroid Build Coastguard Worker { 85*f6dc9357SAndroid Build Coastguard Worker const unsigned kMoreVols = 1 << 0; 86*f6dc9357SAndroid Build Coastguard Worker } 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker enum EHostOS 89*f6dc9357SAndroid Build Coastguard Worker { 90*f6dc9357SAndroid Build Coastguard Worker kHost_Windows = 0, 91*f6dc9357SAndroid Build Coastguard Worker kHost_Unix 92*f6dc9357SAndroid Build Coastguard Worker }; 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker 96*f6dc9357SAndroid Build Coastguard Worker // ---------- Extra ---------- 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker namespace NExtraID 99*f6dc9357SAndroid Build Coastguard Worker { 100*f6dc9357SAndroid Build Coastguard Worker enum 101*f6dc9357SAndroid Build Coastguard Worker { 102*f6dc9357SAndroid Build Coastguard Worker kCrypto = 1, 103*f6dc9357SAndroid Build Coastguard Worker kHash, 104*f6dc9357SAndroid Build Coastguard Worker kTime, 105*f6dc9357SAndroid Build Coastguard Worker kVersion, 106*f6dc9357SAndroid Build Coastguard Worker kLink, 107*f6dc9357SAndroid Build Coastguard Worker kUnixOwner, 108*f6dc9357SAndroid Build Coastguard Worker kSubdata 109*f6dc9357SAndroid Build Coastguard Worker }; 110*f6dc9357SAndroid Build Coastguard Worker } 111*f6dc9357SAndroid Build Coastguard Worker 112*f6dc9357SAndroid Build Coastguard Worker const unsigned kCryptoAlgo_AES = 0; 113*f6dc9357SAndroid Build Coastguard Worker 114*f6dc9357SAndroid Build Coastguard Worker namespace NCryptoFlags 115*f6dc9357SAndroid Build Coastguard Worker { 116*f6dc9357SAndroid Build Coastguard Worker const unsigned kPswCheck = 1 << 0; 117*f6dc9357SAndroid Build Coastguard Worker const unsigned kUseMAC = 1 << 1; 118*f6dc9357SAndroid Build Coastguard Worker } 119*f6dc9357SAndroid Build Coastguard Worker 120*f6dc9357SAndroid Build Coastguard Worker struct CCryptoInfo 121*f6dc9357SAndroid Build Coastguard Worker { 122*f6dc9357SAndroid Build Coastguard Worker UInt64 Algo; 123*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 124*f6dc9357SAndroid Build Coastguard Worker Byte Cnt; 125*f6dc9357SAndroid Build Coastguard Worker UseMACCCryptoInfo126*f6dc9357SAndroid Build Coastguard Worker bool UseMAC() const { return (Flags & NCryptoFlags::kUseMAC) != 0; } IsThereCheckCCryptoInfo127*f6dc9357SAndroid Build Coastguard Worker bool IsThereCheck() const { return (Flags & NCryptoFlags::kPswCheck) != 0; } 128*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, size_t size); 129*f6dc9357SAndroid Build Coastguard Worker }; 130*f6dc9357SAndroid Build Coastguard Worker 131*f6dc9357SAndroid Build Coastguard Worker const unsigned kHashID_Blake2sp = 0; 132*f6dc9357SAndroid Build Coastguard Worker 133*f6dc9357SAndroid Build Coastguard Worker namespace NTimeRecord 134*f6dc9357SAndroid Build Coastguard Worker { 135*f6dc9357SAndroid Build Coastguard Worker enum 136*f6dc9357SAndroid Build Coastguard Worker { 137*f6dc9357SAndroid Build Coastguard Worker k_Index_MTime = 0, 138*f6dc9357SAndroid Build Coastguard Worker k_Index_CTime, 139*f6dc9357SAndroid Build Coastguard Worker k_Index_ATime 140*f6dc9357SAndroid Build Coastguard Worker }; 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker namespace NFlags 143*f6dc9357SAndroid Build Coastguard Worker { 144*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnixTime = 1 << 0; 145*f6dc9357SAndroid Build Coastguard Worker const unsigned kMTime = 1 << 1; 146*f6dc9357SAndroid Build Coastguard Worker const unsigned kCTime = 1 << 2; 147*f6dc9357SAndroid Build Coastguard Worker const unsigned kATime = 1 << 3; 148*f6dc9357SAndroid Build Coastguard Worker const unsigned kUnixNs = 1 << 4; 149*f6dc9357SAndroid Build Coastguard Worker } 150*f6dc9357SAndroid Build Coastguard Worker } 151*f6dc9357SAndroid Build Coastguard Worker 152*f6dc9357SAndroid Build Coastguard Worker namespace NLinkType 153*f6dc9357SAndroid Build Coastguard Worker { 154*f6dc9357SAndroid Build Coastguard Worker enum 155*f6dc9357SAndroid Build Coastguard Worker { 156*f6dc9357SAndroid Build Coastguard Worker kUnixSymLink = 1, 157*f6dc9357SAndroid Build Coastguard Worker kWinSymLink, 158*f6dc9357SAndroid Build Coastguard Worker kWinJunction, 159*f6dc9357SAndroid Build Coastguard Worker kHardLink, 160*f6dc9357SAndroid Build Coastguard Worker kFileCopy 161*f6dc9357SAndroid Build Coastguard Worker }; 162*f6dc9357SAndroid Build Coastguard Worker } 163*f6dc9357SAndroid Build Coastguard Worker 164*f6dc9357SAndroid Build Coastguard Worker namespace NLinkFlags 165*f6dc9357SAndroid Build Coastguard Worker { 166*f6dc9357SAndroid Build Coastguard Worker const unsigned kTargetIsDir = 1 << 0; 167*f6dc9357SAndroid Build Coastguard Worker } 168*f6dc9357SAndroid Build Coastguard Worker 169*f6dc9357SAndroid Build Coastguard Worker 170*f6dc9357SAndroid Build Coastguard Worker struct CLinkInfo 171*f6dc9357SAndroid Build Coastguard Worker { 172*f6dc9357SAndroid Build Coastguard Worker UInt64 Type; 173*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 174*f6dc9357SAndroid Build Coastguard Worker unsigned NameOffset; 175*f6dc9357SAndroid Build Coastguard Worker unsigned NameLen; 176*f6dc9357SAndroid Build Coastguard Worker 177*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, unsigned size); 178*f6dc9357SAndroid Build Coastguard Worker }; 179*f6dc9357SAndroid Build Coastguard Worker 180*f6dc9357SAndroid Build Coastguard Worker 181*f6dc9357SAndroid Build Coastguard Worker struct CItem 182*f6dc9357SAndroid Build Coastguard Worker { 183*f6dc9357SAndroid Build Coastguard Worker UInt32 CommonFlags; 184*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags; 185*f6dc9357SAndroid Build Coastguard Worker 186*f6dc9357SAndroid Build Coastguard Worker Byte RecordType; 187*f6dc9357SAndroid Build Coastguard Worker bool Version_Defined; 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker int ACL; 190*f6dc9357SAndroid Build Coastguard Worker 191*f6dc9357SAndroid Build Coastguard Worker AString Name; 192*f6dc9357SAndroid Build Coastguard Worker 193*f6dc9357SAndroid Build Coastguard Worker unsigned VolIndex; 194*f6dc9357SAndroid Build Coastguard Worker int NextItem; // in _items{} 195*f6dc9357SAndroid Build Coastguard Worker 196*f6dc9357SAndroid Build Coastguard Worker UInt32 UnixMTime; 197*f6dc9357SAndroid Build Coastguard Worker UInt32 CRC; 198*f6dc9357SAndroid Build Coastguard Worker UInt32 Attrib; 199*f6dc9357SAndroid Build Coastguard Worker UInt32 Method; 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Extra; 202*f6dc9357SAndroid Build Coastguard Worker 203*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 204*f6dc9357SAndroid Build Coastguard Worker UInt64 PackSize; 205*f6dc9357SAndroid Build Coastguard Worker UInt64 HostOS; 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard Worker UInt64 DataPos; 208*f6dc9357SAndroid Build Coastguard Worker UInt64 Version; 209*f6dc9357SAndroid Build Coastguard Worker CItemCItem210*f6dc9357SAndroid Build Coastguard Worker CItem() { Clear(); } 211*f6dc9357SAndroid Build Coastguard Worker ClearCItem212*f6dc9357SAndroid Build Coastguard Worker void Clear() 213*f6dc9357SAndroid Build Coastguard Worker { 214*f6dc9357SAndroid Build Coastguard Worker // CommonFlags = 0; 215*f6dc9357SAndroid Build Coastguard Worker // Flags = 0; 216*f6dc9357SAndroid Build Coastguard Worker 217*f6dc9357SAndroid Build Coastguard Worker // UnixMTime = 0; 218*f6dc9357SAndroid Build Coastguard Worker // CRC = 0; 219*f6dc9357SAndroid Build Coastguard Worker 220*f6dc9357SAndroid Build Coastguard Worker VolIndex = 0; 221*f6dc9357SAndroid Build Coastguard Worker NextItem = -1; 222*f6dc9357SAndroid Build Coastguard Worker 223*f6dc9357SAndroid Build Coastguard Worker Version_Defined = false; 224*f6dc9357SAndroid Build Coastguard Worker Version = 0; 225*f6dc9357SAndroid Build Coastguard Worker 226*f6dc9357SAndroid Build Coastguard Worker Name.Empty(); 227*f6dc9357SAndroid Build Coastguard Worker Extra.Free(); 228*f6dc9357SAndroid Build Coastguard Worker ACL = -1; 229*f6dc9357SAndroid Build Coastguard Worker } 230*f6dc9357SAndroid Build Coastguard Worker IsSplitBeforeCItem231*f6dc9357SAndroid Build Coastguard Worker bool IsSplitBefore() const { return (CommonFlags & NHeaderFlags::kPrevVol) != 0; } IsSplitAfterCItem232*f6dc9357SAndroid Build Coastguard Worker bool IsSplitAfter() const { return (CommonFlags & NHeaderFlags::kNextVol) != 0; } IsSplitCItem233*f6dc9357SAndroid Build Coastguard Worker bool IsSplit() const { return (CommonFlags & (NHeaderFlags::kPrevVol | NHeaderFlags::kNextVol)) != 0; } 234*f6dc9357SAndroid Build Coastguard Worker IsDirCItem235*f6dc9357SAndroid Build Coastguard Worker bool IsDir() const { return (Flags & NFileFlags::kIsDir) != 0; } Has_UnixMTimeCItem236*f6dc9357SAndroid Build Coastguard Worker bool Has_UnixMTime() const { return (Flags & NFileFlags::kUnixTime) != 0; } Has_CRCCItem237*f6dc9357SAndroid Build Coastguard Worker bool Has_CRC() const { return (Flags & NFileFlags::kCrc32) != 0; } Is_UnknownSizeCItem238*f6dc9357SAndroid Build Coastguard Worker bool Is_UnknownSize() const { return (Flags & NFileFlags::kUnknownSize) != 0; } 239*f6dc9357SAndroid Build Coastguard Worker IsNextForItemCItem240*f6dc9357SAndroid Build Coastguard Worker bool IsNextForItem(const CItem &prev) const 241*f6dc9357SAndroid Build Coastguard Worker { 242*f6dc9357SAndroid Build Coastguard Worker return !IsDir() && !prev.IsDir() && IsSplitBefore() && prev.IsSplitAfter() && (Name == prev.Name); 243*f6dc9357SAndroid Build Coastguard Worker // && false; 244*f6dc9357SAndroid Build Coastguard Worker } 245*f6dc9357SAndroid Build Coastguard Worker 246*f6dc9357SAndroid Build Coastguard Worker // rar docs: Solid flag can be set only for file headers and is never set for service headers. IsSolidCItem247*f6dc9357SAndroid Build Coastguard Worker bool IsSolid() const { return ((UInt32)Method & NMethodFlags::kSolid) != 0; } Is_Rar5_CompatCItem248*f6dc9357SAndroid Build Coastguard Worker bool Is_Rar5_Compat() const { return ((UInt32)Method & NMethodFlags::kRar5_Compat) != 0; } Get_Rar5_CompatBitCItem249*f6dc9357SAndroid Build Coastguard Worker unsigned Get_Rar5_CompatBit() const { return ((UInt32)Method >> 20) & 1; } 250*f6dc9357SAndroid Build Coastguard Worker Get_AlgoVersion_RawBitsCItem251*f6dc9357SAndroid Build Coastguard Worker unsigned Get_AlgoVersion_RawBits() const { return (unsigned)Method & 0x3F; } Get_AlgoVersion_HuffRevCItem252*f6dc9357SAndroid Build Coastguard Worker unsigned Get_AlgoVersion_HuffRev() const 253*f6dc9357SAndroid Build Coastguard Worker { 254*f6dc9357SAndroid Build Coastguard Worker unsigned w = (unsigned)Method & 0x3F; 255*f6dc9357SAndroid Build Coastguard Worker if (w == 1 && Is_Rar5_Compat()) 256*f6dc9357SAndroid Build Coastguard Worker w = 0; 257*f6dc9357SAndroid Build Coastguard Worker return w; 258*f6dc9357SAndroid Build Coastguard Worker } Get_MethodCItem259*f6dc9357SAndroid Build Coastguard Worker unsigned Get_Method() const { return ((unsigned)Method >> 7) & 0x7; } 260*f6dc9357SAndroid Build Coastguard Worker Get_DictSize_MainCItem261*f6dc9357SAndroid Build Coastguard Worker unsigned Get_DictSize_Main() const 262*f6dc9357SAndroid Build Coastguard Worker { return ((UInt32)Method >> 10) & (Get_AlgoVersion_RawBits() == 0 ? 0xf : 0x1f); } Get_DictSize_FracCItem263*f6dc9357SAndroid Build Coastguard Worker unsigned Get_DictSize_Frac() const 264*f6dc9357SAndroid Build Coastguard Worker { 265*f6dc9357SAndroid Build Coastguard Worker // original-unrar ignores Frac, if (algo==0) (rar5): 266*f6dc9357SAndroid Build Coastguard Worker if (Get_AlgoVersion_RawBits() == 0) 267*f6dc9357SAndroid Build Coastguard Worker return 0; 268*f6dc9357SAndroid Build Coastguard Worker return ((UInt32)Method >> 15) & 0x1f; 269*f6dc9357SAndroid Build Coastguard Worker } Get_DictSize64CItem270*f6dc9357SAndroid Build Coastguard Worker UInt64 Get_DictSize64() const 271*f6dc9357SAndroid Build Coastguard Worker { 272*f6dc9357SAndroid Build Coastguard Worker // ver 6.* check 273*f6dc9357SAndroid Build Coastguard Worker // return (((UInt32)Method >> 10) & 0xF); 274*f6dc9357SAndroid Build Coastguard Worker UInt64 winSize = 0; 275*f6dc9357SAndroid Build Coastguard Worker const unsigned algo = Get_AlgoVersion_RawBits(); 276*f6dc9357SAndroid Build Coastguard Worker if (algo <= 1) 277*f6dc9357SAndroid Build Coastguard Worker { 278*f6dc9357SAndroid Build Coastguard Worker UInt32 w = 32; 279*f6dc9357SAndroid Build Coastguard Worker if (algo == 1) 280*f6dc9357SAndroid Build Coastguard Worker w += Get_DictSize_Frac(); 281*f6dc9357SAndroid Build Coastguard Worker winSize = (UInt64)w << (12 + Get_DictSize_Main()); 282*f6dc9357SAndroid Build Coastguard Worker } 283*f6dc9357SAndroid Build Coastguard Worker return winSize; 284*f6dc9357SAndroid Build Coastguard Worker } 285*f6dc9357SAndroid Build Coastguard Worker 286*f6dc9357SAndroid Build Coastguard Worker IsServiceCItem287*f6dc9357SAndroid Build Coastguard Worker bool IsService() const { return RecordType == NHeaderType::kService; } 288*f6dc9357SAndroid Build Coastguard Worker Is_STMCItem289*f6dc9357SAndroid Build Coastguard Worker bool Is_STM() const { return IsService() && Name == "STM"; } Is_CMTCItem290*f6dc9357SAndroid Build Coastguard Worker bool Is_CMT() const { return IsService() && Name == "CMT"; } Is_ACLCItem291*f6dc9357SAndroid Build Coastguard Worker bool Is_ACL() const { return IsService() && Name == "ACL"; } 292*f6dc9357SAndroid Build Coastguard Worker // bool Is_QO() const { return IsService() && Name == "QO"; } 293*f6dc9357SAndroid Build Coastguard Worker 294*f6dc9357SAndroid Build Coastguard Worker int FindExtra(unsigned extraID, unsigned &recordDataSize) const; 295*f6dc9357SAndroid Build Coastguard Worker void PrintInfo(AString &s) const; 296*f6dc9357SAndroid Build Coastguard Worker 297*f6dc9357SAndroid Build Coastguard Worker IsEncryptedCItem298*f6dc9357SAndroid Build Coastguard Worker bool IsEncrypted() const 299*f6dc9357SAndroid Build Coastguard Worker { 300*f6dc9357SAndroid Build Coastguard Worker unsigned size; 301*f6dc9357SAndroid Build Coastguard Worker return FindExtra(NExtraID::kCrypto, size) >= 0; 302*f6dc9357SAndroid Build Coastguard Worker } 303*f6dc9357SAndroid Build Coastguard Worker FindExtra_BlakeCItem304*f6dc9357SAndroid Build Coastguard Worker int FindExtra_Blake() const 305*f6dc9357SAndroid Build Coastguard Worker { 306*f6dc9357SAndroid Build Coastguard Worker unsigned size = 0; 307*f6dc9357SAndroid Build Coastguard Worker const int offset = FindExtra(NExtraID::kHash, size); 308*f6dc9357SAndroid Build Coastguard Worker if (offset >= 0 309*f6dc9357SAndroid Build Coastguard Worker && size == Z7_BLAKE2S_DIGEST_SIZE + 1 310*f6dc9357SAndroid Build Coastguard Worker && Extra[(unsigned)offset] == kHashID_Blake2sp) 311*f6dc9357SAndroid Build Coastguard Worker return offset + 1; 312*f6dc9357SAndroid Build Coastguard Worker return -1; 313*f6dc9357SAndroid Build Coastguard Worker } 314*f6dc9357SAndroid Build Coastguard Worker 315*f6dc9357SAndroid Build Coastguard Worker bool FindExtra_Version(UInt64 &version) const; 316*f6dc9357SAndroid Build Coastguard Worker 317*f6dc9357SAndroid Build Coastguard Worker bool FindExtra_Link(CLinkInfo &link) const; 318*f6dc9357SAndroid Build Coastguard Worker void Link_to_Prop(unsigned linkType, NWindows::NCOM::CPropVariant &prop) const; 319*f6dc9357SAndroid Build Coastguard Worker bool Is_CopyLink() const; 320*f6dc9357SAndroid Build Coastguard Worker bool Is_HardLink() const; 321*f6dc9357SAndroid Build Coastguard Worker bool Is_CopyLink_or_HardLink() const; 322*f6dc9357SAndroid Build Coastguard Worker NeedUse_as_CopyLinkCItem323*f6dc9357SAndroid Build Coastguard Worker bool NeedUse_as_CopyLink() const { return PackSize == 0 && Is_CopyLink(); } NeedUse_as_HardLinkCItem324*f6dc9357SAndroid Build Coastguard Worker bool NeedUse_as_HardLink() const { return PackSize == 0 && Is_HardLink(); } NeedUse_as_CopyLink_or_HardLinkCItem325*f6dc9357SAndroid Build Coastguard Worker bool NeedUse_as_CopyLink_or_HardLink() const { return PackSize == 0 && Is_CopyLink_or_HardLink(); } 326*f6dc9357SAndroid Build Coastguard Worker 327*f6dc9357SAndroid Build Coastguard Worker bool GetAltStreamName(AString &name) const; 328*f6dc9357SAndroid Build Coastguard Worker GetWinAttribCItem329*f6dc9357SAndroid Build Coastguard Worker UInt32 GetWinAttrib() const 330*f6dc9357SAndroid Build Coastguard Worker { 331*f6dc9357SAndroid Build Coastguard Worker UInt32 a; 332*f6dc9357SAndroid Build Coastguard Worker switch (HostOS) 333*f6dc9357SAndroid Build Coastguard Worker { 334*f6dc9357SAndroid Build Coastguard Worker case kHost_Windows: 335*f6dc9357SAndroid Build Coastguard Worker a = Attrib; 336*f6dc9357SAndroid Build Coastguard Worker break; 337*f6dc9357SAndroid Build Coastguard Worker case kHost_Unix: 338*f6dc9357SAndroid Build Coastguard Worker a = Attrib << 16; 339*f6dc9357SAndroid Build Coastguard Worker a |= 0x8000; // add posix mode marker 340*f6dc9357SAndroid Build Coastguard Worker break; 341*f6dc9357SAndroid Build Coastguard Worker default: 342*f6dc9357SAndroid Build Coastguard Worker a = 0; 343*f6dc9357SAndroid Build Coastguard Worker } 344*f6dc9357SAndroid Build Coastguard Worker if (IsDir()) a |= FILE_ATTRIBUTE_DIRECTORY; 345*f6dc9357SAndroid Build Coastguard Worker return a; 346*f6dc9357SAndroid Build Coastguard Worker } 347*f6dc9357SAndroid Build Coastguard Worker GetDataPositionCItem348*f6dc9357SAndroid Build Coastguard Worker UInt64 GetDataPosition() const { return DataPos; } 349*f6dc9357SAndroid Build Coastguard Worker }; 350*f6dc9357SAndroid Build Coastguard Worker 351*f6dc9357SAndroid Build Coastguard Worker 352*f6dc9357SAndroid Build Coastguard Worker struct CInArcInfo 353*f6dc9357SAndroid Build Coastguard Worker { 354*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 355*f6dc9357SAndroid Build Coastguard Worker UInt64 VolNumber; 356*f6dc9357SAndroid Build Coastguard Worker UInt64 StartPos; 357*f6dc9357SAndroid Build Coastguard Worker UInt64 EndPos; 358*f6dc9357SAndroid Build Coastguard Worker 359*f6dc9357SAndroid Build Coastguard Worker UInt64 EndFlags; 360*f6dc9357SAndroid Build Coastguard Worker bool EndOfArchive_was_Read; 361*f6dc9357SAndroid Build Coastguard Worker 362*f6dc9357SAndroid Build Coastguard Worker bool IsEncrypted; 363*f6dc9357SAndroid Build Coastguard Worker bool Locator_Defined; 364*f6dc9357SAndroid Build Coastguard Worker bool Locator_Error; 365*f6dc9357SAndroid Build Coastguard Worker bool Metadata_Defined; 366*f6dc9357SAndroid Build Coastguard Worker bool Metadata_Error; 367*f6dc9357SAndroid Build Coastguard Worker bool UnknownExtraRecord; 368*f6dc9357SAndroid Build Coastguard Worker bool Extra_Error; 369*f6dc9357SAndroid Build Coastguard Worker bool UnsupportedFeature; 370*f6dc9357SAndroid Build Coastguard Worker 371*f6dc9357SAndroid Build Coastguard Worker struct CLocator 372*f6dc9357SAndroid Build Coastguard Worker { 373*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 374*f6dc9357SAndroid Build Coastguard Worker UInt64 QuickOpen; 375*f6dc9357SAndroid Build Coastguard Worker UInt64 Recovery; 376*f6dc9357SAndroid Build Coastguard Worker Is_QuickOpenCInArcInfo::CLocator377*f6dc9357SAndroid Build Coastguard Worker bool Is_QuickOpen() const { return (Flags & NLocatorFlags::kQuickOpen) != 0; } Is_RecoveryCInArcInfo::CLocator378*f6dc9357SAndroid Build Coastguard Worker bool Is_Recovery() const { return (Flags & NLocatorFlags::kRecovery) != 0; } 379*f6dc9357SAndroid Build Coastguard Worker 380*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, size_t size); CLocatorCInArcInfo::CLocator381*f6dc9357SAndroid Build Coastguard Worker CLocator(): 382*f6dc9357SAndroid Build Coastguard Worker Flags(0), 383*f6dc9357SAndroid Build Coastguard Worker QuickOpen(0), 384*f6dc9357SAndroid Build Coastguard Worker Recovery(0) 385*f6dc9357SAndroid Build Coastguard Worker {} 386*f6dc9357SAndroid Build Coastguard Worker }; 387*f6dc9357SAndroid Build Coastguard Worker 388*f6dc9357SAndroid Build Coastguard Worker struct CMetadata 389*f6dc9357SAndroid Build Coastguard Worker { 390*f6dc9357SAndroid Build Coastguard Worker UInt64 Flags; 391*f6dc9357SAndroid Build Coastguard Worker UInt64 CTime; 392*f6dc9357SAndroid Build Coastguard Worker AString ArcName; 393*f6dc9357SAndroid Build Coastguard Worker 394*f6dc9357SAndroid Build Coastguard Worker bool Parse(const Byte *p, size_t size); CMetadataCInArcInfo::CMetadata395*f6dc9357SAndroid Build Coastguard Worker CMetadata(): 396*f6dc9357SAndroid Build Coastguard Worker Flags(0), 397*f6dc9357SAndroid Build Coastguard Worker CTime(0) 398*f6dc9357SAndroid Build Coastguard Worker {} 399*f6dc9357SAndroid Build Coastguard Worker }; 400*f6dc9357SAndroid Build Coastguard Worker 401*f6dc9357SAndroid Build Coastguard Worker CLocator Locator; 402*f6dc9357SAndroid Build Coastguard Worker CMetadata Metadata; 403*f6dc9357SAndroid Build Coastguard Worker 404*f6dc9357SAndroid Build Coastguard Worker bool ParseExtra(const Byte *p, size_t size); 405*f6dc9357SAndroid Build Coastguard Worker CInArcInfoCInArcInfo406*f6dc9357SAndroid Build Coastguard Worker CInArcInfo(): 407*f6dc9357SAndroid Build Coastguard Worker Flags(0), 408*f6dc9357SAndroid Build Coastguard Worker VolNumber(0), 409*f6dc9357SAndroid Build Coastguard Worker StartPos(0), 410*f6dc9357SAndroid Build Coastguard Worker EndPos(0), 411*f6dc9357SAndroid Build Coastguard Worker EndFlags(0), 412*f6dc9357SAndroid Build Coastguard Worker EndOfArchive_was_Read(false), 413*f6dc9357SAndroid Build Coastguard Worker IsEncrypted(false), 414*f6dc9357SAndroid Build Coastguard Worker Locator_Defined(false), 415*f6dc9357SAndroid Build Coastguard Worker Locator_Error(false), 416*f6dc9357SAndroid Build Coastguard Worker Metadata_Defined(false), 417*f6dc9357SAndroid Build Coastguard Worker Metadata_Error(false), 418*f6dc9357SAndroid Build Coastguard Worker UnknownExtraRecord(false), 419*f6dc9357SAndroid Build Coastguard Worker Extra_Error(false), 420*f6dc9357SAndroid Build Coastguard Worker UnsupportedFeature(false) 421*f6dc9357SAndroid Build Coastguard Worker {} 422*f6dc9357SAndroid Build Coastguard Worker 423*f6dc9357SAndroid Build Coastguard Worker /* 424*f6dc9357SAndroid Build Coastguard Worker void Clear() 425*f6dc9357SAndroid Build Coastguard Worker { 426*f6dc9357SAndroid Build Coastguard Worker Flags = 0; 427*f6dc9357SAndroid Build Coastguard Worker VolNumber = 0; 428*f6dc9357SAndroid Build Coastguard Worker StartPos = 0; 429*f6dc9357SAndroid Build Coastguard Worker EndPos = 0; 430*f6dc9357SAndroid Build Coastguard Worker EndFlags = 0; 431*f6dc9357SAndroid Build Coastguard Worker EndOfArchive_was_Read = false; 432*f6dc9357SAndroid Build Coastguard Worker } 433*f6dc9357SAndroid Build Coastguard Worker */ 434*f6dc9357SAndroid Build Coastguard Worker GetPhySizeCInArcInfo435*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPhySize() const { return EndPos - StartPos; } 436*f6dc9357SAndroid Build Coastguard Worker AreMoreVolumesCInArcInfo437*f6dc9357SAndroid Build Coastguard Worker bool AreMoreVolumes() const { return (EndFlags & NArcEndFlags::kMoreVols) != 0; } 438*f6dc9357SAndroid Build Coastguard Worker IsVolumeCInArcInfo439*f6dc9357SAndroid Build Coastguard Worker bool IsVolume() const { return (Flags & NArcFlags::kVol) != 0; } IsSolidCInArcInfo440*f6dc9357SAndroid Build Coastguard Worker bool IsSolid() const { return (Flags & NArcFlags::kSolid) != 0; } Is_VolNumber_DefinedCInArcInfo441*f6dc9357SAndroid Build Coastguard Worker bool Is_VolNumber_Defined() const { return (Flags & NArcFlags::kVolNumber) != 0; } 442*f6dc9357SAndroid Build Coastguard Worker GetVolIndexCInArcInfo443*f6dc9357SAndroid Build Coastguard Worker UInt64 GetVolIndex() const { return Is_VolNumber_Defined() ? VolNumber : 0; } 444*f6dc9357SAndroid Build Coastguard Worker }; 445*f6dc9357SAndroid Build Coastguard Worker 446*f6dc9357SAndroid Build Coastguard Worker 447*f6dc9357SAndroid Build Coastguard Worker struct CRefItem 448*f6dc9357SAndroid Build Coastguard Worker { 449*f6dc9357SAndroid Build Coastguard Worker unsigned Item; // First item in _items[] 450*f6dc9357SAndroid Build Coastguard Worker unsigned Last; // Last item in _items[] 451*f6dc9357SAndroid Build Coastguard Worker int Parent; // in _refs[], if alternate stream 452*f6dc9357SAndroid Build Coastguard Worker int Link; // in _refs[] 453*f6dc9357SAndroid Build Coastguard Worker }; 454*f6dc9357SAndroid Build Coastguard Worker 455*f6dc9357SAndroid Build Coastguard Worker 456*f6dc9357SAndroid Build Coastguard Worker struct CArc 457*f6dc9357SAndroid Build Coastguard Worker { 458*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream; 459*f6dc9357SAndroid Build Coastguard Worker CInArcInfo Info; 460*f6dc9357SAndroid Build Coastguard Worker }; 461*f6dc9357SAndroid Build Coastguard Worker 462*f6dc9357SAndroid Build Coastguard Worker 463*f6dc9357SAndroid Build Coastguard Worker class CHandler Z7_final: 464*f6dc9357SAndroid Build Coastguard Worker public IInArchive, 465*f6dc9357SAndroid Build Coastguard Worker public IArchiveGetRawProps, 466*f6dc9357SAndroid Build Coastguard Worker public ISetProperties, 467*f6dc9357SAndroid Build Coastguard Worker Z7_PUBLIC_ISetCompressCodecsInfo_IFEC 468*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 469*f6dc9357SAndroid Build Coastguard Worker { 470*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN2(IInArchive) 471*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveGetRawProps) 472*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ISetProperties) 473*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC 474*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END 475*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE 476*f6dc9357SAndroid Build Coastguard Worker 477*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IInArchive) 478*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveGetRawProps) 479*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ISetProperties) 480*f6dc9357SAndroid Build Coastguard Worker DECL_ISetCompressCodecsInfo 481*f6dc9357SAndroid Build Coastguard Worker 482*f6dc9357SAndroid Build Coastguard Worker void InitDefaults(); 483*f6dc9357SAndroid Build Coastguard Worker 484*f6dc9357SAndroid Build Coastguard Worker bool _isArc; 485*f6dc9357SAndroid Build Coastguard Worker bool _needChecksumCheck; 486*f6dc9357SAndroid Build Coastguard Worker bool _memUsage_WasSet; 487*f6dc9357SAndroid Build Coastguard Worker bool _comment_WasUsedInArc; 488*f6dc9357SAndroid Build Coastguard Worker bool _acl_Used; 489*f6dc9357SAndroid Build Coastguard Worker bool _error_in_ACL; 490*f6dc9357SAndroid Build Coastguard Worker bool _split_Error; 491*f6dc9357SAndroid Build Coastguard Worker public: 492*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CRefItem> _refs; 493*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CItem> _items; 494*f6dc9357SAndroid Build Coastguard Worker 495*f6dc9357SAndroid Build Coastguard Worker CHandler(); 496*f6dc9357SAndroid Build Coastguard Worker private: 497*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CArc> _arcs; 498*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CByteBuffer> _acls; 499*f6dc9357SAndroid Build Coastguard Worker 500*f6dc9357SAndroid Build Coastguard Worker UInt32 _errorFlags; 501*f6dc9357SAndroid Build Coastguard Worker // UInt32 _warningFlags; 502*f6dc9357SAndroid Build Coastguard Worker 503*f6dc9357SAndroid Build Coastguard Worker UInt32 _numBlocks; 504*f6dc9357SAndroid Build Coastguard Worker unsigned _rar5comapt_mask; 505*f6dc9357SAndroid Build Coastguard Worker unsigned _methodMasks[2]; 506*f6dc9357SAndroid Build Coastguard Worker UInt64 _algo_Mask; 507*f6dc9357SAndroid Build Coastguard Worker UInt64 _dictMaxSizes[2]; 508*f6dc9357SAndroid Build Coastguard Worker 509*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _comment; 510*f6dc9357SAndroid Build Coastguard Worker UString _missingVolName; 511*f6dc9357SAndroid Build Coastguard Worker 512*f6dc9357SAndroid Build Coastguard Worker UInt64 _memUsage_Decompress; 513*f6dc9357SAndroid Build Coastguard Worker 514*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_VARS 515*f6dc9357SAndroid Build Coastguard Worker 516*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPackSize(unsigned refIndex) const; 517*f6dc9357SAndroid Build Coastguard Worker 518*f6dc9357SAndroid Build Coastguard Worker void FillLinks(); 519*f6dc9357SAndroid Build Coastguard Worker 520*f6dc9357SAndroid Build Coastguard Worker HRESULT Open2(IInStream *stream, 521*f6dc9357SAndroid Build Coastguard Worker const UInt64 *maxCheckStartPosition, 522*f6dc9357SAndroid Build Coastguard Worker IArchiveOpenCallback *openCallback); 523*f6dc9357SAndroid Build Coastguard Worker }; 524*f6dc9357SAndroid Build Coastguard Worker 525*f6dc9357SAndroid Build Coastguard Worker }} 526*f6dc9357SAndroid Build Coastguard Worker 527*f6dc9357SAndroid Build Coastguard Worker #endif 528