diff --git a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp index 57ecf01e0ad..919238e3d03 100644 --- a/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp +++ b/src/plugins/remotelinux/remotelinuxapplicationrunner.cpp @@ -93,20 +93,8 @@ void RemoteLinuxApplicationRunner::start() return; } - m_connection = SshConnectionManager::instance().acquireConnection(m_devConfig->sshParameters()); - setState(Connecting); - m_exitStatus = -1; - m_freePorts = m_initialFreePorts; - connect(m_connection.data(), SIGNAL(connected()), this, - SLOT(handleConnected())); - connect(m_connection.data(), SIGNAL(error(Utils::SshError)), this, - SLOT(handleConnectionFailure())); - if (isConnectionUsable()) { - handleConnected(); - } else { - emit reportProgress(tr("Connecting to device...")); - m_connection->connectToHost(); - } + setState(SettingUpDevice); + doDeviceSetup(); } void RemoteLinuxApplicationRunner::stop() @@ -124,6 +112,7 @@ void RemoteLinuxApplicationRunner::stop() setState(Inactive); emit remoteProcessFinished(InvalidExitCode); break; + case SettingUpDevice: case PreRunCleaning: case AdditionalPreRunCleaning: case AdditionalInitializing: @@ -342,6 +331,11 @@ bool RemoteLinuxApplicationRunner::canRun(QString &whyNot) const return true; } +void RemoteLinuxApplicationRunner::doDeviceSetup() +{ + handleDeviceSetupDone(true); +} + void RemoteLinuxApplicationRunner::doAdditionalInitialCleanup() { handleInitialCleanupDone(true); @@ -357,6 +351,34 @@ void RemoteLinuxApplicationRunner::doAdditionalPostRunCleanup() handlePostRunCleanupDone(); } +void RemoteLinuxApplicationRunner::handleDeviceSetupDone(bool success) +{ + ASSERT_STATE(SettingUpDevice); + + if (m_state != SettingUpDevice) + return; + if (!success || m_stopRequested) { + setState(Inactive); + emit remoteProcessFinished(InvalidExitCode); + return; + } + + m_connection = SshConnectionManager::instance().acquireConnection(m_devConfig->sshParameters()); + setState(Connecting); + m_exitStatus = -1; + m_freePorts = m_initialFreePorts; + connect(m_connection.data(), SIGNAL(connected()), this, + SLOT(handleConnected())); + connect(m_connection.data(), SIGNAL(error(Utils::SshError)), this, + SLOT(handleConnectionFailure())); + if (isConnectionUsable()) { + handleConnected(); + } else { + emit reportProgress(tr("Connecting to device...")); + m_connection->connectToHost(); + } +} + void RemoteLinuxApplicationRunner::handleInitialCleanupDone(bool success) { ASSERT_STATE(AdditionalPreRunCleaning); diff --git a/src/plugins/remotelinux/remotelinuxapplicationrunner.h b/src/plugins/remotelinux/remotelinuxapplicationrunner.h index 124b4dc7e95..f87824d1222 100644 --- a/src/plugins/remotelinux/remotelinuxapplicationrunner.h +++ b/src/plugins/remotelinux/remotelinuxapplicationrunner.h @@ -85,6 +85,7 @@ protected: // Override to to additional checks. virtual bool canRun(QString &whyNot) const; + void handleDeviceSetupDone(bool success); void handleInitialCleanupDone(bool success); void handleInitializationsDone(bool success); void handlePostRunCleanupDone(); @@ -99,11 +100,15 @@ private slots: void handleUsedPortsAvailable(); private: - enum State { Inactive, Connecting, PreRunCleaning, AdditionalPreRunCleaning, GatheringPorts, - AdditionalInitializing, ReadyForExecution, ProcessStarting, ProcessStarted, PostRunCleaning, - AdditionalPostRunCleaning + enum State { Inactive, SettingUpDevice, Connecting, PreRunCleaning, AdditionalPreRunCleaning, + GatheringPorts, AdditionalInitializing, ReadyForExecution, ProcessStarting, ProcessStarted, + PostRunCleaning, AdditionalPostRunCleaning }; + // Override to do custom setup of the device *before* connecting. + // Call handleDeviceSetupDone() afterwards. + virtual void doDeviceSetup(); + // Override to do additional pre-run cleanup and call handleInitialCleanupDone(). virtual void doAdditionalInitialCleanup();