refactor: initial migration to QuaZip 1.2

Let's move off our custom QuaZip. In the olden times we needed the
custom version of QuaZip, as it was basically unmaintained and on
SourceForge (eww). But nowadays it's maintained and on GitHub. See
new GitHub page: https://github.com/stachenov/quazip
This commit is contained in:
Sefa Eyeoglu 2022-01-20 20:40:56 +01:00
parent c39da093bf
commit efa414c442
No known key found for this signature in database
GPG Key ID: C10411294912A422
18 changed files with 39 additions and 130 deletions

4
.gitmodules vendored
View File

@ -2,7 +2,3 @@
path = libraries/libnbtplusplus
url = https://github.com/MultiMC/libnbtplusplus.git
pushurl = git@github.com:MultiMC/libnbtplusplus.git
[submodule "libraries/quazip"]
path = libraries/quazip
url = https://github.com/PolyMC/quazip.git
pushurl = git@github.com:PolyMC/quazip.git

View File

@ -103,6 +103,8 @@ find_package(Qt5Network REQUIRED)
find_package(Qt5Test REQUIRED)
find_package(Qt5Xml REQUIRED)
find_package(QuaZip-Qt5 REQUIRED)
# The Qt5 cmake files don't provide its install paths, so ask qmake.
include(QMakeQuery)
query_qmake(QT_INSTALL_PLUGINS QT_PLUGINS_DIR)
@ -249,7 +251,6 @@ add_subdirectory(libraries/hoedown) # markdown parser
add_subdirectory(libraries/launcher) # java based launcher part for Minecraft
add_subdirectory(libraries/javacheck) # java compatibility checker
add_subdirectory(libraries/xz-embedded) # xz compression
add_subdirectory(libraries/quazip) # zip manipulation library
add_subdirectory(libraries/rainbow) # Qt extension for colors
add_subdirectory(libraries/iconfix) # fork of Qt's QIcon loader
add_subdirectory(libraries/LocalPeer) # fork of a library from Qt solutions

View File

@ -29,7 +29,7 @@
#include "modplatform/flame/FileResolvingTask.h"
#include "modplatform/flame/PackManifest.h"
#include "Json.h"
#include <quazipdir.h>
#include <QuaZip-Qt5-1.2/quazip/quazipdir.h>
#include "modplatform/technic/TechnicPackProcessor.h"
#include "icons/IconList.h"

View File

@ -13,17 +13,16 @@
* limitations under the License.
*/
#include <quazip.h>
#include <quazipdir.h>
#include <quazipfile.h>
#include <JlCompress.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazipdir.h>
#include <QuaZip-Qt5-1.2/quazip/quazipfile.h>
#include "MMCZip.h"
#include "FileSystem.h"
#include <QDebug>
// ours
bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &contained, const JlCompress::FilterFunction filter)
bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &contained, const FilterFunction filter)
{
QuaZip modZip(from.filePath());
modZip.open(QuaZip::mdUnzip);
@ -74,99 +73,6 @@ bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &containe
return true;
}
// ours
bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const QList<Mod>& mods)
{
QuaZip zipOut(targetJarPath);
if (!zipOut.open(QuaZip::mdCreate))
{
QFile::remove(targetJarPath);
qCritical() << "Failed to open the minecraft.jar for modding";
return false;
}
// Files already added to the jar.
// These files will be skipped.
QSet<QString> addedFiles;
// Modify the jar
QListIterator<Mod> i(mods);
i.toBack();
while (i.hasPrevious())
{
const Mod &mod = i.previous();
// do not merge disabled mods.
if (!mod.enabled())
continue;
if (mod.type() == Mod::MOD_ZIPFILE)
{
if (!mergeZipFiles(&zipOut, mod.filename(), addedFiles))
{
zipOut.close();
QFile::remove(targetJarPath);
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
return false;
}
}
else if (mod.type() == Mod::MOD_SINGLEFILE)
{
// FIXME: buggy - does not work with addedFiles
auto filename = mod.filename();
if (!JlCompress::compressFile(&zipOut, filename.absoluteFilePath(), filename.fileName()))
{
zipOut.close();
QFile::remove(targetJarPath);
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
return false;
}
addedFiles.insert(filename.fileName());
}
else if (mod.type() == Mod::MOD_FOLDER)
{
// FIXME: buggy - does not work with addedFiles
auto filename = mod.filename();
QString what_to_zip = filename.absoluteFilePath();
QDir dir(what_to_zip);
dir.cdUp();
QString parent_dir = dir.absolutePath();
if (!JlCompress::compressSubDir(&zipOut, what_to_zip, parent_dir, addedFiles))
{
zipOut.close();
QFile::remove(targetJarPath);
qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar.";
return false;
}
qDebug() << "Adding folder " << filename.fileName() << " from "
<< filename.absoluteFilePath();
}
else
{
// Make sure we do not continue launching when something is missing or undefined...
zipOut.close();
QFile::remove(targetJarPath);
qCritical() << "Failed to add unknown mod type" << mod.filename().fileName() << "to the jar.";
return false;
}
}
if (!mergeZipFiles(&zipOut, QFileInfo(sourceJarPath), addedFiles, [](const QString key){return !key.contains("META-INF");}))
{
zipOut.close();
QFile::remove(targetJarPath);
qCritical() << "Failed to insert minecraft.jar contents.";
return false;
}
// Recompress the jar
zipOut.close();
if (zipOut.getZipError() != 0)
{
QFile::remove(targetJarPath);
qCritical() << "Failed to finalize minecraft.jar!";
return false;
}
return true;
}
// ours
QString MMCZip::findFolderOfFileInZip(QuaZip * zip, const QString & what, const QString &root)
{

View File

@ -21,17 +21,21 @@
#include "minecraft/mod/Mod.h"
#include <functional>
#include <JlCompress.h>
//#include <QuaZip-Qt5-1.2/quazip/JlCompress.h>
// TODO: Blocked by https://github.com/stachenov/quazip/pull/141
// For now, checkout https://github.com/Scrumplex/quazip/tree/expose-jlcompress-fns at ../../quazip
#include <../../quazip/quazip/JlCompress.h>
#include <nonstd/optional>
namespace MMCZip
{
using FilterFunction = std::function<bool(const QString &)>;
/**
* Merge two zip files, using a filter function
*/
bool mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &contained,
const JlCompress::FilterFunction filter = nullptr);
const FilterFunction filter = nullptr);
/**
* take a source jar, add mods to it, resulting in target jar

View File

@ -20,7 +20,7 @@
#include <QUrl>
#include "tasks/Task.h"
#include <quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include "QObjectPtr.h"

View File

@ -22,7 +22,7 @@
#include "net/NetJob.h"
#include "tasks/Task.h"
#include "minecraft/VersionFilterData.h"
#include <quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
class MinecraftVersion;
class MinecraftInstance;

View File

@ -26,9 +26,9 @@
#include <io/stream_reader.h>
#include <tag_string.h>
#include <tag_primitive.h>
#include <quazip.h>
#include <quazipfile.h>
#include <quazipdir.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazipfile.h>
#include <QuaZip-Qt5-1.2/quazip/quazipdir.h>
#include <QCoreApplication>

View File

@ -17,8 +17,8 @@
#include <minecraft/MinecraftInstance.h>
#include <launch/LaunchTask.h>
#include <quazip.h>
#include <quazipdir.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazipdir.h>
#include "MMCZip.h"
#include "FileSystem.h"
#include <QDir>

View File

@ -42,6 +42,7 @@ void ModMinecraftJar::executeTask()
emitFailed(tr("Couldn't remove stale jar file: %1").arg(finalJarPath));
}
/*
// create temporary modded jar, if needed
auto components = m_inst->getPackProfile();
auto profile = components->getProfile();
@ -53,12 +54,13 @@ void ModMinecraftJar::executeTask()
mainJar->getApplicableFiles(currentSystem, jars, temp1, temp2, temp3, m_inst->getLocalLibraryPath());
auto sourceJarPath = jars[0];
if(!MMCZip::createModdedJar(sourceJarPath, finalJarPath, jarMods))
{
{ */
// TODO: add back support for modded jar
emitFailed(tr("Failed to create the custom Minecraft jar file."));
return;
}
/*}
}
emitSucceeded();
emitSucceeded();*/
}
void ModMinecraftJar::finalize()

