diff options
Diffstat (limited to 'launcher')
-rw-r--r-- | launcher/CMakeLists.txt | 3 | ||||
-rw-r--r-- | launcher/InstanceImportTask.cpp | 2 | ||||
-rw-r--r-- | launcher/MMCZip.cpp | 89 | ||||
-rw-r--r-- | launcher/MMCZip.h | 32 | ||||
-rw-r--r-- | launcher/minecraft/MinecraftLoadAndCheck.h | 2 | ||||
-rw-r--r-- | launcher/minecraft/MinecraftUpdate.h | 2 | ||||
-rw-r--r-- | launcher/minecraft/World.cpp | 6 | ||||
-rw-r--r-- | launcher/minecraft/launch/ExtractNatives.cpp | 4 | ||||
-rw-r--r-- | launcher/minecraft/mod/LocalModParseTask.cpp | 4 | ||||
-rw-r--r-- | launcher/modplatform/atlauncher/ATLPackInstallTask.cpp | 2 | ||||
-rw-r--r-- | launcher/modplatform/legacy_ftb/PackInstallTask.h | 4 | ||||
-rw-r--r-- | launcher/modplatform/technic/SingleZipPackInstallTask.h | 2 | ||||
-rw-r--r-- | launcher/modplatform/technic/TechnicPackProcessor.cpp | 6 | ||||
-rw-r--r-- | launcher/ui/dialogs/ExportInstanceDialog.cpp | 8 |
14 files changed, 137 insertions, 29 deletions
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 54b6132e..f4c3a9bc 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -931,7 +931,6 @@ endif() add_library(Launcher_logic STATIC ${LOGIC_SOURCES} ${LAUNCHER_SOURCES} ${LAUNCHER_UI} ${LAUNCHER_RESOURCES}) target_link_libraries(Launcher_logic systeminfo - Launcher_quazip Launcher_classparser ${NBT_NAME} ${ZLIB_LIBRARIES} @@ -949,7 +948,7 @@ target_link_libraries(Launcher_logic ) target_link_libraries(Launcher_logic Launcher_iconfix - ${QUAZIP_LIBRARIES} + QuaZip::QuaZip hoedown Launcher_rainbow LocalPeer diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp index 8cd68d7b..ec378538 100644 --- a/launcher/InstanceImportTask.cpp +++ b/launcher/InstanceImportTask.cpp @@ -29,7 +29,7 @@ #include "modplatform/flame/FileResolvingTask.h" #include "modplatform/flame/PackManifest.h" #include "Json.h" -#include <quazipdir.h> +#include <quazip/quazipdir.h> #include "modplatform/technic/TechnicPackProcessor.h" #include "icons/IconList.h" diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index b25c61e7..9d7e4cc2 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -13,17 +13,16 @@ * limitations under the License. */ -#include <quazip.h> -#include <quazipdir.h> -#include <quazipfile.h> -#include <JlCompress.h> +#include <quazip/quazip.h> +#include <quazip/quazipdir.h> +#include <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,6 +73,39 @@ bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet<QString> &containe return true; } +bool MMCZip::compressDirFiles(QuaZip *zip, QString dir, QFileInfoList files) +{ + QDir directory(dir); + if (!directory.exists()) return false; + + for (auto e : files) { + auto filePath = directory.relativeFilePath(e.absoluteFilePath()); + if( !JlCompress::compressFile(zip, e.absoluteFilePath(), filePath)) return false; + } + + return true; +} + +bool MMCZip::compressDirFiles(QString fileCompressed, QString dir, QFileInfoList files) +{ + QuaZip zip(fileCompressed); + QDir().mkpath(QFileInfo(fileCompressed).absolutePath()); + if(!zip.open(QuaZip::mdCreate)) { + QFile::remove(fileCompressed); + return false; + } + + auto result = compressDirFiles(&zip, dir, files); + + zip.close(); + if(zip.getZipError()!=0) { + QFile::remove(fileCompressed); + return false; + } + + return result; +} + // ours bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const QList<Mod>& mods) { @@ -122,13 +154,22 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const } else if (mod.type() == Mod::MOD_FOLDER) { + // untested, but seems to be unused / not possible to reach // 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)) + auto files = QFileInfoList(); + MMCZip::collectFileListRecursively(what_to_zip, nullptr, &files, nullptr); + + for (auto e : files) { + if (addedFiles.contains(e.filePath())) + files.removeAll(e); + } + + if (!MMCZip::compressDirFiles(&zipOut, parent_dir, files)) { zipOut.close(); QFile::remove(targetJarPath); @@ -136,7 +177,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const return false; } qDebug() << "Adding folder " << filename.fileName() << " from " - << filename.absoluteFilePath(); + << filename.absoluteFilePath(); } else { @@ -310,3 +351,37 @@ bool MMCZip::extractFile(QString fileCompressed, QString file, QString target) } return MMCZip::extractRelFile(&zip, file, target); } + +bool MMCZip::collectFileListRecursively(const QString& rootDir, const QString& subDir, QFileInfoList *files, + MMCZip::FilterFunction excludeFilter) { + QDir rootDirectory(rootDir); + if (!rootDirectory.exists()) return false; + + QDir directory; + if (subDir == nullptr) + directory = rootDirectory; + else + directory = QDir(subDir); + + if (!directory.exists()) return false; // shouldn't ever happen + + // recurse directories + QFileInfoList entries = directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden); + for (const auto& e: entries) { + if (!collectFileListRecursively(rootDir, e.filePath(), files, excludeFilter)) + return false; + } + + // collect files + entries = directory.entryInfoList(QDir::Files); + for (const auto& e: entries) { + QString relativeFilePath = rootDirectory.relativeFilePath(e.absoluteFilePath()); + if (excludeFilter && excludeFilter(relativeFilePath)) { + qDebug() << "Skipping file " << relativeFilePath; + continue; + } + + files->append(e.filePath()); // we want the original paths for MMCZip::compressDirFiles + } + return true; +} diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index 9c47fa11..0f7aa254 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -21,17 +21,36 @@ #include "minecraft/mod/Mod.h" #include <functional> -#include <JlCompress.h> +#include <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); + + /** + * Compress directory, by providing a list of files to compress + * \param zip target archive + * \param dir directory that will be compressed (to compress with relative paths) + * \param files list of files to compress + * \return true for success or false for failure + */ + bool compressDirFiles(QuaZip *zip, QString dir, QFileInfoList files); + + /** + * Compress directory, by providing a list of files to compress + * \param fileCompressed target archive file + * \param dir directory that will be compressed (to compress with relative paths) + * \param files list of files to compress + * \return true for success or false for failure + */ + bool compressDirFiles(QString fileCompressed, QString dir, QFileInfoList files); /** * take a source jar, add mods to it, resulting in target jar @@ -89,4 +108,13 @@ namespace MMCZip */ bool extractFile(QString fileCompressed, QString file, QString dir); + /** + * Populate a QFileInfoList with a directory tree recursively, while allowing to excludeFilter what shouldn't be included. + * \param rootDir directory to start off + * \param subDir subdirectory, should be nullptr for first invocation + * \param files resulting list of QFileInfo + * \param excludeFilter function to excludeFilter which files shouldn't be included (returning true means to excude) + * \return true for success or false for failure + */ + bool collectFileListRecursively(const QString &rootDir, const QString &subDir, QFileInfoList *files, FilterFunction excludeFilter); } diff --git a/launcher/minecraft/MinecraftLoadAndCheck.h b/launcher/minecraft/MinecraftLoadAndCheck.h index bfeae46b..d9af3ace 100644 --- a/launcher/minecraft/MinecraftLoadAndCheck.h +++ b/launcher/minecraft/MinecraftLoadAndCheck.h @@ -20,7 +20,7 @@ #include <QUrl> #include "tasks/Task.h" -#include <quazip.h> +#include <quazip/quazip.h> #include "QObjectPtr.h" diff --git a/launcher/minecraft/MinecraftUpdate.h b/launcher/minecraft/MinecraftUpdate.h index fadebff9..9ebef656 100644 --- a/launcher/minecraft/MinecraftUpdate.h +++ b/launcher/minecraft/MinecraftUpdate.h @@ -22,7 +22,7 @@ #include "net/NetJob.h" #include "tasks/Task.h" #include "minecraft/VersionFilterData.h" -#include <quazip.h> +#include <quazip/quazip.h> class MinecraftVersion; class MinecraftInstance; diff --git a/launcher/minecraft/World.cpp b/launcher/minecraft/World.cpp index a2b4dac7..2937c116 100644 --- a/launcher/minecraft/World.cpp +++ b/launcher/minecraft/World.cpp @@ -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/quazip.h> +#include <quazip/quazipfile.h> +#include <quazip/quazipdir.h> #include <QCoreApplication> diff --git a/launcher/minecraft/launch/ExtractNatives.cpp b/launcher/minecraft/launch/ExtractNatives.cpp index 8cd439b1..7d5f4179 100644 --- a/launcher/minecraft/launch/ExtractNatives.cpp +++ b/launcher/minecraft/launch/ExtractNatives.cpp @@ -17,8 +17,8 @@ #include <minecraft/MinecraftInstance.h> #include <launch/LaunchTask.h> -#include <quazip.h> -#include <quazipdir.h> +#include <quazip/quazip.h> +#include <quazip/quazipdir.h> #include "MMCZip.h" #include "FileSystem.h" #include <QDir> diff --git a/launcher/minecraft/mod/LocalModParseTask.cpp b/launcher/minecraft/mod/LocalModParseTask.cpp index 8ac5885f..757a2187 100644 --- a/launcher/minecraft/mod/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/LocalModParseTask.cpp @@ -4,8 +4,8 @@ #include <QJsonObject> #include <QJsonArray> #include <QJsonValue> -#include <quazip.h> -#include <quazipfile.h> +#include <quazip/quazip.h> +#include <quazip/quazipfile.h> #include <toml.h> #include "settings/INIFile.h" diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp index e5db512e..8de5fc9f 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp @@ -19,7 +19,7 @@ #include <QtConcurrent/QtConcurrent> -#include <quazip.h> +#include <quazip/quazip.h> #include "MMCZip.h" #include "minecraft/OneSixVersionFormat.h" diff --git a/launcher/modplatform/legacy_ftb/PackInstallTask.h b/launcher/modplatform/legacy_ftb/PackInstallTask.h index 305635a1..a7395220 100644 --- a/launcher/modplatform/legacy_ftb/PackInstallTask.h +++ b/launcher/modplatform/legacy_ftb/PackInstallTask.h @@ -1,8 +1,8 @@ #pragma once #include "InstanceTask.h" #include "net/NetJob.h" -#include "quazip.h" -#include "quazipdir.h" +#include <quazip/quazip.h> +#include <quazip/quazipdir.h> #include "meta/Index.h" #include "meta/Version.h" #include "meta/VersionList.h" diff --git a/launcher/modplatform/technic/SingleZipPackInstallTask.h b/launcher/modplatform/technic/SingleZipPackInstallTask.h index 74f60941..4d1fcbff 100644 --- a/launcher/modplatform/technic/SingleZipPackInstallTask.h +++ b/launcher/modplatform/technic/SingleZipPackInstallTask.h @@ -18,7 +18,7 @@ #include "InstanceTask.h" #include "net/NetJob.h" -#include "quazip.h" +#include <quazip/quazip.h> #include <QFutureWatcher> #include <QStringList> diff --git a/launcher/modplatform/technic/TechnicPackProcessor.cpp b/launcher/modplatform/technic/TechnicPackProcessor.cpp index 52979b7c..c45061ac 100644 --- a/launcher/modplatform/technic/TechnicPackProcessor.cpp +++ b/launcher/modplatform/technic/TechnicPackProcessor.cpp @@ -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/quazip.h> +#include <quazip/quazipdir.h> +#include <quazip/quazipfile.h> #include <settings/INISettingsObject.h> #include <memory> diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 1a164875..f3bf7abe 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -403,7 +403,13 @@ 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))) + auto files = QFileInfoList(); + if (!MMCZip::collectFileListRecursively(m_instance->instanceRoot(), nullptr, &files, + std::bind(&SeparatorPrefixTree<'/'>::covers, blocked, _1))) { + QMessageBox::warning(this, tr("Error"), tr("Unable to export instance")); + return false; + } + if (!MMCZip::compressDirFiles(output, m_instance->instanceRoot(), files)) { QMessageBox::warning(this, tr("Error"), tr("Unable to export instance")); return false; |