SSH: Make API of SshRemoteProcess more similar to the one of QProcess.

In the end, we want to derive it from QIODevice as well.

Change-Id: I30e7cb23ec8e5753c363d1f4457b650556860ac2
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
This commit is contained in:
Christian Kandeler
2011-11-14 17:23:51 +01:00
parent 75a7bf2919
commit 232724cc11
20 changed files with 135 additions and 137 deletions

View File

@@ -103,12 +103,11 @@ void SshRemoteProcess::init()
{
connect(d, SIGNAL(started()), this, SIGNAL(started()),
Qt::QueuedConnection);
connect(d, SIGNAL(outputAvailable(QByteArray)), this,
SIGNAL(outputAvailable(QByteArray)), Qt::QueuedConnection);
connect(d, SIGNAL(errorOutputAvailable(QByteArray)), this,
SIGNAL(errorOutputAvailable(QByteArray)), Qt::QueuedConnection);
connect(d, SIGNAL(closed(int)), this, SIGNAL(closed(int)),
connect(d, SIGNAL(readyReadStandardOutput()), this, SIGNAL(readyReadStandardOutput()),
Qt::QueuedConnection);
connect(d, SIGNAL(readyReadStandardError()), this,
SIGNAL(readyReadStandardError()), Qt::QueuedConnection);
connect(d, SIGNAL(closed(int)), this, SIGNAL(closed(int)), Qt::QueuedConnection);
}
void SshRemoteProcess::addToEnvironment(const QByteArray &var, const QByteArray &value)
@@ -168,6 +167,9 @@ int SshRemoteProcess::exitCode() const { return d->m_exitCode; }
QByteArray SshRemoteProcess::exitSignal() const { return d->m_signal; }
QByteArray SshRemoteProcess::readAllStandardOutput() { return d->readAllStandardOutput(); }
QByteArray SshRemoteProcess::readAllStandardError() { return d->readAllStandardError(); }
namespace Internal {
SshRemoteProcessPrivate::SshRemoteProcessPrivate(const QByteArray &command,
@@ -212,6 +214,20 @@ void SshRemoteProcessPrivate::setProcState(ProcessState newState)
}
}
QByteArray SshRemoteProcessPrivate::readAllStandardOutput()
{
const QByteArray data = m_stdout;
m_stdout.clear();
return data;
}
QByteArray SshRemoteProcessPrivate::readAllStandardError()
{
const QByteArray data = m_stderr;
m_stderr.clear();
return data;
}
void SshRemoteProcessPrivate::closeHook()
{
if (m_wasRunning) {
@@ -268,16 +284,19 @@ void SshRemoteProcessPrivate::handleChannelFailure()
void SshRemoteProcessPrivate::handleChannelDataInternal(const QByteArray &data)
{
emit outputAvailable(data);
m_stdout += data;
emit readyReadStandardOutput();
}
void SshRemoteProcessPrivate::handleChannelExtendedDataInternal(quint32 type,
const QByteArray &data)
{
if (type != SSH_EXTENDED_DATA_STDERR)
if (type != SSH_EXTENDED_DATA_STDERR) {
qWarning("Unknown extended data type %u", type);
else
emit errorOutputAvailable(data);
} else {
m_stderr += data;
emit readyReadStandardError();
}
}
void SshRemoteProcessPrivate::handleExitStatus(const SshChannelExitStatus &exitStatus)

View File

@@ -92,6 +92,9 @@ public:
int exitCode() const;
QByteArray exitSignal() const;
QByteArray readAllStandardOutput();
QByteArray readAllStandardError();
// Note: This is ignored by the OpenSSH server.
void sendSignal(const QByteArray &signal);
void kill() { sendSignal(KillSignal); }
@@ -100,8 +103,9 @@ public:
signals:
void started();
void outputAvailable(const QByteArray &output);
void errorOutputAvailable(const QByteArray &output);
void readyReadStandardOutput();
void readyReadStandardError();
/*
* Parameter is of type ExitStatus, but we use int because of

View File

@@ -60,10 +60,13 @@ public:
virtual void closeHook();
QByteArray readAllStandardOutput();
QByteArray readAllStandardError();
signals:
void started();
void outputAvailable(const QByteArray &output);
void errorOutputAvailable(const QByteArray &output);
void readyReadStandardOutput();
void readyReadStandardError();
void closed(int exitStatus);
private:
@@ -96,6 +99,9 @@ private:
bool m_useTerminal;
SshPseudoTerminal m_terminal;
QByteArray m_stdout;
QByteArray m_stderr;
SshRemoteProcess *m_proc;
};

View File

@@ -74,6 +74,8 @@ private slots:
void handleDisconnected();
void handleProcessStarted();
void handleProcessFinished(int exitStatus);
void handleStdout();
void handleStderr();
private:
enum State { Inactive, Connecting, Connected, ProcessRunning };
@@ -150,10 +152,8 @@ void SshRemoteProcessRunnerPrivate::handleConnected()
connect(m_process.data(), SIGNAL(started()), SLOT(handleProcessStarted()));
connect(m_process.data(), SIGNAL(closed(int)),
SLOT(handleProcessFinished(int)));
connect(m_process.data(), SIGNAL(outputAvailable(QByteArray)),
SIGNAL(processOutputAvailable(QByteArray)));
connect(m_process.data(), SIGNAL(errorOutputAvailable(QByteArray)),
SIGNAL(processErrorOutputAvailable(QByteArray)));
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();
@@ -198,6 +198,16 @@ void SshRemoteProcessRunnerPrivate::handleProcessFinished(int exitStatus)
emit processClosed(exitStatus);
}
void SshRemoteProcessRunnerPrivate::handleStdout()
{
emit processOutputAvailable(m_process->readAllStandardOutput());
}
void SshRemoteProcessRunnerPrivate::handleStderr()
{
emit processErrorOutputAvailable(m_process->readAllStandardError());
}
void SshRemoteProcessRunnerPrivate::setState(State state)
{
if (m_state != state) {