diff options
-rw-r--r-- | src/plugins/qnx/qnxdeviceconfiguration.cpp | 64 | ||||
-rw-r--r-- | src/plugins/qnx/qnxdeviceconfiguration.h | 9 | ||||
-rw-r--r-- | src/plugins/qnx/qnxdevicetester.cpp | 23 | ||||
-rw-r--r-- | src/plugins/qnx/qnxdevicetester.h | 2 | ||||
-rw-r--r-- | src/plugins/qnx/qnxruncontrol.cpp | 7 | ||||
-rw-r--r-- | src/plugins/qnx/qnxruncontrol.h | 3 |
6 files changed, 102 insertions, 6 deletions
diff --git a/src/plugins/qnx/qnxdeviceconfiguration.cpp b/src/plugins/qnx/qnxdeviceconfiguration.cpp index f5a26bd9bb..d9b64ed9a3 100644 --- a/src/plugins/qnx/qnxdeviceconfiguration.cpp +++ b/src/plugins/qnx/qnxdeviceconfiguration.cpp @@ -34,14 +34,22 @@ #include "qnxdeviceprocesslist.h" #include "qnxdeviceprocesssignaloperation.h" +#include <projectexplorer/devicesupport/sshdeviceprocess.h> #include <ssh/sshconnection.h> +#include <utils/qtcassert.h> +#include <QApplication> #include <QRegExp> #include <QStringList> +#include <QThread> using namespace Qnx; using namespace Qnx::Internal; +namespace { +const char QnxVersionKey[] = "QnxVersion"; +} + class QnxPortsGatheringMethod : public ProjectExplorer::PortsGatheringMethod { // TODO: The command is probably needlessly complicated because the parsing method @@ -82,20 +90,22 @@ class QnxPortsGatheringMethod : public ProjectExplorer::PortsGatheringMethod QnxDeviceConfiguration::QnxDeviceConfiguration() : RemoteLinux::LinuxDevice() + , m_versionNumber(0) { } QnxDeviceConfiguration::QnxDeviceConfiguration(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id) : RemoteLinux::LinuxDevice(name, type, machineType, origin, id) + , m_versionNumber(0) { } QnxDeviceConfiguration::QnxDeviceConfiguration(const QnxDeviceConfiguration &other) : RemoteLinux::LinuxDevice(other) + , m_versionNumber(other.m_versionNumber) { } - QnxDeviceConfiguration::Ptr QnxDeviceConfiguration::create() { return Ptr(new QnxDeviceConfiguration); @@ -111,6 +121,58 @@ QString QnxDeviceConfiguration::displayType() const return tr("QNX"); } +int QnxDeviceConfiguration::qnxVersion() const +{ + if (m_versionNumber == 0) + updateVersionNumber(); + + return m_versionNumber; +} + +void QnxDeviceConfiguration::updateVersionNumber() const +{ + QEventLoop eventLoop; + ProjectExplorer::SshDeviceProcess versionNumberProcess(sharedFromThis()); + QObject::connect(&versionNumberProcess, SIGNAL(finished()), &eventLoop, SLOT(quit())); + QObject::connect(&versionNumberProcess, SIGNAL(error(QProcess::ProcessError)), &eventLoop, SLOT(quit())); + + QStringList arguments; + arguments << QLatin1String("-r"); + versionNumberProcess.start(QLatin1String("uname"), arguments); + + bool isGuiThread = QThread::currentThread() == QCoreApplication::instance()->thread(); + if (isGuiThread) + QApplication::setOverrideCursor(Qt::WaitCursor); + + eventLoop.exec(QEventLoop::ExcludeUserInputEvents); + + QByteArray output = versionNumberProcess.readAllStandardOutput(); + QString versionMessage = QString::fromLatin1(output); + QRegExp versionNumberRegExp = QRegExp(QLatin1String("(\\d+)\\.(\\d+)\\.(\\d+)")); + if (versionNumberRegExp.indexIn(versionMessage) > -1 && versionNumberRegExp.captureCount() == 3) { + int major = versionNumberRegExp.cap(1).toInt(); + int minor = versionNumberRegExp.cap(2).toInt(); + int patch = versionNumberRegExp.cap(3).toInt(); + m_versionNumber = (major << 16)|(minor<<8)|(patch); + } + + if (isGuiThread) + QApplication::restoreOverrideCursor(); +} + +void QnxDeviceConfiguration::fromMap(const QVariantMap &map) +{ + m_versionNumber = map.value(QLatin1String(QnxVersionKey), 0).toInt(); + RemoteLinux::LinuxDevice::fromMap(map); +} + +QVariantMap QnxDeviceConfiguration::toMap() const +{ + QVariantMap map(RemoteLinux::LinuxDevice::toMap()); + map.insert(QLatin1String(QnxVersionKey), m_versionNumber); + return map; +} + ProjectExplorer::IDevice::Ptr QnxDeviceConfiguration::clone() const { return Ptr(new QnxDeviceConfiguration(*this)); diff --git a/src/plugins/qnx/qnxdeviceconfiguration.h b/src/plugins/qnx/qnxdeviceconfiguration.h index ec67de55d9..5e9fb69070 100644 --- a/src/plugins/qnx/qnxdeviceconfiguration.h +++ b/src/plugins/qnx/qnxdeviceconfiguration.h @@ -58,6 +58,11 @@ public: QString displayType() const; + int qnxVersion() const; + + void fromMap(const QVariantMap &map); + QVariantMap toMap() const; + protected: QnxDeviceConfiguration(); QnxDeviceConfiguration(const QString &name, Core::Id type, MachineType machineType, @@ -67,6 +72,10 @@ protected: QString interruptProcessByNameCommandLine(const QString &filePath) const; QString killProcessByNameCommandLine(const QString &filePath) const; +private: + void updateVersionNumber() const; + + mutable int m_versionNumber; }; } // namespace Internal diff --git a/src/plugins/qnx/qnxdevicetester.cpp b/src/plugins/qnx/qnxdevicetester.cpp index 723e8cc350..a229ae2046 100644 --- a/src/plugins/qnx/qnxdevicetester.cpp +++ b/src/plugins/qnx/qnxdevicetester.cpp @@ -30,6 +30,7 @@ ****************************************************************************/ #include "qnxdevicetester.h" +#include "qnxdeviceconfiguration.h" #include <ssh/sshremoteprocessrunner.h> #include <utils/qtcassert.h> @@ -44,6 +45,10 @@ QnxDeviceTester::QnxDeviceTester(QObject *parent) , m_currentCommandIndex(-1) { m_genericTester = new RemoteLinux::GenericLinuxDeviceTester(this); + connect(m_genericTester, SIGNAL(progressMessage(QString)), SIGNAL(progressMessage(QString))); + connect(m_genericTester, SIGNAL(errorMessage(QString)), SIGNAL(errorMessage(QString))); + connect(m_genericTester, SIGNAL(finished(ProjectExplorer::DeviceTester::TestResult)), + SLOT(handleGenericTestFinished(ProjectExplorer::DeviceTester::TestResult))); m_processRunner = new QSsh::SshRemoteProcessRunner(this); connect(m_processRunner, SIGNAL(connectionError()), SLOT(handleConnectionError())); @@ -68,11 +73,6 @@ void QnxDeviceTester::testDevice(const ProjectExplorer::IDevice::ConstPtr &devic m_deviceConfiguration = deviceConfiguration; - connect(m_genericTester, SIGNAL(progressMessage(QString)), SIGNAL(progressMessage(QString))); - connect(m_genericTester, SIGNAL(errorMessage(QString)), SIGNAL(errorMessage(QString))); - connect(m_genericTester, SIGNAL(finished(ProjectExplorer::DeviceTester::TestResult)), - SLOT(handleGenericTestFinished(ProjectExplorer::DeviceTester::TestResult))); - m_state = GenericTest; m_genericTester->testDevice(deviceConfiguration); } @@ -107,6 +107,10 @@ void QnxDeviceTester::handleGenericTestFinished(TestResult result) } m_state = CommandsTest; + + QnxDeviceConfiguration::ConstPtr qnxDevice = m_deviceConfiguration.dynamicCast<const QnxDeviceConfiguration>(); + m_commandsToTest.append(versionSpecificCommandsToTest(qnxDevice->qnxVersion())); + testNextCommand(); } @@ -161,3 +165,12 @@ void QnxDeviceTester::setFinished() disconnect(m_processRunner, 0, this, 0); emit finished(m_result); } + +QStringList QnxDeviceTester::versionSpecificCommandsToTest(int versionNumber) const +{ + QStringList result; + if (versionNumber > 0x060500) + result << QLatin1String("slog2info"); + + return result; +} diff --git a/src/plugins/qnx/qnxdevicetester.h b/src/plugins/qnx/qnxdevicetester.h index 834f6a601e..d0a4a8a286 100644 --- a/src/plugins/qnx/qnxdevicetester.h +++ b/src/plugins/qnx/qnxdevicetester.h @@ -68,6 +68,8 @@ private: void testNextCommand(); void setFinished(); + QStringList versionSpecificCommandsToTest(int versionNumber) const; + RemoteLinux::GenericLinuxDeviceTester *m_genericTester; ProjectExplorer::IDevice::ConstPtr m_deviceConfiguration; ProjectExplorer::DeviceTester::TestResult m_result; diff --git a/src/plugins/qnx/qnxruncontrol.cpp b/src/plugins/qnx/qnxruncontrol.cpp index 0f717d83be..53a32ac8e8 100644 --- a/src/plugins/qnx/qnxruncontrol.cpp +++ b/src/plugins/qnx/qnxruncontrol.cpp @@ -58,6 +58,8 @@ QnxRunControl::QnxRunControl(ProjectExplorer::RunConfiguration *runConfig) m_slog2Info = new Slog2InfoRunner(applicationId, qnxDevice, this); connect(m_slog2Info, SIGNAL(output(QString,Utils::OutputFormat)), this, SLOT(appendMessage(QString,Utils::OutputFormat))); connect(this, SIGNAL(started()), m_slog2Info, SLOT(start())); + if (qnxDevice->qnxVersion() > 0x060500) + connect(m_slog2Info, SIGNAL(commandMissing()), this, SLOT(printMissingWarning())); } ProjectExplorer::RunControl::StopResult QnxRunControl::stop() @@ -65,3 +67,8 @@ ProjectExplorer::RunControl::StopResult QnxRunControl::stop() m_slog2Info->stop(); return RemoteLinuxRunControl::stop(); } + +void QnxRunControl::printMissingWarning() +{ + appendMessage(tr("Warning: \"slog2info\" is not found on the device, debug output not available!"), Utils::ErrorMessageFormat); +} diff --git a/src/plugins/qnx/qnxruncontrol.h b/src/plugins/qnx/qnxruncontrol.h index 20368e6089..c3e44777e5 100644 --- a/src/plugins/qnx/qnxruncontrol.h +++ b/src/plugins/qnx/qnxruncontrol.h @@ -47,6 +47,9 @@ public: RemoteLinux::RemoteLinuxRunControl::StopResult stop(); +private slots: + void printMissingWarning(); + private: Slog2InfoRunner *m_slog2Info; }; |