diff --git a/quazip/JlCompress.cpp b/quazip/JlCompress.cpp index d5ba418..67068d3 100644 --- a/quazip/JlCompress.cpp +++ b/quazip/JlCompress.cpp @@ -230,6 +230,8 @@ bool JlCompress::compressFile(QString fileCompressed, QString file) { bool JlCompress::compressFile(QString fileCompressed, QString file, const Options& options) { // Create zip QuaZip zip(fileCompressed); + zip.setUtf8Enabled(options.getUtf8Enabled()); + QDir().mkpath(QFileInfo(fileCompressed).absolutePath()); if(!zip.open(QuaZip::mdCreate)) { QFile::remove(fileCompressed); @@ -259,6 +261,8 @@ bool JlCompress::compressFiles(QString fileCompressed, QStringList files) { bool JlCompress::compressFiles(QString fileCompressed, QStringList files, const Options& options) { // Create zip QuaZip zip(fileCompressed); + zip.setUtf8Enabled(options.getUtf8Enabled()); + QDir().mkpath(QFileInfo(fileCompressed).absolutePath()); if(!zip.open(QuaZip::mdCreate)) { QFile::remove(fileCompressed); @@ -301,6 +305,7 @@ bool JlCompress::compressDir(QString fileCompressed, QString dir, { // Create zip QuaZip zip(fileCompressed); + zip.setUtf8Enabled(options.getUtf8Enabled()); QDir().mkpath(QFileInfo(fileCompressed).absolutePath()); if(!zip.open(QuaZip::mdCreate)) { QFile::remove(fileCompressed); diff --git a/quazip/JlCompress.h b/quazip/JlCompress.h index a852549..797c0ed 100644 --- a/quazip/JlCompress.h +++ b/quazip/JlCompress.h @@ -77,8 +77,10 @@ class QUAZIP_EXPORT JlCompress { }; public: - explicit Options(const QDateTime& dateTime = QDateTime(), const CompressionStrategy& strategy = Default) - : m_dateTime(dateTime), m_compressionStrategy(strategy) {} + explicit Options(const QDateTime& dateTime = QDateTime(), + const CompressionStrategy& strategy = Default, + bool utf8Enabled = false) + : m_dateTime(dateTime), m_compressionStrategy(strategy), m_utf8Enabled(utf8Enabled) {} QDateTime getDateTime() const { return m_dateTime; @@ -104,11 +106,26 @@ class QUAZIP_EXPORT JlCompress { m_compressionStrategy = strategy; } + bool getUtf8Enabled() const { + return m_utf8Enabled; + } + + bool setUtf8Enabled(bool utf8Enabled) { + m_utf8Enabled = utf8Enabled; + } + private: // If set, used as last modified on file inside the archive. // If compressing a directory, used for all files. QDateTime m_dateTime; + CompressionStrategy m_compressionStrategy; + + /* Enables UTF-8 support for filenames and comments. + * Must be set before QuaZip::open so only applicable to methods that open the zip internally. + * For methods which receive QuaZip* zip as an argument, you should set this flag before calling open on QuaZip object. + * */ + bool m_utf8Enabled; }; static bool copyData(QIODevice &inFile, QIODevice &outFile); diff --git a/qztest/testjlcompress.cpp b/qztest/testjlcompress.cpp index 35737d9..affad86 100644 --- a/qztest/testjlcompress.cpp +++ b/qztest/testjlcompress.cpp @@ -83,48 +83,70 @@ void TestJlCompress::compressFileOptions_data() QTest::addColumn("fileName"); QTest::addColumn("dateTime"); QTest::addColumn("strategy"); + QTest::addColumn("utf8"); QTest::addColumn("sha256sum_unix"); // Due to extra data archives are not identical QTest::addColumn("sha256sum_win"); QTest::newRow("simple") << "jlsimplefile.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Default + << false << "5eedd83aee92cf3381155d167fee54a4ef6e43b8bc7a979c903611d9aa28610a" << "cb1847dff1a5c33a805efde2558fc74024ad4c64c8607f8b12903e4d92385955"; + QTest::newRow("simple-utf8") << "jlsimplefile-utf8.zip" + << QString::fromUtf8("ありがとう。.txt") + << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) + << JlCompress::Options::Default + << true + << "" + << ""; + QTest::newRow("simple-utf8-bad") << "jlsimplefile-utf8-bad.zip" + << QString::fromUtf8("ありがとう。.txt") + << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) + << JlCompress::Options::Default + << false + << "" + << ""; QTest::newRow("simple-storage") << "jlsimplefile-storage.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Storage + << false << "" << ""; QTest::newRow("simple-fastest") << "jlsimplefile-fastest.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Fastest + << false << "" << ""; QTest::newRow("simple-faster") << "jlsimplefile-faster.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Faster + << false << "" << ""; QTest::newRow("simple-standard") << "jlsimplefile-standard.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Standard + << false << "5eedd83aee92cf3381155d167fee54a4ef6e43b8bc7a979c903611d9aa28610a" << "cb1847dff1a5c33a805efde2558fc74024ad4c64c8607f8b12903e4d92385955"; QTest::newRow("simple-better") << "jlsimplefile-better.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Better + << false << "" << ""; QTest::newRow("simple-best") << "jlsimplefile-best.zip" << "test0.txt" << QDateTime(QDate(2024, 9, 19), QTime(21, 0, 0), QTimeZone::utc()) << JlCompress::Options::Best + << false << "" << ""; } @@ -135,6 +157,7 @@ void TestJlCompress::compressFileOptions() QFETCH(QString, fileName); QFETCH(QDateTime, dateTime); QFETCH(JlCompress::Options::CompressionStrategy, strategy); + QFETCH(bool, utf8); QFETCH(QString, sha256sum_unix); QFETCH(QString, sha256sum_win); QDir curDir; @@ -146,7 +169,7 @@ void TestJlCompress::compressFileOptions() QFAIL("Can't create test file"); } - const JlCompress::Options options(dateTime, strategy); + const JlCompress::Options options(dateTime, strategy, utf8); QVERIFY(JlCompress::compressFile(zipName, "tmp/" + fileName, options)); // get the file list and check it QStringList fileList = JlCompress::getFileList(zipName); @@ -167,7 +190,13 @@ void TestJlCompress::compressFileOptions() if (!sha256sum_unix.isEmpty()) QCOMPARE(hash, sha256sum_unix); #endif zipFile.close(); - removeTestFiles(QStringList() << fileName); + + // Extract + QString flist = JlCompress::extractFile(zipName, fileName); + QFileInfo fileInfo(flist); + QVERIFY(fileInfo.fileName() == fileName); + + removeTestFiles(QStringList() << fileName << flist); curDir.remove(zipName); }