SSH: SshRemoteProcessRunnerPrivate does not need to be a QObject.

Change-Id: Iac8120ecdbb9d79a40924f9bbbdfe55fdd7fbf14
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Christian Kandeler
2011-11-17 10:56:27 +01:00
parent 289a05a189
commit de03b1d7c9
2 changed files with 88 additions and 130 deletions

View File

@@ -46,149 +46,125 @@
namespace Utils {
namespace Internal {
namespace {
enum State { Inactive, Connecting, Connected, ProcessRunning };
} // anonymous namespace
class SshRemoteProcessRunnerPrivate : public QObject
class SshRemoteProcessRunnerPrivate
{
Q_OBJECT
public:
SshRemoteProcessRunnerPrivate(QObject *parent);
~SshRemoteProcessRunnerPrivate();
void runWithoutTerminal(const QByteArray &command, const SshConnectionParameters &sshParams);
void runInTerminal(const QByteArray &command, const SshPseudoTerminal &terminal,
const SshConnectionParameters &sshParams);
QByteArray command() const { return m_command; }
Utils::SshError lastConnectionError() const { return m_lastConnectionError; }
QString lastConnectionErrorString() const { return m_lastConnectionErrorString; }
SshRemoteProcessRunnerPrivate() : m_state(Inactive) {}
SshRemoteProcess::Ptr m_process;
signals:
void connectionError();
void processStarted();
void processOutputAvailable(const QByteArray &output);
void processErrorOutputAvailable(const QByteArray &output);
void processClosed(int exitStatus);
private slots:
void handleConnected();
void handleConnectionError(Utils::SshError error);
void handleDisconnected();
void handleProcessStarted();
void handleProcessFinished(int exitStatus);
void handleStdout();
void handleStderr();
private:
enum State { Inactive, Connecting, Connected, ProcessRunning };
void run(const QByteArray &command, const SshConnectionParameters &sshParams);
void setState(State state);
SshConnection::Ptr m_connection;
State m_state;
bool m_runInTerminal;
SshPseudoTerminal m_terminal;
QByteArray m_command;
Utils::SshError m_lastConnectionError;
QString m_lastConnectionErrorString;
State m_state;
};
} // namespace Internal
SshRemoteProcessRunnerPrivate::SshRemoteProcessRunnerPrivate(QObject *parent)
: QObject(parent), m_state(Inactive)
using namespace Internal;
SshRemoteProcessRunner::SshRemoteProcessRunner(QObject *parent)
: QObject(parent), d(new SshRemoteProcessRunnerPrivate)
{
}
SshRemoteProcessRunnerPrivate::~SshRemoteProcessRunnerPrivate()
SshRemoteProcessRunner::~SshRemoteProcessRunner()
{
disconnect();
setState(Inactive);
delete d;
}
void SshRemoteProcessRunnerPrivate::runWithoutTerminal(const QByteArray &command,
void SshRemoteProcessRunner::run(const QByteArray &command,
const SshConnectionParameters &sshParams)
{
m_runInTerminal = false;
run(command, sshParams);
d->m_runInTerminal = false;
runInternal(command, sshParams);
}
void SshRemoteProcessRunnerPrivate::runInTerminal(const QByteArray &command,
void SshRemoteProcessRunner::runInTerminal(const QByteArray &command,
const SshPseudoTerminal &terminal, const SshConnectionParameters &sshParams)
{
m_terminal = terminal;
m_runInTerminal = true;
run(command, sshParams);
d->m_terminal = terminal;
d->m_runInTerminal = true;
runInternal(command, sshParams);
}
void SshRemoteProcessRunnerPrivate::run(const QByteArray &command,
void SshRemoteProcessRunner::runInternal(const QByteArray &command,
const SshConnectionParameters &sshParams)
{
setState(Inactive);
setState(Connecting);
m_lastConnectionError = SshNoError;
m_lastConnectionErrorString.clear();
m_command = command;
m_connection = SshConnectionManager::instance().acquireConnection(sshParams);
connect(m_connection.data(), SIGNAL(error(Utils::SshError)),
d->m_lastConnectionError = SshNoError;
d->m_lastConnectionErrorString.clear();
d->m_command = command;
d->m_connection = SshConnectionManager::instance().acquireConnection(sshParams);
connect(d->m_connection.data(), SIGNAL(error(Utils::SshError)),
SLOT(handleConnectionError(Utils::SshError)));
connect(m_connection.data(), SIGNAL(disconnected()), SLOT(handleDisconnected()));
if (m_connection->state() == SshConnection::Connected) {
connect(d->m_connection.data(), SIGNAL(disconnected()), SLOT(handleDisconnected()));
if (d->m_connection->state() == SshConnection::Connected) {
handleConnected();
} else {
connect(m_connection.data(), SIGNAL(connected()),
SLOT(handleConnected()));
if (m_connection->state() == SshConnection::Unconnected)
m_connection->connectToHost();
connect(d->m_connection.data(), SIGNAL(connected()), SLOT(handleConnected()));
if (d->m_connection->state() == SshConnection::Unconnected)
d->m_connection->connectToHost();
}
}
void SshRemoteProcessRunnerPrivate::handleConnected()
void SshRemoteProcessRunner::handleConnected()
{
QTC_ASSERT(m_state == Connecting, return);
QTC_ASSERT(d->m_state == Connecting, return);
setState(Connected);
m_process = m_connection->createRemoteProcess(m_command);
connect(m_process.data(), SIGNAL(started()), SLOT(handleProcessStarted()));
connect(m_process.data(), SIGNAL(closed(int)),
SLOT(handleProcessFinished(int)));
connect(m_process.data(), SIGNAL(readyReadStandardOutput()), SLOT(handleStdout()));
connect(m_process.data(), SIGNAL(readyReadStandardError()), SLOT(handleStderr()));
if (m_runInTerminal)
m_process->requestTerminal(m_terminal);
m_process->start();
d->m_process = d->m_connection->createRemoteProcess(d->m_command);
connect(d->m_process.data(), SIGNAL(started()), SLOT(handleProcessStarted()));
connect(d->m_process.data(), SIGNAL(closed(int)), SLOT(handleProcessFinished(int)));
connect(d->m_process.data(), SIGNAL(readyReadStandardOutput()), SLOT(handleStdout()));
connect(d->m_process.data(), SIGNAL(readyReadStandardError()), SLOT(handleStderr()));
if (d->m_runInTerminal)
d->m_process->requestTerminal(d->m_terminal);
d->m_process->start();
}
void SshRemoteProcessRunnerPrivate::handleConnectionError(Utils::SshError error)
void SshRemoteProcessRunner::handleConnectionError(Utils::SshError error)
{
m_lastConnectionError = error;
m_lastConnectionErrorString = m_connection->errorString();
d->m_lastConnectionError = error;
d->m_lastConnectionErrorString = d->m_connection->errorString();
handleDisconnected();
emit connectionError();
}
void SshRemoteProcessRunnerPrivate::handleDisconnected()
void SshRemoteProcessRunner::handleDisconnected()
{
QTC_ASSERT(m_state == Connecting || m_state == Connected || m_state == ProcessRunning, return);
QTC_ASSERT(d->m_state == Connecting || d->m_state == Connected
|| d->m_state == ProcessRunning, return);
setState(Inactive);
}
void SshRemoteProcessRunnerPrivate::handleProcessStarted()
void SshRemoteProcessRunner::handleProcessStarted()
{
QTC_ASSERT(m_state == Connected, return);
setState(ProcessRunning);
QTC_ASSERT(d->m_state == Connected, return);
setState(ProcessRunning);
emit processStarted();
}
void SshRemoteProcessRunnerPrivate::handleProcessFinished(int exitStatus)
void SshRemoteProcessRunner::handleProcessFinished(int exitStatus)
{
switch (exitStatus) {
case SshRemoteProcess::FailedToStart:
QTC_ASSERT(m_state == Connected, return);
QTC_ASSERT(d->m_state == Connected, return);
break;
case SshRemoteProcess::KilledBySignal:
case SshRemoteProcess::ExitedNormally:
QTC_ASSERT(m_state == ProcessRunning, return);
QTC_ASSERT(d->m_state == ProcessRunning, return);
break;
default:
Q_ASSERT_X(false, Q_FUNC_INFO, "Impossible exit status.");
@@ -197,68 +173,38 @@ void SshRemoteProcessRunnerPrivate::handleProcessFinished(int exitStatus)
emit processClosed(exitStatus);
}
void SshRemoteProcessRunnerPrivate::handleStdout()
void SshRemoteProcessRunner::handleStdout()
{
emit processOutputAvailable(m_process->readAllStandardOutput());
emit processOutputAvailable(d->m_process->readAllStandardOutput());
}
void SshRemoteProcessRunnerPrivate::handleStderr()
void SshRemoteProcessRunner::handleStderr()
{
emit processErrorOutputAvailable(m_process->readAllStandardError());
emit processErrorOutputAvailable(d->m_process->readAllStandardError());
}
void SshRemoteProcessRunnerPrivate::setState(State state)
void SshRemoteProcessRunner::setState(int newState)
{
if (m_state != state) {
m_state = state;
if (m_state == Inactive) {
if (m_process)
disconnect(m_process.data(), 0, this, 0);
if (m_connection) {
disconnect(m_connection.data(), 0, this, 0);
SshConnectionManager::instance().releaseConnection(m_connection);
m_connection.clear();
}
if (d->m_state == newState)
return;
d->m_state = static_cast<State>(newState);
if (d->m_state == Inactive) {
if (d->m_process)
disconnect(d->m_process.data(), 0, this, 0);
if (d->m_connection) {
disconnect(d->m_connection.data(), 0, this, 0);
SshConnectionManager::instance().releaseConnection(d->m_connection);
d->m_connection.clear();
}
}
}
} // namespace Internal
SshRemoteProcessRunner::SshRemoteProcessRunner(QObject *parent)
: QObject(parent), d(new Internal::SshRemoteProcessRunnerPrivate(this))
{
connect(d, SIGNAL(connectionError()), SIGNAL(connectionError()));
connect(d, SIGNAL(processStarted()), SIGNAL(processStarted()));
connect(d, SIGNAL(processClosed(int)), SIGNAL(processClosed(int)));
connect(d, SIGNAL(processOutputAvailable(QByteArray)),
SIGNAL(processOutputAvailable(QByteArray)));
connect(d, SIGNAL(processErrorOutputAvailable(QByteArray)),
SIGNAL(processErrorOutputAvailable(QByteArray)));
}
void SshRemoteProcessRunner::run(const QByteArray &command, const SshConnectionParameters &params)
{
d->runWithoutTerminal(command, params);
}
void SshRemoteProcessRunner::runInTerminal(const QByteArray &command,
const SshPseudoTerminal &terminal, const SshConnectionParameters &params)
{
d->runInTerminal(command, terminal, params);
}
QByteArray SshRemoteProcessRunner::command() const { return d->command(); }
SshError SshRemoteProcessRunner::lastConnectionError() const { return d->lastConnectionError(); }
QByteArray SshRemoteProcessRunner::command() const { return d->m_command; }
SshError SshRemoteProcessRunner::lastConnectionError() const { return d->m_lastConnectionError; }
SshRemoteProcess::Ptr SshRemoteProcessRunner::process() const { return d->m_process; }
QString SshRemoteProcessRunner::lastConnectionErrorString() const
{
return d->lastConnectionErrorString();
QString SshRemoteProcessRunner::lastConnectionErrorString() const {
return d->m_lastConnectionErrorString;
}
} // namespace Utils
#include "sshremoteprocessrunner.moc"

View File

@@ -47,10 +47,11 @@ class QTCREATOR_UTILS_EXPORT SshRemoteProcessRunner : public QObject
public:
SshRemoteProcessRunner(QObject *parent = 0);
~SshRemoteProcessRunner();
void run(const QByteArray &command, const SshConnectionParameters &params);
void run(const QByteArray &command, const SshConnectionParameters &sshParams);
void runInTerminal(const QByteArray &command, const SshPseudoTerminal &terminal,
const SshConnectionParameters &params);
const SshConnectionParameters &sshParams);
QByteArray command() const;
Utils::SshError lastConnectionError() const;
@@ -58,6 +59,15 @@ public:
SshRemoteProcess::Ptr process() const;
private slots:
void handleConnected();
void handleConnectionError(Utils::SshError error);
void handleDisconnected();
void handleProcessStarted();
void handleProcessFinished(int exitStatus);
void handleStdout();
void handleStderr();
signals:
void connectionError();
void processStarted();
@@ -66,6 +76,8 @@ signals:
void processClosed(int exitStatus); // values are of type SshRemoteProcess::ExitStatus
private:
void runInternal(const QByteArray &command, const Utils::SshConnectionParameters &sshParams);
void setState(int newState);
Internal::SshRemoteProcessRunnerPrivate * const d;
};