From c9b8e9905811ab6447a272a42a581ebc47ab71aa Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 12 Jun 2025 10:07:27 +0200 Subject: [PATCH] Utils: Use QStringDecoder instead of QTextCodec in Process MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QTextCodec is in Qt5Compat and may not be part of Qt 7. Change-Id: I3f7bad6f647f705cbf4ff45979ee32bbcfd671a1 Reviewed-by: David Schulz Reviewed-by: André Hartmann --- src/libs/utils/devicefileaccess.cpp | 16 +++++----- src/libs/utils/devicefileaccess.h | 12 ++++---- src/libs/utils/filepath.cpp | 8 ++--- src/libs/utils/filepath.h | 6 ++-- src/libs/utils/qtcprocess.cpp | 48 ++++++++++++----------------- src/libs/utils/qtcprocess.h | 2 +- src/libs/utils/textcodec.h | 6 ++++ 7 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/libs/utils/devicefileaccess.cpp b/src/libs/utils/devicefileaccess.cpp index c956cdbb818..e94a8d68a2b 100644 --- a/src/libs/utils/devicefileaccess.cpp +++ b/src/libs/utils/devicefileaccess.cpp @@ -427,16 +427,16 @@ Result> DeviceFileAccess::watch(const FilePath return ResultError(Tr::tr("watch is not implemented.")); } -TextCodec DeviceFileAccess::processStdOutCodec(const FilePath &executable) const +TextEncoding DeviceFileAccess::processStdOutEncoding(const FilePath &executable) const { Q_UNUSED(executable) - return TextCodec::utf8(); // Good default nowadays. + return TextEncoding::Utf8; // Good default nowadays. } -TextCodec DeviceFileAccess::processStdErrCodec(const FilePath &executable) const +TextEncoding DeviceFileAccess::processStdErrEncoding(const FilePath &executable) const { Q_UNUSED(executable) - return TextCodec::utf8(); // Good default nowadays. + return TextEncoding::Utf8; // Good default nowadays. } // UnavailableDeviceFileAccess @@ -1249,16 +1249,16 @@ Result> DesktopDeviceFileAccess::watch(const Fi return ResultError(watcher->error()); } -TextCodec DesktopDeviceFileAccess::processStdOutCodec(const FilePath &executable) const +TextEncoding DesktopDeviceFileAccess::processStdOutEncoding(const FilePath &executable) const { Q_UNUSED(executable) - return TextCodec::codecForLocale(); + return TextCodec::encodingForLocale(); } -TextCodec DesktopDeviceFileAccess::processStdErrCodec(const FilePath &executable) const +TextEncoding DesktopDeviceFileAccess::processStdErrEncoding(const FilePath &executable) const { Q_UNUSED(executable) - return TextCodec::codecForLocale(); + return TextCodec::encodingForLocale(); } QDateTime DesktopDeviceFileAccess::lastModified(const FilePath &filePath) const diff --git a/src/libs/utils/devicefileaccess.h b/src/libs/utils/devicefileaccess.h index c5b9ad60ff4..bba9811b5a7 100644 --- a/src/libs/utils/devicefileaccess.h +++ b/src/libs/utils/devicefileaccess.h @@ -14,7 +14,7 @@ namespace Utils { class CommandLine; class RunResult; -class TextCodec; +class TextEncoding; // Base class including dummy implementation usable as fallback. class QTCREATOR_UTILS_EXPORT DeviceFileAccess @@ -83,8 +83,8 @@ protected: virtual Utils::Result> watch(const FilePath &path) const; - virtual TextCodec processStdOutCodec(const FilePath &executable) const; - virtual TextCodec processStdErrCodec(const FilePath &executable) const; + virtual TextEncoding processStdOutEncoding(const FilePath &executable) const; + virtual TextEncoding processStdErrEncoding(const FilePath &executable) const; }; class QTCREATOR_UTILS_EXPORT UnavailableDeviceFileAccess : public DeviceFileAccess @@ -209,10 +209,10 @@ protected: Result createTempFile(const FilePath &filePath) override; - Utils::Result> watch(const FilePath &path) const override; + Result> watch(const FilePath &path) const override; - TextCodec processStdOutCodec(const FilePath &executable) const override; - TextCodec processStdErrCodec(const FilePath &executable) const override; + TextEncoding processStdOutEncoding(const FilePath &executable) const override; + TextEncoding processStdErrEncoding(const FilePath &executable) const override; }; class QTCREATOR_UTILS_EXPORT UnixDeviceFileAccess : public DeviceFileAccess diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index b21b76f99cf..9207a125022 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -2189,14 +2189,14 @@ QChar FilePath::pathListSeparator() const return osType() == OsTypeWindows ? u';' : u':'; } -TextCodec FilePath::processStdOutCodec() const +TextEncoding FilePath::processStdOutEncoding() const { - return fileAccess()->processStdOutCodec(*this); + return fileAccess()->processStdOutEncoding(*this); } -TextCodec FilePath::processStdErrCodec() const +TextEncoding FilePath::processStdErrEncoding() const { - return fileAccess()->processStdErrCodec(*this); + return fileAccess()->processStdErrEncoding(*this); } /*! diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index 990ef153949..8ab58f6907e 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -34,7 +34,7 @@ namespace Utils { class DeviceFileAccess; class Environment; enum class FileStreamHandle; -class TextCodec; +class TextEncoding; template using Continuation = std::function; using CopyContinuation = Continuation &>; @@ -199,8 +199,8 @@ public: QChar pathComponentSeparator() const; QChar pathListSeparator() const; - TextCodec processStdOutCodec() const; - TextCodec processStdErrCodec() const; + TextEncoding processStdOutEncoding() const; + TextEncoding processStdErrEncoding() const; void clear(); bool isEmpty() const; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 453a620aeec..0a0014b6407 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -198,15 +198,14 @@ public: QString readAllData() { - QString msg = codec.toUnicode(rawData.data(), rawData.size(), &codecState); + QString msg = decoder.decode(rawData); rawData.clear(); return msg; } QByteArray rawData; QString incompleteLineBuffer; // lines not yet signaled - TextCodec codec; - TextCodec::ConverterState codecState; + QStringDecoder decoder; std::function outputCallback; TextChannelMode m_textChannelMode = TextChannelMode::Off; @@ -732,8 +731,8 @@ public: qint64 m_applicationMainThreadId = 0; ProcessResultData m_resultData; - TextCodec m_stdOutCodec; - TextCodec m_stdErrCodec; + std::optional m_stdOutEncoding; + std::optional m_stdErrEncoding; ProcessResult m_result = ProcessResult::StartFailed; ChannelBuffer m_stdOut; @@ -992,15 +991,15 @@ void ProcessPrivate::sendControlSignal(ControlSignal controlSignal) void ProcessPrivate::clearForRun() { - if (!m_stdOutCodec.isValid()) - m_stdOutCodec = m_setup.m_commandLine.executable().processStdOutCodec(); + if (!m_stdOutEncoding) + m_stdOutEncoding = m_setup.m_commandLine.executable().processStdOutEncoding(); m_stdOut.clearForRun(); - m_stdOut.codec = m_stdOutCodec; + m_stdOut.decoder = QStringDecoder(m_stdOutEncoding->name()); - if (!m_stdErrCodec.isValid()) - m_stdErrCodec = m_setup.m_commandLine.executable().processStdErrCodec(); + if (!m_stdErrEncoding) + m_stdErrEncoding = m_setup.m_commandLine.executable().processStdErrEncoding(); m_stdErr.clearForRun(); - m_stdErr.codec = m_stdErrCodec; + m_stdErr.decoder = QStringDecoder(m_stdErrEncoding->name()); m_result = ProcessResult::StartFailed; m_startTimestamp = {}; @@ -1673,15 +1672,15 @@ QByteArray Process::rawStdErr() const QString Process::stdOut() const { QTC_CHECK(d->m_stdOut.keepRawData); - QTC_ASSERT(d->m_stdOutCodec.isValid(), return {}); // Process was not started - return d->m_stdOutCodec.toUnicode(d->m_stdOut.rawData); + QTC_ASSERT(d->m_stdOutEncoding, return {}); // Process was not started + return d->m_stdOut.decoder.decode(d->m_stdOut.rawData); } QString Process::stdErr() const { QTC_CHECK(d->m_stdErr.keepRawData); - QTC_ASSERT(d->m_stdErrCodec.isValid(), return {}); // Process was not started - return d->m_stdErrCodec.toUnicode(d->m_stdErr.rawData); + QTC_ASSERT(d->m_stdOutEncoding, return {}); // Process was not started + return d->m_stdOut.decoder.decode(d->m_stdErr.rawData); } QString Process::cleanedStdOut() const @@ -1726,7 +1725,6 @@ QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug str, const Process &r) void ChannelBuffer::clearForRun() { rawData.clear(); - codecState.reset(); incompleteLineBuffer.clear(); } @@ -1745,7 +1743,7 @@ void ChannelBuffer::append(const QByteArray &text) return; // Convert and append the new input to the buffer of incomplete lines - incompleteLineBuffer.append(codec.toUnicode(text.constData(), text.size(), &codecState)); + incompleteLineBuffer.append(decoder.decode(text)); QStringView bufferView(incompleteLineBuffer); @@ -1796,27 +1794,21 @@ void ChannelBuffer::handleRest() } } -void Process::setCodec(const TextCodec &codec) -{ - QTC_ASSERT(codec.isValid(), return); - d->m_stdOutCodec = codec; - d->m_stdErrCodec = codec; -} - void Process::setEncoding(const TextEncoding &encoding) { - setCodec(TextCodec::codecForName(encoding)); + d->m_stdOutEncoding = encoding; + d->m_stdErrEncoding = encoding; } void Process::setUtf8Codec() { - d->m_stdOutCodec = TextCodec::utf8(); - d->m_stdErrCodec = TextCodec::utf8(); + d->m_stdOutEncoding = QStringDecoder::Utf8; + d->m_stdErrEncoding = QStringDecoder::Utf8; } void Process::setUtf8StdOutCodec() { - d->m_stdOutCodec = TextCodec::utf8(); + d->m_stdOutEncoding = QStringDecoder::Utf8; } void Process::setTimeOutMessageBoxEnabled(bool v) diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index ff2c50ddb47..7035ead4dc7 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -28,6 +28,7 @@ class ProcessInterface; class ProcessResultData; class ProcessRunData; class TextEncoding; +class TextCodec; class QTCREATOR_UTILS_EXPORT Process final : public QObject { @@ -144,7 +145,6 @@ public: void runBlocking(std::chrono::seconds timeout = std::chrono::seconds(10), EventLoopMode eventLoopMode = EventLoopMode::Off); - void setCodec(const TextCodec &codec); // for stdOut and stdErr void setEncoding(const TextEncoding &encoding); // for stdOut and stdErr void setUtf8Codec(); // for stdOut and stdErr void setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec() diff --git a/src/libs/utils/textcodec.h b/src/libs/utils/textcodec.h index 9ed3f6970c5..2f014689840 100644 --- a/src/libs/utils/textcodec.h +++ b/src/libs/utils/textcodec.h @@ -21,6 +21,12 @@ public: TextEncoding(const QByteArray &name); TextEncoding(QStringEncoder::Encoding encoding); + static const QStringConverter::Encoding Utf8 = QStringConverter::Encoding::Utf8; + static const QStringConverter::Encoding Utf16 = QStringConverter::Encoding::Utf16; + static const QStringConverter::Encoding Utf32 = QStringConverter::Encoding::Utf32; + static const QStringConverter::Encoding Latin1 = QStringConverter::Encoding::Latin1; + static const QStringConverter::Encoding System = QStringConverter::Encoding::System; + operator QByteArray() const { return m_name; } QByteArray name() const { return m_name; }