1*f6dc9357SAndroid Build Coastguard Worker // Archive/ZipItem.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_ZIP_ITEM_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_ZIP_ITEM_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h" 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "ZipHeader.h" 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 15*f6dc9357SAndroid Build Coastguard Worker namespace NZip { 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker /* 18*f6dc9357SAndroid Build Coastguard Worker extern const char *k_SpecName_NTFS_STREAM; 19*f6dc9357SAndroid Build Coastguard Worker extern const char *k_SpecName_MAC_RESOURCE_FORK; 20*f6dc9357SAndroid Build Coastguard Worker */ 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker struct CVersion 23*f6dc9357SAndroid Build Coastguard Worker { 24*f6dc9357SAndroid Build Coastguard Worker Byte Version; 25*f6dc9357SAndroid Build Coastguard Worker Byte HostOS; 26*f6dc9357SAndroid Build Coastguard Worker }; 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker struct CExtraSubBlock 29*f6dc9357SAndroid Build Coastguard Worker { 30*f6dc9357SAndroid Build Coastguard Worker UInt32 ID; 31*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Data; 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker bool ExtractNtfsTime(unsigned index, FILETIME &ft) const; 34*f6dc9357SAndroid Build Coastguard Worker bool Extract_UnixTime(bool isCentral, unsigned index, UInt32 &res) const; 35*f6dc9357SAndroid Build Coastguard Worker bool Extract_Unix01_Time(unsigned index, UInt32 &res) const; 36*f6dc9357SAndroid Build Coastguard Worker // bool Extract_Unix_Time(unsigned index, UInt32 &res) const; 37*f6dc9357SAndroid Build Coastguard Worker 38*f6dc9357SAndroid Build Coastguard Worker bool CheckIzUnicode(const AString &s) const; 39*f6dc9357SAndroid Build Coastguard Worker 40*f6dc9357SAndroid Build Coastguard Worker void PrintInfo(AString &s) const; 41*f6dc9357SAndroid Build Coastguard Worker }; 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker const unsigned k_WzAesExtra_Size = 7; 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker struct CWzAesExtra 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker UInt16 VendorVersion; // 1: AE-1, 2: AE-2, 48*f6dc9357SAndroid Build Coastguard Worker // UInt16 VendorId; // 'A' 'E' 49*f6dc9357SAndroid Build Coastguard Worker Byte Strength; // 1: 128-bit, 2: 192-bit, 3: 256-bit 50*f6dc9357SAndroid Build Coastguard Worker UInt16 Method; 51*f6dc9357SAndroid Build Coastguard Worker CWzAesExtraCWzAesExtra52*f6dc9357SAndroid Build Coastguard Worker CWzAesExtra(): VendorVersion(2), Strength(3), Method(0) {} 53*f6dc9357SAndroid Build Coastguard Worker NeedCrcCWzAesExtra54*f6dc9357SAndroid Build Coastguard Worker bool NeedCrc() const { return (VendorVersion == 1); } 55*f6dc9357SAndroid Build Coastguard Worker ParseFromSubBlockCWzAesExtra56*f6dc9357SAndroid Build Coastguard Worker bool ParseFromSubBlock(const CExtraSubBlock &sb) 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker if (sb.ID != NFileHeader::NExtraID::kWzAES) 59*f6dc9357SAndroid Build Coastguard Worker return false; 60*f6dc9357SAndroid Build Coastguard Worker if (sb.Data.Size() < k_WzAesExtra_Size) 61*f6dc9357SAndroid Build Coastguard Worker return false; 62*f6dc9357SAndroid Build Coastguard Worker const Byte *p = (const Byte *)sb.Data; 63*f6dc9357SAndroid Build Coastguard Worker VendorVersion = GetUi16(p); 64*f6dc9357SAndroid Build Coastguard Worker if (p[2] != 'A' || p[3] != 'E') 65*f6dc9357SAndroid Build Coastguard Worker return false; 66*f6dc9357SAndroid Build Coastguard Worker Strength = p[4]; 67*f6dc9357SAndroid Build Coastguard Worker // 9.31: The BUG was fixed: 68*f6dc9357SAndroid Build Coastguard Worker Method = GetUi16(p + 5); 69*f6dc9357SAndroid Build Coastguard Worker return true; 70*f6dc9357SAndroid Build Coastguard Worker } 71*f6dc9357SAndroid Build Coastguard Worker SetSubBlockCWzAesExtra72*f6dc9357SAndroid Build Coastguard Worker void SetSubBlock(CExtraSubBlock &sb) const 73*f6dc9357SAndroid Build Coastguard Worker { 74*f6dc9357SAndroid Build Coastguard Worker sb.Data.Alloc(k_WzAesExtra_Size); 75*f6dc9357SAndroid Build Coastguard Worker sb.ID = NFileHeader::NExtraID::kWzAES; 76*f6dc9357SAndroid Build Coastguard Worker Byte *p = (Byte *)sb.Data; 77*f6dc9357SAndroid Build Coastguard Worker p[0] = (Byte)VendorVersion; 78*f6dc9357SAndroid Build Coastguard Worker p[1] = (Byte)(VendorVersion >> 8); 79*f6dc9357SAndroid Build Coastguard Worker p[2] = 'A'; 80*f6dc9357SAndroid Build Coastguard Worker p[3] = 'E'; 81*f6dc9357SAndroid Build Coastguard Worker p[4] = Strength; 82*f6dc9357SAndroid Build Coastguard Worker p[5] = (Byte)Method; 83*f6dc9357SAndroid Build Coastguard Worker p[6] = (Byte)(Method >> 8); 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker }; 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker namespace NStrongCrypto_AlgId 88*f6dc9357SAndroid Build Coastguard Worker { 89*f6dc9357SAndroid Build Coastguard Worker const UInt16 kDES = 0x6601; 90*f6dc9357SAndroid Build Coastguard Worker const UInt16 kRC2old = 0x6602; 91*f6dc9357SAndroid Build Coastguard Worker const UInt16 k3DES168 = 0x6603; 92*f6dc9357SAndroid Build Coastguard Worker const UInt16 k3DES112 = 0x6609; 93*f6dc9357SAndroid Build Coastguard Worker const UInt16 kAES128 = 0x660E; 94*f6dc9357SAndroid Build Coastguard Worker const UInt16 kAES192 = 0x660F; 95*f6dc9357SAndroid Build Coastguard Worker const UInt16 kAES256 = 0x6610; 96*f6dc9357SAndroid Build Coastguard Worker const UInt16 kRC2 = 0x6702; 97*f6dc9357SAndroid Build Coastguard Worker const UInt16 kBlowfish = 0x6720; 98*f6dc9357SAndroid Build Coastguard Worker const UInt16 kTwofish = 0x6721; 99*f6dc9357SAndroid Build Coastguard Worker const UInt16 kRC4 = 0x6801; 100*f6dc9357SAndroid Build Coastguard Worker } 101*f6dc9357SAndroid Build Coastguard Worker 102*f6dc9357SAndroid Build Coastguard Worker struct CStrongCryptoExtra 103*f6dc9357SAndroid Build Coastguard Worker { 104*f6dc9357SAndroid Build Coastguard Worker UInt16 Format; 105*f6dc9357SAndroid Build Coastguard Worker UInt16 AlgId; 106*f6dc9357SAndroid Build Coastguard Worker UInt16 BitLen; 107*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 108*f6dc9357SAndroid Build Coastguard Worker ParseFromSubBlockCStrongCryptoExtra109*f6dc9357SAndroid Build Coastguard Worker bool ParseFromSubBlock(const CExtraSubBlock &sb) 110*f6dc9357SAndroid Build Coastguard Worker { 111*f6dc9357SAndroid Build Coastguard Worker if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt) 112*f6dc9357SAndroid Build Coastguard Worker return false; 113*f6dc9357SAndroid Build Coastguard Worker const Byte *p = (const Byte *)sb.Data; 114*f6dc9357SAndroid Build Coastguard Worker if (sb.Data.Size() < 8) 115*f6dc9357SAndroid Build Coastguard Worker return false; 116*f6dc9357SAndroid Build Coastguard Worker Format = GetUi16(p + 0); 117*f6dc9357SAndroid Build Coastguard Worker AlgId = GetUi16(p + 2); 118*f6dc9357SAndroid Build Coastguard Worker BitLen = GetUi16(p + 4); 119*f6dc9357SAndroid Build Coastguard Worker Flags = GetUi16(p + 6); 120*f6dc9357SAndroid Build Coastguard Worker return (Format == 2); 121*f6dc9357SAndroid Build Coastguard Worker } 122*f6dc9357SAndroid Build Coastguard Worker CertificateIsUsedCStrongCryptoExtra123*f6dc9357SAndroid Build Coastguard Worker bool CertificateIsUsed() const { return (Flags > 0x0001); } 124*f6dc9357SAndroid Build Coastguard Worker }; 125*f6dc9357SAndroid Build Coastguard Worker 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker struct CExtraBlock 128*f6dc9357SAndroid Build Coastguard Worker { 129*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CExtraSubBlock> SubBlocks; 130*f6dc9357SAndroid Build Coastguard Worker bool Error; 131*f6dc9357SAndroid Build Coastguard Worker bool MinorError; 132*f6dc9357SAndroid Build Coastguard Worker bool IsZip64; 133*f6dc9357SAndroid Build Coastguard Worker bool IsZip64_Error; 134*f6dc9357SAndroid Build Coastguard Worker CExtraBlockCExtraBlock135*f6dc9357SAndroid Build Coastguard Worker CExtraBlock(): Error(false), MinorError(false), IsZip64(false), IsZip64_Error(false) {} 136*f6dc9357SAndroid Build Coastguard Worker ClearCExtraBlock137*f6dc9357SAndroid Build Coastguard Worker void Clear() 138*f6dc9357SAndroid Build Coastguard Worker { 139*f6dc9357SAndroid Build Coastguard Worker SubBlocks.Clear(); 140*f6dc9357SAndroid Build Coastguard Worker IsZip64 = false; 141*f6dc9357SAndroid Build Coastguard Worker } 142*f6dc9357SAndroid Build Coastguard Worker GetSizeCExtraBlock143*f6dc9357SAndroid Build Coastguard Worker size_t GetSize() const 144*f6dc9357SAndroid Build Coastguard Worker { 145*f6dc9357SAndroid Build Coastguard Worker size_t res = 0; 146*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubBlocks) 147*f6dc9357SAndroid Build Coastguard Worker res += SubBlocks[i].Data.Size() + 2 + 2; 148*f6dc9357SAndroid Build Coastguard Worker return res; 149*f6dc9357SAndroid Build Coastguard Worker } 150*f6dc9357SAndroid Build Coastguard Worker GetWzAesCExtraBlock151*f6dc9357SAndroid Build Coastguard Worker bool GetWzAes(CWzAesExtra &e) const 152*f6dc9357SAndroid Build Coastguard Worker { 153*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubBlocks) 154*f6dc9357SAndroid Build Coastguard Worker if (e.ParseFromSubBlock(SubBlocks[i])) 155*f6dc9357SAndroid Build Coastguard Worker return true; 156*f6dc9357SAndroid Build Coastguard Worker return false; 157*f6dc9357SAndroid Build Coastguard Worker } 158*f6dc9357SAndroid Build Coastguard Worker HasWzAesCExtraBlock159*f6dc9357SAndroid Build Coastguard Worker bool HasWzAes() const 160*f6dc9357SAndroid Build Coastguard Worker { 161*f6dc9357SAndroid Build Coastguard Worker CWzAesExtra e; 162*f6dc9357SAndroid Build Coastguard Worker return GetWzAes(e); 163*f6dc9357SAndroid Build Coastguard Worker } 164*f6dc9357SAndroid Build Coastguard Worker GetStrongCryptoCExtraBlock165*f6dc9357SAndroid Build Coastguard Worker bool GetStrongCrypto(CStrongCryptoExtra &e) const 166*f6dc9357SAndroid Build Coastguard Worker { 167*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, SubBlocks) 168*f6dc9357SAndroid Build Coastguard Worker if (e.ParseFromSubBlock(SubBlocks[i])) 169*f6dc9357SAndroid Build Coastguard Worker return true; 170*f6dc9357SAndroid Build Coastguard Worker return false; 171*f6dc9357SAndroid Build Coastguard Worker } 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker /* 174*f6dc9357SAndroid Build Coastguard Worker bool HasStrongCrypto() const 175*f6dc9357SAndroid Build Coastguard Worker { 176*f6dc9357SAndroid Build Coastguard Worker CStrongCryptoExtra e; 177*f6dc9357SAndroid Build Coastguard Worker return GetStrongCrypto(e); 178*f6dc9357SAndroid Build Coastguard Worker } 179*f6dc9357SAndroid Build Coastguard Worker */ 180*f6dc9357SAndroid Build Coastguard Worker 181*f6dc9357SAndroid Build Coastguard Worker bool GetNtfsTime(unsigned index, FILETIME &ft) const; 182*f6dc9357SAndroid Build Coastguard Worker bool GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const; 183*f6dc9357SAndroid Build Coastguard Worker 184*f6dc9357SAndroid Build Coastguard Worker void PrintInfo(AString &s) const; 185*f6dc9357SAndroid Build Coastguard Worker RemoveUnknownSubBlocksCExtraBlock186*f6dc9357SAndroid Build Coastguard Worker void RemoveUnknownSubBlocks() 187*f6dc9357SAndroid Build Coastguard Worker { 188*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = SubBlocks.Size(); i != 0;) 189*f6dc9357SAndroid Build Coastguard Worker { 190*f6dc9357SAndroid Build Coastguard Worker i--; 191*f6dc9357SAndroid Build Coastguard Worker switch (SubBlocks[i].ID) 192*f6dc9357SAndroid Build Coastguard Worker { 193*f6dc9357SAndroid Build Coastguard Worker case NFileHeader::NExtraID::kStrongEncrypt: 194*f6dc9357SAndroid Build Coastguard Worker case NFileHeader::NExtraID::kWzAES: 195*f6dc9357SAndroid Build Coastguard Worker break; 196*f6dc9357SAndroid Build Coastguard Worker default: 197*f6dc9357SAndroid Build Coastguard Worker SubBlocks.Delete(i); 198*f6dc9357SAndroid Build Coastguard Worker } 199*f6dc9357SAndroid Build Coastguard Worker } 200*f6dc9357SAndroid Build Coastguard Worker } 201*f6dc9357SAndroid Build Coastguard Worker }; 202*f6dc9357SAndroid Build Coastguard Worker 203*f6dc9357SAndroid Build Coastguard Worker 204*f6dc9357SAndroid Build Coastguard Worker class CLocalItem 205*f6dc9357SAndroid Build Coastguard Worker { 206*f6dc9357SAndroid Build Coastguard Worker public: 207*f6dc9357SAndroid Build Coastguard Worker UInt16 Flags; 208*f6dc9357SAndroid Build Coastguard Worker UInt16 Method; 209*f6dc9357SAndroid Build Coastguard Worker 210*f6dc9357SAndroid Build Coastguard Worker /* 211*f6dc9357SAndroid Build Coastguard Worker Zip specification doesn't mention that ExtractVersion field uses HostOS subfield. 212*f6dc9357SAndroid Build Coastguard Worker 18.06: 7-Zip now doesn't use ExtractVersion::HostOS to detect codePage 213*f6dc9357SAndroid Build Coastguard Worker */ 214*f6dc9357SAndroid Build Coastguard Worker 215*f6dc9357SAndroid Build Coastguard Worker CVersion ExtractVersion; 216*f6dc9357SAndroid Build Coastguard Worker 217*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 218*f6dc9357SAndroid Build Coastguard Worker UInt64 PackSize; 219*f6dc9357SAndroid Build Coastguard Worker UInt32 Time; 220*f6dc9357SAndroid Build Coastguard Worker UInt32 Crc; 221*f6dc9357SAndroid Build Coastguard Worker 222*f6dc9357SAndroid Build Coastguard Worker UInt32 Disk; 223*f6dc9357SAndroid Build Coastguard Worker 224*f6dc9357SAndroid Build Coastguard Worker AString Name; 225*f6dc9357SAndroid Build Coastguard Worker 226*f6dc9357SAndroid Build Coastguard Worker CExtraBlock LocalExtra; 227*f6dc9357SAndroid Build Coastguard Worker GetDescriptorSize()228*f6dc9357SAndroid Build Coastguard Worker unsigned GetDescriptorSize() const { return LocalExtra.IsZip64 ? kDataDescriptorSize64 : kDataDescriptorSize32; } 229*f6dc9357SAndroid Build Coastguard Worker GetPackSizeWithDescriptor()230*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPackSizeWithDescriptor() const 231*f6dc9357SAndroid Build Coastguard Worker { return PackSize + (HasDescriptor() ? GetDescriptorSize() : 0); } 232*f6dc9357SAndroid Build Coastguard Worker IsUtf8()233*f6dc9357SAndroid Build Coastguard Worker bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; } IsEncrypted()234*f6dc9357SAndroid Build Coastguard Worker bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; } IsStrongEncrypted()235*f6dc9357SAndroid Build Coastguard Worker bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; } IsAesEncrypted()236*f6dc9357SAndroid Build Coastguard Worker bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || Method == NFileHeader::NCompressionMethod::kWzAES); } IsLzmaEOS()237*f6dc9357SAndroid Build Coastguard Worker bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; } HasDescriptor()238*f6dc9357SAndroid Build Coastguard Worker bool HasDescriptor() const { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; } 239*f6dc9357SAndroid Build Coastguard Worker // bool IsAltStream() const { return (Flags & NFileHeader::NFlags::kAltStream) != 0; } 240*f6dc9357SAndroid Build Coastguard Worker GetDeflateLevel()241*f6dc9357SAndroid Build Coastguard Worker unsigned GetDeflateLevel() const { return (Flags >> 1) & 3; } 242*f6dc9357SAndroid Build Coastguard Worker 243*f6dc9357SAndroid Build Coastguard Worker bool IsDir() const; 244*f6dc9357SAndroid Build Coastguard Worker 245*f6dc9357SAndroid Build Coastguard Worker /* 246*f6dc9357SAndroid Build Coastguard Worker void GetUnicodeString(const AString &s, UString &res) const 247*f6dc9357SAndroid Build Coastguard Worker { 248*f6dc9357SAndroid Build Coastguard Worker bool isUtf8 = IsUtf8(); 249*f6dc9357SAndroid Build Coastguard Worker if (isUtf8) 250*f6dc9357SAndroid Build Coastguard Worker if (ConvertUTF8ToUnicode(s, res)) 251*f6dc9357SAndroid Build Coastguard Worker return; 252*f6dc9357SAndroid Build Coastguard Worker MultiByteToUnicodeString2(res, s, GetCodePage()); 253*f6dc9357SAndroid Build Coastguard Worker } 254*f6dc9357SAndroid Build Coastguard Worker */ 255*f6dc9357SAndroid Build Coastguard Worker 256*f6dc9357SAndroid Build Coastguard Worker private: 257*f6dc9357SAndroid Build Coastguard Worker SetFlag(unsigned bitMask,bool enable)258*f6dc9357SAndroid Build Coastguard Worker void SetFlag(unsigned bitMask, bool enable) 259*f6dc9357SAndroid Build Coastguard Worker { 260*f6dc9357SAndroid Build Coastguard Worker if (enable) 261*f6dc9357SAndroid Build Coastguard Worker Flags = (UInt16)(Flags | bitMask); 262*f6dc9357SAndroid Build Coastguard Worker else 263*f6dc9357SAndroid Build Coastguard Worker Flags = (UInt16)(Flags & ~bitMask); 264*f6dc9357SAndroid Build Coastguard Worker } 265*f6dc9357SAndroid Build Coastguard Worker 266*f6dc9357SAndroid Build Coastguard Worker public: 267*f6dc9357SAndroid Build Coastguard Worker ClearFlags()268*f6dc9357SAndroid Build Coastguard Worker void ClearFlags() { Flags = 0; } SetEncrypted(bool encrypted)269*f6dc9357SAndroid Build Coastguard Worker void SetEncrypted(bool encrypted) { SetFlag(NFileHeader::NFlags::kEncrypted, encrypted); } SetUtf8(bool isUtf8)270*f6dc9357SAndroid Build Coastguard Worker void SetUtf8(bool isUtf8) { SetFlag(NFileHeader::NFlags::kUtf8, isUtf8); } 271*f6dc9357SAndroid Build Coastguard Worker // void SetFlag_AltStream(bool isAltStream) { SetFlag(NFileHeader::NFlags::kAltStream, isAltStream); } SetDescriptorMode(bool useDescriptor)272*f6dc9357SAndroid Build Coastguard Worker void SetDescriptorMode(bool useDescriptor) { SetFlag(NFileHeader::NFlags::kDescriptorUsedMask, useDescriptor); } 273*f6dc9357SAndroid Build Coastguard Worker GetCodePage()274*f6dc9357SAndroid Build Coastguard Worker UINT GetCodePage() const 275*f6dc9357SAndroid Build Coastguard Worker { 276*f6dc9357SAndroid Build Coastguard Worker if (IsUtf8()) 277*f6dc9357SAndroid Build Coastguard Worker return CP_UTF8; 278*f6dc9357SAndroid Build Coastguard Worker return CP_OEMCP; 279*f6dc9357SAndroid Build Coastguard Worker } 280*f6dc9357SAndroid Build Coastguard Worker }; 281*f6dc9357SAndroid Build Coastguard Worker 282*f6dc9357SAndroid Build Coastguard Worker 283*f6dc9357SAndroid Build Coastguard Worker class CItem: public CLocalItem 284*f6dc9357SAndroid Build Coastguard Worker { 285*f6dc9357SAndroid Build Coastguard Worker public: 286*f6dc9357SAndroid Build Coastguard Worker CVersion MadeByVersion; 287*f6dc9357SAndroid Build Coastguard Worker UInt16 InternalAttrib; 288*f6dc9357SAndroid Build Coastguard Worker UInt32 ExternalAttrib; 289*f6dc9357SAndroid Build Coastguard Worker 290*f6dc9357SAndroid Build Coastguard Worker UInt64 LocalHeaderPos; 291*f6dc9357SAndroid Build Coastguard Worker 292*f6dc9357SAndroid Build Coastguard Worker CExtraBlock CentralExtra; 293*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Comment; 294*f6dc9357SAndroid Build Coastguard Worker 295*f6dc9357SAndroid Build Coastguard Worker bool FromLocal; 296*f6dc9357SAndroid Build Coastguard Worker bool FromCentral; 297*f6dc9357SAndroid Build Coastguard Worker 298*f6dc9357SAndroid Build Coastguard Worker // CItem can be used as CLocalItem. So we must clear unused fields CItem()299*f6dc9357SAndroid Build Coastguard Worker CItem(): 300*f6dc9357SAndroid Build Coastguard Worker InternalAttrib(0), 301*f6dc9357SAndroid Build Coastguard Worker ExternalAttrib(0), 302*f6dc9357SAndroid Build Coastguard Worker FromLocal(false), 303*f6dc9357SAndroid Build Coastguard Worker FromCentral(false) 304*f6dc9357SAndroid Build Coastguard Worker { 305*f6dc9357SAndroid Build Coastguard Worker MadeByVersion.Version = 0; 306*f6dc9357SAndroid Build Coastguard Worker MadeByVersion.HostOS = 0; 307*f6dc9357SAndroid Build Coastguard Worker } 308*f6dc9357SAndroid Build Coastguard Worker GetMainExtra()309*f6dc9357SAndroid Build Coastguard Worker const CExtraBlock &GetMainExtra() const { return *(FromCentral ? &CentralExtra : &LocalExtra); } 310*f6dc9357SAndroid Build Coastguard Worker 311*f6dc9357SAndroid Build Coastguard Worker bool IsDir() const; 312*f6dc9357SAndroid Build Coastguard Worker UInt32 GetWinAttrib() const; 313*f6dc9357SAndroid Build Coastguard Worker bool GetPosixAttrib(UInt32 &attrib) const; 314*f6dc9357SAndroid Build Coastguard Worker 315*f6dc9357SAndroid Build Coastguard Worker // 18.06: 0 instead of ExtractVersion.HostOS for local item GetHostOS()316*f6dc9357SAndroid Build Coastguard Worker Byte GetHostOS() const { return FromCentral ? MadeByVersion.HostOS : (Byte)0; } 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker void GetUnicodeString(UString &res, const AString &s, bool isComment, bool useSpecifiedCodePage, UINT codePage) const; 319*f6dc9357SAndroid Build Coastguard Worker IsThereCrc()320*f6dc9357SAndroid Build Coastguard Worker bool IsThereCrc() const 321*f6dc9357SAndroid Build Coastguard Worker { 322*f6dc9357SAndroid Build Coastguard Worker if (Method == NFileHeader::NCompressionMethod::kWzAES) 323*f6dc9357SAndroid Build Coastguard Worker { 324*f6dc9357SAndroid Build Coastguard Worker CWzAesExtra aesField; 325*f6dc9357SAndroid Build Coastguard Worker if (GetMainExtra().GetWzAes(aesField)) 326*f6dc9357SAndroid Build Coastguard Worker return aesField.NeedCrc(); 327*f6dc9357SAndroid Build Coastguard Worker } 328*f6dc9357SAndroid Build Coastguard Worker return (Crc != 0 || !IsDir()); 329*f6dc9357SAndroid Build Coastguard Worker } 330*f6dc9357SAndroid Build Coastguard Worker Is_MadeBy_Unix()331*f6dc9357SAndroid Build Coastguard Worker bool Is_MadeBy_Unix() const 332*f6dc9357SAndroid Build Coastguard Worker { 333*f6dc9357SAndroid Build Coastguard Worker if (!FromCentral) 334*f6dc9357SAndroid Build Coastguard Worker return false; 335*f6dc9357SAndroid Build Coastguard Worker return (MadeByVersion.HostOS == NFileHeader::NHostOS::kUnix); 336*f6dc9357SAndroid Build Coastguard Worker } 337*f6dc9357SAndroid Build Coastguard Worker GetCodePage()338*f6dc9357SAndroid Build Coastguard Worker UINT GetCodePage() const 339*f6dc9357SAndroid Build Coastguard Worker { 340*f6dc9357SAndroid Build Coastguard Worker // 18.06: now we use HostOS only from Central::MadeByVersion 341*f6dc9357SAndroid Build Coastguard Worker if (IsUtf8()) 342*f6dc9357SAndroid Build Coastguard Worker return CP_UTF8; 343*f6dc9357SAndroid Build Coastguard Worker if (!FromCentral) 344*f6dc9357SAndroid Build Coastguard Worker return CP_OEMCP; 345*f6dc9357SAndroid Build Coastguard Worker Byte hostOS = MadeByVersion.HostOS; 346*f6dc9357SAndroid Build Coastguard Worker return (UINT)(( 347*f6dc9357SAndroid Build Coastguard Worker hostOS == NFileHeader::NHostOS::kFAT 348*f6dc9357SAndroid Build Coastguard Worker || hostOS == NFileHeader::NHostOS::kNTFS 349*f6dc9357SAndroid Build Coastguard Worker || hostOS == NFileHeader::NHostOS::kUnix // do we need it? 350*f6dc9357SAndroid Build Coastguard Worker ) ? CP_OEMCP : CP_ACP); 351*f6dc9357SAndroid Build Coastguard Worker } 352*f6dc9357SAndroid Build Coastguard Worker }; 353*f6dc9357SAndroid Build Coastguard Worker 354*f6dc9357SAndroid Build Coastguard Worker }} 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker #endif 357