Introduce ProcessResultData

It should be useful when reimplementing ProcessInterface.
It replaces 4 virtual methods with just 1.

Task-number: QTCREATORBUG-27358
Change-Id: I2dafbfbc25f8f016ff2aa19c1a176335a4a7498c
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2022-04-08 17:24:59 +02:00
parent 104bbfc713
commit 936c44f367
11 changed files with 126 additions and 193 deletions

View File

@@ -29,6 +29,7 @@
#include "sshsettings.h" #include "sshsettings.h"
#include <utils/commandline.h> #include <utils/commandline.h>
#include <utils/processinterface.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QTimer> #include <QTimer>
@@ -80,11 +81,12 @@ void SshRemoteProcess::start()
QtcProcess::start(); QtcProcess::start();
} }
QString SshRemoteProcess::errorString() const ProcessResultData SshRemoteProcess::resultData() const
{ {
ProcessResultData result = QtcProcess::resultData();
if (!m_errorString.isEmpty()) if (!m_errorString.isEmpty())
return m_errorString; result.m_errorString = m_errorString;
return QtcProcess::errorString(); return result;
} }
void SshRemoteProcess::requestX11Forwarding(const QString &displayName) void SshRemoteProcess::requestX11Forwarding(const QString &displayName)

View File

@@ -42,7 +42,7 @@ public:
void requestX11Forwarding(const QString &displayName); void requestX11Forwarding(const QString &displayName);
void start() override; void start() override;
QString errorString() const override; Utils::ProcessResultData resultData() const override;
Utils::CommandLine fullLocalCommandLine(bool inTerminal = false) const; Utils::CommandLine fullLocalCommandLine(bool inTerminal = false) const;

View File

