NOISSUE move some zip utility functions back to quazip

It's not entirely clean yet.
This commit is contained in:
Petr Mrázek 2017-05-29 01:32:28 +02:00
parent 7acf1998eb
commit cdc9bed83f
5 changed files with 19 additions and 169 deletions

View File

@ -99,7 +99,7 @@ void InstanceImportTask::extractAndTweak()
QDir extractDir(m_stagingPath); QDir extractDir(m_stagingPath);
qDebug() << "Attempting to create instance from" << m_archivePath; qDebug() << "Attempting to create instance from" << m_archivePath;
m_extractFuture = QtConcurrent::run(QThreadPool::globalInstance(), MMCZip::extractDir, m_archivePath, extractDir.absolutePath(), MMCZip::Option::NoPermissions); m_extractFuture = QtConcurrent::run(QThreadPool::globalInstance(), MMCZip::extractDir, m_archivePath, extractDir.absolutePath());
connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &InstanceImportTask::extractFinished); connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &InstanceImportTask::extractFinished);
connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, &InstanceImportTask::extractAborted); connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, &InstanceImportTask::extractAborted);
m_extractFutureWatcher.setFuture(m_extractFuture); m_extractFutureWatcher.setFuture(m_extractFuture);

View File

@ -24,67 +24,14 @@ see quazip/(un)MMCZip.h files for details. Basically it's the zlib license.
*/ */
#include <quazip.h> #include <quazip.h>
#include <JlCompress.h>
#include <quazipdir.h> #include <quazipdir.h>
#include <quazipfile.h>
#include <JlCompress.h>
#include "MMCZip.h" #include "MMCZip.h"
#include "FileSystem.h" #include "FileSystem.h"
#include <QDebug> #include <QDebug>
bool copyData(QIODevice &inFile, QIODevice &outFile)
{
while (!inFile.atEnd())
{
char buf[4096];
qint64 readLen = inFile.read(buf, 4096);
if (readLen <= 0)
return false;
if (outFile.write(buf, readLen) != readLen)
return false;
}
return true;
}
bool compressFile(QuaZip *zip, QString fileName, QString fileDest)
{
if (!zip)
{
return false;
}
if (zip->getMode() != QuaZip::mdCreate && zip->getMode() != QuaZip::mdAppend &&
zip->getMode() != QuaZip::mdAdd)
{
return false;
}
QFile inFile;
inFile.setFileName(fileName);
if (!inFile.open(QIODevice::ReadOnly))
{
return false;
}
QuaZipFile outFile(zip);
if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, inFile.fileName())))
{
return false;
}
if (!copyData(inFile, outFile) || outFile.getZipError() != UNZ_OK)
{
return false;
}
outFile.close();
if (outFile.getZipError() != UNZ_OK)
{
return false;
}
inFile.close();
return true;
}
bool MMCZip::compressSubDir(QuaZip* zip, QString dir, QString origDir, QSet<QString>& added, QString prefix, const SeparatorPrefixTree <'/'> * blacklist) bool MMCZip::compressSubDir(QuaZip* zip, QString dir, QString origDir, QSet<QString>& added, QString prefix, const SeparatorPrefixTree <'/'> * blacklist)
{ {
if (!zip) return false; if (!zip) return false;
@ -151,7 +98,7 @@ bool MMCZip::compressSubDir(QuaZip* zip, QString dir, QString origDir, QSet<QStr
filename = FS::PathCombine(prefix, filename); filename = FS::PathCombine(prefix, filename);
} }
added.insert(filename); added.insert(filename);
if (!compressFile(zip,file.absoluteFilePath(),filename)) if (!JlCompress::compressFile(zip,file.absoluteFilePath(),filename))
{ {
return false; return false;
} }
@ -160,8 +107,7 @@ bool MMCZip::compressSubDir(QuaZip* zip, QString dir, QString origDir, QSet<QStr
return true; return true;
} }
bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &contained, bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &contained, std::function<bool(QString)> filter)
std::function<bool(QString)> filter)
{ {
QuaZip modZip(from.filePath()); QuaZip modZip(from.filePath());
modZip.open(QuaZip::mdUnzip); modZip.open(QuaZip::mdUnzip);
@ -199,7 +145,7 @@ bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &containe
fileInsideMod.close(); fileInsideMod.close();
return false; return false;
} }
if (!copyData(fileInsideMod, zipOutFile)) if (!JlCompress::copyData(fileInsideMod, zipOutFile))
{ {
zipOutFile.close(); zipOutFile.close();
fileInsideMod.close(); fileInsideMod.close();
@ -247,8 +193,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
else if (mod.type() == Mod::MOD_SINGLEFILE) else if (mod.type() == Mod::MOD_SINGLEFILE)
{ {
auto filename = mod.filename(); auto filename = mod.filename();
if (!compressFile(&zipOut, filename.absoluteFilePath(), if (!JlCompress::compressFile(&zipOut, filename.absoluteFilePath(), filename.fileName()))
filename.fileName()))
{ {
zipOut.close(); zipOut.close();
QFile::remove(targetJarPath); QFile::remove(targetJarPath);
@ -264,7 +209,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
QDir dir(what_to_zip); QDir dir(what_to_zip);
dir.cdUp(); dir.cdUp();
QString parent_dir = dir.absolutePath(); QString parent_dir = dir.absolutePath();
if (!compressSubDir(&zipOut, what_to_zip, parent_dir, addedFiles)) if (!MMCZip::compressSubDir(&zipOut, what_to_zip, parent_dir, addedFiles))
{ {
zipOut.close(); zipOut.close();
QFile::remove(targetJarPath); QFile::remove(targetJarPath);
@ -328,7 +273,7 @@ bool MMCZip::compressDir(QString zipFile, QString dir, QString prefix, const Sep
} }
QSet<QString> added; QSet<QString> added;
if (!compressSubDir(&zip, dir, dir, added, prefix, blacklist)) if (!MMCZip::compressSubDir(&zip, dir, dir, added, prefix, blacklist))
{ {
QFile::remove(zipFile); QFile::remove(zipFile);
return false; return false;
@ -379,89 +324,7 @@ bool MMCZip::findFilesInZip(QuaZip * zip, const QString & what, QStringList & re
return !result.isEmpty(); return !result.isEmpty();
} }
bool removeFile(QStringList listFile) QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QString &target)
{
bool ret = true;
for (int i = 0; i < listFile.count(); i++)
{
ret &= QFile::remove(listFile.at(i));
}
return ret;
}
bool MMCZip::extractFile(QuaZip *zip, const QString &fileName, const QString &fileDest, MMCZip::Options opts)
{
if(!zip)
return false;
if (zip->getMode() != QuaZip::mdUnzip)
return false;
if (!fileName.isEmpty())
zip->setCurrentFile(fileName);
QuaZipFile inFile(zip);
if (!inFile.open(QIODevice::ReadOnly) || inFile.getZipError() != UNZ_OK)
return false;
QDir curDir;
if (fileDest.endsWith('/'))
{
if (!curDir.mkpath(fileDest))
{
return false;
}
}
else
{
if (!curDir.mkpath(QFileInfo(fileDest).absolutePath()))
{
return false;
}
}
QuaZipFileInfo64 info;
if (!zip->getCurrentFileInfo(&info))
return false;
QFile::Permissions srcPerm = info.getPermissions();
if (fileDest.endsWith('/') && QFileInfo(fileDest).isDir())
{
if (!opts.testFlag(Option::NoPermissions) && srcPerm != 0)
{
QFile(fileDest).setPermissions(srcPerm);
}
return true;
}
QFile outFile;
outFile.setFileName(fileDest);
if (!outFile.open(QIODevice::WriteOnly))
return false;
if (!copyData(inFile, outFile) || inFile.getZipError() != UNZ_OK)
{
outFile.close();
removeFile(QStringList(fileDest));
return false;
}
outFile.close();
inFile.close();
if (inFile.getZipError() != UNZ_OK)
{
removeFile(QStringList(fileDest));
return false;
}
if (!opts.testFlag(Option::NoPermissions) && srcPerm != 0)
{
outFile.setPermissions(srcPerm);
}
return true;
}
QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QString &target, MMCZip::Options opts)
{ {
QDir directory(target); QDir directory(target);
QStringList extracted; QStringList extracted;
@ -482,9 +345,9 @@ QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QSt
{ {
absFilePath += "/"; absFilePath += "/";
} }
if (!MMCZip::extractFile(zip, "", absFilePath, opts)) if (!JlCompress::extractFile(zip, "", absFilePath))
{ {
removeFile(extracted); JlCompress::removeFile(extracted);
return QStringList(); return QStringList();
} }
extracted.append(absFilePath); extracted.append(absFilePath);
@ -492,12 +355,12 @@ QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QSt
return extracted; return extracted;
} }
QStringList MMCZip::extractDir(QString fileCompressed, QString dir, MMCZip::Options opts) QStringList MMCZip::extractDir(QString fileCompressed, QString dir)
{ {
QuaZip zip(fileCompressed); QuaZip zip(fileCompressed);
if (!zip.open(QuaZip::mdUnzip)) if (!zip.open(QuaZip::mdUnzip))
{ {
return {}; return {};
} }
return MMCZip::extractSubDir(&zip, "", dir, opts); return MMCZip::extractSubDir(&zip, "", dir);
} }

View File

@ -9,7 +9,7 @@
#include "multimc_logic_export.h" #include "multimc_logic_export.h"
class QuaZip; #include <JlCompress.h>
namespace MMCZip namespace MMCZip
{ {
@ -64,22 +64,10 @@ namespace MMCZip
*/ */
bool MULTIMC_LOGIC_EXPORT findFilesInZip(QuaZip * zip, const QString & what, QStringList & result, const QString &root = QString()); bool MULTIMC_LOGIC_EXPORT findFilesInZip(QuaZip * zip, const QString & what, QStringList & result, const QString &root = QString());
enum Option {
NoPermissions = 1
};
Q_DECLARE_FLAGS(Options, Option)
/**
* Extract a single file to a destination
*
* \return true if it succeeds
*/
bool MULTIMC_LOGIC_EXPORT extractFile(QuaZip *zip, const QString &fileName, const QString &fileDest, Options opts = 0);
/** /**
* Extract a subdirectory from an archive * Extract a subdirectory from an archive
*/ */
QStringList MULTIMC_LOGIC_EXPORT extractSubDir(QuaZip *zip, const QString & subdir, const QString &target, Options opts = 0); QStringList MULTIMC_LOGIC_EXPORT extractSubDir(QuaZip *zip, const QString & subdir, const QString &target);
/** /**
* Extract a whole archive. * Extract a whole archive.
@ -89,6 +77,6 @@ namespace MMCZip
* \param opts Extra options. * \param opts Extra options.
* \return The list of the full paths of the files extracted, empty on failure. * \return The list of the full paths of the files extracted, empty on failure.
*/ */
QStringList MULTIMC_LOGIC_EXPORT extractDir(QString fileCompressed, QString dir, Options opts = 0); QStringList MULTIMC_LOGIC_EXPORT extractDir(QString fileCompressed, QString dir);
} }

View File

@ -18,7 +18,6 @@
#include <launch/LaunchTask.h> #include <launch/LaunchTask.h>
#include <quazip.h> #include <quazip.h>
#include <JlCompress.h>
#include <quazipdir.h> #include <quazipdir.h>
#include "MMCZip.h" #include "MMCZip.h"
#include "FileSystem.h" #include "FileSystem.h"
@ -54,7 +53,7 @@ static bool unzipNatives(QString source, QString targetFolder, bool applyJnilibH
name = replaceSuffix(name, ".jnilib", ".dylib"); name = replaceSuffix(name, ".jnilib", ".dylib");
} }
QString absFilePath = directory.absoluteFilePath(name); QString absFilePath = directory.absoluteFilePath(name);
if (!MMCZip::extractFile(&zip, "", absFilePath)) if (!JlCompress::extractFile(&zip, "", absFilePath))
{ {
return false; return false;
} }

@ -1 +1 @@
Subproject commit 2c40fc85b465b9af33424322de30e4fd09c5c0ba Subproject commit 8837555312a7f95dc5c4ce6474860b1c159d8105