Rabbit Remote Control 0.0.36
Loading...
Searching...
No Matches
ConnectLayer.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include "ConnectLayer.h"
4#include <QLoggingCategory>
5
6static Q_LOGGING_CATEGORY(log, "FreeRDP.Connect.Layer")
7
9 : QObject{connect}
10 , m_pConnect(connect)
11{
12 Q_ASSERT(connect);
13 if(connect)
14 m_pParameter = connect->m_pParameter;
15}
16
17CConnectLayer::~CConnectLayer()
18{
19 qDebug(log) << Q_FUNC_INFO;
20}
21
22int CConnectLayer::Initialize(rdpContext* context)
23{
24 bool bRet = false;
25 // See: - https://github.com/FreeRDP/FreeRDP/issues/8665
26 // - https://github.com/KangLin/Documents/blob/master/net/FreeRDP/freerdp_transport.drawio
27 auto cb = freerdp_get_io_callbacks(context);
28 if(!cb) return -1;
29 rdpTransportIo io = *cb;
30 io.ConnectLayer = cb_transport_connect_layer;
31 bRet = freerdp_set_io_callbacks(context, &io);
32 if(!bRet) {
33 qCritical(log) << "Set freerdp io callback fail";
34 return -1;
35 }
36 bRet = freerdp_set_io_callback_context(context, this);
37 if(!bRet) {
38 qCritical(log) << "Set freerdp io callback context fail";
39 return -1;
40 }
41 return OnInit(context);
42}
43
44int CConnectLayer::Clean()
45{
46 int nRet = 0;
47 nRet = OnClean();
48 return nRet;
49}
50
51rdpTransportLayer* CConnectLayer::cb_transport_connect_layer(
52 rdpTransport* transport,
53 const char* hostname, int port,
54 DWORD timeout)
55{
56 rdpContext* context = transport_get_context(transport);
57 Q_ASSERT(context);
58 Q_UNUSED(hostname);
59 Q_UNUSED(port);
60 Q_UNUSED(timeout);
61 CConnectLayer* pThis = (CConnectLayer*)freerdp_get_io_callback_context(context);
62 if(!pThis) return nullptr;
63 return pThis->OnTransportConnectLayer(context);
64}
65
66rdpTransportLayer* CConnectLayer::OnTransportConnectLayer(rdpContext* context)
67{
68 //qDebug(log) << Q_FUNC_INFO;
69 rdpTransportLayer* layer = nullptr;
70 layer = transport_layer_new(freerdp_get_transport(context), sizeof(LayerUserData));
71 if (!layer)
72 return nullptr;
73 LayerUserData* userData = (LayerUserData*)layer->userContext;
74 userData->pThis = this;
75 layer->Read = cbLayerRead;
76 layer->Write = cbLayerWrite;
77 layer->Close = cbLayerClose;
78 layer->Wait = cbLayerWait;
79 layer->GetEvent = cbLayerGetEvent;
80 return layer;
81}
82
83int CConnectLayer::cbLayerRead(void *userContext, void *data, int bytes)
84{
85 //qDebug(log) << Q_FUNC_INFO;
86 if(!userContext) return -1;
87 if (!data || !bytes)
88 return 0;
89 CConnectLayer* pThis = ((LayerUserData*)userContext)->pThis;
90 return pThis->OnLayerRead(data, bytes);
91}
92
93int CConnectLayer::cbLayerWrite(void *userContext, const void *data, int bytes)
94{
95 if(!userContext) return -1;
96 if (!data || !bytes)
97 return 0;
98 CConnectLayer* pThis = ((LayerUserData*)userContext)->pThis;
99 return pThis->OnLayerWrite(data, bytes);
100}
101
102BOOL CConnectLayer::cbLayerClose(void *userContext)
103{
104 qDebug(log) << Q_FUNC_INFO;
105 if(!userContext) return FALSE;
106 CConnectLayer* pThis = ((LayerUserData*)userContext)->pThis;
107 return pThis->OnLayerClose();
108}
109
110BOOL CConnectLayer::OnLayerClose()
111{
112 int nRet = Clean();
113 if(nRet) return false;
114 return true;
115}
116
117BOOL CConnectLayer::cbLayerWait(void *userContext, BOOL waitWrite, DWORD timeout)
118{
119 //qDebug(log) << Q_FUNC_INFO;
120 CConnectLayer* pThis = ((LayerUserData*)userContext)->pThis;
121 return pThis->OnLayerWait(waitWrite, timeout);
122}
123
124HANDLE CConnectLayer::cbLayerGetEvent(void *userContext)
125{
126 //qDebug(log) << Q_FUNC_INFO;
127 CConnectLayer* pThis = ((LayerUserData*)userContext)->pThis;
128 return pThis->OnLayerGetEvent();
129}
The connect layer class.