@@ -204,12 +204,12 @@ void CallerHandle::handleError(const ErrorSignal *launcherSignal)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return); QTC_ASSERT(isCalledFromCallersThread(), return);
m_processState = QProcess::NotRunning; m_processState = QProcess::NotRunning;
m_error = launcherSignal->error(); m_result.m_error = launcherSignal->error();
if (!launcherSignal->errorString().isEmpty()) if (!launcherSignal->errorString().isEmpty())
m_errorString = launcherSignal->errorString(); m_result.m_errorString = launcherSignal->errorString();
if (m_error == QProcess::FailedToStart) if (m_result.m_error == QProcess::FailedToStart)
m_exitCode = 255; // This code is being returned by QProcess when FailedToStart error occurred m_result.m_exitCode = 255; // This code is being returned by QProcess when FailedToStart error occurred
emit errorOccurred(m_error); emit errorOccurred(m_result.m_error);
} }
void CallerHandle::handleStarted(const StartedSignal *launcherSignal) void CallerHandle::handleStarted(const StartedSignal *launcherSignal)
@@ -252,8 +252,8 @@ void CallerHandle::handleFinished(const FinishedSignal *launcherSignal)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return); QTC_ASSERT(isCalledFromCallersThread(), return);
m_processState = QProcess::NotRunning; m_processState = QProcess::NotRunning;
m_exitStatus = launcherSignal->exitStatus(); m_result.m_exitStatus = launcherSignal->exitStatus();
m_exitCode = launcherSignal->exitCode(); m_result.m_exitCode = launcherSignal->exitCode();
emit finished(); emit finished();
} }
@@ -315,13 +315,13 @@ void CallerHandle::cancel()
case QProcess::NotRunning: case QProcess::NotRunning:
break; break;
case QProcess::Starting: case QProcess::Starting:
m_errorString = QCoreApplication::translate("Utils::LauncherHandle", m_result.m_errorString = QCoreApplication::translate("Utils::LauncherHandle",
"Process was canceled before it was started."); "Process was canceled before it was started.");
m_error = QProcess::FailedToStart; m_result.m_error = QProcess::FailedToStart;
if (LauncherInterface::isReady()) // TODO: race condition with m_processState??? if (LauncherInterface::isReady()) // TODO: race condition with m_processState???
sendPacket(StopProcessPacket(m_token)); sendPacket(StopProcessPacket(m_token));
else else
emit errorOccurred(m_error); emit errorOccurred(m_result.m_error);
break; break;
case QProcess::Running: case QProcess::Running:
sendPacket(StopProcessPacket(m_token)); sendPacket(StopProcessPacket(m_token));
@@ -347,30 +347,24 @@ qint64 CallerHandle::processId() const
return m_processId; return m_processId;
} }
int CallerHandle::exitCode() const ProcessResultData CallerHandle::resultData() const
{
QTC_ASSERT(isCalledFromCallersThread(), return -1);
return m_exitCode;
}
QString CallerHandle::errorString() const
{ {
QTC_ASSERT(isCalledFromCallersThread(), return {}); QTC_ASSERT(isCalledFromCallersThread(), return {});
return m_errorString; return m_result;
} }
void CallerHandle::setErrorString(const QString &str) void CallerHandle::setErrorString(const QString &str)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return); QTC_ASSERT(isCalledFromCallersThread(), return);
m_errorString = str; m_result.m_errorString = str;
} }
void CallerHandle::start(const QString &program, const QStringList &arguments) void CallerHandle::start(const QString &program, const QStringList &arguments)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return); QTC_ASSERT(isCalledFromCallersThread(), return);
if (!m_launcherHandle || m_launcherHandle->isSocketError()) { if (!m_launcherHandle || m_launcherHandle->isSocketError()) {
m_error = QProcess::FailedToStart; m_result.m_error = QProcess::FailedToStart;
emit errorOccurred(m_error); emit errorOccurred(m_result.m_error);
return; return;
} }
@@ -444,12 +438,6 @@ qint64 CallerHandle::write(const QByteArray &data)
return data.size(); return data.size();
} }
QProcess::ProcessError CallerHandle::error() const
{
QTC_ASSERT(isCalledFromCallersThread(), return QProcess::UnknownError);
return m_error;
}
QString CallerHandle::program() const QString CallerHandle::program() const
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
@@ -468,12 +456,6 @@ void CallerHandle::setProcessSetupData(const ProcessSetupData::Ptr &setup)
m_setup = setup; m_setup = setup;
} }
QProcess::ExitStatus CallerHandle::exitStatus() const
{
QTC_ASSERT(isCalledFromCallersThread(), return QProcess::CrashExit);
return m_exitStatus;
}
bool CallerHandle::waitForSignal(int msecs, SignalType newSignal) bool CallerHandle::waitForSignal(int msecs, SignalType newSignal)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return false); QTC_ASSERT(isCalledFromCallersThread(), return false);

View File

@@ -96,8 +96,8 @@ public:
QByteArray readAllStandardError(); QByteArray readAllStandardError();
qint64 processId() const; qint64 processId() const;
int exitCode() const; ProcessResultData resultData() const;
QString errorString() const;
void setErrorString(const QString &str); void setErrorString(const QString &str);
void start(const QString &program, const QStringList &arguments); void start(const QString &program, const QStringList &arguments);
@@ -106,13 +106,11 @@ public:
qint64 write(const QByteArray &data); qint64 write(const QByteArray &data);
QProcess::ProcessError error() const;
// Called from caller's or launcher's thread. // Called from caller's or launcher's thread.
QString program() const; QString program() const;
// Called from caller's or launcher's thread. // Called from caller's or launcher's thread.
QStringList arguments() const; QStringList arguments() const;
void setProcessSetupData(const ProcessSetupData::Ptr &setup); void setProcessSetupData(const ProcessSetupData::Ptr &setup);
QProcess::ExitStatus exitStatus() const;
signals: signals:
void errorOccurred(QProcess::ProcessError error); void errorOccurred(QProcess::ProcessError error);
@@ -159,12 +157,9 @@ private:
std::atomic<QProcess::ProcessState> m_processState = QProcess::NotRunning; std::atomic<QProcess::ProcessState> m_processState = QProcess::NotRunning;
std::unique_ptr<StartProcessPacket> m_startPacket; std::unique_ptr<StartProcessPacket> m_startPacket;
int m_processId = 0; int m_processId = 0;
int m_exitCode = 0;
QProcess::ExitStatus m_exitStatus = QProcess::ExitStatus::NormalExit;
QByteArray m_stdout; QByteArray m_stdout;
QByteArray m_stderr; QByteArray m_stderr;
QProcess::ProcessError m_error = QProcess::UnknownError; ProcessResultData m_result;
QString m_errorString;
QString m_command; QString m_command;
QStringList m_arguments; QStringList m_arguments;

View File

@@ -63,6 +63,15 @@ public:
bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path bool m_belowNormalPriority = false; // internal, dependent on other fields and specific code path
}; };
class QTCREATOR_UTILS_EXPORT ProcessResultData
{
public:
int m_exitCode = 0;
QProcess::ExitStatus m_exitStatus = QProcess::NormalExit;
QProcess::ProcessError m_error = QProcess::UnknownError;
QString m_errorString;
};
class QTCREATOR_UTILS_EXPORT ProcessInterface : public QObject class QTCREATOR_UTILS_EXPORT ProcessInterface : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -83,11 +92,8 @@ public:
virtual qint64 processId() const = 0; virtual qint64 processId() const = 0;
virtual QProcess::ProcessState state() const = 0; virtual QProcess::ProcessState state() const = 0;
virtual int exitCode() const = 0;
virtual QProcess::ExitStatus exitStatus() const = 0;
virtual QProcess::ProcessError error() const = 0; virtual ProcessResultData resultData() const = 0;
virtual QString errorString() const = 0;
virtual bool waitForStarted(int msecs) = 0; virtual bool waitForStarted(int msecs) = 0;
virtual bool waitForReadyRead(int msecs) = 0; virtual bool waitForReadyRead(int msecs) = 0;
@@ -140,11 +146,8 @@ public:
qint64 processId() const override { return m_target->processId(); } qint64 processId() const override { return m_target->processId(); }
QProcess::ProcessState state() const override { return m_target->state(); } QProcess::ProcessState state() const override { return m_target->state(); }
int exitCode() const override { return m_target->exitCode(); }
QProcess::ExitStatus exitStatus() const override { return m_target->exitStatus(); }
QProcess::ProcessError error() const override { return m_target->error(); } ProcessResultData resultData() const override { return m_target->resultData(); };
QString errorString() const override { return m_target->errorString(); }
bool waitForStarted(int msecs) override { return m_target->waitForStarted(msecs); } bool waitForStarted(int msecs) override { return m_target->waitForStarted(msecs); }
bool waitForReadyRead(int msecs) override { return m_target->waitForReadyRead(msecs); } bool waitForReadyRead(int msecs) override { return m_target->waitForReadyRead(msecs); }

View File

