aboutsummaryrefslogtreecommitdiff
path: root/CPP/7zip/Archive/Zip/ZipItem.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CPP/7zip/Archive/Zip/ZipItem.cpp68
1 files changed, 56 insertions, 12 deletions
diff --git a/CPP/7zip/Archive/Zip/ZipItem.cpp b/CPP/7zip/Archive/Zip/ZipItem.cpp
index be33648..cffbb78 100644
--- a/CPP/7zip/Archive/Zip/ZipItem.cpp
+++ b/CPP/7zip/Archive/Zip/ZipItem.cpp
@@ -30,11 +30,12 @@ static const CUInt32PCharPair g_ExtraTypes[] =
30{ 30{
31 { NExtraID::kZip64, "Zip64" }, 31 { NExtraID::kZip64, "Zip64" },
32 { NExtraID::kNTFS, "NTFS" }, 32 { NExtraID::kNTFS, "NTFS" },
33 { NExtraID::kUnix0, "UNIX" },
33 { NExtraID::kStrongEncrypt, "StrongCrypto" }, 34 { NExtraID::kStrongEncrypt, "StrongCrypto" },
34 { NExtraID::kUnixTime, "UT" }, 35 { NExtraID::kUnixTime, "UT" },
35 { NExtraID::kUnixExtra, "UX" }, 36 { NExtraID::kUnix1, "UX" },
36 { NExtraID::kUnix2Extra, "Ux" }, 37 { NExtraID::kUnix2, "Ux" },
37 { NExtraID::kUnix3Extra, "ux" }, 38 { NExtraID::kUnixN, "ux" },
38 { NExtraID::kIzUnicodeComment, "uc" }, 39 { NExtraID::kIzUnicodeComment, "uc" },
39 { NExtraID::kIzUnicodeName, "up" }, 40 { NExtraID::kIzUnicodeName, "up" },
40 { NExtraID::kIzNtSecurityDescriptor, "SD" }, 41 { NExtraID::kIzNtSecurityDescriptor, "SD" },
@@ -50,6 +51,23 @@ void CExtraSubBlock::PrintInfo(AString &s) const
50 if (pair.Value == ID) 51 if (pair.Value == ID)
51 { 52 {
52 s += pair.Name; 53 s += pair.Name;
54 if (ID == NExtraID::kUnixTime)
55 {
56 if (Data.Size() >= 1)
57 {
58 s += ':';
59 const Byte flags = Data[0];
60 if (flags & 1) s += 'M';
61 if (flags & 2) s += 'A';
62 if (flags & 4) s += 'C';
63 const UInt32 size = (UInt32)(Data.Size()) - 1;
64 if (size % 4 == 0)
65 {
66 s += ':';
67 s.Add_UInt32(size / 4);
68 }
69 }
70 }
53 /* 71 /*
54 if (ID == NExtraID::kApkAlign && Data.Size() >= 2) 72 if (ID == NExtraID::kApkAlign && Data.Size() >= 2)
55 { 73 {
@@ -133,14 +151,22 @@ bool CExtraSubBlock::ExtractNtfsTime(unsigned index, FILETIME &ft) const
133 return false; 151 return false;
134} 152}
135 153
136bool CExtraSubBlock::ExtractUnixTime(bool isCentral, unsigned index, UInt32 &res) const 154bool CExtraSubBlock::Extract_UnixTime(bool isCentral, unsigned index, UInt32 &res) const
137{ 155{
156 /* Info-Zip :
157 The central-header extra field contains the modification
158 time only, or no timestamp at all.
159 Size of Data is used to flag its presence or absence
160 If "Flags" indicates that Modtime is present in the local header
161 field, it MUST be present in the central header field, too
162 */
163
138 res = 0; 164 res = 0;
139 UInt32 size = (UInt32)Data.Size(); 165 UInt32 size = (UInt32)Data.Size();
140 if (ID != NExtraID::kUnixTime || size < 5) 166 if (ID != NExtraID::kUnixTime || size < 5)
141 return false; 167 return false;
142 const Byte *p = (const Byte *)Data; 168 const Byte *p = (const Byte *)Data;
143 Byte flags = *p++; 169 const Byte flags = *p++;
144 size--; 170 size--;
145 if (isCentral) 171 if (isCentral)
146 { 172 {
@@ -168,18 +194,35 @@ bool CExtraSubBlock::ExtractUnixTime(bool isCentral, unsigned index, UInt32 &res
168} 194}
169 195
170 196
171bool CExtraSubBlock::ExtractUnixExtraTime(unsigned index, UInt32 &res) const 197// Info-ZIP's abandoned "Unix1 timestamps & owner ID info"
198
199bool CExtraSubBlock::Extract_Unix01_Time(unsigned index, UInt32 &res) const
172{ 200{
173 res = 0; 201 res = 0;
174 const size_t size = Data.Size(); 202 const unsigned offset = index * 4;
175 unsigned offset = index * 4; 203 if (Data.Size() < offset + 4)
176 if (ID != NExtraID::kUnixExtra || size < offset + 4) 204 return false;
205 if (ID != NExtraID::kUnix0 &&
206 ID != NExtraID::kUnix1)
177 return false; 207 return false;
178 const Byte *p = (const Byte *)Data + offset; 208 const Byte *p = (const Byte *)Data + offset;
179 res = GetUi32(p); 209 res = GetUi32(p);
180 return true; 210 return true;
181} 211}
182 212
213/*
214// PKWARE's Unix "extra" is similar to Info-ZIP's abandoned "Unix1 timestamps"
215bool CExtraSubBlock::Extract_Unix_Time(unsigned index, UInt32 &res) const
216{
217 res = 0;
218 const unsigned offset = index * 4;
219 if (ID != NExtraID::kUnix0 || Data.Size() < offset)
220 return false;
221 const Byte *p = (const Byte *)Data + offset;
222 res = GetUi32(p);
223 return true;
224}
225*/
183 226
184bool CExtraBlock::GetNtfsTime(unsigned index, FILETIME &ft) const 227bool CExtraBlock::GetNtfsTime(unsigned index, FILETIME &ft) const
185{ 228{
@@ -199,7 +242,7 @@ bool CExtraBlock::GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const
199 { 242 {
200 const CExtraSubBlock &sb = SubBlocks[i]; 243 const CExtraSubBlock &sb = SubBlocks[i];
201 if (sb.ID == NFileHeader::NExtraID::kUnixTime) 244 if (sb.ID == NFileHeader::NExtraID::kUnixTime)
202 return sb.ExtractUnixTime(isCentral, index, res); 245 return sb.Extract_UnixTime(isCentral, index, res);
203 } 246 }
204 } 247 }
205 248
@@ -214,8 +257,9 @@ bool CExtraBlock::GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const
214 FOR_VECTOR (i, SubBlocks) 257 FOR_VECTOR (i, SubBlocks)
215 { 258 {
216 const CExtraSubBlock &sb = SubBlocks[i]; 259 const CExtraSubBlock &sb = SubBlocks[i];
217 if (sb.ID == NFileHeader::NExtraID::kUnixExtra) 260 if (sb.ID == NFileHeader::NExtraID::kUnix0 ||
218 return sb.ExtractUnixExtraTime(index, res); 261 sb.ID == NFileHeader::NExtraID::kUnix1)
262 return sb.Extract_Unix01_Time(index, res);
219 } 263 }
220 } 264 }
221 return false; 265 return false;