From 249eb7ff79b814f0e23074b9a9e955243b677646 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 30 Sep 2022 14:52:11 +0200 Subject: [PATCH] Qt6: remove or replace QTextCodec --- src/Base/InputSource.cpp | 90 +++++++++++++++++++++++++------- src/Base/InputSource.h | 5 +- src/Gui/EditorView.cpp | 4 ++ src/Gui/QtAll.h | 1 - src/Main/MainGui.cpp | 15 ------ src/Mod/TechDraw/Gui/QGSPage.cpp | 1 - src/Mod/TechDraw/Gui/QGVPage.cpp | 1 - 7 files changed, 78 insertions(+), 39 deletions(-) diff --git a/src/Base/InputSource.cpp b/src/Base/InputSource.cpp index 00d32a3f42..0c4039af80 100644 --- a/src/Base/InputSource.cpp +++ b/src/Base/InputSource.cpp @@ -23,6 +23,15 @@ #include "PreCompiled.h" +#include +#if QT_VERSION < 0x060000 +#include +#else +#include +#include +#include +#endif + #include "InputSource.h" #include "XMLTools.h" @@ -36,11 +45,68 @@ using namespace std; // --------------------------------------------------------------------------- // StdInputStream: Constructors and Destructor // --------------------------------------------------------------------------- -StdInputStream::StdInputStream( std::istream& Stream, XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* const manager ) - : stream(Stream), fMemoryManager(manager) + +#if QT_VERSION < 0x060000 +struct StdInputStream::TextCodec +{ + QTextCodec::ConverterState state; + TextCodec() { + state.flags |= QTextCodec::IgnoreHeader; + state.flags |= QTextCodec::ConvertInvalidToNull; + } + + void validateBytes(XMLByte* const toFill, std::streamsize len) { + QTextCodec *textCodec = QTextCodec::codecForName("UTF-8"); + if (textCodec) { + const QString text = textCodec->toUnicode(reinterpret_cast(toFill), static_cast(len), &state); + if (state.invalidChars > 0) { + // In case invalid characters were found decode back to 'utf-8' and replace + // them with '?' + // First, Qt replaces invalid characters with '\0' (see ConvertInvalidToNull) + // but Xerces doesn't like this because it handles this as termination. Thus, + // we have to go through the array and replace '\0' with '?'. + std::streamsize pos = 0; + QByteArray ba = textCodec->fromUnicode(text); + for (int i=0; i(toFill), static_cast(len)); + auto toUtf16 = QStringDecoder(QStringDecoder::Utf8); + QString text = toUtf16(encodedString); + if (toUtf16.hasError()) { + // In case invalid characters were found decode back to 'utf-8' and replace + // them with '?' + // First, Qt replaces invalid characters with '\0' + // but Xerces doesn't like this because it handles this as termination. Thus, + // we have to go through the array and replace '\0' with '?'. + std::streamsize pos = 0; + auto fromUtf16 = QStringEncoder(QStringEncoder::Utf8); + QByteArray ba = fromUtf16(text); + for (int i=0; i(toFill), static_cast(maxToRead)); std::streamsize len = stream.gcount(); - QTextCodec *codec = QTextCodec::codecForName("UTF-8"); - const QString text = codec->toUnicode(reinterpret_cast(toFill), static_cast(len), &state); - if (state.invalidChars > 0) { - // In case invalid characters were found decode back to 'utf-8' and replace - // them with '?' - // First, Qt replaces invalid characters with '\0' (see ConvertInvalidToNull) - // but Xerces doesn't like this because it handles this as termination. Thus, - // we have to go through the array and replace '\0' with '?'. - std::streamsize pos = 0; - QByteArray ba = codec->fromUnicode(text); - for (int i=0; ivalidateBytes(toFill, len); return static_cast(len); } diff --git a/src/Base/InputSource.h b/src/Base/InputSource.h index 88e07caebb..321b741c34 100644 --- a/src/Base/InputSource.h +++ b/src/Base/InputSource.h @@ -24,10 +24,10 @@ #define BASE_IINPUTSOURCE_H #include +#include #include #include -#include #ifndef FC_GLOBAL_H #include #endif @@ -70,7 +70,8 @@ private : // ----------------------------------------------------------------------- std::istream &stream; XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* const fMemoryManager; - QTextCodec::ConverterState state; + struct TextCodec; + std::unique_ptr codec; }; diff --git a/src/Gui/EditorView.cpp b/src/Gui/EditorView.cpp index 003e9ad7ef..193b946499 100644 --- a/src/Gui/EditorView.cpp +++ b/src/Gui/EditorView.cpp @@ -37,7 +37,9 @@ # include # include # include +# if QT_VERSION < 0x060000 # include +# endif # include # include # include @@ -523,7 +525,9 @@ bool EditorView::saveFile() if (!file.open(QFile::WriteOnly)) return false; QTextStream ts(&file); +#if QT_VERSION < 0x060000 ts.setCodec(QTextCodec::codecForName("UTF-8")); +#endif ts << d->textEdit->document()->toPlainText(); file.close(); d->textEdit->document()->setModified(false); diff --git a/src/Gui/QtAll.h b/src/Gui/QtAll.h index f119f65a5b..ac4ad3dc71 100644 --- a/src/Gui/QtAll.h +++ b/src/Gui/QtAll.h @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include diff --git a/src/Main/MainGui.cpp b/src/Main/MainGui.cpp index 3216960f08..6602c52cec 100644 --- a/src/Main/MainGui.cpp +++ b/src/Main/MainGui.cpp @@ -42,7 +42,6 @@ #include #include #include -#include // FreeCAD header #include @@ -96,20 +95,6 @@ private: FILE* file; }; -#if defined (FC_OS_LINUX) || defined(FC_OS_BSD) -QString myDecoderFunc(const QByteArray &localFileName) -{ - QTextCodec* codec = QTextCodec::codecForName("UTF-8"); - return codec->toUnicode(localFileName); -} - -QByteArray myEncoderFunc(const QString &fileName) -{ - QTextCodec* codec = QTextCodec::codecForName("UTF-8"); - return codec->fromUnicode(fileName); -} -#endif - int main( int argc, char ** argv ) { #if defined (FC_OS_LINUX) || defined(FC_OS_BSD) diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index d94c90ae79..356c7f7b66 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include #endif diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 8d4312199d..0872cea1e3 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #endif #include