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
This commit is contained in:
Dominik Riebeling 2011-07-26 20:54:44 +00:00
parent 3bb0fed345
commit 743308e882
5 changed files with 51 additions and 10 deletions

View file

@ -187,13 +187,25 @@ QString Utils::filesystemName(QString path)
//! @return size in bytes
qulonglong Utils::filesystemFree(QString path)
{
return filesystemSize(path, FilesystemFree);
qulonglong size = filesystemSize(path, FilesystemFree);
qDebug() << "[Utils] free disk space for" << path << size;
return size;
}
qulonglong Utils::filesystemTotal(QString path)
{
return filesystemSize(path, FilesystemTotal);
qulonglong size = filesystemSize(path, FilesystemTotal);
qDebug() << "[Utils] total disk space for" << path << size;
return size;
}
qulonglong Utils::filesystemClusterSize(QString path)
{
qulonglong size = filesystemSize(path, FilesystemClusterSize);
qDebug() << "[Utils] cluster size for" << path << size;
return size;
}
@ -214,6 +226,9 @@ qulonglong Utils::filesystemSize(QString path, enum Utils::Size type)
if(type == FilesystemTotal) {
size = (qulonglong)fs.f_frsize * (qulonglong)fs.f_blocks;
}
if(type == FilesystemClusterSize) {
size = (qulonglong)fs.f_frsize;
}
}
#endif
#if defined(Q_OS_WIN32)
@ -230,9 +245,19 @@ qulonglong Utils::filesystemSize(QString path, enum Utils::Size type)
if(type == FilesystemTotal) {
size = totalNumberBytes.QuadPart;
}
if(type == FilesystemClusterSize) {
DWORD sectorsPerCluster;
DWORD bytesPerSector;
DWORD freeClusters;
DWORD totalClusters;
ret = GetDiskFreeSpaceW((LPCTSTR)path.utf16(), &sectorsPerCluster,
&bytesPerSector, &freeClusters, &totalClusters);
if(ret) {
size = bytesPerSector * sectorsPerCluster;
}
}
}
#endif
qDebug() << "[Utils] Filesystem:" << path << size;
return size;
}

View file

@ -33,13 +33,15 @@ class Utils : public QObject
public:
enum Size {
FilesystemTotal,
FilesystemFree
FilesystemFree,
FilesystemClusterSize,
};
static bool recursiveRmdir(const QString &dirName);
static QString resolvePathCase(QString path);
static qulonglong filesystemFree(QString path);
static qulonglong filesystemTotal(QString path);
static qulonglong filesystemClusterSize(QString path);
static qulonglong filesystemSize(QString path, enum Size type);
static QString findExecutable(QString name);
static QString checkEnvironment(bool permission);

View file

@ -140,7 +140,8 @@ void ZipInstaller::downloadDone(bool error)
// some room for operating (also includes calculation mistakes due to
// cluster sizes on the player).
if((qint64)Utils::filesystemFree(m_mountpoint)
< (zip.totalUncompressedSize() + 1000000)) {
< (zip.totalUncompressedSize(Utils::filesystemClusterSize(m_mountpoint))
+ 1000000)) {
emit logItem(tr("Not enough disk space! Aborting."), LOGERROR);
emit logProgress(1, 1);
emit done(true);

View file

@ -205,7 +205,7 @@ bool ZipUtil::appendFileToArchive(QString& file, QString& basedir)
//! @brief calculate total size of extracted files
qint64 ZipUtil::totalUncompressedSize(void)
qint64 ZipUtil::totalUncompressedSize(unsigned int clustersize)
{
qint64 uncompressed = 0;
@ -214,10 +214,23 @@ qint64 ZipUtil::totalUncompressedSize(void)
return -1;
}
int max = items.size();
for(int i = 0; i < max; ++i) {
uncompressed += items.at(i).uncompressedSize;
if(clustersize > 0) {
for(int i = 0; i < max; ++i) {
qint64 item = items.at(i).uncompressedSize;
uncompressed += (item + clustersize - (item % clustersize));
}
}
qDebug() << "[ZipUtil] size of archive files uncompressed:" << uncompressed;
else {
for(int i = 0; i < max; ++i) {
uncompressed += items.at(i).uncompressedSize;
}
}
if(clustersize > 0) {
qDebug() << "[ZipUtil] calculation rounded to cluster size for each file:"
<< clustersize;
}
qDebug() << "[ZipUtil] size of archive files uncompressed:"
<< uncompressed;
return uncompressed;
}

View file

@ -37,7 +37,7 @@ class ZipUtil : public QObject
bool extractArchive(QString& dest);
bool appendDirToArchive(QString& source, QString& basedir);
bool appendFileToArchive(QString& file, QString& basedir);
qint64 totalUncompressedSize(void);
qint64 totalUncompressedSize(unsigned int clustersize = 0);
QStringList files(void);
signals: