From 1d792a9a15d32b0fd9fa47903a00cdba3fb22281 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20N=C3=A4tterlund?= <tobias.naetterlund.qnx@kdab.com>
Date: Mon, 29 Apr 2013 15:45:00 +0200
Subject: [PATCH] QNX: Add support for listing processes for pure QNX devices

Change-Id: Id2d9bd6b7f5ce56ff0d7ece30bb93a69969beecf
Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com>
Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
---
 src/plugins/qnx/qnxdeviceconfiguration.cpp | 55 ++++++++++++++++++++++
 src/plugins/qnx/qnxdeviceconfiguration.h   |  2 +-
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/src/plugins/qnx/qnxdeviceconfiguration.cpp b/src/plugins/qnx/qnxdeviceconfiguration.cpp
index c23ebaf2267..50cc3a89cd7 100644
--- a/src/plugins/qnx/qnxdeviceconfiguration.cpp
+++ b/src/plugins/qnx/qnxdeviceconfiguration.cpp
@@ -31,6 +31,11 @@
 
 #include "qnxdeviceconfiguration.h"
 
+#include <projectexplorer/devicesupport/sshdeviceprocesslist.h>
+
+#include <QRegExp>
+#include <QStringList>
+
 using namespace Qnx;
 using namespace Qnx::Internal;
 
@@ -85,6 +90,51 @@ class QnxPortsGatheringMethod : public ProjectExplorer::PortsGatheringMethod
     }
 };
 
+class QnxDeviceProcessList : public ProjectExplorer::SshDeviceProcessList
+{
+public:
+    QnxDeviceProcessList(const ProjectExplorer::IDevice::ConstPtr &device, QObject *parent)
+        : SshDeviceProcessList(device, parent)
+    {
+    }
+
+private:
+    QString listProcessesCommandLine() const
+    {
+        return QLatin1String("pidin -F \"%a %A '/%n'\"");
+    }
+
+    QList<ProjectExplorer::DeviceProcess> buildProcessList(const QString &listProcessesReply) const
+    {
+        QList<ProjectExplorer::DeviceProcess> processes;
+        QStringList lines = listProcessesReply.split(QLatin1Char('\n'));
+        if (lines.isEmpty())
+            return processes;
+
+        lines.pop_front(); // drop headers
+        QRegExp re(QLatin1String("\\s*(\\d+)\\s+(.*)'(.*)'"));
+
+        foreach (const QString& line, lines) {
+            if (re.exactMatch(line)) {
+                const QStringList captures = re.capturedTexts();
+                if (captures.size() == 4) {
+                    const int pid = captures[1].toInt();
+                    const QString args = captures[2];
+                    const QString exe = captures[3];
+                    ProjectExplorer::DeviceProcess deviceProcess;
+                    deviceProcess.pid = pid;
+                    deviceProcess.exe = exe.trimmed();
+                    deviceProcess.cmdLine = args.trimmed();
+                    processes.append(deviceProcess);
+                }
+            }
+        }
+
+        qSort(processes);
+        return processes;
+    }
+};
+
 QnxDeviceConfiguration::QnxDeviceConfiguration()
     : RemoteLinux::LinuxDevice()
 {
@@ -130,3 +180,8 @@ ProjectExplorer::PortsGatheringMethod::Ptr QnxDeviceConfiguration::portsGatherin
 {
     return ProjectExplorer::PortsGatheringMethod::Ptr(new QnxPortsGatheringMethod);
 }
+
+ProjectExplorer::DeviceProcessList *QnxDeviceConfiguration::createProcessListModel(QObject *parent) const
+{
+    return new QnxDeviceProcessList(sharedFromThis(), parent);
+}
diff --git a/src/plugins/qnx/qnxdeviceconfiguration.h b/src/plugins/qnx/qnxdeviceconfiguration.h
index 87f97effb91..f1645d6793d 100644
--- a/src/plugins/qnx/qnxdeviceconfiguration.h
+++ b/src/plugins/qnx/qnxdeviceconfiguration.h
@@ -52,7 +52,7 @@ public:
 
     ProjectExplorer::DeviceProcessSupport::Ptr processSupport() const;
     ProjectExplorer::PortsGatheringMethod::Ptr portsGatheringMethod() const;
-    bool canCreateProcessModel() const { return false; } // Override LinuxDevice implementation.
+    ProjectExplorer::DeviceProcessList *createProcessListModel(QObject *parent) const;
 
     QString displayType() const;
 
-- 
GitLab