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);