Utils: Allow different codec for Process stdout and stderr

Change-Id: Ie6a3fb74a447a599c492e38ec83a2330f3cb4cd8
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-02-23 16:27:58 +01:00
parent 8b4578f0c4
commit d061e29dd3
2 changed files with 25 additions and 8 deletions

View File

@@ -847,7 +847,9 @@ public:
qint64 m_applicationMainThreadId = 0; qint64 m_applicationMainThreadId = 0;
ProcessResultData m_resultData; ProcessResultData m_resultData;
QTextCodec *m_codec = QTextCodec::codecForLocale(); QTextCodec *m_stdOutCodec = QTextCodec::codecForLocale();
QTextCodec *m_stdErrCodec = QTextCodec::codecForLocale();
ProcessResult m_result = ProcessResult::StartFailed; ProcessResult m_result = ProcessResult::StartFailed;
ChannelBuffer m_stdOut; ChannelBuffer m_stdOut;
ChannelBuffer m_stdErr; ChannelBuffer m_stdErr;
@@ -1102,9 +1104,9 @@ void ProcessPrivate::sendControlSignal(ControlSignal controlSignal)
void ProcessPrivate::clearForRun() void ProcessPrivate::clearForRun()
{ {
m_stdOut.clearForRun(); m_stdOut.clearForRun();
m_stdOut.codec = m_codec; m_stdOut.codec = m_stdOutCodec;
m_stdErr.clearForRun(); m_stdErr.clearForRun();
m_stdErr.codec = m_codec; m_stdErr.codec = m_stdErrCodec;
m_result = ProcessResult::StartFailed; m_result = ProcessResult::StartFailed;
m_startTimestamp = {}; m_startTimestamp = {};
m_doneTimestamp = {}; m_doneTimestamp = {};
@@ -1729,13 +1731,13 @@ QByteArray Process::rawStdErr() const
QString Process::stdOut() const QString Process::stdOut() const
{ {
QTC_CHECK(d->m_stdOut.keepRawData); 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 QString Process::stdErr() const
{ {
QTC_CHECK(d->m_stdErr.keepRawData); 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 QString Process::cleanedStdOut() const
@@ -1850,7 +1852,20 @@ void ChannelBuffer::handleRest()
void Process::setCodec(QTextCodec *c) void Process::setCodec(QTextCodec *c)
{ {
QTC_ASSERT(c, return); 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) void Process::setTimeOutMessageBoxEnabled(bool v)

View File

@@ -148,8 +148,10 @@ public:
void runBlocking(std::chrono::seconds timeout = std::chrono::seconds(10), void runBlocking(std::chrono::seconds timeout = std::chrono::seconds(10),
EventLoopMode eventLoopMode = EventLoopMode::Off); EventLoopMode eventLoopMode = EventLoopMode::Off);
// TODO: We should specify the purpose of the codec, e.g. setCodecForStandardChannel() void setCodec(QTextCodec *c); // for stdOut and stdErr
void setCodec(QTextCodec *c); void setStdOutCodec(QTextCodec *c);
void setStdErrCodec(QTextCodec *c);
void setTimeOutMessageBoxEnabled(bool); void setTimeOutMessageBoxEnabled(bool);
void setStdOutCallback(const TextChannelCallback &callback); void setStdOutCallback(const TextChannelCallback &callback);