summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2011-07-26 20:54:44 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2011-07-26 20:54:44 +0000
commit743308e8828d36ce53fbf25a6fd815dad74b7d59 (patch)
tree4b3431410c2bdafc3e66541dee9e7733bc59e7b9
parent3bb0fed345d72c7bf944ab490a249463ed150586 (diff)
downloadrockbox-743308e8828d36ce53fbf25a6fd815dad74b7d59.tar.gz
rockbox-743308e8828d36ce53fbf25a6fd815dad74b7d59.zip
Take cluster size into account when calculating zip extracted size.
Allow passing an (optional) cluster size to round up all file sizes when calculating the total size of an extracted zip archive. This allows to check if the space on disk is actually sufficient without relying on an arbitrary headroom value which might be wrong. Addresses FS#12195. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30214 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--rbutil/rbutilqt/base/utils.cpp31
-rw-r--r--rbutil/rbutilqt/base/utils.h4
-rw-r--r--rbutil/rbutilqt/base/zipinstaller.cpp3
-rw-r--r--rbutil/rbutilqt/base/ziputil.cpp21
-rw-r--r--rbutil/rbutilqt/base/ziputil.h2
5 files changed, 51 insertions, 10 deletions
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp
index 1fdf627378..ca3a6d2256 100644
--- a/rbutil/rbutilqt/base/utils.cpp
+++ b/rbutil/rbutilqt/base/utils.cpp
@@ -187,13 +187,25 @@ QString Utils::filesystemName(QString path)
187//! @return size in bytes 187//! @return size in bytes
188qulonglong Utils::filesystemFree(QString path) 188qulonglong Utils::filesystemFree(QString path)
189{ 189{
190 return filesystemSize(path, FilesystemFree); 190 qulonglong size = filesystemSize(path, FilesystemFree);
191 qDebug() << "[Utils] free disk space for" << path << size;
192 return size;
191} 193}
192 194
193 195
194qulonglong Utils::filesystemTotal(QString path) 196qulonglong Utils::filesystemTotal(QString path)
195{ 197{
196 return filesystemSize(path, FilesystemTotal); 198 qulonglong size = filesystemSize(path, FilesystemTotal);
199 qDebug() << "[Utils] total disk space for" << path << size;
200 return size;
201}
202
203
204qulonglong Utils::filesystemClusterSize(QString path)
205{
206 qulonglong size = filesystemSize(path, FilesystemClusterSize);
207 qDebug() << "[Utils] cluster size for" << path << size;
208 return size;
197} 209}
198 210
199 211
@@ -214,6 +226,9 @@ qulonglong Utils::filesystemSize(QString path, enum Utils::Size type)
214 if(type == FilesystemTotal) { 226 if(type == FilesystemTotal) {
215 size = (qulonglong)fs.f_frsize * (qulonglong)fs.f_blocks; 227 size = (qulonglong)fs.f_frsize * (qulonglong)fs.f_blocks;
216 } 228 }
229 if(type == FilesystemClusterSize) {
230 size = (qulonglong)fs.f_frsize;
231 }
217 } 232 }
218#endif 233#endif
219#if defined(Q_OS_WIN32) 234#if defined(Q_OS_WIN32)
@@ -230,9 +245,19 @@ qulonglong Utils::filesystemSize(QString path, enum Utils::Size type)
230 if(type == FilesystemTotal) { 245 if(type == FilesystemTotal) {
231 size = totalNumberBytes.QuadPart; 246 size = totalNumberBytes.QuadPart;
232 } 247 }
248 if(type == FilesystemClusterSize) {
249 DWORD sectorsPerCluster;
250 DWORD bytesPerSector;
251 DWORD freeClusters;
252 DWORD totalClusters;
253 ret = GetDiskFreeSpaceW((LPCTSTR)path.utf16(), &sectorsPerCluster,
254 &bytesPerSector, &freeClusters, &totalClusters);
255 if(ret) {
256 size = bytesPerSector * sectorsPerCluster;
257 }
258 }
233 } 259 }
234#endif 260#endif
235 qDebug() << "[Utils] Filesystem:" << path << size;
236 return size; 261 return size;
237} 262}
238 263
diff --git a/rbutil/rbutilqt/base/utils.h b/rbutil/rbutilqt/base/utils.h
index 659bbc4ed4..b4477699fd 100644
--- a/rbutil/rbutilqt/base/utils.h
+++ b/rbutil/rbutilqt/base/utils.h
@@ -33,13 +33,15 @@ class Utils : public QObject
33public: 33public:
34 enum Size { 34 enum Size {
35 FilesystemTotal, 35 FilesystemTotal,
36 FilesystemFree 36 FilesystemFree,
37 FilesystemClusterSize,
37 }; 38 };
38 39
39 static bool recursiveRmdir(const QString &dirName); 40 static bool recursiveRmdir(const QString &dirName);
40 static QString resolvePathCase(QString path); 41 static QString resolvePathCase(QString path);
41 static qulonglong filesystemFree(QString path); 42 static qulonglong filesystemFree(QString path);
42 static qulonglong filesystemTotal(QString path); 43 static qulonglong filesystemTotal(QString path);
44 static qulonglong filesystemClusterSize(QString path);
43 static qulonglong filesystemSize(QString path, enum Size type); 45 static qulonglong filesystemSize(QString path, enum Size type);
44 static QString findExecutable(QString name); 46 static QString findExecutable(QString name);
45 static QString checkEnvironment(bool permission); 47 static QString checkEnvironment(bool permission);
diff --git a/rbutil/rbutilqt/base/zipinstaller.cpp b/rbutil/rbutilqt/base/zipinstaller.cpp
index 76f673ff81..c450f3015f 100644
--- a/rbutil/rbutilqt/base/zipinstaller.cpp
+++ b/rbutil/rbutilqt/base/zipinstaller.cpp
@@ -140,7 +140,8 @@ void ZipInstaller::downloadDone(bool error)
140 // some room for operating (also includes calculation mistakes due to 140 // some room for operating (also includes calculation mistakes due to
141 // cluster sizes on the player). 141 // cluster sizes on the player).
142 if((qint64)Utils::filesystemFree(m_mountpoint) 142 if((qint64)Utils::filesystemFree(m_mountpoint)
143 < (zip.totalUncompressedSize() + 1000000)) { 143 < (zip.totalUncompressedSize(Utils::filesystemClusterSize(m_mountpoint))
144 + 1000000)) {
144 emit logItem(tr("Not enough disk space! Aborting."), LOGERROR); 145 emit logItem(tr("Not enough disk space! Aborting."), LOGERROR);
145 emit logProgress(1, 1); 146 emit logProgress(1, 1);
146 emit done(true); 147 emit done(true);
diff --git a/rbutil/rbutilqt/base/ziputil.cpp b/rbutil/rbutilqt/base/ziputil.cpp
index ed8f17eefe..4396fa5e87 100644
--- a/rbutil/rbutilqt/base/ziputil.cpp
+++ b/rbutil/rbutilqt/base/ziputil.cpp
@@ -205,7 +205,7 @@ bool ZipUtil::appendFileToArchive(QString& file, QString& basedir)
205 205
206 206
207//! @brief calculate total size of extracted files 207//! @brief calculate total size of extracted files
208qint64 ZipUtil::totalUncompressedSize(void) 208qint64 ZipUtil::totalUncompressedSize(unsigned int clustersize)
209{ 209{
210 qint64 uncompressed = 0; 210 qint64 uncompressed = 0;
211 211
@@ -214,10 +214,23 @@ qint64 ZipUtil::totalUncompressedSize(void)
214 return -1; 214 return -1;
215 } 215 }
216 int max = items.size(); 216 int max = items.size();
217 for(int i = 0; i < max; ++i) { 217 if(clustersize > 0) {
218 uncompressed += items.at(i).uncompressedSize; 218 for(int i = 0; i < max; ++i) {
219 qint64 item = items.at(i).uncompressedSize;
220 uncompressed += (item + clustersize - (item % clustersize));
221 }
222 }
223 else {
224 for(int i = 0; i < max; ++i) {
225 uncompressed += items.at(i).uncompressedSize;
226 }
227 }
228 if(clustersize > 0) {
229 qDebug() << "[ZipUtil] calculation rounded to cluster size for each file:"
230 << clustersize;
219 } 231 }
220 qDebug() << "[ZipUtil] size of archive files uncompressed:" << uncompressed; 232 qDebug() << "[ZipUtil] size of archive files uncompressed:"
233 << uncompressed;
221 return uncompressed; 234 return uncompressed;
222} 235}
223 236
diff --git a/rbutil/rbutilqt/base/ziputil.h b/rbutil/rbutilqt/base/ziputil.h
index cfafb96566..dc1b986c29 100644
--- a/rbutil/rbutilqt/base/ziputil.h
+++ b/rbutil/rbutilqt/base/ziputil.h
@@ -37,7 +37,7 @@ class ZipUtil : public QObject
37 bool extractArchive(QString& dest); 37 bool extractArchive(QString& dest);
38 bool appendDirToArchive(QString& source, QString& basedir); 38 bool appendDirToArchive(QString& source, QString& basedir);
39 bool appendFileToArchive(QString& file, QString& basedir); 39 bool appendFileToArchive(QString& file, QString& basedir);
40 qint64 totalUncompressedSize(void); 40 qint64 totalUncompressedSize(unsigned int clustersize = 0);
41 QStringList files(void); 41 QStringList files(void);
42 42
43 signals: 43 signals: