Qnx: Check device connection when debugging

Move the device connection verification code from BlackBerryRunControl class
into BlackBerryApplicaitonRunner class.
This will setup a device connection if the device is not connected
when starting debugger.

Task-number: QTCREATORBUG-10309

Change-Id: I57db0e60039bb05f8467e925e71cf710a0712791
Reviewed-by: Nicolas Arnaud-Cormos <nicolas@kdab.com>
Reviewed-by: Tobias Nätterlund <tobias.naetterlund@kdab.com>
This commit is contained in:
El Mehdi Fekari
2013-10-08 11:39:44 +02:00
committed by Mehdi Fekari
parent 0b8f3c3e9d
commit 01c8e98d0b
7 changed files with 75 additions and 62 deletions

View File

@@ -32,6 +32,7 @@
#include "blackberryapplicationrunner.h" #include "blackberryapplicationrunner.h"
#include "blackberrydeployconfiguration.h" #include "blackberrydeployconfiguration.h"
#include "blackberrydeviceconnectionmanager.h"
#include "blackberryrunconfiguration.h" #include "blackberryrunconfiguration.h"
#include "blackberrylogprocessrunner.h" #include "blackberrylogprocessrunner.h"
#include "qnxconstants.h" #include "qnxconstants.h"
@@ -94,28 +95,17 @@ BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool debugMode, BlackBe
void BlackBerryApplicationRunner::start() void BlackBerryApplicationRunner::start()
{ {
QStringList args; if (!BlackBerryDeviceConnectionManager::instance()->isConnected(m_device->id())) {
args << QLatin1String("-launchApp"); connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceConnected()),
if (m_debugMode) this, SLOT(launchApplication()));
args << QLatin1String("-debugNative"); connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceDisconnected(Core::Id)),
args << QLatin1String("-device") << m_sshParams.host; this, SLOT(disconnectFromDeviceSignals(Core::Id)));
if (!m_sshParams.password.isEmpty()) connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(connectionOutput(Core::Id,QString)),
args << QLatin1String("-password") << m_sshParams.password; this, SLOT(displayConnectionOutput(Core::Id,QString)));
args << QDir::toNativeSeparators(m_barPackage); BlackBerryDeviceConnectionManager::instance()->connectDevice(m_device->id());
} else {
if (!m_launchProcess) { launchApplication();
m_launchProcess = new QProcess(this);
connect(m_launchProcess, SIGNAL(readyReadStandardError()), this, SLOT(readStandardError()));
connect(m_launchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandardOutput()));
connect(m_launchProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
this, SLOT(startFinished(int,QProcess::ExitStatus)));
m_launchProcess->setEnvironment(m_environment.toStringList());
} }
m_launchProcess->start(m_deployCmd, args);
m_runningStateTimer->start();
m_running = true;
} }
void BlackBerryApplicationRunner::startLogProcessRunner() void BlackBerryApplicationRunner::startLogProcessRunner()
@@ -130,6 +120,17 @@ void BlackBerryApplicationRunner::startLogProcessRunner()
m_logProcessRunner->start(); m_logProcessRunner->start();
} }
void BlackBerryApplicationRunner::displayConnectionOutput(Core::Id deviceId, const QString &msg)
{
if (deviceId != m_device->id())
return;
if (msg.contains(QLatin1String("Info:")))
emit output(msg, Utils::StdOutFormat);
else if (msg.contains(QLatin1String("Error:")))
emit output(msg, Utils::StdErrFormat);
}
void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStatus exitStatus) void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStatus exitStatus)
{ {
if (exitCode == 0 && exitStatus == QProcess::NormalExit && m_pid > -1) { if (exitCode == 0 && exitStatus == QProcess::NormalExit && m_pid > -1) {
@@ -214,6 +215,18 @@ void BlackBerryApplicationRunner::readStandardError()
} }
} }
void BlackBerryApplicationRunner::disconnectFromDeviceSignals(Core::Id deviceId)
{
if (m_device->id() == deviceId) {
disconnect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceConnected()),
this, SLOT(launchApplication()));
disconnect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceDisconnected(Core::Id)),
this, SLOT(disconnectFromDeviceSignals(Core::Id)));
disconnect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(connectionOutput(Core::Id,QString)),
this, SLOT(displayConnectionOutput(Core::Id,QString)));
}
}
void BlackBerryApplicationRunner::setPid(qint64 pid) void BlackBerryApplicationRunner::setPid(qint64 pid)
{ {
m_pid = pid; m_pid = pid;
@@ -224,6 +237,37 @@ void BlackBerryApplicationRunner::setApplicationId(const QString &applicationId)
m_appId = applicationId; m_appId = 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_debugMode)
args << QLatin1String("-debugNative");
args << QLatin1String("-device") << m_sshParams.host;
if (!m_sshParams.password.isEmpty())
args << QLatin1String("-password") << m_sshParams.password;
args << QDir::toNativeSeparators(m_barPackage);
if (!m_launchProcess) {
m_launchProcess = new QProcess(this);
connect(m_launchProcess, SIGNAL(readyReadStandardError()), this, SLOT(readStandardError()));
connect(m_launchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandardOutput()));
connect(m_launchProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
this, SLOT(startFinished(int,QProcess::ExitStatus)));
m_launchProcess->setEnvironment(m_environment.toStringList());
}
m_launchProcess->start(m_deployCmd, args);
m_runningStateTimer->start();
m_running = true;
}
void BlackBerryApplicationRunner::startRunningStateTimer() void BlackBerryApplicationRunner::startRunningStateTimer()
{ {
if (m_running) if (m_running)

View File

@@ -82,6 +82,7 @@ private slots:
void readStandardOutput(); void readStandardOutput();
void readStandardError(); void readStandardError();
void disconnectFromDeviceSignals(Core::Id deviceId);
void startRunningStateTimer(); void startRunningStateTimer();
void determineRunningState(); void determineRunningState();
void readRunningStateStandardOutput(); void readRunningStateStandardOutput();
@@ -89,8 +90,11 @@ private slots:
void setPid(qint64 pid); void setPid(qint64 pid);
void setApplicationId(const QString &applicationId); void setApplicationId(const QString &applicationId);
void launchApplication();
void startLogProcessRunner(); void startLogProcessRunner();
void displayConnectionOutput(Core::Id deviceId, const QString &output);
private: private:
void reset(); void reset();

View File

@@ -51,8 +51,8 @@ BlackBerryDebugSupport::BlackBerryDebugSupport(BlackBerryRunConfiguration *runCo
this, SLOT(handleDebuggerStateChanged(Debugger::DebuggerState))); this, SLOT(handleDebuggerStateChanged(Debugger::DebuggerState)));
connect(m_runner, SIGNAL(started()), this, SLOT(handleStarted())); connect(m_runner, SIGNAL(started()), this, SLOT(handleStarted()));
connect(m_runner, SIGNAL(started()), m_runner, SLOT(checkSlog2Info()));
connect(m_runner, SIGNAL(startFailed(QString)), this, SLOT(handleStartFailed(QString))); connect(m_runner, SIGNAL(startFailed(QString)), this, SLOT(handleStartFailed(QString)));
connect(m_runner, SIGNAL(started()), m_runner, SLOT(checkSlog2Info()));
connect(m_runner, SIGNAL(output(QString,Utils::OutputFormat)), connect(m_runner, SIGNAL(output(QString,Utils::OutputFormat)),
this, SLOT(handleApplicationOutput(QString,Utils::OutputFormat))); this, SLOT(handleApplicationOutput(QString,Utils::OutputFormat)));

View File

@@ -278,9 +278,11 @@ void BlackBerryDeviceConnectionManager::handleDeviceDisconnected()
QTC_ASSERT(connection, return); QTC_ASSERT(connection, return);
QList<Core::Id> disconnectedDevices = m_connections.values(connection); QList<Core::Id> disconnectedDevices = m_connections.values(connection);
foreach (Core::Id id, disconnectedDevices) foreach (Core::Id id, disconnectedDevices) {
ProjectExplorer::DeviceManager::instance()->setDeviceState(id, ProjectExplorer::DeviceManager::instance()->setDeviceState(id,
ProjectExplorer::IDevice::DeviceDisconnected); ProjectExplorer::IDevice::DeviceDisconnected);
emit deviceDisconnected(id);
}
} }
void BlackBerryDeviceConnectionManager::handleDeviceAboutToConnect() void BlackBerryDeviceConnectionManager::handleDeviceAboutToConnect()

View File

@@ -69,6 +69,7 @@ signals:
void connectionOutput(Core::Id deviceId, const QString &output); void connectionOutput(Core::Id deviceId, const QString &output);
void deviceAboutToConnect(Core::Id deviceId); void deviceAboutToConnect(Core::Id deviceId);
void deviceConnected(); void deviceConnected();
void deviceDisconnected(Core::Id deviceId);
public slots: public slots:
void connectDevice(Core::Id deviceId); void connectDevice(Core::Id deviceId);

View File

@@ -34,8 +34,6 @@
#include "blackberryrunconfiguration.h" #include "blackberryrunconfiguration.h"
#include "blackberrydeviceconnectionmanager.h" #include "blackberrydeviceconnectionmanager.h"
#include <projectexplorer/target.h>
#include <QIcon> #include <QIcon>
#include <QTimer> #include <QTimer>
@@ -45,7 +43,6 @@ using namespace Qnx::Internal;
BlackBerryRunControl::BlackBerryRunControl(BlackBerryRunConfiguration *runConfiguration) BlackBerryRunControl::BlackBerryRunControl(BlackBerryRunConfiguration *runConfiguration)
: ProjectExplorer::RunControl(runConfiguration, ProjectExplorer::NormalRunMode) : ProjectExplorer::RunControl(runConfiguration, ProjectExplorer::NormalRunMode)
{ {
m_device = BlackBerryDeviceConfiguration::device(runConfiguration->target()->kit());
m_runner = new BlackBerryApplicationRunner(false, runConfiguration, this); m_runner = new BlackBerryApplicationRunner(false, runConfiguration, this);
connect(m_runner, SIGNAL(started()), this, SIGNAL(started())); connect(m_runner, SIGNAL(started()), this, SIGNAL(started()));
@@ -57,7 +54,7 @@ BlackBerryRunControl::BlackBerryRunControl(BlackBerryRunConfiguration *runConfig
void BlackBerryRunControl::start() void BlackBerryRunControl::start()
{ {
checkDeviceConnection(); m_runner->start();
} }
ProjectExplorer::RunControl::StopResult BlackBerryRunControl::stop() ProjectExplorer::RunControl::StopResult BlackBerryRunControl::stop()
@@ -79,32 +76,3 @@ void BlackBerryRunControl::handleStartFailed(const QString &message)
{ {
appendMessage(message, Utils::StdErrFormat); appendMessage(message, Utils::StdErrFormat);
} }
void BlackBerryRunControl::handleDeviceConnected()
{
m_runner->start();
}
void BlackBerryRunControl::displayConnectionOutput(Core::Id deviceId, const QString &output)
{
if (deviceId != m_device->id())
return;
if (output.contains(QLatin1String("Info:")))
appendMessage(output, Utils::StdOutFormat);
else if (output.contains(QLatin1String("Error:")))
appendMessage(output, Utils::StdErrFormat);
}
void BlackBerryRunControl::checkDeviceConnection()
{
if (!BlackBerryDeviceConnectionManager::instance()->isConnected(m_device->id())) {
connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(deviceConnected()),
this, SLOT(handleDeviceConnected()));
connect(BlackBerryDeviceConnectionManager::instance(), SIGNAL(connectionOutput(Core::Id,QString)),
this, SLOT(displayConnectionOutput(Core::Id,QString)));
BlackBerryDeviceConnectionManager::instance()->connectDevice(m_device->id());
} else {
m_runner->start();
}
}

View File

@@ -32,8 +32,6 @@
#ifndef QNX_INTERNAL_BLACKBERRYRUNCONTROL_H #ifndef QNX_INTERNAL_BLACKBERRYRUNCONTROL_H
#define QNX_INTERNAL_BLACKBERRYRUNCONTROL_H #define QNX_INTERNAL_BLACKBERRYRUNCONTROL_H
#include "blackberrydeviceconfiguration.h"
#include <projectexplorer/runconfiguration.h> #include <projectexplorer/runconfiguration.h>
namespace QmakeProjectManager { namespace QmakeProjectManager {
@@ -60,13 +58,9 @@ public:
private slots: private slots:
void handleStartFailed(const QString &message); void handleStartFailed(const QString &message);
void handleDeviceConnected();
void displayConnectionOutput(Core::Id deviceId, const QString &output);
void checkDeviceConnection();
private: private:
BlackBerryApplicationRunner *m_runner; BlackBerryApplicationRunner *m_runner;
BlackBerryDeviceConfiguration::ConstPtr m_device;
}; };
} // namespace Internal } // namespace Internal