From d061e29dd307c42a7fd79091be14f745752c27c5 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 23 Feb 2024 16:27:58 +0100 Subject: [PATCH] Utils: Allow different codec for Process stdout and stderr Change-Id: Ie6a3fb74a447a599c492e38ec83a2330f3cb4cd8 Reviewed-by: hjk --- src/libs/utils/process.cpp | 27 +++++++++++++++++++++------ src/libs/utils/process.h | 6 ++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/libs/utils/process.cpp b/src/libs/utils/process.cpp index 4eacb28986f..651dd5b49b1 100644 --- a/src/libs/utils/process.cpp +++ b/src/libs/utils/process.cpp @@ -847,7 +847,9 @@ public: qint64 m_applicationMainThreadId = 0; ProcessResultData m_resultData; - QTextCodec *m_codec = QTextCodec::codecForLocale(); + QTextCodec *m_stdOutCodec = QTextCodec::codecForLocale(); + QTextCodec *m_stdErrCodec = QTextCodec::codecForLocale(); + ProcessResult m_result = ProcessResult::StartFailed; ChannelBuffer m_stdOut; ChannelBuffer m_stdErr; @@ -1102,9 +1104,9 @@ void ProcessPrivate::sendControlSignal(ControlSignal controlSignal) void ProcessPrivate::clearForRun() { m_stdOut.clearForRun(); - m_stdOut.codec = m_codec; + m_stdOut.codec = m_stdOutCodec; m_stdErr.clearForRun(); - m_stdErr.codec = m_codec; + m_stdErr.codec = m_stdErrCodec; m_result = ProcessResult::StartFailed; m_startTimestamp = {}; m_doneTimestamp = {}; @@ -1729,13 +1731,13 @@ QByteArray Process::rawStdErr() const QString Process::stdOut() const { QTC_CHECK(d->m_stdOut.keepRawData); - return d->m_codec->toUnicode(d->m_stdOut.rawData); + return d->m_stdOutCodec->toUnicode(d->m_stdOut.rawData); } QString Process::stdErr() const { QTC_CHECK(d->m_stdErr.keepRawData); - return d->m_codec->toUnicode(d->m_stdErr.rawData); + return d->m_stdErrCodec->toUnicode(d->m_stdErr.rawData); } QString Process::cleanedStdOut() const @@ -1850,7 +1852,20 @@ void ChannelBuffer::handleRest() void Process::setCodec(QTextCodec *c) { QTC_ASSERT(c, return); - d->m_codec = c; + d->m_stdOutCodec = c; + d->m_stdErrCodec = c; +} + +void Process::setStdOutCodec(QTextCodec *c) +{ + QTC_ASSERT(c, return); + d->m_stdOutCodec = c; +} + +void Process::setStdErrCodec(QTextCodec *c) +{ + QTC_ASSERT(c, return); + d->m_stdErrCodec = c; } void Process::setTimeOutMessageBoxEnabled(bool v) diff --git a/src/libs/utils/process.h b/src/libs/utils/process.h index d425f76eed3..694c1a12a86 100644 --- a/src/libs/utils/process.h +++ b/src/libs/utils/process.h @@ -148,8 +148,10 @@ public: void runBlocking(std::chrono::seconds timeout = std::chrono::seconds(10), EventLoopMode eventLoopMode = EventLoopMode::Off); - // TODO: We should specify the purpose of the codec, e.g. setCodecForStandardChannel() - void setCodec(QTextCodec *c); + void setCodec(QTextCodec *c); // for stdOut and stdErr + void setStdOutCodec(QTextCodec *c); + void setStdErrCodec(QTextCodec *c); + void setTimeOutMessageBoxEnabled(bool); void setStdOutCallback(const TextChannelCallback &callback);