Skip to content

Commit bcfe62b

Browse files
cen1geustache
andauthored
Add option to disable QTextCodec (#235)
* Remove dependency on QTextCodec for qt6 * Add CI for qt6 with qt5compat and no QTextCodec * Rework the patch with a typedef, fix russian tests * Documentation --------- Co-authored-by: geustache <[email protected]>
1 parent eaff4a8 commit bcfe62b

20 files changed

+312
-63
lines changed

.clang-tidy

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
Checks: >
2+
# Enable core static analysis checks
3+
clang-analyzer-*,
4+
5+
# Best practices and maintainability
6+
cppcoreguidelines-*,
7+
modernize-*,
8+
performance-*,
9+
readability-*,
10+
11+
# Catch potential bugs
12+
bugprone-*,
13+
misc-*,
14+
15+
# Ensure safer memory management
16+
cert-*,
17+
18+
# Security checks
19+
security-*,
20+
21+
# Avoid shadowing issues
22+
clang-analyzer-core.Shadowing,
23+
cppcoreguidelines-avoid-variable-shadowing

.github/workflows/ci.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,23 @@ jobs:
4141
shared: "ON"
4242
zlib_const: "ON"
4343

44+
# Qt6 with Qt5Compat but explicitly disabled QTextCodec support
45+
ubuntu-no-qtextcodec:
46+
if: true
47+
name: Ubuntu-${{ matrix.os_version }}-Qt-${{ matrix.qt_version }}-shared-no-qtextcodec
48+
strategy:
49+
fail-fast: true
50+
matrix:
51+
os_version: [ 24.04 ]
52+
qt_version: [ 6.8.2 ]
53+
uses: ./.github/workflows/reusable.yml
54+
with:
55+
runs_on: ubuntu-${{ matrix.os_version }}
56+
os_version: ${{ matrix.os_version }}
57+
qt_version: ${{ matrix.qt_version }}
58+
shared: "ON"
59+
qtextcodec: 'OFF'
60+
4461
macos:
4562
if: true
4663
name: macos-${{ matrix.os_version }}-Qt-${{ matrix.qt_version }}-shared-${{ matrix.shared }}

.github/workflows/reusable.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ on:
1919
required: false
2020
default: "OFF"
2121
type: string
22+
qtextcodec:
23+
required: false
24+
default: "ON"
25+
type: string
2226
runs_on:
2327
required: true
2428
type: string
@@ -74,7 +78,7 @@ jobs:
7478
zlib1g-dev libbz2-dev
7579
7680
- name: Configure CMake
77-
run: cmake -DCMAKE_BUILD_TYPE="${{env.BUILD_TYPE}}" -DBUILD_SHARED_LIBS=${{ inputs.shared }} -DQUAZIP_ENABLE_TESTS=ON -DZLIB_CONST=${{ inputs.zlib_const }} -B "${{github.workspace}}/build"
81+
run: cmake -DCMAKE_BUILD_TYPE="${{env.BUILD_TYPE}}" -DBUILD_SHARED_LIBS=${{ inputs.shared }} -DQUAZIP_ENABLE_TESTS=ON -DZLIB_CONST=${{ inputs.zlib_const }} -DQUAZIP_ENABLE_QTEXTCODEC=${{ inputs.qtextcodec }} -B "${{github.workspace}}/build"
7882

7983
- name: Build
8084
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ CMakeUserPresets.json
1212
vcpkg_installed/
1313
Testing/
1414
minizip/
15+
CMakeFiles/
16+
CMakeCache.txt

CMakeLists.txt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ else()
2323
endif()
2424

2525
OPTION(ZLIB_CONST "Sets ZLIB_CONST preprocessor definition" OFF)
26+
option(QUAZIP_ENABLE_QTEXTCODEC "Enable use of QTextCodec (requires Qt5 or Qt6 Core5Compat)" ON)
2627

2728
# Make BZIP2 optional
2829
option(QUAZIP_BZIP2 "Enables BZIP2 compression" ON)
@@ -74,13 +75,13 @@ message(STATUS "QUAZIP_QT_MAJOR_VERSION set to ${QUAZIP_QT_MAJOR_VERSION}")
7475
message(STATUS "CMAKE_CXX_STANDARD set to ${CMAKE_CXX_STANDARD}")
7576

7677
if(QUAZIP_QT_MAJOR_VERSION EQUAL 6)
77-
find_package(Qt6 REQUIRED COMPONENTS Core Core5Compat
78+
find_package(Qt6 REQUIRED COMPONENTS Core
7879
OPTIONAL_COMPONENTS Network Test)
7980
message(STATUS "Found Qt version ${Qt6_VERSION} at ${Qt6_DIR}")
8081
set(QUAZIP_QT_ZLIB_COMPONENT BundledZLIB)
8182
set(QUAZIP_QT_ZLIB_HEADER_COMPONENT ZlibPrivate)
82-
set(QUAZIP_LIB_LIBRARIES Qt6::Core Qt6::Core5Compat)
83-
set(QUAZIP_TEST_QT_LIBRARIES Qt6::Core Qt6::Core5Compat Qt6::Network Qt6::Test)
83+
set(QUAZIP_LIB_LIBRARIES Qt6::Core )
84+
set(QUAZIP_TEST_QT_LIBRARIES Qt6::Core Qt6::Network Qt6::Test)
8485
set(QUAZIP_PKGCONFIG_REQUIRES "zlib, Qt6Core")
8586
elseif(QUAZIP_QT_MAJOR_VERSION EQUAL 5)
8687
find_package(Qt5 REQUIRED COMPONENTS Core
@@ -214,6 +215,26 @@ if(QUAZIP_BZIP2)
214215
endif()
215216
endif()
216217

218+
if(QUAZIP_ENABLE_QTEXTCODEC)
219+
if(${QT_VERSION} VERSION_GREATER_EQUAL 6.0.0)
220+
find_package(Qt6 OPTIONAL_COMPONENTS Core5Compat)
221+
if(Qt6Core5Compat_FOUND)
222+
set(QUAZIP_LIB_LIBRARIES ${QUAZIP_LIB_LIBRARIES} Qt6::Core5Compat)
223+
set(QUAZIP_TEST_QT_LIBRARIES ${QUAZIP_TEST_QT_LIBRARIES} Qt6::Core5Compat)
224+
225+
add_compile_definitions(QUAZIP_CAN_USE_QTEXTCODEC)
226+
message("-- Quazip can use QTextCodec")
227+
else()
228+
message("-- Core5Compat not found, QTextCodec support disabled")
229+
endif()
230+
else()
231+
add_compile_definitions(QUAZIP_CAN_USE_QTEXTCODEC)
232+
message("-- Quazip can use QTextCodec")
233+
endif()
234+
else()
235+
message("-- QTextCodec explicitly disabled by QUAZIP_ENABLE_QTEXTCODEC=OFF")
236+
endif()
237+
217238
add_subdirectory(quazip)
218239

219240
if(QUAZIP_ENABLE_TESTS)

README.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,15 @@ cmake --build . --target clean
103103

104104
CMake options
105105

106-
| Option | Description | Default |
107-
|--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------|
108-
| `QUAZIP_QT_MAJOR_VERSION`| Specifies which major Qt version should be searched for (6 or 5). By default it tries to find the most recent. | |
109-
| `BUILD_SHARED_LIBS` | Build QuaZip as a shared library | `ON` |
110-
| `QUAZIP_LIB_FILE_NAME` | Specifies output libname. | `quazip<quazip-version>-qt<qt-version>` |
111-
| `QUAZIP_INSTALL` | Enable installation | `ON` |
112-
| `QUAZIP_ENABLE_TESTS` | Build QuaZip tests | `OFF` |
113-
| `QUAZIP_USE_QT_ZLIB` | Use Qt's bundled zlib instead of system zlib (**not recommended**). Qt must be built with `-qt-zlib` and `-static`. Incompatible with `BUILD_SHARED_LIBS=ON`. | `OFF` |
114-
| `QUAZIP_BZIP2` | Enable BZIP2 compression | `ON` |
115-
| `QUAZIP_BZIP2_STDIO` | Output BZIP2 errors to stdio when BZIP2 compression is enabled | `ON` |
106+
| Option | Description | Default |
107+
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
108+
| `QUAZIP_QT_MAJOR_VERSION` | Specifies which major Qt version should be searched for (6 or 5). By default it tries to find the most recent. | |
109+
| `BUILD_SHARED_LIBS` | Build QuaZip as a shared library | `ON` |
110+
| `QUAZIP_LIB_FILE_NAME` | Specifies output libname. | `quazip<quazip-version>-qt<qt-version>` |
111+
| `QUAZIP_INSTALL` | Enable installation | `ON` |
112+
| `QUAZIP_USE_QT_ZLIB` | Use Qt's bundled zlib instead of system zlib (**not recommended**). Qt must be built with `-qt-zlib` and `-static`. Incompatible with `BUILD_SHARED_LIBS=ON`. | `OFF` |
113+
| `QUAZIP_ENABLE_TESTS` | Build QuaZip tests | `OFF` |
114+
| `QUAZIP_BZIP2` | Enable BZIP2 compression | `ON` |
115+
| `QUAZIP_BZIP2_STDIO` | Output BZIP2 errors to stdio when BZIP2 compression is enabled | `ON` |
116+
| `QUAZIP_ENABLE_QTEXTCODEC` | Set to OFF to explicitely disable the use of QTextCodec on Qt6 even if Core5Compat is available. This uses [QStringConverter](https://doc.qt.io/qt-6/qstringconverter.html) in the background with less supported encodings. | `ON` |
116117

quazip/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ set(QUAZIP_HEADERS
1616
quazip.h
1717
quazip_global.h
1818
quazip_qt_compat.h
19+
quazip_textcodec.h
1920
quazipdir.h
2021
quazipfile.h
2122
quazipfileinfo.h
@@ -36,6 +37,7 @@ set(QUAZIP_SOURCES
3637
quagzipfile.cpp
3738
quaziodevice.cpp
3839
quazip.cpp
40+
quazip_textcodec.cpp
3941
quazipdir.cpp
4042
quazipfile.cpp
4143
quazipfileinfo.cpp

quazip/JlCompress.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ QStringList JlCompress::extractFiles(QuaZip &zip, const QStringList &files, cons
384384
return extracted;
385385
}
386386

387-
QStringList JlCompress::extractDir(QString fileCompressed, QTextCodec* fileNameCodec, QString dir) {
387+
QStringList JlCompress::extractDir(QString fileCompressed, QuazipTextCodec* fileNameCodec, QString dir) {
388388
// Open zip
389389
QuaZip zip(fileCompressed);
390390
if (fileNameCodec)
@@ -468,7 +468,7 @@ QStringList JlCompress::getFileList(QuaZip *zip)
468468
return lst;
469469
}
470470

471-
QStringList JlCompress::extractDir(QIODevice* ioDevice, QTextCodec* fileNameCodec, QString dir)
471+
QStringList JlCompress::extractDir(QIODevice* ioDevice, QuazipTextCodec* fileNameCodec, QString dir)
472472
{
473473
QuaZip zip(ioDevice);
474474
if (fileNameCodec)

quazip/JlCompress.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ class QUAZIP_EXPORT JlCompress {
291291
left empty.
292292
\return The list of the full paths of the files extracted, empty on failure.
293293
*/
294-
static QStringList extractDir(QString fileCompressed, QTextCodec* fileNameCodec, QString dir = QString());
294+
static QStringList extractDir(QString fileCompressed, QuazipTextCodec* fileNameCodec, QString dir = QString());
295295
/// Get the file list.
296296
/**
297297
\return The list of the files in the archive, or, more precisely, the
@@ -333,7 +333,7 @@ class QUAZIP_EXPORT JlCompress {
333333
left empty.
334334
\return The list of the full paths of the files extracted, empty on failure.
335335
*/
336-
static QStringList extractDir(QIODevice* ioDevice, QTextCodec* fileNameCodec, QString dir = QString());
336+
static QStringList extractDir(QIODevice* ioDevice, QuazipTextCodec* fileNameCodec, QString dir = QString());
337337
/// Get the file list.
338338
/**
339339
\return The list of the files in the archive, or, more precisely, the

quazip/quazip.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ class QuaZipPrivate {
4545
/// The pointer to the corresponding QuaZip instance.
4646
QuaZip *q;
4747
/// The codec for file names (used when UTF-8 is not enabled).
48-
QTextCodec *fileNameCodec;
48+
QuazipTextCodec *fileNameCodec;
4949
/// The codec for comments (used when UTF-8 is not enabled).
50-
QTextCodec *commentCodec;
50+
QuazipTextCodec *commentCodec;
5151
/// The archive file name.
5252
QString zipName;
5353
/// The device to access the archive.
@@ -76,18 +76,18 @@ class QuaZipPrivate {
7676
bool utf8;
7777
/// The OS code.
7878
uint osCode;
79-
inline QTextCodec *getDefaultFileNameCodec()
79+
inline QuazipTextCodec *getDefaultFileNameCodec()
8080
{
8181
if (defaultFileNameCodec == nullptr) {
82-
return QTextCodec::codecForLocale();
82+
return QuazipTextCodec::codecForLocale();
8383
}
8484
return defaultFileNameCodec;
8585
}
8686
/// The constructor for the corresponding QuaZip constructor.
8787
inline QuaZipPrivate(QuaZip *_q):
8888
q(_q),
8989
fileNameCodec(getDefaultFileNameCodec()),
90-
commentCodec(QTextCodec::codecForLocale()),
90+
commentCodec(QuazipTextCodec::codecForLocale()),
9191
ioDevice(nullptr),
9292
mode(QuaZip::mdNotOpen),
9393
hasCurrentFile_f(false),
@@ -107,7 +107,7 @@ class QuaZipPrivate {
107107
inline QuaZipPrivate(QuaZip *_q, const QString &_zipName):
108108
q(_q),
109109
fileNameCodec(getDefaultFileNameCodec()),
110-
commentCodec(QTextCodec::codecForLocale()),
110+
commentCodec(QuazipTextCodec::codecForLocale()),
111111
zipName(_zipName),
112112
ioDevice(nullptr),
113113
mode(QuaZip::mdNotOpen),
@@ -128,7 +128,7 @@ class QuaZipPrivate {
128128
inline QuaZipPrivate(QuaZip *_q, QIODevice *_ioDevice):
129129
q(_q),
130130
fileNameCodec(getDefaultFileNameCodec()),
131-
commentCodec(QTextCodec::codecForLocale()),
131+
commentCodec(QuazipTextCodec::codecForLocale()),
132132
ioDevice(_ioDevice),
133133
mode(QuaZip::mdNotOpen),
134134
hasCurrentFile_f(false),
@@ -155,11 +155,11 @@ class QuaZipPrivate {
155155
QHash<QString, unz64_file_pos> directoryCaseSensitive;
156156
QHash<QString, unz64_file_pos> directoryCaseInsensitive;
157157
unz64_file_pos lastMappedDirectoryEntry;
158-
static QTextCodec *defaultFileNameCodec;
158+
static QuazipTextCodec *defaultFileNameCodec;
159159
static uint defaultOsCode;
160160
};
161161

162-
QTextCodec *QuaZipPrivate::defaultFileNameCodec = nullptr;
162+
QuazipTextCodec *QuaZipPrivate::defaultFileNameCodec = nullptr;
163163
uint QuaZipPrivate::defaultOsCode = QUAZIP_OS_UNIX;
164164

165165
void QuaZipPrivate::clearDirectoryMap()
@@ -588,14 +588,14 @@ QString QuaZip::getCurrentFileName()const
588588
return result;
589589
}
590590

591-
void QuaZip::setFileNameCodec(QTextCodec *fileNameCodec)
591+
void QuaZip::setFileNameCodec(QuazipTextCodec *fileNameCodec)
592592
{
593593
p->fileNameCodec=fileNameCodec;
594594
}
595595

596596
void QuaZip::setFileNameCodec(const char *fileNameCodecName)
597597
{
598-
p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
598+
p->fileNameCodec=QuazipTextCodec::codecForName(fileNameCodecName);
599599
}
600600

601601
void QuaZip::setOsCode(uint osCode)
@@ -608,22 +608,22 @@ uint QuaZip::getOsCode() const
608608
return p->osCode;
609609
}
610610

611-
QTextCodec *QuaZip::getFileNameCodec()const
611+
QuazipTextCodec *QuaZip::getFileNameCodec()const
612612
{
613613
return p->fileNameCodec;
614614
}
615615

616-
void QuaZip::setCommentCodec(QTextCodec *commentCodec)
616+
void QuaZip::setCommentCodec(QuazipTextCodec *commentCodec)
617617
{
618618
p->commentCodec=commentCodec;
619619
}
620620

621621
void QuaZip::setCommentCodec(const char *commentCodecName)
622622
{
623-
p->commentCodec=QTextCodec::codecForName(commentCodecName);
623+
p->commentCodec=QuazipTextCodec::codecForName(commentCodecName);
624624
}
625625

626-
QTextCodec *QuaZip::getCommentCodec()const
626+
QuazipTextCodec *QuaZip::getCommentCodec()const
627627
{
628628
return p->commentCodec;
629629
}
@@ -783,14 +783,14 @@ Qt::CaseSensitivity QuaZip::convertCaseSensitivity(QuaZip::CaseSensitivity cs)
783783
}
784784
}
785785

786-
void QuaZip::setDefaultFileNameCodec(QTextCodec *codec)
786+
void QuaZip::setDefaultFileNameCodec(QuazipTextCodec *codec)
787787
{
788788
QuaZipPrivate::defaultFileNameCodec = codec;
789789
}
790790

791791
void QuaZip::setDefaultFileNameCodec(const char *codecName)
792792
{
793-
setDefaultFileNameCodec(QTextCodec::codecForName(codecName));
793+
setDefaultFileNameCodec(QuazipTextCodec::codecForName(codecName));
794794
}
795795

796796
void QuaZip::setDefaultOsCode(uint osCode)

0 commit comments

Comments
 (0)