View File

@ -4,8 +4,8 @@
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <quazip.h>
#include <quazipfile.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazipfile.h>
#include <toml.h>
#include "settings/INIFile.h"

View File

@ -19,7 +19,7 @@
#include <QtConcurrent/QtConcurrent>
#include <quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include "MMCZip.h"
#include "minecraft/OneSixVersionFormat.h"

View File

@ -1,8 +1,8 @@
#pragma once
#include "InstanceTask.h"
#include "net/NetJob.h"
#include "quazip.h"
#include "quazipdir.h"
#include "QuaZip-Qt5-1.2/quazip/quazip.h"
#include "QuaZip-Qt5-1.2/quazip/quazipdir.h"
#include "meta/Index.h"
#include "meta/Version.h"
#include "meta/VersionList.h"

View File

@ -18,7 +18,7 @@
#include "InstanceTask.h"
#include "net/NetJob.h"
#include "quazip.h"
#include "QuaZip-Qt5-1.2/quazip/quazip.h"
#include <QFutureWatcher>
#include <QStringList>

View File

@ -19,9 +19,9 @@
#include <Json.h>
#include <minecraft/MinecraftInstance.h>
#include <minecraft/PackProfile.h>
#include <quazip.h>
#include <quazipdir.h>
#include <quazipfile.h>
#include <QuaZip-Qt5-1.2/quazip/quazip.h>
#include <QuaZip-Qt5-1.2/quazip/quazipdir.h>
#include <QuaZip-Qt5-1.2/quazip/quazipfile.h>
#include <settings/INISettingsObject.h>
#include <memory>

View File

@ -378,6 +378,7 @@ void SaveIcon(InstancePtr m_instance)
bool ExportInstanceDialog::doExport()
{
/*
auto name = FS::RemoveInvalidFilenameChars(m_instance->name());
const QString output = QFileDialog::getSaveFileName(
@ -404,11 +405,11 @@ bool ExportInstanceDialog::doExport()
auto & blocked = proxyModel->blockedPaths();
using std::placeholders::_1;
if (!JlCompress::compressDir(output, m_instance->instanceRoot(), name, std::bind(&SeparatorPrefixTree<'/'>::covers, blocked, _1)))
{
{ */
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
return false;
}
return true;
/*}
return true;*/
}
void ExportInstanceDialog::done(int result)

View File

@ -18,7 +18,7 @@
#include "classparser.h"
#include <QFile>
#include <quazipfile.h>
#include <QuaZip-Qt5-1.2/quazip/quazipfile.h>
#include <QDebug>
namespace classparser

@ -1 +0,0 @@
Subproject commit c9ef32de19bceb58d236f5c22382698deaec69fd