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_pConnect);
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_pConnect->
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()
virtual bool open(OpenMode mode) override
void sigError(const int nError, const QString &szError=QString())
Triggered when an error is generated.
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...