[core,transport] event handle for transportIO

With the latest client changes the internal event loop requires a handle
to wait on. Add a new function to (re)set the newly added transport event handle.
This commit is contained in:
akallabeth 2022-11-15 15:04:13 +01:00 committed by akallabeth
parent 4ccb38aa13
commit d83f70bc32
7 changed files with 48 additions and 7 deletions

View File

@ -55,6 +55,8 @@ extern "C"
};
typedef struct rdp_transport_io rdpTransportIo;
FREERDP_API BOOL freerdp_io_callback_set_event(rdpContext* context, BOOL reset);
FREERDP_API const rdpTransportIo* freerdp_get_io_callbacks(rdpContext* context);
FREERDP_API BOOL freerdp_set_io_callbacks(rdpContext* context,
const rdpTransportIo* io_callbacks);

View File

@ -393,8 +393,8 @@ BOOL rdp_client_connect(rdpRdp* rdp)
for (; now < dueDate; now = GetTickCount64())
{
HANDLE events[MAXIMUM_WAIT_OBJECTS];
DWORD status;
HANDLE events[MAXIMUM_WAIT_OBJECTS] = { 0 };
DWORD status = 0;
DWORD nevents = freerdp_get_event_handles(rdp->context, events, ARRAYSIZE(events));
if (!nevents)
{

View File

@ -1172,6 +1172,12 @@ const char* freerdp_nego_get_routing_token(rdpContext* context, DWORD* length)
return (const char*)nego_get_routing_token(context->rdp->nego, length);
}
BOOL freerdp_io_callback_set_event(rdpContext* context, BOOL set)
{
WINPR_ASSERT(context);
return rdp_io_callback_set_event(context->rdp, set);
}
const rdpTransportIo* freerdp_get_io_callbacks(rdpContext* context)
{
WINPR_ASSERT(context);

View File

@ -2332,6 +2332,13 @@ void rdp_free(rdpRdp* rdp)
}
}
BOOL rdp_io_callback_set_event(rdpRdp* rdp, BOOL set)
{
if (!rdp)
return FALSE;
return transport_io_callback_set_event(rdp->transport, set);
}
const rdpTransportIo* rdp_get_io_callbacks(rdpRdp* rdp)
{
if (!rdp)

View File

@ -254,6 +254,8 @@ FREERDP_LOCAL rdpRdp* rdp_new(rdpContext* context);
FREERDP_LOCAL BOOL rdp_reset(rdpRdp* rdp);
FREERDP_LOCAL void rdp_free(rdpRdp* rdp);
FREERDP_LOCAL BOOL rdp_io_callback_set_event(rdpRdp* rdp, BOOL reset);
FREERDP_LOCAL const rdpTransportIo* rdp_get_io_callbacks(rdpRdp* rdp);
FREERDP_LOCAL BOOL rdp_set_io_callbacks(rdpRdp* rdp, const rdpTransportIo* io_callbacks);

View File

@ -82,6 +82,7 @@ struct rdp_transport
BOOL haveMoreBytesToRead;
wLog* log;
rdpTransportIo io;
HANDLE ioEvent;
};
static void transport_ssl_cb(SSL* ssl, int where, int ret)
@ -988,7 +989,7 @@ fail:
DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD count)
{
DWORD nCount = 1; /* always the reread Event */
DWORD nCount = 0; /* always the reread Event */
DWORD tmp;
WINPR_ASSERT(transport);
@ -1004,7 +1005,14 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD
return 0;
}
events[0] = transport->rereadEvent;
events[nCount++] = transport->rereadEvent;
if (transport->ioEvent)
{
if (count < 2)
return 0;
events[nCount++] = transport->ioEvent;
}
}
if (!transport->GatewayEnabled)
@ -1022,7 +1030,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD
if (transport->frontBio)
{
if (BIO_get_event(transport->frontBio, &events[1]) != 1)
if (BIO_get_event(transport->frontBio, &events[nCount]) != 1)
{
WLog_Print(transport->log, WLOG_ERROR, "%s: error getting the frontBio handle",
__FUNCTION__);
@ -1036,7 +1044,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD
{
if (transport->rdg)
{
tmp = rdg_get_event_handles(transport->rdg, &events[1], count - 1);
tmp = rdg_get_event_handles(transport->rdg, &events[nCount], count - nCount);
if (tmp == 0)
return 0;
@ -1045,7 +1053,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD
}
else if (transport->tsg)
{
tmp = tsg_get_event_handles(transport->tsg, &events[1], count - 1);
tmp = tsg_get_event_handles(transport->tsg, &events[nCount], count - nCount);
if (tmp == 0)
return 0;
@ -1313,6 +1321,11 @@ rdpTransport* transport_new(rdpContext* context)
if (!transport->rereadEvent || transport->rereadEvent == INVALID_HANDLE_VALUE)
goto fail;
transport->ioEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!transport->ioEvent || transport->ioEvent == INVALID_HANDLE_VALUE)
goto fail;
transport->haveMoreBytesToRead = FALSE;
transport->blocking = TRUE;
transport->GatewayEnabled = FALSE;
@ -1344,6 +1357,7 @@ void transport_free(rdpTransport* transport)
StreamPool_Free(transport->ReceivePool);
CloseHandle(transport->connectedEvent);
CloseHandle(transport->rereadEvent);
CloseHandle(transport->ioEvent);
DeleteCriticalSection(&(transport->ReadLock));
DeleteCriticalSection(&(transport->WriteLock));
free(transport);
@ -1500,3 +1514,11 @@ HANDLE transport_get_front_bio(rdpTransport* transport)
BIO_get_event(transport->frontBio, &hEvent);
return hEvent;
}
BOOL transport_io_callback_set_event(rdpTransport* transport, BOOL set)
{
WINPR_ASSERT(transport);
if (!set)
return ResetEvent(transport->ioEvent);
return SetEvent(transport->ioEvent);
}

View File

@ -87,6 +87,8 @@ FREERDP_LOCAL int transport_drain_output_buffer(rdpTransport* transport);
FREERDP_LOCAL wStream* transport_receive_pool_take(rdpTransport* transport);
FREERDP_LOCAL int transport_receive_pool_return(rdpTransport* transport, wStream* pdu);
FREERDP_LOCAL BOOL transport_io_callback_set_event(rdpTransport* transport, BOOL set);
FREERDP_LOCAL const rdpTransportIo* transport_get_io_callbacks(rdpTransport* transport);
FREERDP_LOCAL BOOL transport_set_io_callbacks(rdpTransport* transport,
const rdpTransportIo* io_callbacks);