ProjectExplorer: Replace ex-ApplicationLauncher signals

... by direct function calls. All local in runcontrol.cpp nowadays.

Change-Id: I40233ded4caad46ebac59d06030e41bd6ca1f211
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
hjk
2022-05-23 13:11:33 +02:00
parent af1351d27b
commit e8d62c1f2c

View File

@@ -1206,7 +1206,7 @@ class SimpleTargetRunnerPrivate : public QObject
Q_OBJECT Q_OBJECT
public: public:
SimpleTargetRunnerPrivate(); explicit SimpleTargetRunnerPrivate(SimpleTargetRunner *parent);
~SimpleTargetRunnerPrivate() override; ~SimpleTargetRunnerPrivate() override;
void start(); void start();
@@ -1224,6 +1224,8 @@ public:
qint64 privateApplicationPID() const; qint64 privateApplicationPID() const;
bool isRunning() const; bool isRunning() const;
SimpleTargetRunner *q = nullptr;
bool m_isLocal = true; bool m_isLocal = true;
bool m_runAsRoot = false; bool m_runAsRoot = false;
@@ -1249,10 +1251,8 @@ public:
bool m_stopReported = false; bool m_stopReported = false;
bool m_stopForced = false; bool m_stopForced = false;
signals: void forwardStarted();
void appendMessage(const QString &message, Utils::OutputFormat format, bool appendNewLine = true); void forwardDone();
void started();
void done();
}; };
} // Internal } // Internal
@@ -1263,10 +1263,11 @@ static QProcess::ProcessChannelMode defaultProcessChannelMode()
? QProcess::MergedChannels : QProcess::SeparateChannels; ? QProcess::MergedChannels : QProcess::SeparateChannels;
} }
SimpleTargetRunnerPrivate::SimpleTargetRunnerPrivate() SimpleTargetRunnerPrivate::SimpleTargetRunnerPrivate(SimpleTargetRunner *parent)
: q(parent)
{ {
m_process.setProcessChannelMode(defaultProcessChannelMode()); m_process.setProcessChannelMode(defaultProcessChannelMode());
connect(&m_process, &QtcProcess::started, this, &SimpleTargetRunnerPrivate::started); connect(&m_process, &QtcProcess::started, this, &SimpleTargetRunnerPrivate::forwardStarted);
connect(&m_process, &QtcProcess::done, this, &SimpleTargetRunnerPrivate::handleDone); connect(&m_process, &QtcProcess::done, this, &SimpleTargetRunnerPrivate::handleDone);
connect(&m_process, &QtcProcess::readyReadStandardError, connect(&m_process, &QtcProcess::readyReadStandardError,
this, &SimpleTargetRunnerPrivate::handleStandardError); this, &SimpleTargetRunnerPrivate::handleStandardError);
@@ -1277,14 +1278,14 @@ SimpleTargetRunnerPrivate::SimpleTargetRunnerPrivate()
connect(WinDebugInterface::instance(), &WinDebugInterface::cannotRetrieveDebugOutput, connect(WinDebugInterface::instance(), &WinDebugInterface::cannotRetrieveDebugOutput,
this, [this] { this, [this] {
disconnect(WinDebugInterface::instance(), nullptr, this, nullptr); disconnect(WinDebugInterface::instance(), nullptr, this, nullptr);
emit appendMessage(tr("Cannot retrieve debugging output.") q->appendMessage(tr("Cannot retrieve debugging output.")
+ QLatin1Char('\n'), ErrorMessageFormat); + QLatin1Char('\n'), ErrorMessageFormat);
}); });
connect(WinDebugInterface::instance(), &WinDebugInterface::debugOutput, connect(WinDebugInterface::instance(), &WinDebugInterface::debugOutput,
this, [this](qint64 pid, const QString &message) { this, [this](qint64 pid, const QString &message) {
if (privateApplicationPID() == pid) if (privateApplicationPID() == pid)
emit appendMessage(message, DebugFormat); q->appendMessage(message, DebugFormat);
}); });
} }
} }
@@ -1292,7 +1293,7 @@ SimpleTargetRunnerPrivate::SimpleTargetRunnerPrivate()
SimpleTargetRunnerPrivate::~SimpleTargetRunnerPrivate() SimpleTargetRunnerPrivate::~SimpleTargetRunnerPrivate()
{ {
if (m_state == Run) if (m_state == Run)
emit done(); forwardDone();
} }
void SimpleTargetRunnerPrivate::stop() void SimpleTargetRunnerPrivate::stop()
@@ -1302,12 +1303,12 @@ void SimpleTargetRunnerPrivate::stop()
if (!isRunning()) if (!isRunning())
return; return;
m_process.stopProcess(); m_process.stopProcess();
QTimer::singleShot(100, this, [this] { emit done(); }); QTimer::singleShot(100, this, [this] { forwardDone(); });
} else { } else {
if (m_stopRequested) if (m_stopRequested)
return; return;
m_stopRequested = true; m_stopRequested = true;
emit appendMessage(tr("User requested stop. Shutting down..."), NormalMessageFormat); q->appendMessage(tr("User requested stop. Shutting down..."), NormalMessageFormat);
switch (m_state) { switch (m_state) {
case Run: case Run:
m_process.terminate(); m_process.terminate();
@@ -1337,12 +1338,12 @@ void SimpleTargetRunnerPrivate::handleDone()
if (m_isLocal) { if (m_isLocal) {
if (m_resultData.m_error == QProcess::UnknownError) { if (m_resultData.m_error == QProcess::UnknownError) {
emit done(); forwardDone();
return; return;
} }
// TODO: why below handlings are different? // TODO: why below handlings are different?
if (m_process.usesTerminal()) { if (m_process.usesTerminal()) {
emit appendMessage(m_process.errorString(), ErrorMessageFormat); q->appendMessage(m_process.errorString(), ErrorMessageFormat);
if (m_processRunning && m_process.processId() == 0) { if (m_processRunning && m_process.processId() == 0) {
m_processRunning = false; m_processRunning = false;
m_resultData.m_exitCode = -1; // FIXME: Why? m_resultData.m_exitCode = -1; // FIXME: Why?
@@ -1360,7 +1361,7 @@ void SimpleTargetRunnerPrivate::handleDone()
errorString = tr("Some error has occurred while running the program."); errorString = tr("Some error has occurred while running the program.");
} }
if (!errorString.isEmpty()) if (!errorString.isEmpty())
emit appendMessage(errorString, ErrorMessageFormat); q->appendMessage(errorString, ErrorMessageFormat);
if (m_processRunning && !isRunning()) { if (m_processRunning && !isRunning()) {
m_processRunning = false; m_processRunning = false;
m_resultData.m_exitCode = -1; m_resultData.m_exitCode = -1;
@@ -1368,7 +1369,7 @@ void SimpleTargetRunnerPrivate::handleDone()
} }
} else { } else {
QTC_ASSERT(m_state == Run, emit done(); return); QTC_ASSERT(m_state == Run, forwardDone(); return);
if (m_resultData.m_error == QProcess::FailedToStart) { if (m_resultData.m_error == QProcess::FailedToStart) {
m_resultData.m_exitStatus = QProcess::CrashExit; m_resultData.m_exitStatus = QProcess::CrashExit;
} else if (m_resultData.m_exitStatus == QProcess::CrashExit) { } else if (m_resultData.m_exitStatus == QProcess::CrashExit) {
@@ -1376,7 +1377,7 @@ void SimpleTargetRunnerPrivate::handleDone()
} }
m_state = Inactive; m_state = Inactive;
} }
emit done(); forwardDone();
} }
void SimpleTargetRunnerPrivate::handleStandardOutput() void SimpleTargetRunnerPrivate::handleStandardOutput()
@@ -1384,7 +1385,7 @@ void SimpleTargetRunnerPrivate::handleStandardOutput()
const QByteArray data = m_process.readAllStandardOutput(); const QByteArray data = m_process.readAllStandardOutput();
const QString msg = m_outputCodec->toUnicode( const QString msg = m_outputCodec->toUnicode(
data.constData(), data.length(), &m_outputCodecState); data.constData(), data.length(), &m_outputCodecState);
emit appendMessage(msg, StdOutFormat, false); q->appendMessage(msg, StdOutFormat, false);
} }
void SimpleTargetRunnerPrivate::handleStandardError() void SimpleTargetRunnerPrivate::handleStandardError()
@@ -1392,7 +1393,7 @@ void SimpleTargetRunnerPrivate::handleStandardError()
const QByteArray data = m_process.readAllStandardError(); const QByteArray data = m_process.readAllStandardError();
const QString msg = m_outputCodec->toUnicode( const QString msg = m_outputCodec->toUnicode(
data.constData(), data.length(), &m_errorCodecState); data.constData(), data.length(), &m_errorCodecState);
emit appendMessage(msg, StdErrFormat, false); q->appendMessage(msg, StdErrFormat, false);
} }
void SimpleTargetRunnerPrivate::start() void SimpleTargetRunnerPrivate::start()
@@ -1429,7 +1430,7 @@ void SimpleTargetRunnerPrivate::start()
m_resultData.m_errorString = tr("Cannot run: No device."); m_resultData.m_errorString = tr("Cannot run: No device.");
m_resultData.m_error = QProcess::FailedToStart; m_resultData.m_error = QProcess::FailedToStart;
m_resultData.m_exitStatus = QProcess::CrashExit; m_resultData.m_exitStatus = QProcess::CrashExit;
emit done(); forwardDone();
return; return;
} }
@@ -1437,7 +1438,7 @@ void SimpleTargetRunnerPrivate::start()
m_resultData.m_errorString = tr("Cannot run: No command given."); m_resultData.m_errorString = tr("Cannot run: No command given.");
m_resultData.m_error = QProcess::FailedToStart; m_resultData.m_error = QProcess::FailedToStart;
m_resultData.m_exitStatus = QProcess::CrashExit; m_resultData.m_exitStatus = QProcess::CrashExit;
emit done(); forwardDone();
return; return;
} }
@@ -1473,14 +1474,13 @@ void SimpleTargetRunnerPrivate::start()
*/ */
SimpleTargetRunner::SimpleTargetRunner(RunControl *runControl) SimpleTargetRunner::SimpleTargetRunner(RunControl *runControl)
: RunWorker(runControl), d(new Internal::SimpleTargetRunnerPrivate) : RunWorker(runControl), d(new Internal::SimpleTargetRunnerPrivate(this))
{ {
setId("SimpleTargetRunner"); setId("SimpleTargetRunner");
} }
SimpleTargetRunner::~SimpleTargetRunner() = default; SimpleTargetRunner::~SimpleTargetRunner() = default;
void SimpleTargetRunner::start() void SimpleTargetRunner::start()
{ {
if (d->m_starter) { if (d->m_starter) {
@@ -1492,6 +1492,37 @@ void SimpleTargetRunner::start()
} }
} }
void SimpleTargetRunnerPrivate::forwardDone()
{
if (m_stopReported)
return;
const QString executable = m_runnable.command.executable().toUserOutput();
QString msg = tr("%2 exited with code %1").arg(m_resultData.m_exitCode).arg(executable);
if (m_resultData.m_exitStatus == QProcess::CrashExit)
msg = tr("%1 crashed.").arg(executable);
else if (m_stopForced)
msg = tr("The process was ended forcefully.");
else if (m_resultData.m_error != QProcess::UnknownError)
msg = RunWorker::userMessageForProcessError(m_resultData.m_error, m_runnable.command.executable());
q->appendMessage(msg, NormalMessageFormat);
m_stopReported = true;
q->reportStopped();
}
void SimpleTargetRunnerPrivate::forwardStarted()
{
const bool isDesktop = m_runnable.device.isNull()
|| m_runnable.device.dynamicCast<const DesktopDevice>();
if (isDesktop) {
// Console processes only know their pid after being started
ProcessHandle pid{privateApplicationPID()};
q->runControl()->setApplicationProcessHandle(pid);
pid.activate();
}
q->reportStarted();
}
void SimpleTargetRunner::doStart(const Runnable &runnable) void SimpleTargetRunner::doStart(const Runnable &runnable)
{ {
bool useTerminal = false; bool useTerminal = false;
@@ -1511,42 +1542,11 @@ void SimpleTargetRunner::doStart(const Runnable &runnable)
const QString msg = RunControl::tr("Starting %1...").arg(runnable.command.toUserOutput()); const QString msg = RunControl::tr("Starting %1...").arg(runnable.command.toUserOutput());
appendMessage(msg, Utils::NormalMessageFormat); appendMessage(msg, Utils::NormalMessageFormat);
connect(d.get(), &SimpleTargetRunnerPrivate::done, this, [this, runnable] {
if (d->m_stopReported)
return;
const QString executable = runnable.command.executable().toUserOutput();
const ProcessResultData &resultData = d->m_resultData;
QString msg = tr("%2 exited with code %1").arg(resultData.m_exitCode).arg(executable);
if (resultData.m_exitStatus == QProcess::CrashExit)
msg = tr("%1 crashed.").arg(executable);
else if (d->m_stopForced)
msg = tr("The process was ended forcefully.");
else if (resultData.m_error != QProcess::UnknownError)
msg = userMessageForProcessError(resultData.m_error, runnable.command.executable());
appendMessage(msg, NormalMessageFormat);
d->m_stopReported = true;
reportStopped();
});
connect(d.get(), &SimpleTargetRunnerPrivate::appendMessage, this, &RunWorker::appendMessage);
const bool isDesktop = runnable.device.isNull() const bool isDesktop = runnable.device.isNull()
|| runnable.device.dynamicCast<const DesktopDevice>(); || runnable.device.dynamicCast<const DesktopDevice>();
if (isDesktop) { if (isDesktop && runnable.command.isEmpty()) {
connect(d.get(), &SimpleTargetRunnerPrivate::started, this, [this] { reportFailure(RunControl::tr("No executable specified."));
// Console processes only know their pid after being started return;
ProcessHandle pid{d->privateApplicationPID()};
runControl()->setApplicationProcessHandle(pid);
pid.activate();
reportStarted();
});
if (runnable.command.isEmpty()) {
reportFailure(RunControl::tr("No executable specified."));
return;
}
} else {
connect(d.get(), &SimpleTargetRunnerPrivate::started, this, &RunWorker::reportStarted);
} }
d->m_runnable = runnable; d->m_runnable = runnable;
d->start(); d->start();