ProjectExplorer: Merge DeviceProcessList into ProcessList

The abstraction was not used anymore.

Change-Id: I756ae65b9164d0032c3e6a26c3a123fc50f72a75
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-06-21 16:54:11 +02:00
parent fd04d6afa4
commit d045d8dc60
15 changed files with 166 additions and 254 deletions

View File

@@ -828,7 +828,7 @@ ProcessInterface *DockerDevice::createProcessInterface() const
return new DockerProcessImpl(this->sharedFromThis(), d);
}
DeviceProcessList *DockerDevice::createProcessListModel(QObject *parent) const
ProcessList *DockerDevice::createProcessListModel(QObject *parent) const
{
return new ProcessList(sharedFromThis(), parent);
}

View File

@@ -74,7 +74,7 @@ public:
Utils::ProcessInterface *createProcessInterface() const override;
bool canCreateProcessModel() const override { return true; }
ProjectExplorer::DeviceProcessList *createProcessListModel(QObject *parent) const override;
ProjectExplorer::ProcessList *createProcessListModel(QObject *parent) const override;
bool hasDeviceTester() const override { return false; }
ProjectExplorer::DeviceTester *createDeviceTester() const override;
bool usableAsBuildDevice() const override;

View File

@@ -55,7 +55,6 @@ add_qtc_plugin(ProjectExplorer
devicesupport/devicemanager.cpp devicesupport/devicemanager.h
devicesupport/devicemanagermodel.cpp devicesupport/devicemanagermodel.h
devicesupport/deviceprocessesdialog.cpp devicesupport/deviceprocessesdialog.h
devicesupport/deviceprocesslist.cpp devicesupport/deviceprocesslist.h
devicesupport/devicesettingspage.cpp devicesupport/devicesettingspage.h
devicesupport/devicesettingswidget.cpp devicesupport/devicesettingswidget.h
devicesupport/devicetestdialog.cpp devicesupport/devicetestdialog.h

View File

@@ -6,7 +6,6 @@
#include "../projectexplorerconstants.h"
#include "../projectexplorertr.h"
#include "desktopprocesssignaloperation.h"
#include "deviceprocesslist.h"
#include "processlist.h"
#include <coreplugin/fileutils.h>
@@ -90,7 +89,7 @@ bool DesktopDevice::canCreateProcessModel() const
return true;
}
DeviceProcessList *DesktopDevice::createProcessListModel(QObject *parent) const
ProcessList *DesktopDevice::createProcessListModel(QObject *parent) const
{
return new ProcessList(sharedFromThis(), parent);
}

View File

@@ -26,7 +26,7 @@ public:
IDeviceWidget *createWidget() override;
bool canCreateProcessModel() const override;
DeviceProcessList *createProcessListModel(QObject *parent) const override;
ProcessList *createProcessListModel(QObject *parent) const override;
DeviceProcessSignalOperation::Ptr signalOperation() const override;
QUrl toolControlChannel(const ControlChannelHint &) const override;
bool usableAsBuildDevice() const override;

View File

