mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
WINPR_ASSERT shadow client
This commit is contained in:
parent
3ac50697a0
commit
4ce3063b16
@ -91,7 +91,13 @@ static INLINE BOOL shadow_client_rdpgfx_release_surface(rdpShadowClient* client)
|
|||||||
{
|
{
|
||||||
UINT error = CHANNEL_RC_OK;
|
UINT error = CHANNEL_RC_OK;
|
||||||
RDPGFX_DELETE_SURFACE_PDU pdu;
|
RDPGFX_DELETE_SURFACE_PDU pdu;
|
||||||
RdpgfxServerContext* context = client->rdpgfx;
|
RdpgfxServerContext* context;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
|
context = client->rdpgfx;
|
||||||
|
WINPR_ASSERT(context);
|
||||||
|
|
||||||
pdu.surfaceId = 0;
|
pdu.surfaceId = 0;
|
||||||
IFCALLRET(context->DeleteSurface, error, context, &pdu);
|
IFCALLRET(context->DeleteSurface, error, context, &pdu);
|
||||||
|
|
||||||
@ -107,9 +113,19 @@ static INLINE BOOL shadow_client_rdpgfx_release_surface(rdpShadowClient* client)
|
|||||||
static INLINE BOOL shadow_client_rdpgfx_reset_graphic(rdpShadowClient* client)
|
static INLINE BOOL shadow_client_rdpgfx_reset_graphic(rdpShadowClient* client)
|
||||||
{
|
{
|
||||||
UINT error = CHANNEL_RC_OK;
|
UINT error = CHANNEL_RC_OK;
|
||||||
RDPGFX_RESET_GRAPHICS_PDU pdu;
|
RDPGFX_RESET_GRAPHICS_PDU pdu = { 0 };
|
||||||
RdpgfxServerContext* context = client->rdpgfx;
|
RdpgfxServerContext* context;
|
||||||
rdpSettings* settings = ((rdpContext*)client)->settings;
|
rdpSettings* settings;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->context);
|
||||||
|
|
||||||
|
context = client->rdpgfx;
|
||||||
|
WINPR_ASSERT(context);
|
||||||
|
|
||||||
|
settings = client->context.settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
pdu.width = settings->DesktopWidth;
|
pdu.width = settings->DesktopWidth;
|
||||||
pdu.height = settings->DesktopHeight;
|
pdu.height = settings->DesktopHeight;
|
||||||
pdu.monitorCount = client->subsystem->numMonitors;
|
pdu.monitorCount = client->subsystem->numMonitors;
|
||||||
@ -129,6 +145,7 @@ static INLINE void shadow_client_free_queued_message(void* obj)
|
|||||||
{
|
{
|
||||||
wMessage* message = (wMessage*)obj;
|
wMessage* message = (wMessage*)obj;
|
||||||
|
|
||||||
|
WINPR_ASSERT(message);
|
||||||
if (message->Free)
|
if (message->Free)
|
||||||
{
|
{
|
||||||
message->Free(message);
|
message->Free(message);
|
||||||
@ -241,6 +258,7 @@ static void shadow_client_context_free(freerdp_peer* peer, rdpContext* context)
|
|||||||
server = client->server;
|
server = client->server;
|
||||||
WINPR_ASSERT(server);
|
WINPR_ASSERT(server);
|
||||||
|
|
||||||
|
WINPR_ASSERT(server->clients);
|
||||||
ArrayList_Remove(server->clients, (void*)client);
|
ArrayList_Remove(server->clients, (void*)client);
|
||||||
|
|
||||||
if (client->encoder)
|
if (client->encoder)
|
||||||
@ -250,6 +268,7 @@ static void shadow_client_context_free(freerdp_peer* peer, rdpContext* context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Clear queued messages and free resource */
|
/* Clear queued messages and free resource */
|
||||||
|
WINPR_ASSERT(client->MsgQueue);
|
||||||
MessageQueue_Clear(client->MsgQueue);
|
MessageQueue_Clear(client->MsgQueue);
|
||||||
MessageQueue_Free(client->MsgQueue);
|
MessageQueue_Free(client->MsgQueue);
|
||||||
WTSCloseServer((HANDLE)client->vcm);
|
WTSCloseServer((HANDLE)client->vcm);
|
||||||
@ -263,7 +282,15 @@ static INLINE void shadow_client_mark_invalid(rdpShadowClient* client, UINT32 nu
|
|||||||
{
|
{
|
||||||
UINT32 index;
|
UINT32 index;
|
||||||
RECTANGLE_16 screenRegion;
|
RECTANGLE_16 screenRegion;
|
||||||
rdpSettings* settings = ((rdpContext*)client)->settings;
|
rdpSettings* settings;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->context);
|
||||||
|
WINPR_ASSERT(rects || (numRects == 0));
|
||||||
|
|
||||||
|
settings = client->context.settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
EnterCriticalSection(&(client->lock));
|
EnterCriticalSection(&(client->lock));
|
||||||
|
|
||||||
/* Mark client invalid region. No rectangle means full screen */
|
/* Mark client invalid region. No rectangle means full screen */
|
||||||
@ -341,8 +368,16 @@ static BOOL shadow_client_capabilities(freerdp_peer* peer)
|
|||||||
rdpShadowSubsystem* subsystem;
|
rdpShadowSubsystem* subsystem;
|
||||||
rdpShadowClient* client;
|
rdpShadowClient* client;
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer);
|
||||||
|
|
||||||
client = (rdpShadowClient*)peer->context;
|
client = (rdpShadowClient*)peer->context;
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->server);
|
||||||
|
|
||||||
subsystem = client->server->subsystem;
|
subsystem = client->server->subsystem;
|
||||||
|
WINPR_ASSERT(subsystem);
|
||||||
|
|
||||||
IFCALLRET(subsystem->ClientCapabilities, ret, subsystem, client);
|
IFCALLRET(subsystem->ClientCapabilities, ret, subsystem, client);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@ -361,10 +396,20 @@ static BOOL shadow_client_post_connect(freerdp_peer* peer)
|
|||||||
rdpShadowClient* client;
|
rdpShadowClient* client;
|
||||||
rdpShadowServer* server;
|
rdpShadowServer* server;
|
||||||
rdpShadowSubsystem* subsystem;
|
rdpShadowSubsystem* subsystem;
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer);
|
||||||
|
|
||||||
client = (rdpShadowClient*)peer->context;
|
client = (rdpShadowClient*)peer->context;
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
settings = peer->settings;
|
settings = peer->settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
server = client->server;
|
server = client->server;
|
||||||
|
WINPR_ASSERT(server);
|
||||||
|
|
||||||
subsystem = server->subsystem;
|
subsystem = server->subsystem;
|
||||||
|
WINPR_ASSERT(subsystem);
|
||||||
|
|
||||||
if (settings->ColorDepth == 24)
|
if (settings->ColorDepth == 24)
|
||||||
settings->ColorDepth = 16; /* disable 24bpp */
|
settings->ColorDepth = 16; /* disable 24bpp */
|
||||||
@ -379,6 +424,8 @@ static BOOL shadow_client_post_connect(freerdp_peer* peer)
|
|||||||
/* Resize client if necessary */
|
/* Resize client if necessary */
|
||||||
if (shadow_client_recalc_desktop_size(client))
|
if (shadow_client_recalc_desktop_size(client))
|
||||||
{
|
{
|
||||||
|
WINPR_ASSERT(peer->update);
|
||||||
|
WINPR_ASSERT(peer->update->DesktopResize);
|
||||||
peer->update->DesktopResize(peer->update->context);
|
peer->update->DesktopResize(peer->update->context);
|
||||||
WLog_INFO(TAG, "Client from %s is resized (%" PRIu32 "x%" PRIu32 "@%" PRIu32 ")",
|
WLog_INFO(TAG, "Client from %s is resized (%" PRIu32 "x%" PRIu32 "@%" PRIu32 ")",
|
||||||
peer->hostname, settings->DesktopWidth, settings->DesktopHeight,
|
peer->hostname, settings->DesktopWidth, settings->DesktopHeight,
|
||||||
@ -421,6 +468,11 @@ static BOOL shadow_client_post_connect(freerdp_peer* peer)
|
|||||||
static INLINE void shadow_client_convert_rects(rdpShadowClient* client, RECTANGLE_16* dst,
|
static INLINE void shadow_client_convert_rects(rdpShadowClient* client, RECTANGLE_16* dst,
|
||||||
const RECTANGLE_16* src, UINT32 numRects)
|
const RECTANGLE_16* src, UINT32 numRects)
|
||||||
{
|
{
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->server);
|
||||||
|
WINPR_ASSERT(dst);
|
||||||
|
WINPR_ASSERT(src || (numRects == 0));
|
||||||
|
|
||||||
if (client->server->shareSubRect)
|
if (client->server->shareSubRect)
|
||||||
{
|
{
|
||||||
UINT32 i = 0;
|
UINT32 i = 0;
|
||||||
@ -429,10 +481,13 @@ static INLINE void shadow_client_convert_rects(rdpShadowClient* client, RECTANGL
|
|||||||
|
|
||||||
for (i = 0; i < numRects; i++)
|
for (i = 0; i < numRects; i++)
|
||||||
{
|
{
|
||||||
dst[i].left = src[i].left + offsetX;
|
const RECTANGLE_16* s = &src[i];
|
||||||
dst[i].right = src[i].right + offsetX;
|
RECTANGLE_16* d = &dst[i];
|
||||||
dst[i].top = src[i].top + offsetY;
|
|
||||||
dst[i].bottom = src[i].bottom + offsetY;
|
d->left = s->left + offsetX;
|
||||||
|
d->right = s->right + offsetX;
|
||||||
|
d->top = s->top + offsetY;
|
||||||
|
d->bottom = s->bottom + offsetY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -447,7 +502,14 @@ static INLINE void shadow_client_convert_rects(rdpShadowClient* client, RECTANGL
|
|||||||
static BOOL shadow_client_refresh_request(rdpShadowClient* client)
|
static BOOL shadow_client_refresh_request(rdpShadowClient* client)
|
||||||
{
|
{
|
||||||
wMessage message = { 0 };
|
wMessage message = { 0 };
|
||||||
wMessagePipe* MsgPipe = client->subsystem->MsgPipe;
|
wMessagePipe* MsgPipe;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->subsystem);
|
||||||
|
|
||||||
|
MsgPipe = client->subsystem->MsgPipe;
|
||||||
|
WINPR_ASSERT(MsgPipe);
|
||||||
|
|
||||||
message.id = SHADOW_MSG_IN_REFRESH_REQUEST_ID;
|
message.id = SHADOW_MSG_IN_REFRESH_REQUEST_ID;
|
||||||
message.wParam = NULL;
|
message.wParam = NULL;
|
||||||
message.lParam = NULL;
|
message.lParam = NULL;
|
||||||
@ -490,6 +552,9 @@ static BOOL shadow_client_suppress_output(rdpContext* context, BYTE allow, const
|
|||||||
{
|
{
|
||||||
rdpShadowClient* client = (rdpShadowClient*)context;
|
rdpShadowClient* client = (rdpShadowClient*)context;
|
||||||
RECTANGLE_16 region;
|
RECTANGLE_16 region;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
client->suppressOutput = allow ? FALSE : TRUE;
|
client->suppressOutput = allow ? FALSE : TRUE;
|
||||||
|
|
||||||
if (allow)
|
if (allow)
|
||||||
@ -510,8 +575,16 @@ static BOOL shadow_client_suppress_output(rdpContext* context, BYTE allow, const
|
|||||||
|
|
||||||
static BOOL shadow_client_activate(freerdp_peer* peer)
|
static BOOL shadow_client_activate(freerdp_peer* peer)
|
||||||
{
|
{
|
||||||
rdpSettings* settings = peer->settings;
|
rdpSettings* settings;
|
||||||
rdpShadowClient* client = (rdpShadowClient*)peer->context;
|
rdpShadowClient* client;
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer);
|
||||||
|
|
||||||
|
settings = peer->settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
|
client = (rdpShadowClient*)peer->context;
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
if (settings->ClientDir && (strcmp(settings->ClientDir, "librdp") == 0))
|
if (settings->ClientDir && (strcmp(settings->ClientDir, "librdp") == 0))
|
||||||
{
|
{
|
||||||
@ -541,7 +614,13 @@ static BOOL shadow_client_logon(freerdp_peer* peer, SEC_WINNT_AUTH_IDENTITY* ide
|
|||||||
char* user = NULL;
|
char* user = NULL;
|
||||||
char* domain = NULL;
|
char* domain = NULL;
|
||||||
char* password = NULL;
|
char* password = NULL;
|
||||||
rdpSettings* settings = peer->settings;
|
rdpSettings* settings;
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer);
|
||||||
|
WINPR_ASSERT(identity);
|
||||||
|
|
||||||
|
settings = peer->settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
if (identity->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE)
|
if (identity->Flags & SEC_WINNT_AUTH_IDENTITY_UNICODE)
|
||||||
{
|
{
|
||||||
@ -630,6 +709,8 @@ static INLINE void shadow_client_common_frame_acknowledge(rdpShadowClient* clien
|
|||||||
* So it is OK to calculate inflight frame count according to
|
* So it is OK to calculate inflight frame count according to
|
||||||
* a latest acknowledged frame id.
|
* a latest acknowledged frame id.
|
||||||
*/
|
*/
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->encoder);
|
||||||
client->encoder->lastAckframeId = frameId;
|
client->encoder->lastAckframeId = frameId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,6 +721,8 @@ static BOOL shadow_client_surface_frame_acknowledge(rdpContext* context, UINT32
|
|||||||
/*
|
/*
|
||||||
* Reset queueDepth for legacy none RDPGFX acknowledge
|
* Reset queueDepth for legacy none RDPGFX acknowledge
|
||||||
*/
|
*/
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->encoder);
|
||||||
client->encoder->queueDepth = QUEUE_DEPTH_UNAVAILABLE;
|
client->encoder->queueDepth = QUEUE_DEPTH_UNAVAILABLE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -648,15 +731,23 @@ static UINT
|
|||||||
shadow_client_rdpgfx_frame_acknowledge(RdpgfxServerContext* context,
|
shadow_client_rdpgfx_frame_acknowledge(RdpgfxServerContext* context,
|
||||||
const RDPGFX_FRAME_ACKNOWLEDGE_PDU* frameAcknowledge)
|
const RDPGFX_FRAME_ACKNOWLEDGE_PDU* frameAcknowledge)
|
||||||
{
|
{
|
||||||
rdpShadowClient* client = (rdpShadowClient*)context->custom;
|
rdpShadowClient* client;
|
||||||
|
|
||||||
|
WINPR_ASSERT(context);
|
||||||
|
WINPR_ASSERT(frameAcknowledge);
|
||||||
|
|
||||||
|
client = (rdpShadowClient*)context->custom;
|
||||||
shadow_client_common_frame_acknowledge(client, frameAcknowledge->frameId);
|
shadow_client_common_frame_acknowledge(client, frameAcknowledge->frameId);
|
||||||
|
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
WINPR_ASSERT(client->encoder);
|
||||||
client->encoder->queueDepth = frameAcknowledge->queueDepth;
|
client->encoder->queueDepth = frameAcknowledge->queueDepth;
|
||||||
return CHANNEL_RC_OK;
|
return CHANNEL_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL shadow_are_caps_filtered(const rdpSettings* settings, UINT32 caps)
|
static BOOL shadow_are_caps_filtered(const rdpSettings* settings, UINT32 caps)
|
||||||
{
|
{
|
||||||
const UINT32 filter = settings->GfxCapsFilter;
|
UINT32 filter;
|
||||||
const UINT32 capList[] = {
|
const UINT32 capList[] = {
|
||||||
RDPGFX_CAPVERSION_8, RDPGFX_CAPVERSION_81, RDPGFX_CAPVERSION_10,
|
RDPGFX_CAPVERSION_8, RDPGFX_CAPVERSION_81, RDPGFX_CAPVERSION_10,
|
||||||
RDPGFX_CAPVERSION_101, RDPGFX_CAPVERSION_102, RDPGFX_CAPVERSION_103,
|
RDPGFX_CAPVERSION_101, RDPGFX_CAPVERSION_102, RDPGFX_CAPVERSION_103,
|
||||||
@ -664,6 +755,9 @@ static BOOL shadow_are_caps_filtered(const rdpSettings* settings, UINT32 caps)
|
|||||||
};
|
};
|
||||||
UINT32 x;
|
UINT32 x;
|
||||||
|
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
filter = settings->GfxCapsFilter;
|
||||||
|
|
||||||
for (x = 0; x < ARRAYSIZE(capList); x++)
|
for (x = 0; x < ARRAYSIZE(capList); x++)
|
||||||
{
|
{
|
||||||
if (caps == capList[x])
|
if (caps == capList[x])
|
||||||
@ -888,6 +982,7 @@ static UINT shadow_client_rdpgfx_caps_advertise(RdpgfxServerContext* context,
|
|||||||
static INLINE UINT32 rdpgfx_estimate_h264_avc420(RDPGFX_AVC420_BITMAP_STREAM* havc420)
|
static INLINE UINT32 rdpgfx_estimate_h264_avc420(RDPGFX_AVC420_BITMAP_STREAM* havc420)
|
||||||
{
|
{
|
||||||
/* H264 metadata + H264 stream. See rdpgfx_write_h264_avc420 */
|
/* H264 metadata + H264 stream. See rdpgfx_write_h264_avc420 */
|
||||||
|
WINPR_ASSERT(havc420);
|
||||||
return sizeof(UINT32) /* numRegionRects */
|
return sizeof(UINT32) /* numRegionRects */
|
||||||
+ 10 /* regionRects + quantQualityVals */
|
+ 10 /* regionRects + quantQualityVals */
|
||||||
* havc420->meta.numRegionRects +
|
* havc420->meta.numRegionRects +
|
||||||
@ -1670,6 +1765,8 @@ static BOOL shadow_client_send_resize(rdpShadowClient* client, SHADOW_GFX_STATUS
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send Resize */
|
/* Send Resize */
|
||||||
|
WINPR_ASSERT(peer->update);
|
||||||
|
WINPR_ASSERT(peer->update->DesktopResize);
|
||||||
if (!peer->update->DesktopResize(peer->update->context))
|
if (!peer->update->DesktopResize(peer->update->context))
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "DesktopResize failed");
|
WLog_ERR(TAG, "DesktopResize failed");
|
||||||
@ -1713,15 +1810,22 @@ static INLINE BOOL shadow_client_no_surface_update(rdpShadowClient* client,
|
|||||||
rdpShadowServer* server;
|
rdpShadowServer* server;
|
||||||
rdpShadowSurface* surface;
|
rdpShadowSurface* surface;
|
||||||
WINPR_UNUSED(pStatus);
|
WINPR_UNUSED(pStatus);
|
||||||
|
WINPR_ASSERT(client);
|
||||||
server = client->server;
|
server = client->server;
|
||||||
|
WINPR_ASSERT(server);
|
||||||
surface = client->inLobby ? server->lobby : server->surface;
|
surface = client->inLobby ? server->lobby : server->surface;
|
||||||
return shadow_client_surface_update(client, &(surface->invalidRegion));
|
return shadow_client_surface_update(client, &(surface->invalidRegion));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMessage* message)
|
static int shadow_client_subsystem_process_message(rdpShadowClient* client, const wMessage* message)
|
||||||
{
|
{
|
||||||
rdpContext* context = (rdpContext*)client;
|
rdpContext* context = (rdpContext*)client;
|
||||||
rdpUpdate* update = context->update;
|
rdpUpdate* update;
|
||||||
|
|
||||||
|
WINPR_ASSERT(message);
|
||||||
|
WINPR_ASSERT(context);
|
||||||
|
update = context->update;
|
||||||
|
WINPR_ASSERT(update);
|
||||||
|
|
||||||
/* FIXME: the pointer updates appear to be broken when used with bulk compression and mstsc */
|
/* FIXME: the pointer updates appear to be broken when used with bulk compression and mstsc */
|
||||||
|
|
||||||
@ -1730,11 +1834,12 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
||||||
{
|
{
|
||||||
POINTER_POSITION_UPDATE pointerPosition;
|
POINTER_POSITION_UPDATE pointerPosition;
|
||||||
SHADOW_MSG_OUT_POINTER_POSITION_UPDATE* msg =
|
const SHADOW_MSG_OUT_POINTER_POSITION_UPDATE* msg =
|
||||||
(SHADOW_MSG_OUT_POINTER_POSITION_UPDATE*)message->wParam;
|
(const SHADOW_MSG_OUT_POINTER_POSITION_UPDATE*)message->wParam;
|
||||||
pointerPosition.xPos = msg->xPos;
|
pointerPosition.xPos = msg->xPos;
|
||||||
pointerPosition.yPos = msg->yPos;
|
pointerPosition.yPos = msg->yPos;
|
||||||
|
|
||||||
|
WINPR_ASSERT(client->server);
|
||||||
if (client->server->shareSubRect)
|
if (client->server->shareSubRect)
|
||||||
{
|
{
|
||||||
pointerPosition.xPos -= client->server->subRect.left;
|
pointerPosition.xPos -= client->server->subRect.left;
|
||||||
@ -1745,6 +1850,7 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
{
|
{
|
||||||
if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY))
|
if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY))
|
||||||
{
|
{
|
||||||
|
WINPR_ASSERT(update->pointer);
|
||||||
IFCALL(update->pointer->PointerPosition, context, &pointerPosition);
|
IFCALL(update->pointer->PointerPosition, context, &pointerPosition);
|
||||||
client->pointerX = msg->xPos;
|
client->pointerX = msg->xPos;
|
||||||
client->pointerY = msg->yPos;
|
client->pointerY = msg->yPos;
|
||||||
@ -1756,12 +1862,13 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
|
|
||||||
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
||||||
{
|
{
|
||||||
POINTER_NEW_UPDATE pointerNew;
|
POINTER_NEW_UPDATE pointerNew = { 0 };
|
||||||
POINTER_COLOR_UPDATE* pointerColor;
|
POINTER_COLOR_UPDATE* pointerColor = { 0 };
|
||||||
POINTER_CACHED_UPDATE pointerCached;
|
POINTER_CACHED_UPDATE pointerCached = { 0 };
|
||||||
SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* msg =
|
const SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* msg =
|
||||||
(SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*)message->wParam;
|
(const SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*)message->wParam;
|
||||||
ZeroMemory(&pointerNew, sizeof(POINTER_NEW_UPDATE));
|
|
||||||
|
WINPR_ASSERT(msg);
|
||||||
pointerNew.xorBpp = 24;
|
pointerNew.xorBpp = 24;
|
||||||
pointerColor = &(pointerNew.colorPtrAttr);
|
pointerColor = &(pointerNew.colorPtrAttr);
|
||||||
pointerColor->cacheIndex = 0;
|
pointerColor->cacheIndex = 0;
|
||||||
@ -1786,8 +1893,10 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
|
|
||||||
case SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID:
|
case SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID:
|
||||||
{
|
{
|
||||||
SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES* msg =
|
const SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES* msg =
|
||||||
(SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES*)message->wParam;
|
(const SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES*)message->wParam;
|
||||||
|
|
||||||
|
WINPR_ASSERT(msg);
|
||||||
|
|
||||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||||
{
|
{
|
||||||
@ -1801,8 +1910,8 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
|
|
||||||
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
||||||
{
|
{
|
||||||
SHADOW_MSG_OUT_AUDIO_OUT_VOLUME* msg =
|
const SHADOW_MSG_OUT_AUDIO_OUT_VOLUME* msg =
|
||||||
(SHADOW_MSG_OUT_AUDIO_OUT_VOLUME*)message->wParam;
|
(const SHADOW_MSG_OUT_AUDIO_OUT_VOLUME*)message->wParam;
|
||||||
|
|
||||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||||
{
|
{
|
||||||
@ -1824,13 +1933,14 @@ static int shadow_client_subsystem_process_message(rdpShadowClient* client, wMes
|
|||||||
static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
||||||
{
|
{
|
||||||
rdpShadowClient* client = (rdpShadowClient*)arg;
|
rdpShadowClient* client = (rdpShadowClient*)arg;
|
||||||
|
BOOL rc;
|
||||||
DWORD status;
|
DWORD status;
|
||||||
DWORD nCount;
|
DWORD nCount;
|
||||||
wMessage message;
|
wMessage message;
|
||||||
wMessage pointerPositionMsg;
|
wMessage pointerPositionMsg;
|
||||||
wMessage pointerAlphaMsg;
|
wMessage pointerAlphaMsg;
|
||||||
wMessage audioVolumeMsg;
|
wMessage audioVolumeMsg;
|
||||||
HANDLE events[32];
|
HANDLE events[32] = { 0 };
|
||||||
HANDLE ChannelEvent;
|
HANDLE ChannelEvent;
|
||||||
void* UpdateSubscriber;
|
void* UpdateSubscriber;
|
||||||
HANDLE UpdateEvent;
|
HANDLE UpdateEvent;
|
||||||
@ -1839,22 +1949,35 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
|||||||
rdpSettings* settings;
|
rdpSettings* settings;
|
||||||
rdpShadowServer* server;
|
rdpShadowServer* server;
|
||||||
rdpShadowSubsystem* subsystem;
|
rdpShadowSubsystem* subsystem;
|
||||||
wMessageQueue* MsgQueue = client->MsgQueue;
|
wMessageQueue* MsgQueue;
|
||||||
/* This should only be visited in client thread */
|
/* This should only be visited in client thread */
|
||||||
SHADOW_GFX_STATUS gfxstatus;
|
SHADOW_GFX_STATUS gfxstatus = { 0 };
|
||||||
gfxstatus.gfxOpened = FALSE;
|
|
||||||
gfxstatus.gfxSurfaceCreated = FALSE;
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
|
MsgQueue = client->MsgQueue;
|
||||||
|
WINPR_ASSERT(MsgQueue);
|
||||||
|
|
||||||
server = client->server;
|
server = client->server;
|
||||||
|
WINPR_ASSERT(server);
|
||||||
subsystem = server->subsystem;
|
subsystem = server->subsystem;
|
||||||
context = (rdpContext*)client;
|
context = (rdpContext*)client;
|
||||||
peer = context->peer;
|
peer = context->peer;
|
||||||
|
WINPR_ASSERT(peer);
|
||||||
|
|
||||||
settings = peer->settings;
|
settings = peer->settings;
|
||||||
|
WINPR_ASSERT(settings);
|
||||||
|
|
||||||
peer->Capabilities = shadow_client_capabilities;
|
peer->Capabilities = shadow_client_capabilities;
|
||||||
peer->PostConnect = shadow_client_post_connect;
|
peer->PostConnect = shadow_client_post_connect;
|
||||||
peer->Activate = shadow_client_activate;
|
peer->Activate = shadow_client_activate;
|
||||||
peer->Logon = shadow_client_logon;
|
peer->Logon = shadow_client_logon;
|
||||||
shadow_input_register_callbacks(peer->input);
|
shadow_input_register_callbacks(peer->input);
|
||||||
peer->Initialize(peer);
|
|
||||||
|
rc = peer->Initialize(peer);
|
||||||
|
WINPR_ASSERT(rc);
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer->update);
|
||||||
peer->update->RefreshRect = shadow_client_refresh_rect;
|
peer->update->RefreshRect = shadow_client_refresh_rect;
|
||||||
peer->update->SuppressOutput = shadow_client_suppress_output;
|
peer->update->SuppressOutput = shadow_client_suppress_output;
|
||||||
peer->update->SurfaceFrameAcknowledge = shadow_client_surface_frame_acknowledge;
|
peer->update->SurfaceFrameAcknowledge = shadow_client_surface_frame_acknowledge;
|
||||||
@ -1868,11 +1991,18 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
UpdateEvent = shadow_multiclient_getevent(UpdateSubscriber);
|
UpdateEvent = shadow_multiclient_getevent(UpdateSubscriber);
|
||||||
ChannelEvent = WTSVirtualChannelManagerGetEventHandle(client->vcm);
|
WINPR_ASSERT(UpdateEvent);
|
||||||
|
|
||||||
|
ChannelEvent = WTSVirtualChannelManagerGetEventHandle(client->vcm);
|
||||||
|
WINPR_ASSERT(ChannelEvent);
|
||||||
|
|
||||||
|
rc = freerdp_settings_set_bool(settings, FreeRDP_UnicodeInput, TRUE);
|
||||||
|
WINPR_ASSERT(rc);
|
||||||
|
rc = freerdp_settings_set_bool(settings, FreeRDP_HasHorizontalWheel, TRUE);
|
||||||
|
WINPR_ASSERT(rc);
|
||||||
|
rc = freerdp_settings_set_bool(settings, FreeRDP_HasExtendedMouseEvent, TRUE);
|
||||||
|
WINPR_ASSERT(rc);
|
||||||
|
|
||||||
freerdp_settings_set_bool(settings, FreeRDP_UnicodeInput, TRUE);
|
|
||||||
freerdp_settings_set_bool(settings, FreeRDP_HasHorizontalWheel, TRUE);
|
|
||||||
freerdp_settings_set_bool(settings, FreeRDP_HasExtendedMouseEvent, TRUE);
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
nCount = 0;
|
nCount = 0;
|
||||||
@ -1945,6 +2075,7 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
|||||||
(void)shadow_multiclient_consume(UpdateSubscriber);
|
(void)shadow_multiclient_consume(UpdateSubscriber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WINPR_ASSERT(peer->CheckFileDescriptor);
|
||||||
if (!peer->CheckFileDescriptor(peer))
|
if (!peer->CheckFileDescriptor(peer))
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "Failed to check FreeRDP file descriptor");
|
WLog_ERR(TAG, "Failed to check FreeRDP file descriptor");
|
||||||
@ -1992,9 +2123,11 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
|||||||
WLog_WARN(TAG, "Failed to open GraphicsPipeline");
|
WLog_WARN(TAG, "Failed to open GraphicsPipeline");
|
||||||
settings->SupportGraphicsPipeline = FALSE;
|
settings->SupportGraphicsPipeline = FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
gfxstatus.gfxOpened = TRUE;
|
{
|
||||||
WLog_INFO(TAG, "Gfx Pipeline Opened");
|
gfxstatus.gfxOpened = TRUE;
|
||||||
|
WLog_INFO(TAG, "Gfx Pipeline Opened");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -2036,19 +2169,19 @@ static DWORD WINAPI shadow_client_thread(LPVOID arg)
|
|||||||
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
||||||
/* Abandon previous message */
|
/* Abandon previous message */
|
||||||
shadow_client_free_queued_message(&pointerPositionMsg);
|
shadow_client_free_queued_message(&pointerPositionMsg);
|
||||||
CopyMemory(&pointerPositionMsg, &message, sizeof(wMessage));
|
pointerPositionMsg = message;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
||||||
/* Abandon previous message */
|
/* Abandon previous message */
|
||||||
shadow_client_free_queued_message(&pointerAlphaMsg);
|
shadow_client_free_queued_message(&pointerAlphaMsg);
|
||||||
CopyMemory(&pointerAlphaMsg, &message, sizeof(wMessage));
|
pointerAlphaMsg = message;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
||||||
/* Abandon previous message */
|
/* Abandon previous message */
|
||||||
shadow_client_free_queued_message(&audioVolumeMsg);
|
shadow_client_free_queued_message(&audioVolumeMsg);
|
||||||
CopyMemory(&audioVolumeMsg, &message, sizeof(wMessage));
|
audioVolumeMsg = message;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -2105,7 +2238,10 @@ fail:
|
|||||||
WLog_WARN(TAG, "GFX release surface failure!");
|
WLog_WARN(TAG, "GFX release surface failure!");
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)client->rdpgfx->Close(client->rdpgfx);
|
WINPR_ASSERT(client->rdpgfx);
|
||||||
|
WINPR_ASSERT(client->rdpgfx->Close);
|
||||||
|
rc = client->rdpgfx->Close(client->rdpgfx);
|
||||||
|
WINPR_ASSERT(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
shadow_client_channels_free(client);
|
shadow_client_channels_free(client);
|
||||||
@ -2122,6 +2258,7 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
WINPR_ASSERT(peer->Disconnect);
|
||||||
peer->Disconnect(peer);
|
peer->Disconnect(peer);
|
||||||
freerdp_peer_context_free(peer);
|
freerdp_peer_context_free(peer);
|
||||||
freerdp_peer_free(peer);
|
freerdp_peer_free(peer);
|
||||||
@ -2138,16 +2275,20 @@ BOOL shadow_client_accepted(freerdp_listener* listener, freerdp_peer* peer)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
server = (rdpShadowServer*)listener->info;
|
server = (rdpShadowServer*)listener->info;
|
||||||
|
WINPR_ASSERT(server);
|
||||||
|
|
||||||
peer->ContextExtra = (void*)server;
|
peer->ContextExtra = (void*)server;
|
||||||
peer->ContextSize = sizeof(rdpShadowClient);
|
peer->ContextSize = sizeof(rdpShadowClient);
|
||||||
peer->ContextNew = shadow_client_context_new;
|
peer->ContextNew = shadow_client_context_new;
|
||||||
peer->ContextFree = shadow_client_context_free;
|
peer->ContextFree = shadow_client_context_free;
|
||||||
peer->settings = freerdp_settings_clone(server->settings);
|
peer->settings = freerdp_settings_clone(server->settings);
|
||||||
|
WINPR_ASSERT(peer->settings);
|
||||||
|
|
||||||
if (!freerdp_peer_context_new(peer))
|
if (!freerdp_peer_context_new(peer))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
client = (rdpShadowClient*)peer->context;
|
client = (rdpShadowClient*)peer->context;
|
||||||
|
WINPR_ASSERT(client);
|
||||||
|
|
||||||
if (!(client->thread = CreateThread(NULL, 0, shadow_client_thread, client, 0, NULL)))
|
if (!(client->thread = CreateThread(NULL, 0, shadow_client_thread, client, 0, NULL)))
|
||||||
{
|
{
|
||||||
@ -2166,18 +2307,26 @@ BOOL shadow_client_accepted(freerdp_listener* listener, freerdp_peer* peer)
|
|||||||
|
|
||||||
static void shadow_msg_out_addref(wMessage* message)
|
static void shadow_msg_out_addref(wMessage* message)
|
||||||
{
|
{
|
||||||
SHADOW_MSG_OUT* msg = (SHADOW_MSG_OUT*)message->wParam;
|
SHADOW_MSG_OUT* msg;
|
||||||
|
|
||||||
|
WINPR_ASSERT(message);
|
||||||
|
msg = (SHADOW_MSG_OUT*)message->wParam;
|
||||||
|
WINPR_ASSERT(msg);
|
||||||
|
|
||||||
InterlockedIncrement(&(msg->refCount));
|
InterlockedIncrement(&(msg->refCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shadow_msg_out_release(wMessage* message)
|
static void shadow_msg_out_release(wMessage* message)
|
||||||
{
|
{
|
||||||
SHADOW_MSG_OUT* msg = (SHADOW_MSG_OUT*)message->wParam;
|
SHADOW_MSG_OUT* msg;
|
||||||
|
|
||||||
|
WINPR_ASSERT(message);
|
||||||
|
msg = (SHADOW_MSG_OUT*)message->wParam;
|
||||||
|
WINPR_ASSERT(msg);
|
||||||
|
|
||||||
if (InterlockedDecrement(&(msg->refCount)) <= 0)
|
if (InterlockedDecrement(&(msg->refCount)) <= 0)
|
||||||
{
|
{
|
||||||
if (msg->Free)
|
IFCALL(msg->Free, message->id, msg);
|
||||||
msg->Free(message->id, msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2189,6 +2338,7 @@ static BOOL shadow_client_dispatch_msg(rdpShadowClient* client, wMessage* messag
|
|||||||
/* Add reference when it is posted */
|
/* Add reference when it is posted */
|
||||||
shadow_msg_out_addref(message);
|
shadow_msg_out_addref(message);
|
||||||
|
|
||||||
|
WINPR_ASSERT(client->MsgQueue);
|
||||||
if (MessageQueue_Dispatch(client->MsgQueue, message))
|
if (MessageQueue_Dispatch(client->MsgQueue, message))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
@ -2218,6 +2368,10 @@ int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 t
|
|||||||
rdpShadowClient* client = NULL;
|
rdpShadowClient* client = NULL;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
size_t index = 0;
|
size_t index = 0;
|
||||||
|
|
||||||
|
WINPR_ASSERT(server);
|
||||||
|
WINPR_ASSERT(msg);
|
||||||
|
|
||||||
message.context = context;
|
message.context = context;
|
||||||
message.id = type;
|
message.id = type;
|
||||||
message.wParam = (void*)msg;
|
message.wParam = (void*)msg;
|
||||||
@ -2226,6 +2380,8 @@ int shadow_client_boardcast_msg(rdpShadowServer* server, void* context, UINT32 t
|
|||||||
/* First add reference as we reference it in this function.
|
/* First add reference as we reference it in this function.
|
||||||
* Therefore it would not be free'ed during post. */
|
* Therefore it would not be free'ed during post. */
|
||||||
shadow_msg_out_addref(&message);
|
shadow_msg_out_addref(&message);
|
||||||
|
|
||||||
|
WINPR_ASSERT(server->clients);
|
||||||
ArrayList_Lock(server->clients);
|
ArrayList_Lock(server->clients);
|
||||||
|
|
||||||
for (index = 0; index < ArrayList_Count(server->clients); index++)
|
for (index = 0; index < ArrayList_Count(server->clients); index++)
|
||||||
@ -2249,6 +2405,10 @@ int shadow_client_boardcast_quit(rdpShadowServer* server, int nExitCode)
|
|||||||
wMessageQueue* queue = NULL;
|
wMessageQueue* queue = NULL;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
size_t index = 0;
|
size_t index = 0;
|
||||||
|
|
||||||
|
WINPR_ASSERT(server);
|
||||||
|
WINPR_ASSERT(server->clients);
|
||||||
|
|
||||||
ArrayList_Lock(server->clients);
|
ArrayList_Lock(server->clients);
|
||||||
|
|
||||||
for (index = 0; index < ArrayList_Count(server->clients); index++)
|
for (index = 0; index < ArrayList_Count(server->clients); index++)
|
||||||
|
Loading…
Reference in New Issue
Block a user