Commit dee57f69 authored by El Mehdi Fekari's avatar El Mehdi Fekari Committed by Mehdi Fekari
Browse files

Qnx: Check runtime version when debugging



This cannot be done in the "check device" deploy step
since the deploy configuration does not know which
run mode will be used, which is mandatory since this check
is only required with debug mode.

Task-number: QTCREATORBUG-11513

Change-Id: I0356f792a8f08e5521a80675b60c64b337cabafb
Reviewed-by: default avatarTobias Hunger <tobias.hunger@digia.com>
parent 7a4c1ad1
......@@ -35,13 +35,17 @@
#include "blackberrydeviceconnectionmanager.h"
#include "blackberryrunconfiguration.h"
#include "blackberrylogprocessrunner.h"
#include "blackberrydeviceinformation.h"
#include "qnxconstants.h"
#include <coreplugin/icore.h>
#include <projectexplorer/kit.h>
#include <projectexplorer/target.h>
#include <qmakeprojectmanager/qmakebuildconfiguration.h>
#include <ssh/sshremoteprocessrunner.h>
#include <utils/qtcassert.h>
#include <QMessageBox>
#include <QTimer>
#include <QDir>
......@@ -66,6 +70,7 @@ BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool cppDebugMode, Blac
, m_stopping(false)
, m_launchProcess(0)
, m_stopProcess(0)
, m_deviceInfo(0)
, m_logProcessRunner(0)
, m_runningStateTimer(new QTimer(this))
, m_runningStateProcess(0)
......@@ -77,6 +82,9 @@ BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool cppDebugMode, Blac
m_environment = buildConfig->environment();
m_deployCmd = m_environment.searchInPath(QLatin1String(Constants::QNX_BLACKBERRY_DEPLOY_CMD));
QFileInfo fi(target->kit()->autoDetectionSource());
m_bbApiLevelVersion = BlackBerryVersionNumber::fromNdkEnvFileName(fi.baseName());
m_device = BlackBerryDeviceConfiguration::device(target->kit());
m_barPackage = runConfiguration->barPackage();
......@@ -131,6 +139,52 @@ void BlackBerryApplicationRunner::displayConnectionOutput(Core::Id deviceId, con
emit output(msg, Utils::StdErrFormat);
}
void BlackBerryApplicationRunner::checkDeviceRuntimeVersion(int status)
{
if (status != BlackBerryNdkProcess::Success) {
emit output(tr("Cannot determine device runtime version."), Utils::StdErrFormat);
return;
}
if (m_bbApiLevelVersion.isEmpty()) {
emit output(tr("Cannot determine API level version."), Utils::StdErrFormat);
launchApplication();
return;
}
const QString runtimeVersion = m_deviceInfo->scmBundle();
if (m_bbApiLevelVersion.toString() != runtimeVersion) {
const QMessageBox::StandardButton answer =
QMessageBox::question(Core::ICore::mainWindow(),
tr("Confirmation"),
tr("The device runtime version(%1) does not match "
"the API level version(%2).\n"
"This may cause unexpected behavior when debugging.\n"
"Do you want to continue anyway?")
.arg(runtimeVersion, m_bbApiLevelVersion.toString()),
QMessageBox::Yes | QMessageBox::No);
if (answer == QMessageBox::No) {
emit startFailed(tr("API level version does not match Runtime version."));
return;
}
}
launchApplication();
}
void BlackBerryApplicationRunner::queryDeviceInformation()
{
if (!m_deviceInfo) {
m_deviceInfo = new BlackBerryDeviceInformation(this);
connect(m_deviceInfo, SIGNAL(finished(int)),
this, SLOT(checkDeviceRuntimeVersion(int)));
}
m_deviceInfo->setDeviceTarget(m_sshParams.host, m_sshParams.password);
emit output(tr("Querying device runtime version..."), Utils::StdOutFormat);
}
void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
if (exitCode == 0 && exitStatus == QProcess::NormalExit && m_pid > -1) {
......@@ -268,6 +322,19 @@ void BlackBerryApplicationRunner::launchApplication()
m_running = true;
}
void BlackBerryApplicationRunner::checkDeployMode()
{
// If original device connection fails before launching, this method maybe triggered
// if any other device is connected
if (!BlackBerryDeviceConnectionManager::instance()->isConnected(m_device->id()))
return;
if (m_cppDebugMode)
queryDeviceInformation(); // check API version vs Runtime version
else
launchApplication();
}
void BlackBerryApplicationRunner::startRunningStateTimer()
{
if (m_running)
......
......@@ -34,6 +34,7 @@
#include "blackberrydeviceconfiguration.h"
#include "blackberryprocessparser.h"
#include "blackberryversionnumber.h"
#include <projectexplorer/runconfiguration.h>
......@@ -51,6 +52,7 @@ namespace Internal {
class BlackBerryRunConfiguration;
class BlackBerryLogProcessRunner;
class BlackBerryDeviceInformation;
class BlackBerryApplicationRunner : public QObject
{
......@@ -89,12 +91,15 @@ private slots:
void setApplicationId(const QString &applicationId);
void launchApplication();
void checkDeployMode();
void startLogProcessRunner();
void displayConnectionOutput(Core::Id deviceId, const QString &output);
void checkDeviceRuntimeVersion(int status);
private:
void reset();
void queryDeviceInformation();
bool m_cppDebugMode;
......@@ -113,11 +118,14 @@ private:
QProcess *m_launchProcess;
QProcess *m_stopProcess;
BlackBerryProcessParser m_launchStopProcessParser;
BlackBerryDeviceInformation *m_deviceInfo;
BlackBerryLogProcessRunner *m_logProcessRunner;
QTimer *m_runningStateTimer;
QProcess *m_runningStateProcess;
BlackBerryVersionNumber m_bbApiLevelVersion;
};
} // namespace Internal
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment