From 00e353323048aee836287f7b258a8dd9199f0da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 10 Oct 2014 17:19:38 -0400 Subject: [PATCH] libfreerdp-core: expose API for FreeRDS WTSVirtualChannelRead --- include/freerdp/peer.h | 4 ++++ libfreerdp/core/channels.c | 32 ++++++++++++++++++++++++++++++-- libfreerdp/core/peer.c | 27 ++++++++++++++++++++++++++- libfreerdp/core/server.h | 1 + 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h index cfe8faa96..62d817c36 100644 --- a/include/freerdp/peer.h +++ b/include/freerdp/peer.h @@ -52,6 +52,8 @@ typedef HANDLE (*psPeerVirtualChannelOpen)(freerdp_peer* client, const char* nam typedef BOOL (*psPeerVirtualChannelClose)(freerdp_peer* client, HANDLE hChannel); typedef int (*psPeerVirtualChannelRead)(freerdp_peer* client, HANDLE hChannel, BYTE* buffer, UINT32 length); typedef int (*psPeerVirtualChannelWrite)(freerdp_peer* client, HANDLE hChannel, BYTE* buffer, UINT32 length); +typedef void* (*psPeerVirtualChannelGetData)(freerdp_peer* client, HANDLE hChannel); +typedef int (*psPeerVirtualChannelSetData)(freerdp_peer* client, HANDLE hChannel, void* data); struct rdp_freerdp_peer { @@ -89,6 +91,8 @@ struct rdp_freerdp_peer psPeerVirtualChannelClose VirtualChannelClose; psPeerVirtualChannelRead VirtualChannelRead; psPeerVirtualChannelWrite VirtualChannelWrite; + psPeerVirtualChannelGetData VirtualChannelGetData; + psPeerVirtualChannelSetData VirtualChannelSetData; int pId; UINT32 ack_frame_id; diff --git a/libfreerdp/core/channels.c b/libfreerdp/core/channels.c index a482ac0f1..53c6e3149 100644 --- a/libfreerdp/core/channels.c +++ b/libfreerdp/core/channels.c @@ -143,8 +143,36 @@ BOOL freerdp_channel_peer_process(freerdp_peer* client, wStream* s, UINT16 chann Stream_Read_UINT32(s, flags); chunkLength = Stream_GetRemainingLength(s); - IFCALL(client->ReceiveChannelData, client, - channelId, Stream_Pointer(s), chunkLength, flags, length); + if (client->VirtualChannelRead) + { + UINT32 index; + BOOL found = FALSE; + HANDLE hChannel = 0; + rdpContext* context = client->context; + rdpMcs* mcs = context->rdp->mcs; + rdpMcsChannel* mcsChannel = NULL; + + for (index = 0; index < mcs->channelCount; index++) + { + mcsChannel = &(mcs->channels[index]); + + if (mcsChannel->ChannelId == channelId) + { + hChannel = (HANDLE) mcsChannel->handle; + found = TRUE; + break; + } + } + + if (!found) + return FALSE; + + client->VirtualChannelRead(client, hChannel, Stream_Pointer(s), Stream_GetRemainingLength(s)); + } + else if (client->ReceiveChannelData) + { + client->ReceiveChannelData(client, channelId, Stream_Pointer(s), chunkLength, flags, length); + } return TRUE; } diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index dc695f5dc..3b9274187 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -113,7 +113,7 @@ static BOOL freerdp_peer_virtual_channel_close(freerdp_peer* client, HANDLE hCha int freerdp_peer_virtual_channel_read(freerdp_peer* client, HANDLE hChannel, BYTE* buffer, UINT32 length) { - return 1; + return 0; /* this needs to be implemented by the server application */ } static int freerdp_peer_virtual_channel_write(freerdp_peer* client, HANDLE hChannel, BYTE* buffer, UINT32 length) @@ -170,6 +170,28 @@ static int freerdp_peer_virtual_channel_write(freerdp_peer* client, HANDLE hChan return 1; } +void* freerdp_peer_virtual_channel_get_data(freerdp_peer* client, HANDLE hChannel) +{ + rdpPeerChannel* peerChannel = (rdpPeerChannel*) hChannel; + + if (!hChannel) + return NULL; + + return peerChannel->extra; +} + +int freerdp_peer_virtual_channel_set_data(freerdp_peer* client, HANDLE hChannel, void* data) +{ + rdpPeerChannel* peerChannel = (rdpPeerChannel*) hChannel; + + if (!hChannel) + return -1; + + peerChannel->extra = data; + + return 1; +} + static BOOL freerdp_peer_initialize(freerdp_peer* client) { rdpRdp* rdp = client->context->rdp; @@ -635,6 +657,9 @@ freerdp_peer* freerdp_peer_new(int sockfd) client->VirtualChannelOpen = freerdp_peer_virtual_channel_open; client->VirtualChannelClose = freerdp_peer_virtual_channel_close; client->VirtualChannelWrite = freerdp_peer_virtual_channel_write; + client->VirtualChannelRead = NULL; /* must be defined by server application */ + client->VirtualChannelGetData = freerdp_peer_virtual_channel_get_data; + client->VirtualChannelSetData = freerdp_peer_virtual_channel_set_data; } return client; diff --git a/libfreerdp/core/server.h b/libfreerdp/core/server.h index 7c8bad9c1..1bd63e8f6 100644 --- a/libfreerdp/core/server.h +++ b/libfreerdp/core/server.h @@ -66,6 +66,7 @@ struct rdp_peer_channel WTSVirtualChannelManager* vcm; freerdp_peer* client; + void* extra; UINT16 index; UINT32 channelId; UINT16 channelType;