summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/quazip/quazipfileinfo.cpp
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2015-03-08 19:07:42 +0100
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2015-05-02 16:52:14 +0200
commitb230cf3aa24f3883b8b165bd5fd56620a9a95e47 (patch)
tree19e46e3697c98c3e51f7f4e91e3879f95bd0bc43 /rbutil/rbutilqt/quazip/quazipfileinfo.cpp
parentd4fee369712f006785fd3a8904a5e2b5c529598b (diff)
downloadrockbox-b230cf3aa24f3883b8b165bd5fd56620a9a95e47.tar.gz
rockbox-b230cf3aa24f3883b8b165bd5fd56620a9a95e47.zip
Update quazip to release 0.7.1.
Update to latest quazip release. Note that quazip is now LGPL and not GPL / LGPL dual licensed anymore. Change-Id: Ie1e975b5b546dd31218eef9df472527493fe81e0
Diffstat (limited to 'rbutil/rbutilqt/quazip/quazipfileinfo.cpp')
-rw-r--r--rbutil/rbutilqt/quazip/quazipfileinfo.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/quazip/quazipfileinfo.cpp b/rbutil/rbutilqt/quazip/quazipfileinfo.cpp
new file mode 100644
index 0000000000..f11c91017c
--- /dev/null
+++ b/rbutil/rbutilqt/quazip/quazipfileinfo.cpp
@@ -0,0 +1,176 @@
1/*
2Copyright (C) 2005-2014 Sergey A. Tachenov
3
4This file is part of QuaZIP.
5
6QuaZIP is free software: you can redistribute it and/or modify
7it under the terms of the GNU Lesser General Public License as published by
8the Free Software Foundation, either version 2.1 of the License, or
9(at your option) any later version.
10
11QuaZIP is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU Lesser General Public License for more details.
15
16You should have received a copy of the GNU Lesser General Public License
17along with QuaZIP. If not, see <http://www.gnu.org/licenses/>.
18
19See COPYING file for the full LGPL text.
20
21Original ZIP package is copyrighted by Gilles Vollant and contributors,
22see quazip/(un)zip.h files for details. Basically it's the zlib license.
23*/
24
25#include "quazipfileinfo.h"
26
27static QFile::Permissions permissionsFromExternalAttr(quint32 externalAttr) {
28 quint32 uPerm = (externalAttr & 0xFFFF0000u) >> 16;
29 QFile::Permissions perm = 0;
30 if ((uPerm & 0400) != 0)
31 perm |= QFile::ReadOwner;
32 if ((uPerm & 0200) != 0)
33 perm |= QFile::WriteOwner;
34 if ((uPerm & 0100) != 0)
35 perm |= QFile::ExeOwner;
36 if ((uPerm & 0040) != 0)
37 perm |= QFile::ReadGroup;
38 if ((uPerm & 0020) != 0)
39 perm |= QFile::WriteGroup;
40 if ((uPerm & 0010) != 0)
41 perm |= QFile::ExeGroup;
42 if ((uPerm & 0004) != 0)
43 perm |= QFile::ReadOther;
44 if ((uPerm & 0002) != 0)
45 perm |= QFile::WriteOther;
46 if ((uPerm & 0001) != 0)
47 perm |= QFile::ExeOther;
48 return perm;
49
50}
51
52QFile::Permissions QuaZipFileInfo::getPermissions() const
53{
54 return permissionsFromExternalAttr(externalAttr);
55}
56
57QFile::Permissions QuaZipFileInfo64::getPermissions() const
58{
59 return permissionsFromExternalAttr(externalAttr);
60}
61
62bool QuaZipFileInfo64::toQuaZipFileInfo(QuaZipFileInfo &info) const
63{
64 bool noOverflow = true;
65 info.name = name;
66 info.versionCreated = versionCreated;
67 info.versionNeeded = versionNeeded;
68 info.flags = flags;
69 info.method = method;
70 info.dateTime = dateTime;
71 info.crc = crc;
72 if (compressedSize > 0xFFFFFFFFu) {
73 info.compressedSize = 0xFFFFFFFFu;
74 noOverflow = false;
75 } else {
76 info.compressedSize = compressedSize;
77 }
78 if (uncompressedSize > 0xFFFFFFFFu) {
79 info.uncompressedSize = 0xFFFFFFFFu;
80 noOverflow = false;
81 } else {
82 info.uncompressedSize = uncompressedSize;
83 }
84 info.diskNumberStart = diskNumberStart;
85 info.internalAttr = internalAttr;
86 info.externalAttr = externalAttr;
87 info.comment = comment;
88 info.extra = extra;
89 return noOverflow;
90}
91
92static QDateTime getNTFSTime(const QByteArray &extra, int position,
93 int *fineTicks)
94{
95 QDateTime dateTime;
96 for (int i = 0; i <= extra.size() - 4; ) {
97 unsigned type = static_cast<unsigned>(static_cast<unsigned char>(
98 extra.at(i)))
99 | (static_cast<unsigned>(static_cast<unsigned char>(
100 extra.at(i + 1))) << 8);
101 i += 2;
102 unsigned length = static_cast<unsigned>(static_cast<unsigned char>(
103 extra.at(i)))
104 | (static_cast<unsigned>(static_cast<unsigned char>(
105 extra.at(i + 1))) << 8);
106 i += 2;
107 if (type == QUAZIP_EXTRA_NTFS_MAGIC && length >= 32) {
108 i += 4; // reserved
109 while (i <= extra.size() - 4) {
110 unsigned tag = static_cast<unsigned>(
111 static_cast<unsigned char>(extra.at(i)))
112 | (static_cast<unsigned>(
113 static_cast<unsigned char>(extra.at(i + 1)))
114 << 8);
115 i += 2;
116 int tagsize = static_cast<unsigned>(
117 static_cast<unsigned char>(extra.at(i)))
118 | (static_cast<unsigned>(
119 static_cast<unsigned char>(extra.at(i + 1)))
120 << 8);
121 i += 2;
122 if (tag == QUAZIP_EXTRA_NTFS_TIME_MAGIC
123 && tagsize >= position + 8) {
124 i += position;
125 quint64 mtime = static_cast<quint64>(
126 static_cast<unsigned char>(extra.at(i)))
127 | (static_cast<quint64>(static_cast<unsigned char>(
128 extra.at(i + 1))) << 8)
129 | (static_cast<quint64>(static_cast<unsigned char>(
130 extra.at(i + 2))) << 16)
131 | (static_cast<quint64>(static_cast<unsigned char>(
132 extra.at(i + 3))) << 24)
133 | (static_cast<quint64>(static_cast<unsigned char>(
134 extra.at(i + 4))) << 32)
135 | (static_cast<quint64>(static_cast<unsigned char>(
136 extra.at(i + 5))) << 40)
137 | (static_cast<quint64>(static_cast<unsigned char>(
138 extra.at(i + 6))) << 48)
139 | (static_cast<quint64>(static_cast<unsigned char>(
140 extra.at(i + 7))) << 56);
141 // the NTFS time is measured from 1601 for whatever reason
142 QDateTime base(QDate(1601, 1, 1), QTime(0, 0), Qt::UTC);
143 dateTime = base.addMSecs(mtime / 10000);
144 if (fineTicks != NULL) {
145 *fineTicks = static_cast<int>(mtime % 10000);
146 }
147 i += tagsize - position;
148 } else {
149 i += tagsize;
150 }
151
152 }
153 } else {
154 i += length;
155 }
156 }
157 if (fineTicks != NULL && dateTime.isNull()) {
158 *fineTicks = 0;
159 }
160 return dateTime;
161}
162
163QDateTime QuaZipFileInfo64::getNTFSmTime(int *fineTicks) const
164{
165 return getNTFSTime(extra, 0, fineTicks);
166}
167
168QDateTime QuaZipFileInfo64::getNTFSaTime(int *fineTicks) const
169{
170 return getNTFSTime(extra, 8, fineTicks);
171}
172
173QDateTime QuaZipFileInfo64::getNTFScTime(int *fineTicks) const
174{
175 return getNTFSTime(extra, 16, fineTicks);
176}