Files
easy7zip/CPP/7zip/Archive/Zip/ZipItem.cpp
Igor Pavlov 980e181dcc 4.50 beta
2016-05-28 00:15:52 +01:00

131 lines
3.2 KiB
C++
Executable File

// Archive/ZipItem.cpp
#include "StdAfx.h"
#include "ZipHeader.h"
#include "ZipItem.h"
#include "../Common/ItemNameUtils.h"
namespace NArchive {
namespace NZip {
bool operator==(const CVersion &v1, const CVersion &v2)
{
return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS);
}
bool operator!=(const CVersion &v1, const CVersion &v2)
{
return !(v1 == v2);
}
bool CLocalItem::IsImplodeBigDictionary() const
{
if (CompressionMethod != NFileHeader::NCompressionMethod::kImploded)
throw 12312212;
return (Flags & NFileHeader::NFlags::kImplodeDictionarySizeMask) != 0;
}
bool CLocalItem::IsImplodeLiteralsOn() const
{
if (CompressionMethod != NFileHeader::NCompressionMethod::kImploded)
throw 12312213;
return (Flags & NFileHeader::NFlags::kImplodeLiteralsOnMask) != 0;
}
bool CLocalItem::IsDirectory() const
{
return NItemName::HasTailSlash(Name, GetCodePage());
}
bool CItem::IsDirectory() const
{
if (NItemName::HasTailSlash(Name, GetCodePage()))
return true;
if (!FromCentral)
return false;
WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF);
switch(MadeByVersion.HostOS)
{
case NFileHeader::NHostOS::kAMIGA:
switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT)
{
case NFileHeader::NAmigaAttribute::kIFDIR:
return true;
case NFileHeader::NAmigaAttribute::kIFREG:
return false;
default:
return false; // change it throw kUnknownAttributes;
}
case NFileHeader::NHostOS::kFAT:
case NFileHeader::NHostOS::kNTFS:
case NFileHeader::NHostOS::kHPFS:
case NFileHeader::NHostOS::kVFAT:
return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
case NFileHeader::NHostOS::kAtari:
case NFileHeader::NHostOS::kMac:
case NFileHeader::NHostOS::kVMS:
case NFileHeader::NHostOS::kVM_CMS:
case NFileHeader::NHostOS::kAcorn:
case NFileHeader::NHostOS::kMVS:
return false; // change it throw kUnknownAttributes;
default:
/*
switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT)
{
case NFileHeader::NUnixAttribute::kIFDIR:
return true;
default:
return false;
}
*/
return false;
}
}
UInt32 CLocalItem::GetWinAttributes() const
{
DWORD winAttributes = 0;
if (IsDirectory())
winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
return winAttributes;
}
UInt32 CItem::GetWinAttributes() const
{
DWORD winAttributes = 0;
switch(MadeByVersion.HostOS)
{
case NFileHeader::NHostOS::kFAT:
case NFileHeader::NHostOS::kNTFS:
if (FromCentral)
winAttributes = ExternalAttributes;
break;
default:
winAttributes = 0; // must be converted from unix value;
}
if (IsDirectory()) // test it;
winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
return winAttributes;
}
void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value)
{
UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber);
Flags &= ~mask;
Flags |= value << startBitNumber;
}
void CLocalItem::SetBitMask(int bitMask, bool enable)
{
if(enable)
Flags |= bitMask;
else
Flags &= ~bitMask;
}
void CLocalItem::SetEncrypted(bool encrypted)
{ SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); }
}}