forked from qt-creator/qt-creator
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: I25121cf61afcf947c3873a6d2767877892ab4afc Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
This commit is contained in:
@@ -35,13 +35,18 @@
|
||||
#include "blackberrydeviceconnectionmanager.h"
|
||||
#include "blackberryrunconfiguration.h"
|
||||
#include "blackberrylogprocessrunner.h"
|
||||
#include "blackberrydeviceinformation.h"
|
||||
#include "blackberryversionnumber.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,18 +71,18 @@ 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)
|
||||
, m_target(runConfiguration->target())
|
||||
{
|
||||
QTC_ASSERT(runConfiguration, return);
|
||||
|
||||
Target *target = runConfiguration->target();
|
||||
BuildConfiguration *buildConfig = target->activeBuildConfiguration();
|
||||
BuildConfiguration *buildConfig = m_target->activeBuildConfiguration();
|
||||
m_environment = buildConfig->environment();
|
||||
m_deployCmd = m_environment.searchInPath(QLatin1String(Constants::QNX_BLACKBERRY_DEPLOY_CMD));
|
||||
|
||||
m_device = BlackBerryDeviceConfiguration::device(target->kit());
|
||||
m_device = BlackBerryDeviceConfiguration::device(m_target->kit());
|
||||
m_barPackage = runConfiguration->barPackage();
|
||||
|
||||
// The BlackBerry device always uses key authentication
|
||||
@@ -97,14 +102,14 @@ void BlackBerryApplicationRunner::start()
|
||||
{
|
||||
if (!BlackBerryDeviceConnectionManager::instance()->isConnected(m_device->id())) {
|
||||
connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceConnected()),
|
||||
this, SLOT(launchApplication()));
|
||||
this, SLOT(checkDeployMode()));
|
||||
connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceDisconnected(Core::Id)),
|
||||
this, SLOT(disconnectFromDeviceSignals(Core::Id)));
|
||||
connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(connectionOutput(Core::Id,QString)),
|
||||
this, SLOT(displayConnectionOutput(Core::Id,QString)));
|
||||
BlackBerryDeviceConnectionManager::instance()->connectDevice(m_device->id());
|
||||
} else {
|
||||
launchApplication();
|
||||
checkDeployMode();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,6 +136,55 @@ 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;
|
||||
}
|
||||
|
||||
QFileInfo fi(m_target->kit()->autoDetectionSource());
|
||||
BlackBerryVersionNumber apiVersion =
|
||||
BlackBerryVersionNumber::fromNdkEnvFileName(fi.baseName());
|
||||
if (apiVersion.isEmpty()) {
|
||||
emit output(tr("Cannot determine API level version."), Utils::StdErrFormat);
|
||||
launchApplication();
|
||||
return;
|
||||
}
|
||||
|
||||
const QString runtimeVersion = m_deviceInfo->scmBundle();
|
||||
if (apiVersion.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, apiVersion.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) {
|
||||
@@ -239,11 +293,6 @@ void BlackBerryApplicationRunner::setApplicationId(const QString &applicationId)
|
||||
|
||||
void BlackBerryApplicationRunner::launchApplication()
|
||||
{
|
||||
// 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;
|
||||
|
||||
QStringList args;
|
||||
args << QLatin1String("-launchApp");
|
||||
if (m_cppDebugMode)
|
||||
@@ -268,6 +317,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_debugMode)
|
||||
queryDeviceInformation(); // check API version vs Runtime version
|
||||
else
|
||||
launchApplication();
|
||||
}
|
||||
|
||||
void BlackBerryApplicationRunner::startRunningStateTimer()
|
||||
{
|
||||
if (m_running)
|
||||
|
@@ -45,12 +45,14 @@
|
||||
#include <QDateTime>
|
||||
|
||||
namespace QSsh { class SshRemoteProcessRunner; }
|
||||
namespace ProjectExplorer { class Target; }
|
||||
|
||||
namespace Qnx {
|
||||
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,13 @@ private:
|
||||
QProcess *m_launchProcess;
|
||||
QProcess *m_stopProcess;
|
||||
BlackBerryProcessParser m_launchStopProcessParser;
|
||||
BlackBerryDeviceInformation *m_deviceInfo;
|
||||
|
||||
BlackBerryLogProcessRunner *m_logProcessRunner;
|
||||
|
||||
QTimer *m_runningStateTimer;
|
||||
QProcess *m_runningStateProcess;
|
||||
ProjectExplorer::Target *m_target;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
Reference in New Issue
Block a user