@@ -215,7 +215,7 @@ public:
class DefaultImpl : public ProcessInterface class DefaultImpl : public ProcessInterface
{ {
public: public:
virtual void start() { defaultStart(); } virtual void start() final { defaultStart(); }
protected: protected:
void defaultStart(); void defaultStart();
@@ -325,7 +325,7 @@ bool DefaultImpl::ensureProgramExists(const QString &program)
return false; return false;
} }
class QProcessImpl : public DefaultImpl class QProcessImpl final : public DefaultImpl
{ {
public: public:
QProcessImpl() : m_process(new ProcessHelper(this)) QProcessImpl() : m_process(new ProcessHelper(this))
@@ -341,49 +341,32 @@ public:
connect(m_process, &QProcess::readyReadStandardError, connect(m_process, &QProcess::readyReadStandardError,
this, &ProcessInterface::readyReadStandardError); this, &ProcessInterface::readyReadStandardError);
} }
~QProcessImpl() override ~QProcessImpl() final { ProcessReaper::reap(m_process); }
{
ProcessReaper::reap(m_process);
}
QByteArray readAllStandardOutput() override { return m_process->readAllStandardOutput(); } QByteArray readAllStandardOutput() final { return m_process->readAllStandardOutput(); }
QByteArray readAllStandardError() override { return m_process->readAllStandardError(); } QByteArray readAllStandardError() final { return m_process->readAllStandardError(); }
void interrupt() override void interrupt() final { ProcessHelper::interruptProcess(m_process); }
{ ProcessHelper::interruptProcess(m_process); } void terminate() final { ProcessHelper::terminateProcess(m_process); }
void terminate() override void kill() final { m_process->kill(); }
{ ProcessHelper::terminateProcess(m_process); } void close() final { m_process->close(); }
void kill() override qint64 write(const QByteArray &data) final { return m_process->write(data); }
{ m_process->kill(); }
void close() override
{ m_process->close(); }
qint64 write(const QByteArray &data) override
{ return m_process->write(data); }
QProcess::ProcessError error() const override ProcessResultData resultData() const final {
{ return m_process->error(); } return { m_process->exitCode(), m_process->exitStatus(),
QProcess::ProcessState state() const override m_process->error(), m_process->errorString() };
{ return m_process->state(); } };
qint64 processId() const override void setErrorString(const QString &str) final { m_process->setErrorString(str); }
{ return m_process->processId(); }
int exitCode() const override
{ return m_process->exitCode(); }
QProcess::ExitStatus exitStatus() const override
{ return m_process->exitStatus(); }
QString errorString() const override
{ return m_process->errorString(); }
void setErrorString(const QString &str) override
{ m_process->setErrorString(str); }
bool waitForStarted(int msecs) override QProcess::ProcessState state() const final { return m_process->state(); }
{ return m_process->waitForStarted(msecs); } qint64 processId() const final { return m_process->processId(); }
bool waitForReadyRead(int msecs) override
{ return m_process->waitForReadyRead(msecs); } bool waitForStarted(int msecs) final { return m_process->waitForStarted(msecs); }
bool waitForFinished(int msecs) override bool waitForReadyRead(int msecs) final { return m_process->waitForReadyRead(msecs); }
{ return m_process->waitForFinished(msecs); } bool waitForFinished(int msecs) final { return m_process->waitForFinished(msecs); }
private: private:
void doDefaultStart(const QString &program, const QStringList &arguments) override void doDefaultStart(const QString &program, const QStringList &arguments) final
{ {
ProcessStartHandler *handler = m_process->processStartHandler(); ProcessStartHandler *handler = m_process->processStartHandler();
handler->setProcessMode(m_setup->m_processMode); handler->setProcessMode(m_setup->m_processMode);
@@ -418,7 +401,7 @@ static uint uniqueToken()
return ++globalUniqueToken; return ++globalUniqueToken;
} }
class ProcessLauncherImpl : public DefaultImpl class ProcessLauncherImpl final : public DefaultImpl
{ {
Q_OBJECT Q_OBJECT
public: public:
@@ -437,40 +420,38 @@ public:
connect(m_handle, &CallerHandle::readyReadStandardError, connect(m_handle, &CallerHandle::readyReadStandardError,
this, &ProcessInterface::readyReadStandardError); this, &ProcessInterface::readyReadStandardError);
} }
~ProcessLauncherImpl() override ~ProcessLauncherImpl() final
{ {
cancel(); cancel();
LauncherInterface::unregisterHandle(token()); LauncherInterface::unregisterHandle(token());
m_handle = nullptr; m_handle = nullptr;
} }
QByteArray readAllStandardOutput() override { return m_handle->readAllStandardOutput(); } QByteArray readAllStandardOutput() final { return m_handle->readAllStandardOutput(); }
QByteArray readAllStandardError() override { return m_handle->readAllStandardError(); } QByteArray readAllStandardError() final { return m_handle->readAllStandardError(); }
void interrupt() override void interrupt() final
{ {
if (m_setup->m_useCtrlCStub) // bypass launcher and interrupt directly if (m_setup->m_useCtrlCStub) // bypass launcher and interrupt directly
ProcessHelper::interruptPid(processId()); ProcessHelper::interruptPid(processId());
} }
void terminate() override { cancel(); } // TODO: what are differences among terminate, kill and close? void terminate() final { cancel(); } // TODO: what are differences among terminate, kill and close?
void kill() override { cancel(); } // TODO: see above void kill() final { cancel(); } // TODO: see above
void close() override { cancel(); } // TODO: see above void close() final { cancel(); } // TODO: see above
qint64 write(const QByteArray &data) override { return m_handle->write(data); } qint64 write(const QByteArray &data) final { return m_handle->write(data); }
QProcess::ProcessError error() const override { return m_handle->error(); } ProcessResultData resultData() const final { return m_handle->resultData(); };
QProcess::ProcessState state() const override { return m_handle->state(); } void setErrorString(const QString &str) final { m_handle->setErrorString(str); }
qint64 processId() const override { return m_handle->processId(); }
int exitCode() const override { return m_handle->exitCode(); }
QProcess::ExitStatus exitStatus() const override { return m_handle->exitStatus(); }
QString errorString() const override { return m_handle->errorString(); }
void setErrorString(const QString &str) override { m_handle->setErrorString(str); }
bool waitForStarted(int msecs) override { return m_handle->waitForStarted(msecs); } QProcess::ProcessState state() const final { return m_handle->state(); }
bool waitForReadyRead(int msecs) override { return m_handle->waitForReadyRead(msecs); } qint64 processId() const final { return m_handle->processId(); }
bool waitForFinished(int msecs) override { return m_handle->waitForFinished(msecs); }
bool waitForStarted(int msecs) final { return m_handle->waitForStarted(msecs); }
bool waitForReadyRead(int msecs) final { return m_handle->waitForReadyRead(msecs); }
bool waitForFinished(int msecs) final { return m_handle->waitForFinished(msecs); }
private: private:
void doDefaultStart(const QString &program, const QStringList &arguments) override void doDefaultStart(const QString &program, const QStringList &arguments) final
{ {
m_handle->start(program, arguments); m_handle->start(program, arguments);
} }
@@ -1052,15 +1033,35 @@ void QtcProcess::setResult(const ProcessResult &result)
d->m_result = result; d->m_result = result;
} }
int QtcProcess::exitCode() const ProcessResultData QtcProcess::resultData() const
{ {
const ProcessResultData result = d->m_process ? d->m_process->resultData()
: ProcessResultData();
// This code (255) is being returned by QProcess when FailedToStart error occurred
if (d->m_startFailure == QtcProcessPrivate::WrongCommandFailure) if (d->m_startFailure == QtcProcessPrivate::WrongCommandFailure)
return 255; // This code is being returned by QProcess when FailedToStart error occurred return { 255, result.m_exitStatus, QProcess::FailedToStart, result.m_errorString };
if (d->m_process) return result;
return d->m_process->exitCode();
return 0;
} }
int QtcProcess::exitCode() const
{
return resultData().m_exitCode;
}
QProcess::ExitStatus QtcProcess::exitStatus() const
{
return resultData().m_exitStatus;
}
QProcess::ProcessError QtcProcess::error() const
{
return resultData().m_error;
}
QString QtcProcess::errorString() const
{
return resultData().m_errorString;
}
// Path utilities // Path utilities
@@ -1169,15 +1170,6 @@ void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
d->m_setup.m_processChannelMode = mode; d->m_setup.m_processChannelMode = mode;
} }
QProcess::ProcessError QtcProcess::error() const
{
if (d->m_startFailure == QtcProcessPrivate::WrongCommandFailure)
return QProcess::FailedToStart;
if (d->m_process)
return d->m_process->error();
return QProcess::UnknownError;
}
QProcess::ProcessState QtcProcess::state() const QProcess::ProcessState QtcProcess::state() const
{ {
if (d->m_process) if (d->m_process)
@@ -1190,13 +1182,6 @@ bool QtcProcess::isRunning() const
return state() == QProcess::Running; return state() == QProcess::Running;
} }
QString QtcProcess::errorString() const
{
if (d->m_process)
return d->m_process->errorString();
return {};
}
qint64 QtcProcess::processId() const qint64 QtcProcess::processId() const
{ {
if (d->m_process) if (d->m_process)
@@ -1236,13 +1221,6 @@ QByteArray QtcProcess::readAllStandardError()
return buf; return buf;
} }
QProcess::ExitStatus QtcProcess::exitStatus() const
{
if (d->m_process)
return d->m_process->exitStatus();
return QProcess::NormalExit;
}
void QtcProcess::kill() void QtcProcess::kill()
{ {
if (d->m_process) if (d->m_process)
@@ -1621,7 +1599,7 @@ void QtcProcessPrivate::slotTimeout()
void QtcProcessPrivate::slotFinished() void QtcProcessPrivate::slotFinished()
{ {
handleFinished(m_process->exitCode(), m_process->exitStatus()); handleFinished(m_process->resultData().m_exitCode, m_process->resultData().m_exitStatus);
emitFinished(); emitFinished();
} }

View File

@@ -47,6 +47,7 @@ namespace Internal { class QtcProcessPrivate; }
class DeviceProcessHooks; class DeviceProcessHooks;
class ProcessInterface; class ProcessInterface;
class ProcessResultData;
class QTCREATOR_UTILS_EXPORT QtcProcess : public QObject class QTCREATOR_UTILS_EXPORT QtcProcess : public QObject
{ {
@@ -70,11 +71,13 @@ public:
virtual qint64 processId() const; virtual qint64 processId() const;
virtual QProcess::ProcessState state() const; virtual QProcess::ProcessState state() const;
virtual int exitCode() const; virtual ProcessResultData resultData() const;
virtual QProcess::ExitStatus exitStatus() const;
int exitCode() const;
QProcess::ExitStatus exitStatus() const;
QProcess::ProcessError error() const; QProcess::ProcessError error() const;
virtual QString errorString() const; QString errorString() const;
bool waitForStarted(int msecs = 30000); bool waitForStarted(int msecs = 30000);
bool waitForReadyRead(int msecs = 30000); bool waitForReadyRead(int msecs = 30000);

View File

@@ -127,13 +127,10 @@ public:
: m_process(parent) {} : m_process(parent) {}
qint64 m_processId = 0; qint64 m_processId = 0;
int m_exitCode = 0; ProcessResultData m_result;
QProcess::ExitStatus m_appStatus = QProcess::NormalExit;
QLocalServer m_stubServer; QLocalServer m_stubServer;
QLocalSocket *m_stubSocket = nullptr; QLocalSocket *m_stubSocket = nullptr;
QTemporaryFile *m_tempFile = nullptr; QTemporaryFile *m_tempFile = nullptr;
QProcess::ProcessError m_error = QProcess::UnknownError;
QString m_errorString;
// Used on Unix only // Used on Unix only
QtcProcess m_process; QtcProcess m_process;
@@ -178,8 +175,7 @@ void TerminalImpl::start()
if (isRunning()) if (isRunning())
return; return;
d->m_errorString.clear(); d->m_result = {};
d->m_error = QProcess::UnknownError;
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@@ -449,8 +445,8 @@ void TerminalImpl::cleanupAfterStartFailure(const QString &errorMessage)
void TerminalImpl::finish(int exitCode, QProcess::ExitStatus exitStatus) void TerminalImpl::finish(int exitCode, QProcess::ExitStatus exitStatus)
{ {
d->m_processId = 0; d->m_processId = 0;
d->m_exitCode = exitCode; d->m_result.m_exitCode = exitCode;
d->m_appStatus = exitStatus; d->m_result.m_exitStatus = exitStatus;
emit finished(); emit finished();
} }
@@ -745,30 +741,15 @@ qint64 TerminalImpl::processId() const
return d->m_processId; return d->m_processId;
} }
int TerminalImpl::exitCode() const ProcessResultData TerminalImpl::resultData() const
{ {
return d->m_exitCode; return d->m_result;
} // This will be the signal number if exitStatus == CrashExit
QProcess::ExitStatus TerminalImpl::exitStatus() const
{
return d->m_appStatus;
}
QProcess::ProcessError TerminalImpl::error() const
{
return d->m_error;
}
QString TerminalImpl::errorString() const
{
return d->m_errorString;
} }
void TerminalImpl::emitError(QProcess::ProcessError err, const QString &errorString) void TerminalImpl::emitError(QProcess::ProcessError err, const QString &errorString)
{ {
d->m_error = err; d->m_result.m_error = err;
d->m_errorString = errorString; d->m_result.m_errorString = errorString;
emit errorOccurred(err); emit errorOccurred(err);
} }

View File

@@ -39,7 +39,7 @@ class FilePath;
namespace Internal { namespace Internal {
class TerminalImpl : public ProcessInterface class TerminalImpl final : public ProcessInterface
{ {
public: public:
TerminalImpl(); TerminalImpl();
@@ -60,15 +60,11 @@ public:
// intentionally no-op without an assert // intentionally no-op without an assert
bool waitForFinished(int) final { return false; } bool waitForFinished(int) final { return false; }
QProcess::ProcessError error() const final;
QString errorString() const final;
void start() final; void start() final;
QProcess::ProcessState state() const final; QProcess::ProcessState state() const final;
qint64 processId() const final; qint64 processId() const final;
int exitCode() const final; ProcessResultData resultData() const final;
QProcess::ExitStatus exitStatus() const final;
void kickoffProcess() final; // only debugger terminal, only non-windows void kickoffProcess() final; // only debugger terminal, only non-windows
void interrupt() final; // only debugger terminal, only non-windows void interrupt() final; // only debugger terminal, only non-windows

View File

@@ -32,6 +32,7 @@
#include <ssh/sshconnectionmanager.h> #include <ssh/sshconnectionmanager.h>
#include <ssh/sshremoteprocess.h> #include <ssh/sshremoteprocess.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/processinterface.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
@@ -155,20 +156,14 @@ QProcess::ProcessState SshDeviceProcess::state() const
} }
} }
QProcess::ExitStatus SshDeviceProcess::exitStatus() const ProcessResultData SshDeviceProcess::resultData() const
{ {
return d->exitStatus == QProcess::NormalExit && exitCode() != 255 const ProcessResultData result = QtcProcess::resultData();
? QProcess::NormalExit : QProcess::CrashExit; return { usesTerminal() ? result.m_exitCode : d->remoteProcess->exitCode(),
} d->exitStatus == QProcess::NormalExit && result.m_exitCode != 255
? QProcess::NormalExit : QProcess::CrashExit,
int SshDeviceProcess::exitCode() const result.m_error,
{ d->errorMessage };
return usesTerminal() ? QtcProcess::exitCode() : d->remoteProcess->exitCode();
}
QString SshDeviceProcess::errorString() const
{
return d->errorMessage;
} }
QByteArray SshDeviceProcess::readAllStandardOutput() QByteArray SshDeviceProcess::readAllStandardOutput()

View File

@@ -48,9 +48,7 @@ public:
void kill() override; void kill() override;
QProcess::ProcessState state() const override; QProcess::ProcessState state() const override;
QProcess::ExitStatus exitStatus() const override; Utils::ProcessResultData resultData() const override;
int exitCode() const override;
QString errorString() const override;
QByteArray readAllStandardOutput() override; QByteArray readAllStandardOutput() override;
QByteArray readAllStandardError() override; QByteArray readAllStandardError() override;