diff options
author | hjk <qthjk@ovi.com> | 2012-07-26 17:41:52 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@nokia.com> | 2012-07-27 14:18:21 +0200 |
commit | 5c94f8114f691b1b7d635f47f6c1599618ea6897 (patch) | |
tree | 5ccd23aa3d7b97c899b5df46b30e2695768b9a2b /src/plugins/remotelinux | |
parent | 4c1dd686cbb3d1f825f34ca1388a6512c803fa5e (diff) | |
download | qt-creator-5c94f8114f691b1b7d635f47f6c1599618ea6897.tar.gz |
projectexplorer: move kill/list to IDevice
Change-Id: Ic4cbf62a61f7d0bf72e700a77c08788850cde85b
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
Diffstat (limited to 'src/plugins/remotelinux')
-rw-r--r-- | src/plugins/remotelinux/linuxdeviceconfiguration.cpp | 74 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdeviceconfiguration.h | 4 | ||||
-rw-r--r-- | src/plugins/remotelinux/startgdbserverdialog.cpp | 2 |
3 files changed, 76 insertions, 4 deletions
diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp index 8f94c8f274..eae9e9f2dd 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.cpp +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.cpp @@ -46,6 +46,14 @@ using namespace ProjectExplorer; namespace RemoteLinux { +const char Delimiter0[] = "x--"; +const char Delimiter1[] = "---"; + +static QString visualizeNull(QString s) +{ + return s.replace(QLatin1Char('\0'), QLatin1String("<null>")); +} + LinuxDeviceConfiguration::Ptr LinuxDeviceConfiguration::create(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id) { @@ -59,8 +67,7 @@ QString LinuxDeviceConfiguration::displayType() const ProjectExplorer::IDeviceWidget *LinuxDeviceConfiguration::createWidget() { - return new GenericLinuxDeviceConfigurationWidget(sharedFromThis() - .staticCast<LinuxDeviceConfiguration>()); + return new GenericLinuxDeviceConfigurationWidget(sharedFromThis()); } QList<Core::Id> LinuxDeviceConfiguration::actionIds() const @@ -93,7 +100,7 @@ void LinuxDeviceConfiguration::executeAction(Core::Id actionId, QWidget *parent) if (actionId == Core::Id(Constants::GenericTestDeviceActionId)) d = new LinuxDeviceTestDialog(device, new GenericLinuxDeviceTester, parent); else if (actionId == Core::Id(Constants::GenericRemoteProcessesActionId)) - d = new DeviceProcessesDialog(new GenericLinuxProcessList(device, parent)); + d = new DeviceProcessesDialog(new DeviceProcessList(device, parent)); else if (actionId == Core::Id(Constants::GenericDeployKeyToDeviceActionId)) d = PublicKeyDeploymentDialog::createDialog(device, parent); if (d) @@ -122,4 +129,65 @@ ProjectExplorer::IDevice::Ptr LinuxDeviceConfiguration::clone() const return Ptr(new LinuxDeviceConfiguration(*this)); } +QString LinuxDeviceConfiguration::listProcessesCommandLine() const +{ + return QString::fromLatin1( + "for dir in `ls -d /proc/[0123456789]*`; do " + "test -d $dir || continue;" // Decrease the likelihood of a race condition. + "echo $dir;" + "cat $dir/cmdline;echo;" // cmdline does not end in newline + "cat $dir/stat;" + "readlink $dir/exe;" + "printf '%1''%2';" + "done").arg(Delimiter0).arg(Delimiter1); +} + +QString LinuxDeviceConfiguration::killProcessCommandLine(const DeviceProcess &process) const +{ + return QLatin1String("kill -9 ") + QString::number(process.pid); +} + +QList<DeviceProcess> LinuxDeviceConfiguration::buildProcessList(const QString &listProcessesReply) const +{ + QList<DeviceProcess> processes; + const QStringList lines = listProcessesReply.split(QString::fromLatin1(Delimiter0) + + QString::fromLatin1(Delimiter1), QString::SkipEmptyParts); + foreach (const QString &line, lines) { + const QStringList elements = line.split(QLatin1Char('\n')); + if (elements.count() < 4) { + qDebug("%s: Expected four list elements, got %d. Line was '%s'.", Q_FUNC_INFO, + elements.count(), qPrintable(visualizeNull(line))); + continue; + } + bool ok; + const int pid = elements.first().mid(6).toInt(&ok); + if (!ok) { + qDebug("%s: Expected number in %s. Line was '%s'.", Q_FUNC_INFO, + qPrintable(elements.first()), qPrintable(visualizeNull(line))); + continue; + } + QString command = elements.at(1); + command.replace(QLatin1Char('\0'), QLatin1Char(' ')); + if (command.isEmpty()) { + const QString &statString = elements.at(2); + const int openParenPos = statString.indexOf(QLatin1Char('(')); + const int closedParenPos = statString.indexOf(QLatin1Char(')'), openParenPos); + if (openParenPos == -1 || closedParenPos == -1) + continue; + command = QLatin1Char('[') + + statString.mid(openParenPos + 1, closedParenPos - openParenPos - 1) + + QLatin1Char(']'); + } + + DeviceProcess process; + process.pid = pid; + process.cmdLine = command; + process.exe = elements.at(3); + processes.append(process); + } + + qSort(processes); + return processes; +} + } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/linuxdeviceconfiguration.h b/src/plugins/remotelinux/linuxdeviceconfiguration.h index 3f54da6654..99512611d4 100644 --- a/src/plugins/remotelinux/linuxdeviceconfiguration.h +++ b/src/plugins/remotelinux/linuxdeviceconfiguration.h @@ -62,6 +62,10 @@ public: void executeAction(Core::Id actionId, QWidget *parent) const; ProjectExplorer::IDevice::Ptr clone() const; + QString listProcessesCommandLine() const; + QString killProcessCommandLine(const ProjectExplorer::DeviceProcess &process) const; + QList<ProjectExplorer::DeviceProcess> buildProcessList(const QString &listProcessesReply) const; + protected: LinuxDeviceConfiguration() {} LinuxDeviceConfiguration(const QString &name, Core::Id type, diff --git a/src/plugins/remotelinux/startgdbserverdialog.cpp b/src/plugins/remotelinux/startgdbserverdialog.cpp index b0cf8bfd38..63d08b4056 100644 --- a/src/plugins/remotelinux/startgdbserverdialog.cpp +++ b/src/plugins/remotelinux/startgdbserverdialog.cpp @@ -206,7 +206,7 @@ void StartGdbServerDialog::attachToDevice() if (!device) return; delete d->processList; - d->processList = new GenericLinuxProcessList(device); + d->processList = new DeviceProcessList(device); d->proxyModel.setSourceModel(d->processList); connect(d->processList, SIGNAL(error(QString)), SLOT(handleRemoteError(QString))); |