annotate src/win32/7zip/7z/CPP/7zip/Archive/Zip/ZipItem.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // Archive/ZipItem.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "ZipHeader.h"
rlm@1 6 #include "ZipItem.h"
rlm@1 7 #include "../Common/ItemNameUtils.h"
rlm@1 8 #include "../../../../C/CpuArch.h"
rlm@1 9
rlm@1 10 namespace NArchive {
rlm@1 11 namespace NZip {
rlm@1 12
rlm@1 13 bool operator==(const CVersion &v1, const CVersion &v2)
rlm@1 14 {
rlm@1 15 return (v1.Version == v2.Version) && (v1.HostOS == v2.HostOS);
rlm@1 16 }
rlm@1 17
rlm@1 18 bool operator!=(const CVersion &v1, const CVersion &v2)
rlm@1 19 {
rlm@1 20 return !(v1 == v2);
rlm@1 21 }
rlm@1 22
rlm@1 23 bool CExtraSubBlock::ExtractNtfsTime(int index, FILETIME &ft) const
rlm@1 24 {
rlm@1 25 ft.dwHighDateTime = ft.dwLowDateTime = 0;
rlm@1 26 UInt32 size = (UInt32)Data.GetCapacity();
rlm@1 27 if (ID != NFileHeader::NExtraID::kNTFS || size < 32)
rlm@1 28 return false;
rlm@1 29 const Byte *p = (const Byte *)Data;
rlm@1 30 p += 4; // for reserved
rlm@1 31 size -= 4;
rlm@1 32 while (size > 4)
rlm@1 33 {
rlm@1 34 UInt16 tag = GetUi16(p);
rlm@1 35 UInt32 attrSize = GetUi16(p + 2);
rlm@1 36 p += 4;
rlm@1 37 size -= 4;
rlm@1 38 if (attrSize > size)
rlm@1 39 attrSize = size;
rlm@1 40
rlm@1 41 if (tag == NFileHeader::NNtfsExtra::kTagTime && attrSize >= 24)
rlm@1 42 {
rlm@1 43 p += 8 * index;
rlm@1 44 ft.dwLowDateTime = GetUi32(p);
rlm@1 45 ft.dwHighDateTime = GetUi32(p + 4);
rlm@1 46 return true;
rlm@1 47 }
rlm@1 48 p += attrSize;
rlm@1 49 size -= attrSize;
rlm@1 50 }
rlm@1 51 return false;
rlm@1 52 }
rlm@1 53
rlm@1 54 bool CLocalItem::IsDir() const
rlm@1 55 {
rlm@1 56 return NItemName::HasTailSlash(Name, GetCodePage());
rlm@1 57 }
rlm@1 58
rlm@1 59 bool CItem::IsDir() const
rlm@1 60 {
rlm@1 61 if (NItemName::HasTailSlash(Name, GetCodePage()))
rlm@1 62 return true;
rlm@1 63 if (!FromCentral)
rlm@1 64 return false;
rlm@1 65 WORD highAttributes = WORD((ExternalAttributes >> 16 ) & 0xFFFF);
rlm@1 66 switch(MadeByVersion.HostOS)
rlm@1 67 {
rlm@1 68 case NFileHeader::NHostOS::kAMIGA:
rlm@1 69 switch (highAttributes & NFileHeader::NAmigaAttribute::kIFMT)
rlm@1 70 {
rlm@1 71 case NFileHeader::NAmigaAttribute::kIFDIR: return true;
rlm@1 72 case NFileHeader::NAmigaAttribute::kIFREG: return false;
rlm@1 73 default: return false; // change it throw kUnknownAttributes;
rlm@1 74 }
rlm@1 75 case NFileHeader::NHostOS::kFAT:
rlm@1 76 case NFileHeader::NHostOS::kNTFS:
rlm@1 77 case NFileHeader::NHostOS::kHPFS:
rlm@1 78 case NFileHeader::NHostOS::kVFAT:
rlm@1 79 return ((ExternalAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
rlm@1 80 case NFileHeader::NHostOS::kAtari:
rlm@1 81 case NFileHeader::NHostOS::kMac:
rlm@1 82 case NFileHeader::NHostOS::kVMS:
rlm@1 83 case NFileHeader::NHostOS::kVM_CMS:
rlm@1 84 case NFileHeader::NHostOS::kAcorn:
rlm@1 85 case NFileHeader::NHostOS::kMVS:
rlm@1 86 return false; // change it throw kUnknownAttributes;
rlm@1 87 default:
rlm@1 88 /*
rlm@1 89 switch (highAttributes & NFileHeader::NUnixAttribute::kIFMT)
rlm@1 90 {
rlm@1 91 case NFileHeader::NUnixAttribute::kIFDIR:
rlm@1 92 return true;
rlm@1 93 default:
rlm@1 94 return false;
rlm@1 95 }
rlm@1 96 */
rlm@1 97 return false;
rlm@1 98 }
rlm@1 99 }
rlm@1 100
rlm@1 101 UInt32 CLocalItem::GetWinAttributes() const
rlm@1 102 {
rlm@1 103 DWORD winAttributes = 0;
rlm@1 104 if (IsDir())
rlm@1 105 winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
rlm@1 106 return winAttributes;
rlm@1 107 }
rlm@1 108
rlm@1 109 UInt32 CItem::GetWinAttributes() const
rlm@1 110 {
rlm@1 111 DWORD winAttributes = 0;
rlm@1 112 switch(MadeByVersion.HostOS)
rlm@1 113 {
rlm@1 114 case NFileHeader::NHostOS::kFAT:
rlm@1 115 case NFileHeader::NHostOS::kNTFS:
rlm@1 116 if (FromCentral)
rlm@1 117 winAttributes = ExternalAttributes;
rlm@1 118 break;
rlm@1 119 default:
rlm@1 120 winAttributes = 0; // must be converted from unix value;
rlm@1 121 }
rlm@1 122 if (IsDir()) // test it;
rlm@1 123 winAttributes |= FILE_ATTRIBUTE_DIRECTORY;
rlm@1 124 return winAttributes;
rlm@1 125 }
rlm@1 126
rlm@1 127 void CLocalItem::SetFlagBits(int startBitNumber, int numBits, int value)
rlm@1 128 {
rlm@1 129 UInt16 mask = (UInt16)(((1 << numBits) - 1) << startBitNumber);
rlm@1 130 Flags &= ~mask;
rlm@1 131 Flags |= value << startBitNumber;
rlm@1 132 }
rlm@1 133
rlm@1 134 void CLocalItem::SetBitMask(int bitMask, bool enable)
rlm@1 135 {
rlm@1 136 if(enable)
rlm@1 137 Flags |= bitMask;
rlm@1 138 else
rlm@1 139 Flags &= ~bitMask;
rlm@1 140 }
rlm@1 141
rlm@1 142 void CLocalItem::SetEncrypted(bool encrypted)
rlm@1 143 { SetBitMask(NFileHeader::NFlags::kEncrypted, encrypted); }
rlm@1 144 void CLocalItem::SetUtf8(bool isUtf8)
rlm@1 145 { SetBitMask(NFileHeader::NFlags::kUtf8, isUtf8); }
rlm@1 146
rlm@1 147 }}