diff --git a/api/logic/MMCZip.cpp b/api/logic/MMCZip.cpp
index 725aea71c..3badbbd19 100644
--- a/api/logic/MMCZip.cpp
+++ b/api/logic/MMCZip.cpp
@@ -1,27 +1,17 @@
-/*
-Copyright (C) 2010 Roberto Pompermaier
-Copyright (C) 2005-2014 Sergey A. Tachenov
-
-Parts of this file were part of QuaZIP.
-
-QuaZIP is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 2.1 of the License, or
-(at your option) any later version.
-
-QuaZIP is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with QuaZIP. If not, see .
-
-See COPYING file for the full LGPL text.
-
-Original ZIP package is copyrighted by Gilles Vollant and contributors,
-see quazip/(un)MMCZip.h files for details. Basically it's the zlib license.
-*/
+/* Copyright 2013-2017 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
#include
#include
@@ -32,82 +22,8 @@ see quazip/(un)MMCZip.h files for details. Basically it's the zlib license.
#include
-bool MMCZip::compressSubDir(QuaZip* zip, QString dir, QString origDir, QSet& added, QString prefix, const SeparatorPrefixTree <'/'> * blacklist)
-{
- if (!zip) return false;
- if (zip->getMode()!=QuaZip::mdCreate && zip->getMode()!=QuaZip::mdAppend && zip->getMode()!=QuaZip::mdAdd)
- {
- return false;
- }
-
- QDir directory(dir);
- if (!directory.exists())
- {
- return false;
- }
-
- QDir origDirectory(origDir);
- if (dir != origDir)
- {
- QString internalDirName = origDirectory.relativeFilePath(dir);
- if(!blacklist || !blacklist->covers(internalDirName))
- {
- QuaZipFile dirZipFile(zip);
- auto dirPrefix = FS::PathCombine(prefix, origDirectory.relativeFilePath(dir)) + "/";
- if (!dirZipFile.open(QIODevice::WriteOnly, QuaZipNewInfo(dirPrefix, dir), 0, 0, 0))
- {
- return false;
- }
- dirZipFile.close();
- }
- }
-
- QFileInfoList files = directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
- for (auto file: files)
- {
- if(!file.isDir())
- {
- continue;
- }
- if(!compressSubDir(zip,file.absoluteFilePath(),origDir, added, prefix, blacklist))
- {
- return false;
- }
- }
-
- files = directory.entryInfoList(QDir::Files);
- for (auto file: files)
- {
- if(!file.isFile())
- {
- continue;
- }
-
- if(file.absoluteFilePath()==zip->getZipName())
- {
- continue;
- }
-
- QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
- if(blacklist && blacklist->covers(filename))
- {
- continue;
- }
- if(prefix.size())
- {
- filename = FS::PathCombine(prefix, filename);
- }
- added.insert(filename);
- if (!JlCompress::compressFile(zip,file.absoluteFilePath(),filename))
- {
- return false;
- }
- }
-
- return true;
-}
-
-bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet &contained, std::function filter)
+// ours
+bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet &contained, const JlCompress::FilterFunction filter)
{
QuaZip modZip(from.filePath());
modZip.open(QuaZip::mdUnzip);
@@ -117,7 +33,7 @@ bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet &containe
for (bool more = modZip.goToFirstFile(); more; more = modZip.goToNextFile())
{
QString filename = modZip.getCurrentFileName();
- if (!filter(filename))
+ if (filter && !filter(filename))
{
qDebug() << "Skipping file " << filename << " from "
<< from.fileName() << " - filtered";
@@ -158,6 +74,7 @@ bool MMCZip::mergeZipFiles(QuaZip *into, QFileInfo from, QSet &containe
return true;
}
+// ours
bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const QList& mods)
{
QuaZip zipOut(targetJarPath);
@@ -182,7 +99,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
continue;
if (mod.type() == Mod::MOD_ZIPFILE)
{
- if (!mergeZipFiles(&zipOut, mod.filename(), addedFiles, noFilter))
+ if (!mergeZipFiles(&zipOut, mod.filename(), addedFiles))
{
zipOut.close();
QFile::remove(targetJarPath);
@@ -192,6 +109,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
}
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()))
{
@@ -204,12 +122,13 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
}
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 (!MMCZip::compressSubDir(&zipOut, what_to_zip, parent_dir, addedFiles))
+ if (!JlCompress::compressSubDir(&zipOut, what_to_zip, parent_dir, addedFiles))
{
zipOut.close();
QFile::remove(targetJarPath);
@@ -229,7 +148,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
}
}
- if (!mergeZipFiles(&zipOut, QFileInfo(sourceJarPath), addedFiles, metaInfFilter))
+ if (!mergeZipFiles(&zipOut, QFileInfo(sourceJarPath), addedFiles, [](const QString key){return !key.contains("META-INF");}))
{
zipOut.close();
QFile::remove(targetJarPath);
@@ -248,45 +167,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const
return true;
}
-bool MMCZip::noFilter(QString)
-{
- return true;
-}
-
-bool MMCZip::metaInfFilter(QString key)
-{
- if(key.contains("META-INF"))
- {
- return false;
- }
- return true;
-}
-
-bool MMCZip::compressDir(QString zipFile, QString dir, QString prefix, const SeparatorPrefixTree <'/'> * blacklist)
-{
- QuaZip zip(zipFile);
- QDir().mkpath(QFileInfo(zipFile).absolutePath());
- if(!zip.open(QuaZip::mdCreate))
- {
- QFile::remove(zipFile);
- return false;
- }
-
- QSet added;
- if (!MMCZip::compressSubDir(&zip, dir, dir, added, prefix, blacklist))
- {
- QFile::remove(zipFile);
- return false;
- }
- zip.close();
- if(zip.getZipError()!=0)
- {
- QFile::remove(zipFile);
- return false;
- }
- return true;
-}
-
+// ours
QString MMCZip::findFileInZip(QuaZip * zip, const QString & what, const QString &root)
{
QuaZipDir rootDir(zip, root);
@@ -306,6 +187,7 @@ QString MMCZip::findFileInZip(QuaZip * zip, const QString & what, const QString
return QString();
}
+// ours
bool MMCZip::findFilesInZip(QuaZip * zip, const QString & what, QStringList & result, const QString &root)
{
QuaZipDir rootDir(zip, root);
@@ -324,6 +206,8 @@ bool MMCZip::findFilesInZip(QuaZip * zip, const QString & what, QStringList & re
return !result.isEmpty();
}
+
+// ours
QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QString &target)
{
QDir directory(target);
@@ -355,6 +239,7 @@ QStringList MMCZip::extractSubDir(QuaZip *zip, const QString & subdir, const QSt
return extracted;
}
+// ours
QStringList MMCZip::extractDir(QString fileCompressed, QString dir)
{
QuaZip zip(fileCompressed);
diff --git a/api/logic/MMCZip.h b/api/logic/MMCZip.h
index ca8b349ff..eac8d7412 100644
--- a/api/logic/MMCZip.h
+++ b/api/logic/MMCZip.h
@@ -1,10 +1,24 @@
+/* Copyright 2013-2017 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
#pragma once
#include
#include
#include
#include "minecraft/Mod.h"
-#include "SeparatorPrefixTree.h"
#include
#include "multimc_logic_export.h"
@@ -13,36 +27,12 @@
namespace MMCZip
{
- /**
- * Compress a subdirectory.
- * \param parentZip Opened zip containing the parent directory.
- * \param dir The full path to the directory to pack.
- * \param parentDir The full path to the directory corresponding to the root of the ZIP.
- * \param recursive Whether to pack sub-directories as well or only files.
- * \return true if success, false otherwise.
- */
- bool MULTIMC_LOGIC_EXPORT compressSubDir(QuaZip *zip, QString dir, QString origDir, QSet &added,
- QString prefix = QString(), const SeparatorPrefixTree <'/'> * blacklist = nullptr);
-
- /**
- * Compress a whole directory.
- * \param fileCompressed The name of the archive.
- * \param dir The directory to compress.
- * \param recursive Whether to pack the subdirectories as well, or just regular files.
- * \return true if success, false otherwise.
- */
- bool MULTIMC_LOGIC_EXPORT compressDir(QString zipFile, QString dir, QString prefix = QString(), const SeparatorPrefixTree <'/'> * blacklist = nullptr);
-
- /// filter function for @mergeZipFiles - passthrough
- bool MULTIMC_LOGIC_EXPORT noFilter(QString key);
-
- /// filter function for @mergeZipFiles - ignores METAINF
- bool MULTIMC_LOGIC_EXPORT metaInfFilter(QString key);
/**
* Merge two zip files, using a filter function
*/
- bool MULTIMC_LOGIC_EXPORT mergeZipFiles(QuaZip *into, QFileInfo from, QSet &contained, std::function filter);
+ bool MULTIMC_LOGIC_EXPORT mergeZipFiles(QuaZip *into, QFileInfo from, QSet &contained,
+ const JlCompress::FilterFunction filter = nullptr);
/**
* take a source jar, add mods to it, resulting in target jar
@@ -74,7 +64,6 @@ namespace MMCZip
*
* \param fileCompressed The name of the archive.
* \param dir The directory to extract to, the current directory if left empty.
- * \param opts Extra options.
* \return The list of the full paths of the files extracted, empty on failure.
*/
QStringList MULTIMC_LOGIC_EXPORT extractDir(QString fileCompressed, QString dir);
diff --git a/application/dialogs/ExportInstanceDialog.cpp b/application/dialogs/ExportInstanceDialog.cpp
index bdee38d6f..8e488b3ff 100644
--- a/application/dialogs/ExportInstanceDialog.cpp
+++ b/application/dialogs/ExportInstanceDialog.cpp
@@ -405,7 +405,9 @@ bool ExportInstanceDialog::doExport()
SaveIcon(m_instance);
- if (!MMCZip::compressDir(output, m_instance->instanceRoot(), name, &proxyModel->blockedPaths()))
+ auto & blocked = proxyModel->blockedPaths();
+ using std::placeholders::_1;
+ if (!JlCompress::compressDir(output, m_instance->instanceRoot(), name, std::bind(&SeparatorPrefixTree<'/'>::contains, blocked, _1)))
{
QMessageBox::warning(this, tr("Error"), tr("Unable to export instance"));
return false;
diff --git a/libraries/quazip b/libraries/quazip
index 883755531..164acc35f 160000
--- a/libraries/quazip
+++ b/libraries/quazip
@@ -1 +1 @@
-Subproject commit 8837555312a7f95dc5c4ce6474860b1c159d8105
+Subproject commit 164acc35fd5f77d353161dcf1c4e121bc2ce756f