NOISSUE move some zip utility functions back to quazip
It's not entirely clean yet.
This commit is contained in:
parent
7acf1998eb
commit
cdc9bed83f
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user