Skip to content

JlCompress UTF-8 support #211

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions quazip/JlCompress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
21 changes: 19 additions & 2 deletions quazip/JlCompress.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
33 changes: 31 additions & 2 deletions qztest/testjlcompress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,48 +83,70 @@ void TestJlCompress::compressFileOptions_data()
QTest::addColumn<QString>("fileName");
QTest::addColumn<QDateTime>("dateTime");
QTest::addColumn<JlCompress::Options::CompressionStrategy>("strategy");
QTest::addColumn<bool>("utf8");
QTest::addColumn<QString>("sha256sum_unix"); // Due to extra data archives are not identical
QTest::addColumn<QString>("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
<< ""
<< "";
}
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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);
}

Expand Down
Loading