3#include "winpr/winsock.h" 
    4#include "ConnectLayerSSHTunnel.h" 
    5#include <QLoggingCategory> 
    7static Q_LOGGING_CATEGORY(log, 
"FreeRDP.Connect.Layer.SSH")
 
   11    , m_pChannelSSH(
nullptr)
 
   12    , m_hSshSocket(
nullptr)
 
   15ConnectLayerSSHTunnel::~ConnectLayerSSHTunnel()
 
   17    qDebug(log) << Q_FUNC_INFO;
 
   20int ConnectLayerSSHTunnel::OnInit(rdpContext *context)
 
   25        &m_pParameter->m_Proxy.m_SSH, &m_pParameter->m_Net, m_pOperate);
 
   28    bool bRet = m_pChannelSSH->
open(QIODevice::ReadWrite);
 
   31    if(SSH_INVALID_SOCKET == m_pChannelSSH->GetSocket()) {
 
   32        qCritical(log) << 
"The socket is invalid";
 
   35    m_hSshSocket = WSACreateEvent();
 
   37        qCritical(log) << 
"CreateEvent ssh socket event failed";
 
   40    nRet = WSAEventSelect(m_pChannelSSH->GetSocket(), m_hSshSocket, FD_READ | FD_CLOSE);
 
   43    if(m_pParameter->m_Net.GetHost().isEmpty())
 
   46        szErr = tr(
"The server is empty, please input it");
 
   47        qCritical(log) << szErr;
 
   49        emit m_pOperate->
sigError(-1, szErr.toStdString().c_str());
 
   53    auto &net = m_pParameter->m_Net;
 
   54    auto settings = context->settings;
 
   55    freerdp_settings_set_string(
 
   56        settings, FreeRDP_ServerHostname,
 
   57        net.GetHost().toStdString().c_str());
 
   58    freerdp_settings_set_uint32(
 
   59        settings, FreeRDP_ServerPort,
 
   62    nRet = freerdp_client_start(context);
 
   65        qCritical(log) << 
"freerdp_client_start fail";
 
   71int ConnectLayerSSHTunnel::OnClean()
 
   77        m_pChannelSSH->close();
 
   78        m_pChannelSSH->deleteLater();
 
   79        m_pChannelSSH = 
nullptr;
 
   83        WSACloseEvent(m_hSshSocket);
 
   84        m_hSshSocket = 
nullptr;
 
   90int ConnectLayerSSHTunnel::OnLayerRead(
void *data, 
int bytes)
 
   94    if(!m_pChannelSSH || !m_pChannelSSH->isOpen()) {
 
   95        qCritical(log) << Q_FUNC_INFO << 
"The channel is close";
 
  100        WSAResetEvent(m_hSshSocket);
 
  102    nRet = m_pChannelSSH->read((
char*)data, bytes);
 
  107int ConnectLayerSSHTunnel::OnLayerWrite(
const void *data, 
int bytes)
 
  111    if(!m_pChannelSSH || !m_pChannelSSH->isOpen()) {
 
  112        qCritical(log) << Q_FUNC_INFO << 
"The channel is close";
 
  115    nRet = m_pChannelSSH->write((
const char*)data, bytes);
 
  119BOOL ConnectLayerSSHTunnel::OnLayerWait(BOOL waitWrite, DWORD timeout)
 
  122    Q_ASSERT(!waitWrite);
 
  123    if(!m_pChannelSSH || !m_pChannelSSH->isOpen()
 
  124        || m_pChannelSSH->GetSocket() == SSH_INVALID_SOCKET) {
 
  125        qCritical(log) << Q_FUNC_INFO << 
"The channel is close";
 
  129    int nRet = m_pChannelSSH->DoWait(waitWrite, timeout);
 
  130    if(nRet) 
return false;
 
  134HANDLE ConnectLayerSSHTunnel::OnLayerGetEvent()
 
void sigShowMessageBox(const QString &szTitle, const QString &szMessage, const QMessageBox::Icon &icon=QMessageBox::Information)
Trigger the display of a message dialog (QMessageBox) in the main thread from a background thread wit...
 
void sigError(const int nError, const QString &szError=QString())
Triggered when an error is generated.
 
virtual bool open(OpenMode mode) override