forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user