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 }}
|