@@ -3,8 +3,8 @@
#include "deviceprocessesdialog.h"
#include "deviceprocesslist.h"
#include "idevice.h"
#include "processlist.h"
#include "../kitchooser.h"
#include "../kitinformation.h"
#include "../projectexplorertr.h"
@@ -84,7 +84,7 @@ public:
ProcessInfo selectedProcess() const;
QDialog *q;
std::unique_ptr<DeviceProcessList> processList;
std::unique_ptr<ProcessList> processList;
ProcessListFilterModel proxyModel;
QLabel *kitLabel;
KitChooser *kitChooser;
@@ -191,11 +191,11 @@ void DeviceProcessesDialogPrivate::setDevice(const IDevice::ConstPtr &device)
QTC_ASSERT(processList, return);
proxyModel.setSourceModel(processList->model());
connect(processList.get(), &DeviceProcessList::error,
connect(processList.get(), &ProcessList::error,
this, &DeviceProcessesDialogPrivate::handleRemoteError);
connect(processList.get(), &DeviceProcessList::processListUpdated,
connect(processList.get(), &ProcessList::processListUpdated,
this, &DeviceProcessesDialogPrivate::handleProcessListUpdated);
connect(processList.get(), &DeviceProcessList::processKilled,
connect(processList.get(), &ProcessList::processKilled,
this, &DeviceProcessesDialogPrivate::handleProcessKilled, Qt::QueuedConnection);
updateButtons();

View File

@@ -1,146 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "deviceprocesslist.h"
#include "idevice.h"
#include "../projectexplorertr.h"
#include <utils/processinfo.h>
#include <utils/qtcassert.h>
#include <utils/treemodel.h>
using namespace Utils;
namespace ProjectExplorer {
namespace Internal {
enum State { Inactive, Listing, Killing };
class DeviceProcessTreeItem : public TreeItem
{
public:
DeviceProcessTreeItem(const ProcessInfo &p, Qt::ItemFlags f) : process(p), fl(f) {}
QVariant data(int column, int role) const final;
Qt::ItemFlags flags(int) const final { return fl; }
ProcessInfo process;
Qt::ItemFlags fl;
};
class DeviceProcessListPrivate
{
public:
DeviceProcessListPrivate(const IDevice::ConstPtr &device)
: device(device)
{ }
qint64 ownPid = -1;
const IDevice::ConstPtr device;
State state = Inactive;
TreeModel<TypedTreeItem<DeviceProcessTreeItem>, DeviceProcessTreeItem> model;
};
} // namespace Internal
using namespace Internal;
DeviceProcessList::DeviceProcessList(const IDevice::ConstPtr &device, QObject *parent)
: QObject(parent), d(std::make_unique<DeviceProcessListPrivate>(device))
{
d->model.setHeader({Tr::tr("Process ID"), Tr::tr("Command Line")});
}
DeviceProcessList::~DeviceProcessList() = default;
void DeviceProcessList::update()
{
QTC_ASSERT(d->state == Inactive, return);
QTC_ASSERT(device(), return);
d->model.clear();
d->model.rootItem()->appendChild(
new DeviceProcessTreeItem(
{0, Tr::tr("Fetching process list. This might take a while."), ""},
Qt::NoItemFlags));
d->state = Listing;
doUpdate();
}
void DeviceProcessList::reportProcessListUpdated(const QList<ProcessInfo> &processes)
{
QTC_ASSERT(d->state == Listing, return);
setFinished();
d->model.clear();
for (const ProcessInfo &process : processes) {
Qt::ItemFlags fl;
if (process.processId != d->ownPid)
fl = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
d->model.rootItem()->appendChild(new DeviceProcessTreeItem(process, fl));
}
emit processListUpdated();
}
void DeviceProcessList::killProcess(int row)
{
QTC_ASSERT(row >= 0 && row < d->model.rootItem()->childCount(), return);
QTC_ASSERT(d->state == Inactive, return);
QTC_ASSERT(device(), return);
d->state = Killing;
doKillProcess(at(row));
}
void DeviceProcessList::setOwnPid(qint64 pid)
{
d->ownPid = pid;
}
void DeviceProcessList::reportProcessKilled()
{
QTC_ASSERT(d->state == Killing, return);
setFinished();
emit processKilled();
}
ProcessInfo DeviceProcessList::at(int row) const
{
return d->model.rootItem()->childAt(row)->process;
}
QAbstractItemModel *DeviceProcessList::model() const
{
return &d->model;
}
QVariant DeviceProcessTreeItem::data(int column, int role) const
{
if (role == Qt::DisplayRole || role == Qt::ToolTipRole) {
if (column == 0)
return process.processId ? process.processId : QVariant();
else
return process.commandLine;
}
return QVariant();
}
void DeviceProcessList::setFinished()
{
d->state = Inactive;
}
IDevice::ConstPtr DeviceProcessList::device() const
{
return d->device;
}
void DeviceProcessList::reportError(const QString &message)
{
QTC_ASSERT(d->state != Inactive, return);
setFinished();
emit error(message);
}
} // namespace ProjectExplorer

View File

@@ -1,56 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "../projectexplorer_export.h"
#include "idevicefwd.h"
#include <QAbstractItemModel>
#include <QList>
#include <memory>
namespace Utils { class ProcessInfo; }
namespace ProjectExplorer {
namespace Internal { class DeviceProcessListPrivate; }
class PROJECTEXPLORER_EXPORT DeviceProcessList : public QObject
{
Q_OBJECT
public:
DeviceProcessList(const IDeviceConstPtr &device, QObject *parent = nullptr);
~DeviceProcessList() override;
void update();
void killProcess(int row);
void setOwnPid(qint64 pid);
Utils::ProcessInfo at(int row) const;
QAbstractItemModel *model() const;
signals:
void processListUpdated();
void error(const QString &errorMsg);
void processKilled();
protected:
void reportError(const QString &message);
void reportProcessKilled();
void reportProcessListUpdated(const QList<Utils::ProcessInfo> &processes);
IDeviceConstPtr device() const;
private:
virtual void doUpdate() = 0;
virtual void doKillProcess(const Utils::ProcessInfo &process) = 0;
void setFinished();
const std::unique_ptr<Internal::DeviceProcessListPrivate> d;
};
} // namespace ProjectExplorer

View File

@@ -4,8 +4,8 @@
#include "idevice.h"
#include "devicemanager.h"
#include "deviceprocesslist.h"
#include "idevicefactory.h"
#include "processlist.h"
#include "sshparameters.h"
#include "../kit.h"
@@ -393,7 +393,7 @@ PortsGatheringMethod IDevice::portsGatheringMethod() const
&Port::parseFromCommandOutput};
};
DeviceProcessList *IDevice::createProcessListModel(QObject *parent) const
ProcessList *IDevice::createProcessListModel(QObject *parent) const
{
Q_UNUSED(parent)
QTC_ASSERT(false, qDebug("This should not have been called..."); return nullptr);

View File

@@ -41,7 +41,7 @@ class Process;
namespace ProjectExplorer {
class DeviceProcessList;
class ProcessList;
class FileTransferInterface;
class FileTransferSetupData;
class Kit;
@@ -142,7 +142,7 @@ public:
virtual PortsGatheringMethod portsGatheringMethod() const;
virtual bool canCreateProcessModel() const { return false; }
virtual DeviceProcessList *createProcessListModel(QObject *parent = nullptr) const;
virtual ProcessList *createProcessListModel(QObject *parent = nullptr) const;
virtual bool hasDeviceTester() const { return false; }
virtual DeviceTester *createDeviceTester() const;

View File

@@ -3,8 +3,12 @@
#include "processlist.h"
#include <projectexplorer/devicesupport/idevice.h>
#include "idevice.h"
#include "../projectexplorertr.h"
#include <utils/processinfo.h>
#include <utils/qtcassert.h>
#include <utils/treemodel.h>
#include <QTimer>
@@ -17,45 +21,140 @@
using namespace Utils;
namespace ProjectExplorer {
namespace Internal {
enum State { Inactive, Listing, Killing };
class DeviceProcessTreeItem : public TreeItem
{
public:
DeviceProcessTreeItem(const ProcessInfo &p, Qt::ItemFlags f) : process(p), fl(f) {}
QVariant data(int column, int role) const final;
Qt::ItemFlags flags(int) const final { return fl; }
ProcessInfo process;
Qt::ItemFlags fl;
};
class DeviceProcessListPrivate
{
public:
DeviceProcessListPrivate(const IDevice::ConstPtr &device)
: device(device)
{
// FIXME: This should not be used for non-desktop cases.
#if defined(Q_OS_UNIX)
ownPid = getpid();
#elif defined(Q_OS_WIN)
ownPid = GetCurrentProcessId();
#endif
}
qint64 ownPid = -1;
const IDevice::ConstPtr device;
State state = Inactive;
TreeModel<TypedTreeItem<DeviceProcessTreeItem>, DeviceProcessTreeItem> model;
DeviceProcessSignalOperation::Ptr signalOperation;
};
} // namespace Internal
using namespace Internal;
ProcessList::ProcessList(const IDevice::ConstPtr &device, QObject *parent)
: DeviceProcessList(device, parent)
: QObject(parent), d(std::make_unique<DeviceProcessListPrivate>(device))
{
#if defined(Q_OS_UNIX)
setOwnPid(getpid());
#elif defined(Q_OS_WIN)
setOwnPid(GetCurrentProcessId());
#endif
d->model.setHeader({Tr::tr("Process ID"), Tr::tr("Command Line")});
}
void ProcessList::doKillProcess(const ProcessInfo &processInfo)
ProcessList::~ProcessList() = default;
void ProcessList::update()
{
m_signalOperation = device()->signalOperation();
connect(m_signalOperation.data(),
&DeviceProcessSignalOperation::finished,
this,
&ProcessList::reportDelayedKillStatus);
m_signalOperation->killProcess(processInfo.processId);
QTC_ASSERT(d->state == Inactive, return);
QTC_ASSERT(d->device, return);
d->model.clear();
d->model.rootItem()->appendChild(
new DeviceProcessTreeItem(
{0, Tr::tr("Fetching process list. This might take a while."), ""},
Qt::NoItemFlags));
d->state = Listing;
QTimer::singleShot(0, this, &ProcessList::handleUpdate);
}
void ProcessList::killProcess(int row)
{
QTC_ASSERT(row >= 0 && row < d->model.rootItem()->childCount(), return);
QTC_ASSERT(d->state == Inactive, return);
QTC_ASSERT(d->device, return);
d->state = Killing;
const ProcessInfo processInfo = at(row);
d->signalOperation = d->device->signalOperation();
connect(d->signalOperation.data(), &DeviceProcessSignalOperation::finished,
this, &ProcessList::reportDelayedKillStatus);
d->signalOperation->killProcess(processInfo.processId);
}
ProcessInfo ProcessList::at(int row) const
{
return d->model.rootItem()->childAt(row)->process;
}
QAbstractItemModel *ProcessList::model() const
{
return &d->model;
}
QVariant DeviceProcessTreeItem::data(int column, int role) const
{
if (role == Qt::DisplayRole || role == Qt::ToolTipRole) {
if (column == 0)
return process.processId ? process.processId : QVariant();
else
return process.commandLine;
}
return QVariant();
}
void ProcessList::setFinished()
{
d->state = Inactive;
}
void ProcessList::handleUpdate()
{
reportProcessListUpdated(ProcessInfo::processInfoList(DeviceProcessList::device()->rootPath()));
}
const QList<ProcessInfo> processes = ProcessInfo::processInfoList(d->device->rootPath());
QTC_ASSERT(d->state == Listing, return);
setFinished();
d->model.clear();
for (const ProcessInfo &process : processes) {
Qt::ItemFlags fl;
if (process.processId != d->ownPid)
fl = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
d->model.rootItem()->appendChild(new DeviceProcessTreeItem(process, fl));
}
void ProcessList::doUpdate()
{
QTimer::singleShot(0, this, &ProcessList::handleUpdate);
emit processListUpdated();
}
void ProcessList::reportDelayedKillStatus(const QString &errorMessage)
{
if (errorMessage.isEmpty())
reportProcessKilled();
else
reportError(errorMessage);
if (errorMessage.isEmpty()) {
QTC_CHECK(d->state == Killing);
setFinished();
emit processKilled();
} else {
QTC_CHECK(d->state != Inactive);
setFinished();
emit error(errorMessage);
}
m_signalOperation.reset();
d->signalOperation.reset();
}
} // namespace ProjectExplorer
} // ProjectExplorer

View File

@@ -3,28 +3,46 @@
#pragma once
#include "deviceprocesslist.h"
#include "idevice.h"
#include "../projectexplorer_export.h"
#include "idevicefwd.h"
#include <QAbstractItemModel>
#include <QList>
#include <memory>
namespace Utils { class ProcessInfo; }
namespace ProjectExplorer {
class PROJECTEXPLORER_EXPORT ProcessList : public DeviceProcessList
namespace Internal { class DeviceProcessListPrivate; }
class PROJECTEXPLORER_EXPORT ProcessList : public QObject
{
Q_OBJECT
public:
explicit ProcessList(const IDeviceConstPtr &device, QObject *parent = nullptr);
ProcessList(const IDeviceConstPtr &device, QObject *parent = nullptr);
~ProcessList() override;
private:
void doUpdate() override;
void doKillProcess(const Utils::ProcessInfo &process) override;
void update();
void killProcess(int row);
Utils::ProcessInfo at(int row) const;
QAbstractItemModel *model() const;
signals:
void processListUpdated();
void error(const QString &errorMsg);
void processKilled();
private:
void handleUpdate();
void reportDelayedKillStatus(const QString &errorMessage);
private:
DeviceProcessSignalOperation::Ptr m_signalOperation;
void setFinished();
const std::unique_ptr<Internal::DeviceProcessListPrivate> d;
};
} // namespace ProjectExplorer

View File

@@ -210,7 +210,6 @@ Project {
"devicemanager.cpp", "devicemanager.h",
"devicemanagermodel.cpp", "devicemanagermodel.h",
"deviceprocessesdialog.cpp", "deviceprocessesdialog.h",
"deviceprocesslist.cpp", "deviceprocesslist.h",
"devicesettingspage.cpp", "devicesettingspage.h",
"devicesettingswidget.cpp", "devicesettingswidget.h",
"devicetestdialog.cpp", "devicetestdialog.h",

View File

@@ -995,7 +995,7 @@ IDeviceWidget *LinuxDevice::createWidget()
return new Internal::GenericLinuxDeviceConfigurationWidget(sharedFromThis());
}
DeviceProcessList *LinuxDevice::createProcessListModel(QObject *parent) const
ProcessList *LinuxDevice::createProcessListModel(QObject *parent) const
{
return new ProcessList(sharedFromThis(), parent);
}

View File

@@ -23,7 +23,7 @@ public:
ProjectExplorer::IDeviceWidget *createWidget() override;
bool canCreateProcessModel() const override { return true; }
ProjectExplorer::DeviceProcessList *createProcessListModel(QObject *parent) const override;
ProjectExplorer::ProcessList *createProcessListModel(QObject *parent) const override;
bool hasDeviceTester() const override { return true; }
ProjectExplorer::DeviceTester *createDeviceTester() const override;
ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const override;