rlm@1: // Archive/ZipItem.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: #include "ZipHeader.h" rlm@1: #include "ZipItem.h" rlm@1: #include "../Common/ItemNameUtils.h" rlm@1: #include "../../../../C/CpuArch.h" rlm@1: rlm@1: namespace NArchive { rlm@1: namespace NZip { rlm@1: rlm@1: bool operator==(const CVersion &v1, const CVersion &v2) rlm@1: { rlm@1: return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS); rlm@1: } rlm@1: rlm@1: bool operator!=(const CVersion &v1, const CVersion &v2) rlm@1: { rlm@1: return !(v1 == v2); rlm@1: } rlm@1: rlm@1: bool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const rlm@1: { rlm@1: ft.dwHighDateTime = ft.dwLowDateTime = 0; rlm@1: UInt32 size = (UInt32)Data.GetCapacity(); rlm@1: if (ID != NFileHeader::NExtraID::kNTFS || size < 32) rlm@1: return false; rlm@1: const Byte *p = (const Byte *)Data; rlm@1: p += 4; // for reserved rlm@1: size -= 4; rlm@1: while (size > 4) rlm@1: { rlm@1: UInt16 tag = GetUi16(p); rlm@1: UInt32 attrSize = GetUi16(p + 2); rlm@1: p += 4; rlm@1: size -= 4; rlm@1: if (attrSize > size) rlm@1: attrSize = size; rlm@1: rlm@1: if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24) rlm@1: { rlm@1: p += 8 * index; rlm@1: ft.dwLowDateTime = GetUi32(p); rlm@1: ft.dwHighDateTime = GetUi32(p + 4); rlm@1: return true; rlm@1: } rlm@1: p += attrSize; rlm@1: size -= attrSize; rlm@1: } rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool CLocalItem::IsDir() const rlm@1: { rlm@1: return NItemName::HasTailSlash(Name, GetCodePage()); rlm@1: } rlm@1: rlm@1: bool CItem::IsDir() const rlm@1: { rlm@1: if (NItemName::HasTailSlash(Name, GetCodePage())) rlm@1: return true; rlm@1: if (!FromCentral) rlm@1: return false; rlm@1: WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF); rlm@1: switch(MadeByVersion.HostOS) rlm@1: { rlm@1: case NFileHeader::NHostOS::kAMIGA: rlm@1: switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT) rlm@1: { rlm@1: case NFileHeader::NAmigaAttribute::kIFDIR: return true; rlm@1: case NFileHeader::NAmigaAttribute::kIFREG: return false; rlm@1: default: return false; // change it throw kUnknownAttributes; rlm@1: } rlm@1: case NFileHeader::NHostOS::kFAT: rlm@1: case NFileHeader::NHostOS::kNTFS: rlm@1: case NFileHeader::NHostOS::kHPFS: rlm@1: case NFileHeader::NHostOS::kVFAT: rlm@1: return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); rlm@1: case NFileHeader::NHostOS::kAtari: rlm@1: case NFileHeader::NHostOS::kMac: rlm@1: case NFileHeader::NHostOS::kVMS: rlm@1: case NFileHeader::NHostOS::kVM_CMS: rlm@1: case NFileHeader::NHostOS::kAcorn: rlm@1: case NFileHeader::NHostOS::kMVS: rlm@1: return false; // change it throw kUnknownAttributes; rlm@1: default: rlm@1: /* rlm@1: switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT) rlm@1: { rlm@1: case NFileHeader::NUnixAttribute::kIFDIR: rlm@1: return true; rlm@1: default: rlm@1: return false; rlm@1: } rlm@1: */ rlm@1: return false; rlm@1: } rlm@1: } rlm@1: rlm@1: UInt32 CLocalItem::GetWinAttributes() const rlm@1: { rlm@1: DWORD winAttributes = 0; rlm@1: if (IsDir()) rlm@1: winAttributes |= FILE_ATTRIBUTE_DIRECTORY; rlm@1: return winAttributes; rlm@1: } rlm@1: rlm@1: UInt32 CItem::GetWinAttributes() const rlm@1: { rlm@1: DWORD winAttributes = 0; rlm@1: switch(MadeByVersion.HostOS) rlm@1: { rlm@1: case NFileHeader::NHostOS::kFAT: rlm@1: case NFileHeader::NHostOS::kNTFS: rlm@1: if (FromCentral) rlm@1: winAttributes = ExternalAttributes; rlm@1: break; rlm@1: default: rlm@1: winAttributes = 0; // must be converted from unix value; rlm@1: } rlm@1: if (IsDir()) // test it; rlm@1: winAttributes |= FILE_ATTRIBUTE_DIRECTORY; rlm@1: return winAttributes; rlm@1: } rlm@1: rlm@1: void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value) rlm@1: { rlm@1: UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber); rlm@1: Flags &= ~mask; rlm@1: Flags |= value << startBitNumber; rlm@1: } rlm@1: rlm@1: void CLocalItem::SetBitMask(int bitMask, bool enable) rlm@1: { rlm@1: if(enable) rlm@1: Flags |= bitMask; rlm@1: else rlm@1: Flags &= ~bitMask; rlm@1: } rlm@1: rlm@1: void CLocalItem::SetEncrypted(bool encrypted) rlm@1: { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); } rlm@1: void CLocalItem::SetUtf8(bool isUtf8) rlm@1: { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); } rlm@1: rlm@1: }}