diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 7830e9c29f2..3f33fcd5ee2 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -203,8 +203,7 @@ Utils::ProcessInterface *QnxDevice::createProcessInterface() const DeviceProcessSignalOperation::Ptr QnxDevice::signalOperation() const { - return DeviceProcessSignalOperation::Ptr( - new QnxDeviceProcessSignalOperation(sshParameters())); + return DeviceProcessSignalOperation::Ptr(new QnxDeviceProcessSignalOperation(sharedFromThis())); } // Factory diff --git a/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp b/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp index be72624d7ce..24b6417f0dc 100644 --- a/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp +++ b/src/plugins/qnx/qnxdeviceprocesssignaloperation.cpp @@ -25,14 +25,11 @@ #include "qnxdeviceprocesssignaloperation.h" -#include - -using namespace Qnx; using namespace Qnx::Internal; QnxDeviceProcessSignalOperation::QnxDeviceProcessSignalOperation( - const QSsh::SshConnectionParameters &sshParameters) - : RemoteLinux::RemoteLinuxSignalOperation(sshParameters) + const ProjectExplorer::IDeviceConstPtr &device) + : RemoteLinux::RemoteLinuxSignalOperation(device) { } diff --git a/src/plugins/qnx/qnxdeviceprocesssignaloperation.h b/src/plugins/qnx/qnxdeviceprocesssignaloperation.h index be3795bba0c..d1337fbb169 100644 --- a/src/plugins/qnx/qnxdeviceprocesssignaloperation.h +++ b/src/plugins/qnx/qnxdeviceprocesssignaloperation.h @@ -34,7 +34,7 @@ class QnxDeviceProcessSignalOperation : public RemoteLinux::RemoteLinuxSignalOpe { Q_OBJECT protected: - explicit QnxDeviceProcessSignalOperation(const QSsh::SshConnectionParameters &sshParameters); + explicit QnxDeviceProcessSignalOperation(const ProjectExplorer::IDeviceConstPtr &device); private: QString killProcessByNameCommandLine(const QString &filePath) const override; diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 8aaef841f84..15503abec47 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1055,7 +1055,7 @@ DeviceTester *LinuxDevice::createDeviceTester() const DeviceProcessSignalOperation::Ptr LinuxDevice::signalOperation() const { - return DeviceProcessSignalOperation::Ptr(new RemoteLinuxSignalOperation(sshParameters())); + return DeviceProcessSignalOperation::Ptr(new RemoteLinuxSignalOperation(sharedFromThis())); } class LinuxDeviceEnvironmentFetcher : public DeviceEnvironmentFetcher diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp index 115391d3045..da2d57c03f0 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.cpp +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.cpp @@ -25,24 +25,21 @@ #include "remotelinuxsignaloperation.h" -#include -#include -#include +#include #include +#include +#include using namespace RemoteLinux; using namespace ProjectExplorer; +using namespace Utils; RemoteLinuxSignalOperation::RemoteLinuxSignalOperation( - const QSsh::SshConnectionParameters &sshParameters) - : m_sshParameters(sshParameters) + const IDeviceConstPtr &device) + : m_device(device) {} -RemoteLinuxSignalOperation::~RemoteLinuxSignalOperation() -{ - if (m_runner) - m_runner->deleteLater(); -} +RemoteLinuxSignalOperation::~RemoteLinuxSignalOperation() = default; static QString signalProcessGroupByPidCommandLine(qint64 pid, int signal) { @@ -51,20 +48,12 @@ static QString signalProcessGroupByPidCommandLine(qint64 pid, int signal) void RemoteLinuxSignalOperation::run(const QString &command) { - QTC_ASSERT(!m_runner, return); - m_runner = new QSsh::SshRemoteProcessRunner(); - connect(m_runner, &QSsh::SshRemoteProcessRunner::finished, - this, &RemoteLinuxSignalOperation::runnerProcessFinished); - connect(m_runner, &QSsh::SshRemoteProcessRunner::connectionError, - this, &RemoteLinuxSignalOperation::runnerConnectionError); - m_runner->run(command, m_sshParameters); -} + QTC_ASSERT(!m_process, return); + m_process.reset(new QtcProcess); + connect(m_process.get(), &QtcProcess::done, this, &RemoteLinuxSignalOperation::runnerDone); -void RemoteLinuxSignalOperation::finish() -{ - delete m_runner; - m_runner = nullptr; - emit finished(m_errorMessage); + m_process->setCommand({m_device->mapToGlobalPath("/bin/sh"), {"-c", command}}); + m_process->start(); } static QString signalProcessGroupByNameCommandLine(const QString &filePath, int signal) @@ -112,21 +101,16 @@ void RemoteLinuxSignalOperation::interruptProcess(const QString &filePath) run(interruptProcessByNameCommandLine(filePath)); } -void RemoteLinuxSignalOperation::runnerProcessFinished() +void RemoteLinuxSignalOperation::runnerDone() { m_errorMessage.clear(); - if (m_runner->exitStatus() != QProcess::NormalExit) { - m_errorMessage = m_runner->errorString(); - } else if (m_runner->exitCode() != 0) { - m_errorMessage = tr("Exit code is %1. stderr:").arg(m_runner->exitCode()) + if (m_process->exitStatus() != QProcess::NormalExit) { + m_errorMessage = m_process->errorString(); + } else if (m_process->exitCode() != 0) { + m_errorMessage = tr("Exit code is %1. stderr:").arg(m_process->exitCode()) + QLatin1Char(' ') - + QString::fromLatin1(m_runner->readAllStandardError()); + + QString::fromLatin1(m_process->readAllStandardError()); } - finish(); -} - -void RemoteLinuxSignalOperation::runnerConnectionError() -{ - m_errorMessage = m_runner->lastConnectionErrorString(); - finish(); + m_process.release()->deleteLater(); + emit finished(m_errorMessage); } diff --git a/src/plugins/remotelinux/remotelinuxsignaloperation.h b/src/plugins/remotelinux/remotelinuxsignaloperation.h index dc479141b3c..844c3c6d2fd 100644 --- a/src/plugins/remotelinux/remotelinuxsignaloperation.h +++ b/src/plugins/remotelinux/remotelinuxsignaloperation.h @@ -28,11 +28,6 @@ #include "remotelinux_export.h" #include -#include - -namespace QSsh { -class SshRemoteProcessRunner; -} namespace RemoteLinux { @@ -49,19 +44,17 @@ public: void interruptProcess(const QString &filePath) override; protected: - RemoteLinuxSignalOperation(const QSsh::SshConnectionParameters &sshParameters); + RemoteLinuxSignalOperation(const ProjectExplorer::IDeviceConstPtr &device); private: virtual QString killProcessByNameCommandLine(const QString &filePath) const; virtual QString interruptProcessByNameCommandLine(const QString &filePath) const; - void runnerProcessFinished(); - void runnerConnectionError(); + void runnerDone(); void run(const QString &command); - void finish(); - const QSsh::SshConnectionParameters m_sshParameters; - QSsh::SshRemoteProcessRunner *m_runner = nullptr; + const ProjectExplorer::IDeviceConstPtr m_device; + std::unique_ptr m_process; friend class LinuxDevice; };