mirror of https://github.com/FreeRDP/FreeRDP
Merge pull request #2088 from bmiklautz/fix/rdpsndv5
rdpsnd server side: misc fixes
This commit is contained in:
commit
938e2abcd4
|
@ -118,7 +118,7 @@ static BOOL rdpsnd_server_recv_formats(RdpsndServerContext* context, wStream* s)
|
||||||
{
|
{
|
||||||
int i, num_known_format = 0;
|
int i, num_known_format = 0;
|
||||||
UINT32 flags, vol, pitch;
|
UINT32 flags, vol, pitch;
|
||||||
UINT16 udpPort, version;
|
UINT16 udpPort;
|
||||||
BYTE lastblock;
|
BYTE lastblock;
|
||||||
|
|
||||||
if (Stream_GetRemainingLength(s) < 20)
|
if (Stream_GetRemainingLength(s) < 20)
|
||||||
|
@ -130,7 +130,7 @@ static BOOL rdpsnd_server_recv_formats(RdpsndServerContext* context, wStream* s)
|
||||||
Stream_Read_UINT16(s, udpPort); /* wDGramPort */
|
Stream_Read_UINT16(s, udpPort); /* wDGramPort */
|
||||||
Stream_Read_UINT16(s, context->num_client_formats); /* wNumberOfFormats */
|
Stream_Read_UINT16(s, context->num_client_formats); /* wNumberOfFormats */
|
||||||
Stream_Read_UINT8(s, lastblock); /* cLastBlockConfirmed */
|
Stream_Read_UINT8(s, lastblock); /* cLastBlockConfirmed */
|
||||||
Stream_Read_UINT16(s, version); /* wVersion */
|
Stream_Read_UINT16(s, context->clientVersion); /* wVersion */
|
||||||
Stream_Seek_UINT8(s); /* bPad */
|
Stream_Seek_UINT8(s); /* bPad */
|
||||||
|
|
||||||
/* this check is only a guess as cbSize can influence the size of a format record */
|
/* this check is only a guess as cbSize can influence the size of a format record */
|
||||||
|
@ -210,7 +210,7 @@ static void* rdpsnd_server_thread(void* arg)
|
||||||
if (WaitForSingleObject(context->priv->StopEvent, 0) == WAIT_OBJECT_0)
|
if (WaitForSingleObject(context->priv->StopEvent, 0) == WAIT_OBJECT_0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!rdpsnd_server_handle_messages(context))
|
if (rdpsnd_server_handle_messages(context) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,7 +620,16 @@ HANDLE rdpsnd_server_get_event_handle(RdpsndServerContext *context)
|
||||||
return context->priv->channelEvent;
|
return context->priv->channelEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
/*
|
||||||
|
* Handle rpdsnd messages - server side
|
||||||
|
*
|
||||||
|
* @param Server side context
|
||||||
|
*
|
||||||
|
* @return -1 if no data could be read,
|
||||||
|
* 0 on error (like connection close),
|
||||||
|
* 1 on succsess (also if further bytes need to be read)
|
||||||
|
*/
|
||||||
|
int rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
||||||
{
|
{
|
||||||
DWORD bytesReturned;
|
DWORD bytesReturned;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
@ -631,17 +640,18 @@ BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
||||||
if (!WTSVirtualChannelRead(priv->ChannelHandle, 0, (PCHAR)Stream_Pointer(s), priv->expectedBytes, &bytesReturned))
|
if (!WTSVirtualChannelRead(priv->ChannelHandle, 0, (PCHAR)Stream_Pointer(s), priv->expectedBytes, &bytesReturned))
|
||||||
{
|
{
|
||||||
if (GetLastError() == ERROR_NO_DATA)
|
if (GetLastError() == ERROR_NO_DATA)
|
||||||
return TRUE;
|
return -1;
|
||||||
|
|
||||||
CLOG_ERR( "%s: channel connection closed\n", __FUNCTION__);
|
CLOG_ERR( "%s: channel connection closed\n", __FUNCTION__);
|
||||||
return FALSE;
|
return 0;
|
||||||
}
|
}
|
||||||
priv->expectedBytes -= bytesReturned;
|
priv->expectedBytes -= bytesReturned;
|
||||||
Stream_Seek(s, bytesReturned);
|
Stream_Seek(s, bytesReturned);
|
||||||
|
|
||||||
if (priv->expectedBytes)
|
if (priv->expectedBytes)
|
||||||
return TRUE;
|
return 1;
|
||||||
|
|
||||||
|
Stream_SealLength(s);
|
||||||
Stream_SetPosition(s, 0);
|
Stream_SetPosition(s, 0);
|
||||||
if (priv->waitingHeader)
|
if (priv->waitingHeader)
|
||||||
{
|
{
|
||||||
|
@ -655,7 +665,7 @@ BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
||||||
if (priv->expectedBytes)
|
if (priv->expectedBytes)
|
||||||
{
|
{
|
||||||
Stream_EnsureCapacity(s, priv->expectedBytes);
|
Stream_EnsureCapacity(s, priv->expectedBytes);
|
||||||
return TRUE;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,16 +684,18 @@ BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
||||||
|
|
||||||
case SNDC_FORMATS:
|
case SNDC_FORMATS:
|
||||||
ret = rdpsnd_server_recv_formats(context, s);
|
ret = rdpsnd_server_recv_formats(context, s);
|
||||||
|
|
||||||
|
if (ret && context->clientVersion < 6)
|
||||||
|
IFCALL(context->Activated, context);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SNDC_QUALITYMODE:
|
case SNDC_QUALITYMODE:
|
||||||
ret = rdpsnd_server_recv_quality_mode(context, s);
|
ret = rdpsnd_server_recv_quality_mode(context, s);
|
||||||
Stream_SetPosition(s, 0); /* in case the Activated callback tries to treat some messages */
|
Stream_SetPosition(s, 0); /* in case the Activated callback tries to treat some messages */
|
||||||
|
|
||||||
if (ret)
|
if (ret && context->clientVersion >= 6)
|
||||||
{
|
|
||||||
IFCALL(context->Activated, context);
|
IFCALL(context->Activated, context);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -693,5 +705,8 @@ BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context)
|
||||||
}
|
}
|
||||||
Stream_SetPosition(s, 0);
|
Stream_SetPosition(s, 0);
|
||||||
|
|
||||||
return ret;
|
if (ret)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,11 @@ struct _rdpsnd_server_context
|
||||||
* synchronization.
|
* synchronization.
|
||||||
*/
|
*/
|
||||||
psRdpsndServerActivated Activated;
|
psRdpsndServerActivated Activated;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MS-RDPEA channel version the client announces
|
||||||
|
*/
|
||||||
|
UINT16 clientVersion;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -116,6 +121,7 @@ FREERDP_API void rdpsnd_server_context_reset(RdpsndServerContext *);
|
||||||
FREERDP_API void rdpsnd_server_context_free(RdpsndServerContext* context);
|
FREERDP_API void rdpsnd_server_context_free(RdpsndServerContext* context);
|
||||||
FREERDP_API HANDLE rdpsnd_server_get_event_handle(RdpsndServerContext *context);
|
FREERDP_API HANDLE rdpsnd_server_get_event_handle(RdpsndServerContext *context);
|
||||||
FREERDP_API BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context);
|
FREERDP_API BOOL rdpsnd_server_handle_messages(RdpsndServerContext *context);
|
||||||
|
FREERDP_API int rdpsnd_server_handle_messages(RdpsndServerContext *context);
|
||||||
FREERDP_API BOOL rdpsnd_server_send_formats(RdpsndServerContext* context, wStream* s);
|
FREERDP_API BOOL rdpsnd_server_send_formats(RdpsndServerContext* context, wStream* s);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue