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