Implement readyRead inside process launcher

Change-Id: I3a27edef2307053b8c4c7d8f1dbf7e0400e27416
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2021-08-02 13:26:33 +02:00
parent 48c1f56ebe
commit ba037a707e
7 changed files with 131 additions and 14 deletions

View File

@@ -103,6 +103,12 @@ void LauncherHandle::handlePacket(LauncherPacketType type, const QByteArray &pay
case LauncherPacketType::ProcessStarted:
handleStartedPacket(payload);
break;
case LauncherPacketType::ReadyReadStandardOutput:
handleReadyReadStandardOutput(payload);
break;
case LauncherPacketType::ReadyReadStandardError:
handleReadyReadStandardError(payload);
break;
case LauncherPacketType::ProcessFinished:
handleFinishedPacket(payload);
break;
@@ -165,10 +171,47 @@ void LauncherHandle::handleStartedPacket(const QByteArray &packetData)
m_processState = QProcess::Running;
const auto packet = LauncherPacket::extractPacket<ProcessStartedPacket>(m_token, packetData);
m_processId = packet.processId;
if (m_callerHandle) {
m_callerHandle->appendSignal(SignalType::Started);
flushCaller();
}
if (!m_callerHandle)
return;
m_callerHandle->appendSignal(SignalType::Started);
flushCaller();
}
void LauncherHandle::handleReadyReadStandardOutput(const QByteArray &packetData)
{
QMutexLocker locker(&m_mutex);
wakeUpIfWaitingFor(SignalType::ReadyRead);
if (m_canceled)
return;
const auto packet = LauncherPacket::extractPacket<ReadyReadStandardOutputPacket>(m_token, packetData);
if (packet.standardChannel.isEmpty())
return;
m_stdout += packet.standardChannel;
if (!m_callerHandle)
return;
m_callerHandle->appendSignal(SignalType::ReadyRead);
flushCaller();
}
void LauncherHandle::handleReadyReadStandardError(const QByteArray &packetData)
{
QMutexLocker locker(&m_mutex);
wakeUpIfWaitingFor(SignalType::ReadyRead);
if (m_canceled)
return;
const auto packet = LauncherPacket::extractPacket<ReadyReadStandardErrorPacket>(m_token, packetData);
if (packet.standardChannel.isEmpty())
return;
m_stderr += packet.standardChannel;
if (!m_callerHandle)
return;
m_callerHandle->appendSignal(SignalType::ReadyRead);
flushCaller();
}
void LauncherHandle::handleFinishedPacket(const QByteArray &packetData)
@@ -180,16 +223,17 @@ void LauncherHandle::handleFinishedPacket(const QByteArray &packetData)
m_processState = QProcess::NotRunning;
const auto packet = LauncherPacket::extractPacket<ProcessFinishedPacket>(m_token, packetData);
m_exitCode = packet.exitCode;
m_stdout = packet.stdOut;
m_stderr = packet.stdErr;
m_stdout += packet.stdOut;
m_stderr += packet.stdErr;
m_errorString = packet.errorString;
m_exitStatus = packet.exitStatus;
if (m_callerHandle) {
if (!m_stdout.isEmpty() || !m_stderr.isEmpty())
m_callerHandle->appendSignal(SignalType::ReadyRead);
m_callerHandle->appendSignal(SignalType::Finished);
flushCaller();
}
if (!m_callerHandle)
return;
if (!m_stdout.isEmpty() || !m_stderr.isEmpty())
m_callerHandle->appendSignal(SignalType::ReadyRead);
m_callerHandle->appendSignal(SignalType::Finished);
flushCaller();
}
void LauncherHandle::handleSocketReady()
@@ -476,6 +520,8 @@ void LauncherSocket::handleSocketDataAvailable()
switch (m_packetParser.type()) {
case LauncherPacketType::ProcessError:
case LauncherPacketType::ProcessStarted:
case LauncherPacketType::ReadyReadStandardOutput:
case LauncherPacketType::ReadyReadStandardError:
case LauncherPacketType::ProcessFinished:
handle->handlePacket(m_packetParser.type(), m_packetParser.packetData());
break;