diff options
Diffstat (limited to 'src/libs/utils/ssh')
-rw-r--r-- | src/libs/utils/ssh/sshremoteprocess.cpp | 47 | ||||
-rw-r--r-- | src/libs/utils/ssh/sshremoteprocess.h | 4 | ||||
-rw-r--r-- | src/libs/utils/ssh/sshremoteprocess_p.h | 6 |
3 files changed, 47 insertions, 10 deletions
diff --git a/src/libs/utils/ssh/sshremoteprocess.cpp b/src/libs/utils/ssh/sshremoteprocess.cpp index 52068ba869..875325a158 100644 --- a/src/libs/utils/ssh/sshremoteprocess.cpp +++ b/src/libs/utils/ssh/sshremoteprocess.cpp @@ -96,28 +96,35 @@ SshRemoteProcess::~SshRemoteProcess() bool SshRemoteProcess::atEnd() const { - return QIODevice::atEnd() && d->m_stdout.isEmpty(); + return QIODevice::atEnd() && d->data().isEmpty(); } qint64 SshRemoteProcess::bytesAvailable() const { - return QIODevice::bytesAvailable() + d->m_stdout.count(); + return QIODevice::bytesAvailable() + d->data().count(); } bool SshRemoteProcess::canReadLine() const { - return QIODevice::canReadLine() || d->m_stdout.contains('\n'); // TODO: Not cross-platform? + return QIODevice::canReadLine() || d->data().contains('\n'); } QByteArray SshRemoteProcess::readAllStandardOutput() { - return readAll(); + return readAllFromChannel(QProcess::StandardOutput); } QByteArray SshRemoteProcess::readAllStandardError() { - const QByteArray data = d->m_stderr; - d->m_stderr.clear(); + return readAllFromChannel(QProcess::StandardError); +} + +QByteArray SshRemoteProcess::readAllFromChannel(QProcess::ProcessChannel channel) +{ + const QProcess::ProcessChannel currentReadChannel = readChannel(); + setReadChannel(channel); + const QByteArray &data = readAll(); + setReadChannel(currentReadChannel); return data; } @@ -129,9 +136,9 @@ void SshRemoteProcess::close() qint64 SshRemoteProcess::readData(char *data, qint64 maxlen) { - const qint64 bytesRead = qMin(qint64(d->m_stdout.count()), maxlen); - memcpy(data, d->m_stdout.constData(), bytesRead); - d->m_stdout.remove(0, bytesRead); + const qint64 bytesRead = qMin(qint64(d->data().count()), maxlen); + memcpy(data, d->data().constData(), bytesRead); + d->data().remove(0, bytesRead); return bytesRead; } @@ -144,13 +151,23 @@ qint64 SshRemoteProcess::writeData(const char *data, qint64 len) return 0; } +QProcess::ProcessChannel SshRemoteProcess::readChannel() const +{ + return d->m_readChannel; +} + +void SshRemoteProcess::setReadChannel(QProcess::ProcessChannel channel) +{ + d->m_readChannel = channel; +} + void SshRemoteProcess::init() { connect(d, SIGNAL(started()), this, SIGNAL(started()), Qt::QueuedConnection); connect(d, SIGNAL(readyReadStandardOutput()), this, SIGNAL(readyReadStandardOutput()), Qt::QueuedConnection); - connect(d, SIGNAL(readyReadStandardOutput()), this, SIGNAL(readyRead()), Qt::QueuedConnection); + connect(d, SIGNAL(readyRead()), this, SIGNAL(readyRead()), Qt::QueuedConnection); connect(d, SIGNAL(readyReadStandardError()), this, SIGNAL(readyReadStandardError()), Qt::QueuedConnection); connect(d, SIGNAL(closed(int)), this, SIGNAL(closed(int)), Qt::QueuedConnection); @@ -228,6 +245,7 @@ void SshRemoteProcessPrivate::init() m_procState = NotYetStarted; m_wasRunning = false; m_exitCode = 0; + m_readChannel = QProcess::StandardOutput; } void SshRemoteProcessPrivate::setProcState(ProcessState newState) @@ -244,6 +262,11 @@ void SshRemoteProcessPrivate::setProcState(ProcessState newState) } } +QByteArray &SshRemoteProcessPrivate::data() +{ + return m_readChannel == QProcess::StandardOutput ? m_stdout : m_stderr; +} + void SshRemoteProcessPrivate::closeHook() { if (m_wasRunning) { @@ -303,6 +326,8 @@ void SshRemoteProcessPrivate::handleChannelDataInternal(const QByteArray &data) { m_stdout += data; emit readyReadStandardOutput(); + if (m_readChannel == QProcess::StandardOutput) + emit readyRead(); } void SshRemoteProcessPrivate::handleChannelExtendedDataInternal(quint32 type, @@ -313,6 +338,8 @@ void SshRemoteProcessPrivate::handleChannelExtendedDataInternal(quint32 type, } else { m_stderr += data; emit readyReadStandardError(); + if (m_readChannel == QProcess::StandardError) + emit readyRead(); } } diff --git a/src/libs/utils/ssh/sshremoteprocess.h b/src/libs/utils/ssh/sshremoteprocess.h index fcd3f0edd5..d696228b01 100644 --- a/src/libs/utils/ssh/sshremoteprocess.h +++ b/src/libs/utils/ssh/sshremoteprocess.h @@ -85,6 +85,9 @@ public: void close(); bool isSequential() const { return true; } + QProcess::ProcessChannel readChannel() const; + void setReadChannel(QProcess::ProcessChannel channel); + /* * Note that this is of limited value in practice, because servers are * usually configured to ignore such requests for security reasons. @@ -127,6 +130,7 @@ private: qint64 writeData(const char *data, qint64 len); void init(); + QByteArray readAllFromChannel(QProcess::ProcessChannel channel); Internal::SshRemoteProcessPrivate *d; }; diff --git a/src/libs/utils/ssh/sshremoteprocess_p.h b/src/libs/utils/ssh/sshremoteprocess_p.h index 32564ef9cb..300050d5eb 100644 --- a/src/libs/utils/ssh/sshremoteprocess_p.h +++ b/src/libs/utils/ssh/sshremoteprocess_p.h @@ -39,6 +39,7 @@ #include <QtCore/QList> #include <QtCore/QPair> +#include <QtCore/QProcess> namespace Utils { class SshRemoteProcess; @@ -60,8 +61,11 @@ public: virtual void closeHook(); + QByteArray &data(); + signals: void started(); + void readyRead(); void readyReadStandardOutput(); void readyReadStandardError(); void closed(int exitStatus); @@ -83,6 +87,8 @@ private: void init(); void setProcState(ProcessState newState); + QProcess::ProcessChannel m_readChannel; + ProcessState m_procState; bool m_wasRunning; QByteArray m_signal; |