diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 60de49f18499078dc73f348ef07d851af93db120..f19da2d91a73c8437df9e77b440e53771ffe150c 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -111,6 +111,11 @@ public: AbstractMaemoRunControl(RunConfiguration *runConfig); virtual ~AbstractMaemoRunControl() {} +#ifdef USE_SSH_LIB +protected slots: + void handleRemoteOutput(const QString &output); +#endif + protected: void startDeployment(bool forDebugging); void deploy(); @@ -180,8 +185,13 @@ private: virtual void handleDeploymentFinished(bool success); void startExecution(); +#ifdef USE_SSH_LIB + QScopedPointer<MaemoSshRunner> sshRunner; + QScopedPointer<MaemoSshRunner> sshStopper; +#else QProcess sshProcess; QProcess stopProcess; +#endif // USE_SSH_LIB bool stoppedByUser; }; @@ -1248,12 +1258,21 @@ void AbstractMaemoRunControl::readStandardOutput() } // #endif // USE_SSH_LIB +#ifdef USE_SSH_LIB +void AbstractMaemoRunControl::handleRemoteOutput(const QString &output) +{ + emit addToOutputWindowInline(this, output); +} + +#endif // USE_SSH_LIB + // #pragma mark -- MaemoRunControl MaemoRunControl::MaemoRunControl(RunConfiguration *runConfiguration) : AbstractMaemoRunControl(runConfiguration) { +#ifndef USE_SSH_LIB setProcessEnvironment(sshProcess); setProcessEnvironment(stopProcess); @@ -1265,12 +1284,15 @@ MaemoRunControl::MaemoRunControl(RunConfiguration *runConfiguration) SLOT(executionFinished())); connect(&sshProcess, SIGNAL(error(QProcess::ProcessError)), &dumper, SLOT(printToStream(QProcess::ProcessError))); +#endif // USE_SSH_LIB } MaemoRunControl::~MaemoRunControl() { stop(); +#ifndef USE_SSH_LIB stopProcess.waitForFinished(5000); +#endif } void MaemoRunControl::start() @@ -1289,6 +1311,19 @@ void MaemoRunControl::handleDeploymentFinished(bool success) void MaemoRunControl::startExecution() { +#ifdef USE_SSH_LIB + const QString remoteCall = QString::fromLocal8Bit("%1 %2 %3") + .arg(targetCmdLinePrefix()).arg(executableOnTarget()) + .arg(runConfig->arguments().join(" ")); + sshRunner.reset(new MaemoSshRunner(devConfig, remoteCall)); + connect(sshRunner.data(), SIGNAL(remoteOutput(QString)), + this, SLOT(handleRemoteOutput(QString))); + connect(sshRunner.data(), SIGNAL(finished()), + this, SLOT(executionFinished())); + emit addToOutputWindow(this, tr("Starting remote application.")); + emit started(); + sshRunner->start(); +#else const QString remoteCall = QString::fromLocal8Bit("%1 %2 %3") .arg(targetCmdLinePrefix()).arg(executableOnTarget()) .arg(runConfig->arguments().join(" ")); @@ -1306,14 +1341,21 @@ void MaemoRunControl::startExecution() emit error(this, tr("Could not start ssh!")); sshProcess.kill(); } +#endif // USE_SSH_LIB } void MaemoRunControl::executionFinished() { if (stoppedByUser) emit addToOutputWindow(this, tr("Remote process stopped by user.")); +#ifdef USE_SSH_LIB + else if (sshRunner->hasError()) + emit addToOutputWindow(this, tr("Remote process exited with error: ") + % sshRunner->error()); +#else else if (sshProcess.exitCode() != 0) emit addToOutputWindow(this, tr("Remote process exited with error.")); +#endif // USE_SSH_LIB else emit addToOutputWindow(this, tr("Remote process finished successfully.")); emit finished(); @@ -1328,6 +1370,12 @@ void MaemoRunControl::stop() if (isDeploying()) { stopDeployment(); } else { +#ifdef USE_SSH_LIB + const QString remoteCall = QString::fromLocal8Bit("pkill -x %1; " + "sleep 1; pkill -x -9 %1").arg(executableFileName()); + sshStopper.reset(new MaemoSshRunner(devConfig, remoteCall)); + sshStopper->start(); +#else stopProcess.kill(); QStringList cmdArgs; const QString remoteCall = QString::fromLocal8Bit("pkill -x %1; " @@ -1335,12 +1383,18 @@ void MaemoRunControl::stop() cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname << options() << devConfig.host << remoteCall; stopProcess.start(runConfig->sshCmd(), cmdArgs); +#endif // USE_SSH_LIB } } bool MaemoRunControl::isRunning() const { - return isDeploying() || sshProcess.state() != QProcess::NotRunning; + return isDeploying() +#ifdef USE_SSH_LIB + || (!sshRunner.isNull() && sshRunner->isRunning()); +#else + || sshProcess.state() != QProcess::NotRunning; +#endif // USE_SSH_LIB } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp index a9bfcaf865e1db04d31a055444902d10b0ac5b81..29b013bc8a0fb4ad0b4fda9460d7a445c4f7dd33 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshconnection.cpp @@ -45,13 +45,14 @@ #include "maemodeviceconfigurations.h" -#include "/opt/ne7ssh/include/ne7ssh.h" +#include "/opt/ne7sshModified/include/ne7ssh.h" #include <QtCore/QFileInfo> #include <QtCore/QStringBuilder> #include <QtCore/QStringList> #include <cstdio> +#include <cstring> namespace Qt4ProjectManager { namespace Internal { @@ -121,13 +122,17 @@ void MaemoInteractiveSshConnection::runCommand(const QString &command) bool done; do { - done = ssh.waitFor(channel(), m_prompt, 2); + done = ssh.waitFor(channel(), m_prompt, 1); const char * const error = lastError(); if (error) throw MaemoSshException(tr("SSH error: %1").arg(error)); - const char * const output = ssh.read(channel()); - if (output) + ssh.lock(); + const char * output = ssh.read(channel(), false); + if (output) { emit remoteOutput(QLatin1String(output)); + ssh.resetInput(channel(), false); + } + ssh.unlock(); } while (!done && !stopRequested()); }