diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index d10f9a751..b1a6ed588 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -217,19 +217,20 @@ static int drdynvc_process_create_request(drdynvcPlugin* drdynvc, int Sp, int cb int status; UINT32 ChannelId; wStream* data_out; + int channel_status; ChannelId = drdynvc_read_variable_uint(s, cbChId); pos = Stream_GetPosition(s); DEBUG_DVC("ChannelId=%d ChannelName=%s", ChannelId, Stream_Pointer(s)); - status = dvcman_create_channel(drdynvc->channel_mgr, ChannelId, (char*) Stream_Pointer(s)); + channel_status = dvcman_create_channel(drdynvc->channel_mgr, ChannelId, (char*) Stream_Pointer(s)); data_out = Stream_New(NULL, pos + 4); Stream_Write_UINT8(data_out, 0x10 | cbChId); Stream_SetPosition(s, 1); Stream_Copy(data_out, s, pos - 1); - if (status == 0) + if (channel_status == 0) { DEBUG_DVC("channel created"); Stream_Write_UINT32(data_out, 0); @@ -248,6 +249,11 @@ static int drdynvc_process_create_request(drdynvcPlugin* drdynvc, int Sp, int cb return 1; } + if (channel_status == 0) + { + dvcman_open_channel(drdynvc->channel_mgr, ChannelId); + } + return 0; } diff --git a/channels/drdynvc/client/dvcman.c b/channels/drdynvc/client/dvcman.c index da170160d..6f7e5b6ed 100644 --- a/channels/drdynvc/client/dvcman.c +++ b/channels/drdynvc/client/dvcman.c @@ -385,6 +385,28 @@ int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channel return 1; } +int dvcman_open_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId) +{ + DVCMAN_CHANNEL* channel; + IWTSVirtualChannelCallback* pCallback; + + channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); + + if (!channel) + { + DEBUG_WARN("ChannelId %d not found!", ChannelId); + return 1; + } + + if (channel->status == 0) + { + pCallback = channel->channel_callback; + pCallback->OnOpen(pCallback); + } + + return 0; +} + int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId) { DVCMAN_CHANNEL* channel; diff --git a/channels/drdynvc/client/dvcman.h b/channels/drdynvc/client/dvcman.h index ca886f3af..9d96d1460 100644 --- a/channels/drdynvc/client/dvcman.h +++ b/channels/drdynvc/client/dvcman.h @@ -87,6 +87,7 @@ int dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args); void dvcman_free(IWTSVirtualChannelManager* pChannelMgr); int dvcman_init(IWTSVirtualChannelManager* pChannelMgr); int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, const char* ChannelName); +int dvcman_open_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId); int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId); int dvcman_receive_channel_data_first(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, UINT32 length); int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, BYTE* data, UINT32 data_size); diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index c6e2fc87a..218cecd41 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -91,14 +91,14 @@ int rdpgfx_send_caps_advertise_pdu(RDPGFX_CHANNEL_CALLBACK* callback) capset8.version = RDPGFX_CAPVERSION_8; capset8.capsDataLength = 4; capset8.flags = 0; - //capset8.flags |= RDPGFX_CAPS_FLAG_THINCLIENT; + capset8.flags |= RDPGFX_CAPS_FLAG_THINCLIENT; //capset8.flags |= RDPGFX_CAPS_FLAG_SMALL_CACHE; capset81.version = RDPGFX_CAPVERSION_81; //capset81.version = 0x00080103; capset81.capsDataLength = 4; capset81.flags = 0; - //capset81.flags |= RDPGFX_CAPS_FLAG_THINCLIENT; + capset81.flags |= RDPGFX_CAPS_FLAG_THINCLIENT; //capset81.flags |= RDPGFX_CAPS_FLAG_SMALL_CACHE; //capset81.flags |= RDPGFX_CAPS_FLAG_H264ENABLED; @@ -164,6 +164,17 @@ static int rdpgfx_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, return status; } +static int rdpgfx_on_open(IWTSVirtualChannelCallback* pChannelCallback) +{ + RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; + + fprintf(stderr, "RdpGfxOnOpen\n"); + + rdpgfx_send_caps_advertise_pdu(callback); + + return 0; +} + static int rdpgfx_on_close(IWTSVirtualChannelCallback* pChannelCallback) { RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; @@ -185,6 +196,7 @@ static int rdpgfx_on_new_channel_connection(IWTSListenerCallback* pListenerCallb callback = (RDPGFX_CHANNEL_CALLBACK*) calloc(1, sizeof(RDPGFX_CHANNEL_CALLBACK)); callback->iface.OnDataReceived = rdpgfx_on_data_received; + callback->iface.OnOpen = rdpgfx_on_open; callback->iface.OnClose = rdpgfx_on_close; callback->plugin = listener_callback->plugin; callback->channel_mgr = listener_callback->channel_mgr; @@ -195,8 +207,6 @@ static int rdpgfx_on_new_channel_connection(IWTSListenerCallback* pListenerCallb fprintf(stderr, "RdpGfxOnNewChannelConnection\n"); - rdpgfx_send_caps_advertise_pdu(callback); - return 0; } diff --git a/include/freerdp/dvc.h b/include/freerdp/dvc.h index a2350bfe8..f89745ca4 100644 --- a/include/freerdp/dvc.h +++ b/include/freerdp/dvc.h @@ -140,6 +140,8 @@ struct _IWTSVirtualChannelCallback int (*OnDataReceived) (IWTSVirtualChannelCallback* pChannelCallback, UINT32 cbSize, BYTE* pBuffer); + /* Notifies the user that the channel has been opened. */ + int (*OnOpen) (IWTSVirtualChannelCallback* pChannelCallback); /* Notifies the user that the channel has been closed. */ int (*OnClose) (IWTSVirtualChannelCallback* pChannelCallback); };