int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, BYTE* data, UINT32 data_size) { int error = 0; DVCMAN_CHANNEL* channel; channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (!channel) { DEBUG_WARN("ChannelId %d not found!", ChannelId); return 1; } if (channel->dvc_data) { /* Fragmented data */ if (Stream_GetPosition(channel->dvc_data) + data_size > (UINT32) Stream_Capacity(channel->dvc_data)) { DEBUG_WARN("data exceeding declared length!"); Stream_Free(channel->dvc_data, TRUE); channel->dvc_data = NULL; return 1; } Stream_Write(channel->dvc_data, data, data_size); if (Stream_GetPosition(channel->dvc_data) >= Stream_Capacity(channel->dvc_data)) { error = channel->channel_callback->OnDataReceived(channel->channel_callback, Stream_Capacity(channel->dvc_data), Stream_Buffer(channel->dvc_data)); Stream_Free(channel->dvc_data, TRUE); channel->dvc_data = NULL; } } else { error = channel->channel_callback->OnDataReceived(channel->channel_callback, data_size, data); } return error; }
int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint8* data, uint32 data_size) { int error = 0; DVCMAN_CHANNEL* channel; channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (channel == NULL) { DEBUG_WARN("ChannelId %d not found!", ChannelId); return 1; } if (channel->dvc_data) { /* Fragmented data */ if (stream_get_length(channel->dvc_data) + data_size > (uint32) stream_get_size(channel->dvc_data)) { DEBUG_WARN("data exceeding declared length!"); stream_free(channel->dvc_data); channel->dvc_data = NULL; return 1; } stream_write(channel->dvc_data, data, data_size); if (stream_get_length(channel->dvc_data) >= stream_get_size(channel->dvc_data)) { error = channel->channel_callback->OnDataReceived(channel->channel_callback, stream_get_size(channel->dvc_data), stream_get_data(channel->dvc_data)); stream_free(channel->dvc_data); channel->dvc_data = NULL; } } else { error = channel->channel_callback->OnDataReceived(channel->channel_callback, data_size, data); } return error; }
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; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId) { DVCMAN_CHANNEL* channel; UINT error = CHANNEL_RC_OK; DVCMAN* dvcman = (DVCMAN*) pChannelMgr; channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (!channel) { //WLog_Print(drdynvc->log, WLOG_ERROR, "ChannelId %"PRIu32" not found!", ChannelId); /** * Windows 8 / Windows Server 2012 send close requests for channels that failed to be created. * Do not warn, simply return success here. */ return CHANNEL_RC_OK; } ArrayList_Remove(dvcman->channels, channel); return error; }
int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId) { DVCMAN_CHANNEL* channel; IWTSVirtualChannel* ichannel; channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (channel == NULL) { DEBUG_WARN("ChannelId %d not found!", ChannelId); return 1; } if (channel->dvc_data) { stream_free(channel->dvc_data); channel->dvc_data = NULL; } DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId); ichannel = (IWTSVirtualChannel*)channel; ichannel->Close(ichannel); return 0; }
static DVCMAN_CHANNEL* dvcman_channel_new(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, const char* ChannelName) { DVCMAN_CHANNEL* channel; if (dvcman_find_channel_by_id(pChannelMgr, ChannelId)) { WLog_ERR(TAG, "Protocol error: Duplicated ChannelId %d (%s)!", ChannelId, ChannelName); return NULL; } channel = (DVCMAN_CHANNEL*) calloc(1, sizeof(DVCMAN_CHANNEL)); if (!channel) { WLog_ERR(TAG, "calloc failed!"); return NULL; } channel->dvcman = (DVCMAN*) pChannelMgr; channel->channel_id = ChannelId; channel->channel_name = _strdup(ChannelName); if (!channel->channel_name) { WLog_ERR(TAG, "_strdup failed!"); free(channel); return NULL; } if (!InitializeCriticalSectionEx(&(channel->lock), 0 ,0)) { WLog_ERR(TAG, "InitializeCriticalSectionEx failed!"); free(channel->channel_name); free(channel); return NULL; } return channel; }
int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId) { DVCMAN_CHANNEL* channel; IWTSVirtualChannel* ichannel; DrdynvcClientContext* context; DVCMAN* dvcman = (DVCMAN*) pChannelMgr; channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (!channel) { DEBUG_WARN("ChannelId %d not found!", ChannelId); return 1; } if (channel->dvc_data) { Stream_Release(channel->dvc_data); channel->dvc_data = NULL; } if (channel->status == 0) { context = dvcman->drdynvc->context; IFCALL(context->OnChannelDisconnected, context, channel->channel_name, channel->pInterface); free(channel->channel_name); DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId); ichannel = (IWTSVirtualChannel*) channel; ichannel->Close(ichannel); } return 0; }