3#include "ChannelSSHTerminal.h" 
    4#include <QLoggingCategory> 
    6static Q_LOGGING_CATEGORY(log, 
"Plugin.SSH.Channel")
 
   11    qDebug(log) << Q_FUNC_INFO;
 
   14CChannelSSHTerminal::~CChannelSSHTerminal()
 
   16    qDebug(log) << Q_FUNC_INFO;
 
   19qint64 CChannelSSHTerminal::readData(
char *data, qint64 maxlen)
 
   22    if(!m_Channel || !ssh_channel_is_open(m_Channel))
 
   24    nRet = ssh_channel_read(m_Channel, data, maxlen, 0);
 
   25    m_nBytesAvailable -= nRet;
 
   30qint64 CChannelSSHTerminal::writeData(
const char *data, qint64 maxlen)
 
   33    if(!m_Channel || !ssh_channel_is_open(m_Channel))
 
   36        nRet = ssh_channel_write(m_Channel, data, maxlen);
 
   41int CChannelSSHTerminal::OnOpen(ssh_session session)
 
   46    m_Channel = ssh_channel_new(session);
 
   47    if (m_Channel == NULL) {
 
   48        szErr = QString(
"Don't create channel: ") + ssh_get_error(session);
 
   49        qCritical(log) << szErr;
 
   50        setErrorString(szErr);
 
   53    nRet = ssh_channel_open_session(m_Channel);
 
   55        szErr = QString(
"Error opening channel: ") + ssh_get_error(session);
 
   56        qCritical(log) << szErr;
 
   57        setErrorString(szErr);
 
   60    nRet = ssh_channel_request_pty(m_Channel);
 
   62        szErr = QString(
"Error request pty: ") + ssh_get_error(session);
 
   63        qCritical(log) << szErr;
 
   64        setErrorString(szErr);
 
   67    nRet = ssh_channel_change_pty_size(m_Channel, m_nColumn, m_nRow);
 
   69        szErr = QString(
"Error change pty size: ") + ssh_get_error(session);
 
   70        qCritical(log) << szErr;
 
   71        setErrorString(szErr);
 
   74    qDebug(log) << 
"row:" << m_nRow << 
"; column:" << m_nColumn;
 
   75    nRet = ssh_channel_request_shell(m_Channel);
 
   77        szErr = QString(
"Requesting shell: ") + ssh_get_error(session);
 
   78        qCritical(log) << szErr;
 
   79        setErrorString(szErr);
 
   86void CChannelSSHTerminal::OnClose()
 
   89        if(ssh_channel_is_open(m_Channel)) {
 
   90            ssh_channel_close(m_Channel);
 
   92        ssh_channel_free(m_Channel);
 
   97void CChannelSSHTerminal::SetSize(
int row, 
int column)
 
  103int CChannelSSHTerminal::OnProcess(
int tm)
 
  107    m_nBytesAvailable = 0;
 
  108    if(!m_Channel || !ssh_channel_is_open(m_Channel)
 
  109        || ssh_channel_is_eof(m_Channel)) {
 
  110        QString szErr = 
"The channel is not open";
 
  111        qCritical(log) << szErr;
 
  112        setErrorString(szErr);
 
  116    struct timeval timeout = {0, tm};
 
  117    ssh_channel channels[2], channel_out[2];
 
  118    channels[0] = m_Channel;
 
  119    channels[1] = 
nullptr;
 
  123    socket_t fd = SSH_INVALID_SOCKET;
 
  125        fd = m_pEvent->GetFd();
 
  126    if(SSH_INVALID_SOCKET != fd)
 
  130    nRet = ssh_select(channels, channel_out, fd + 1, &set, &timeout);
 
  137        szErr = 
"ssh_channel_select failed: " + QString::number(nRet);
 
  138        szErr += ssh_get_error(m_Session);
 
  139        qCritical(log) << szErr;
 
  140        setErrorString(szErr);
 
  144    if(SSH_INVALID_SOCKET != fd && FD_ISSET(fd, &set)) {
 
  147            nRet = m_pEvent->Reset();
 
  152    if(!channel_out[0]) {
 
  157    if(ssh_channel_is_eof(m_Channel)) {
 
  158        qWarning(log) << 
"Channel is eof";
 
  159        setErrorString(tr(
"The channel is eof"));
 
  165    nRet = ssh_channel_poll(m_Channel, 0);
 
  167    if(SSH_ERROR == nRet)
 
  170        szErr = 
"ssh_channel_poll failed. nRet:";
 
  171        szErr += QString::number(nRet);
 
  172        szErr += ssh_get_error(m_Session);
 
  173        setErrorString(szErr);
 
  174        qCritical(log) << szErr;
 
  176    } 
else if(SSH_EOF == nRet) {
 
  179    } 
else if(0 > nRet) {
 
  181        szErr = 
"ssh_channel_poll failed. nRet:";
 
  182        szErr += QString::number(nRet);
 
  183        szErr += ssh_get_error(m_Session);
 
  184        setErrorString(szErr);
 
  185        qCritical(log) << szErr;
 
  188    } 
else if(0 == nRet) {
 
  193    m_nBytesAvailable = nRet;
 
  199qint64 CChannelSSHTerminal::bytesAvailable()
 const 
  201    return m_nBytesAvailable;