mirror of https://github.com/FreeRDP/FreeRDP
[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:
parent
4ccb38aa13
commit
d83f70bc32
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue