summaryrefslogtreecommitdiff
path: root/src/plugins/remotelinux
diff options
context:
space:
mode:
authorhjk <qthjk@ovi.com>2012-07-26 17:41:52 +0200
committerChristian Kandeler <christian.kandeler@nokia.com>2012-07-27 14:18:21 +0200
commit5c94f8114f691b1b7d635f47f6c1599618ea6897 (patch)
tree5ccd23aa3d7b97c899b5df46b30e2695768b9a2b /src/plugins/remotelinux
parent4c1dd686cbb3d1f825f34ca1388a6512c803fa5e (diff)
downloadqt-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.cpp74
-rw-r--r--src/plugins/remotelinux/linuxdeviceconfiguration.h4
-rw-r--r--src/plugins/remotelinux/startgdbserverdialog.cpp2
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)));