mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
server/shadow: Integrate comment from @hardening: use switch to handle different message id.
This commit is contained in:
@@ -452,48 +452,56 @@ int mac_shadow_screen_grab(macShadowSubsystem* subsystem)
|
||||
|
||||
int mac_shadow_subsystem_process_message(macShadowSubsystem* subsystem, wMessage* message)
|
||||
{
|
||||
if (message->id == SHADOW_MSG_IN_REFRESH_OUTPUT_ID)
|
||||
switch(message->id)
|
||||
{
|
||||
UINT32 index;
|
||||
SHADOW_MSG_IN_REFRESH_OUTPUT* msg = (SHADOW_MSG_IN_REFRESH_OUTPUT*) message->wParam;
|
||||
|
||||
if (msg->numRects)
|
||||
case SHADOW_MSG_IN_REFRESH_OUTPUT_ID:
|
||||
{
|
||||
for (index = 0; index < msg->numRects; index++)
|
||||
UINT32 index;
|
||||
SHADOW_MSG_IN_REFRESH_OUTPUT* msg = (SHADOW_MSG_IN_REFRESH_OUTPUT*) message->wParam;
|
||||
|
||||
if (msg->numRects)
|
||||
{
|
||||
for (index = 0; index < msg->numRects; index++)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &msg->rects[index]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RECTANGLE_16 refreshRect;
|
||||
|
||||
refreshRect.left = 0;
|
||||
refreshRect.top = 0;
|
||||
refreshRect.right = subsystem->width;
|
||||
refreshRect.bottom = subsystem->height;
|
||||
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &refreshRect);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID:
|
||||
{
|
||||
SHADOW_MSG_IN_SUPPRESS_OUTPUT* msg = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) message->wParam;
|
||||
|
||||
subsystem->suppressOutput = (msg->allow) ? FALSE : TRUE;
|
||||
|
||||
if (msg->allow)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &msg->rects[index]);
|
||||
&(subsystem->invalidRegion), &(msg->rect));
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
RECTANGLE_16 refreshRect;
|
||||
|
||||
refreshRect.left = 0;
|
||||
refreshRect.top = 0;
|
||||
refreshRect.right = subsystem->width;
|
||||
refreshRect.bottom = subsystem->height;
|
||||
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &refreshRect);
|
||||
}
|
||||
default:
|
||||
WLog_ERR(TAG, "Unknown message id: %u", message->id);
|
||||
break;
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID)
|
||||
{
|
||||
SHADOW_MSG_IN_SUPPRESS_OUTPUT* msg = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) message->wParam;
|
||||
|
||||
subsystem->suppressOutput = (msg->allow) ? FALSE : TRUE;
|
||||
|
||||
if (msg->allow)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &(msg->rect));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (message->Free)
|
||||
message->Free(message);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -350,14 +350,21 @@ void x11_shadow_input_extended_mouse_event(x11ShadowSubsystem* subsystem, UINT16
|
||||
|
||||
static void x11_shadow_message_free(UINT32 id, SHADOW_MSG_OUT* msg)
|
||||
{
|
||||
if (id == SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID)
|
||||
switch(id)
|
||||
{
|
||||
free(msg);
|
||||
}
|
||||
else if (id == SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID)
|
||||
{
|
||||
free(((SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*)msg)->pixels);
|
||||
free(msg);
|
||||
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
||||
free(msg);
|
||||
break;
|
||||
|
||||
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
||||
free(((SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*)msg)->pixels);
|
||||
free(msg);
|
||||
break;
|
||||
|
||||
default:
|
||||
WLog_ERR(TAG, "Unknown message id: %u", id);
|
||||
free(msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -743,43 +750,51 @@ int x11_shadow_screen_grab(x11ShadowSubsystem* subsystem)
|
||||
|
||||
int x11_shadow_subsystem_process_message(x11ShadowSubsystem* subsystem, wMessage* message)
|
||||
{
|
||||
if (message->id == SHADOW_MSG_IN_REFRESH_OUTPUT_ID)
|
||||
switch(message->id)
|
||||
{
|
||||
UINT32 index;
|
||||
SHADOW_MSG_IN_REFRESH_OUTPUT* msg = (SHADOW_MSG_IN_REFRESH_OUTPUT*) message->wParam;
|
||||
|
||||
if (msg->numRects)
|
||||
case SHADOW_MSG_IN_REFRESH_OUTPUT_ID:
|
||||
{
|
||||
for (index = 0; index < msg->numRects; index++)
|
||||
UINT32 index;
|
||||
SHADOW_MSG_IN_REFRESH_OUTPUT* msg = (SHADOW_MSG_IN_REFRESH_OUTPUT*) message->wParam;
|
||||
|
||||
if (msg->numRects)
|
||||
{
|
||||
for (index = 0; index < msg->numRects; index++)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &msg->rects[index]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RECTANGLE_16 refreshRect;
|
||||
|
||||
refreshRect.left = 0;
|
||||
refreshRect.top = 0;
|
||||
refreshRect.right = subsystem->width;
|
||||
refreshRect.bottom = subsystem->height;
|
||||
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &refreshRect);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID:
|
||||
{
|
||||
SHADOW_MSG_IN_SUPPRESS_OUTPUT* msg = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) message->wParam;
|
||||
|
||||
subsystem->suppressOutput = (msg->allow) ? FALSE : TRUE;
|
||||
|
||||
if (msg->allow)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &msg->rects[index]);
|
||||
&(subsystem->invalidRegion), &(msg->rect));
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
RECTANGLE_16 refreshRect;
|
||||
|
||||
refreshRect.left = 0;
|
||||
refreshRect.top = 0;
|
||||
refreshRect.right = subsystem->width;
|
||||
refreshRect.bottom = subsystem->height;
|
||||
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &refreshRect);
|
||||
}
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID)
|
||||
{
|
||||
SHADOW_MSG_IN_SUPPRESS_OUTPUT* msg = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) message->wParam;
|
||||
|
||||
subsystem->suppressOutput = (msg->allow) ? FALSE : TRUE;
|
||||
|
||||
if (msg->allow)
|
||||
{
|
||||
region16_union_rect(&(subsystem->invalidRegion),
|
||||
&(subsystem->invalidRegion), &(msg->rect));
|
||||
}
|
||||
default:
|
||||
WLog_ERR(TAG, "Unknown message id: %u", message->id);
|
||||
break;
|
||||
}
|
||||
|
||||
if (message->Free)
|
||||
|
||||
@@ -165,17 +165,21 @@ void shadow_client_context_free(freerdp_peer* peer, rdpShadowClient* client)
|
||||
|
||||
void shadow_client_message_free(wMessage* message)
|
||||
{
|
||||
if (message->id == SHADOW_MSG_IN_REFRESH_OUTPUT_ID)
|
||||
switch(message->id)
|
||||
{
|
||||
SHADOW_MSG_IN_REFRESH_OUTPUT* wParam = (SHADOW_MSG_IN_REFRESH_OUTPUT*) message->wParam;
|
||||
case SHADOW_MSG_IN_REFRESH_OUTPUT_ID:
|
||||
free(((SHADOW_MSG_IN_REFRESH_OUTPUT*)message->wParam)->rects);
|
||||
free(message->wParam);
|
||||
break;
|
||||
|
||||
free(wParam->rects);
|
||||
free(wParam);
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID)
|
||||
{
|
||||
SHADOW_MSG_IN_SUPPRESS_OUTPUT* wParam = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) message->wParam;
|
||||
free(wParam);
|
||||
case SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID:
|
||||
free(message->wParam);
|
||||
break;
|
||||
|
||||
default:
|
||||
WLog_ERR(TAG, "Unknown message id: %u", message->id);
|
||||
free(message->wParam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -894,73 +898,83 @@ int shadow_client_subsystem_process_message(rdpShadowClient* client, wMessage* m
|
||||
|
||||
/* FIXME: the pointer updates appear to be broken when used with bulk compression and mstsc */
|
||||
|
||||
if (message->id == SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID)
|
||||
switch(message->id)
|
||||
{
|
||||
POINTER_POSITION_UPDATE pointerPosition;
|
||||
SHADOW_MSG_OUT_POINTER_POSITION_UPDATE* msg = (SHADOW_MSG_OUT_POINTER_POSITION_UPDATE*) message->wParam;
|
||||
|
||||
pointerPosition.xPos = msg->xPos;
|
||||
pointerPosition.yPos = msg->yPos;
|
||||
|
||||
if (client->activated)
|
||||
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
||||
{
|
||||
if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY))
|
||||
POINTER_POSITION_UPDATE pointerPosition;
|
||||
SHADOW_MSG_OUT_POINTER_POSITION_UPDATE* msg = (SHADOW_MSG_OUT_POINTER_POSITION_UPDATE*) message->wParam;
|
||||
|
||||
pointerPosition.xPos = msg->xPos;
|
||||
pointerPosition.yPos = msg->yPos;
|
||||
|
||||
if (client->activated)
|
||||
{
|
||||
IFCALL(update->pointer->PointerPosition, context, &pointerPosition);
|
||||
if ((msg->xPos != client->pointerX) || (msg->yPos != client->pointerY))
|
||||
{
|
||||
IFCALL(update->pointer->PointerPosition, context, &pointerPosition);
|
||||
|
||||
client->pointerX = msg->xPos;
|
||||
client->pointerY = msg->yPos;
|
||||
client->pointerX = msg->xPos;
|
||||
client->pointerY = msg->yPos;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID)
|
||||
{
|
||||
POINTER_NEW_UPDATE pointerNew;
|
||||
POINTER_COLOR_UPDATE* pointerColor;
|
||||
POINTER_CACHED_UPDATE pointerCached;
|
||||
SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* msg = (SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*) message->wParam;
|
||||
|
||||
ZeroMemory(&pointerNew, sizeof(POINTER_NEW_UPDATE));
|
||||
|
||||
pointerNew.xorBpp = 24;
|
||||
pointerColor = &(pointerNew.colorPtrAttr);
|
||||
|
||||
pointerColor->cacheIndex = 0;
|
||||
pointerColor->xPos = msg->xHot;
|
||||
pointerColor->yPos = msg->yHot;
|
||||
pointerColor->width = msg->width;
|
||||
pointerColor->height = msg->height;
|
||||
|
||||
pointerCached.cacheIndex = pointerColor->cacheIndex;
|
||||
|
||||
if (client->activated)
|
||||
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
||||
{
|
||||
shadow_client_convert_alpha_pointer_data(msg->pixels, msg->premultiplied,
|
||||
msg->width, msg->height, pointerColor);
|
||||
POINTER_NEW_UPDATE pointerNew;
|
||||
POINTER_COLOR_UPDATE* pointerColor;
|
||||
POINTER_CACHED_UPDATE pointerCached;
|
||||
SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE* msg = (SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE*) message->wParam;
|
||||
|
||||
IFCALL(update->pointer->PointerNew, context, &pointerNew);
|
||||
IFCALL(update->pointer->PointerCached, context, &pointerCached);
|
||||
ZeroMemory(&pointerNew, sizeof(POINTER_NEW_UPDATE));
|
||||
|
||||
free(pointerColor->xorMaskData);
|
||||
free(pointerColor->andMaskData);
|
||||
pointerNew.xorBpp = 24;
|
||||
pointerColor = &(pointerNew.colorPtrAttr);
|
||||
|
||||
pointerColor->cacheIndex = 0;
|
||||
pointerColor->xPos = msg->xHot;
|
||||
pointerColor->yPos = msg->yHot;
|
||||
pointerColor->width = msg->width;
|
||||
pointerColor->height = msg->height;
|
||||
|
||||
pointerCached.cacheIndex = pointerColor->cacheIndex;
|
||||
|
||||
if (client->activated)
|
||||
{
|
||||
shadow_client_convert_alpha_pointer_data(msg->pixels, msg->premultiplied,
|
||||
msg->width, msg->height, pointerColor);
|
||||
|
||||
IFCALL(update->pointer->PointerNew, context, &pointerNew);
|
||||
IFCALL(update->pointer->PointerCached, context, &pointerCached);
|
||||
|
||||
free(pointerColor->xorMaskData);
|
||||
free(pointerColor->andMaskData);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID)
|
||||
{
|
||||
SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES* msg = (SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES*) message->wParam;
|
||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||
case SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES_ID:
|
||||
{
|
||||
client->rdpsnd->src_format = msg->audio_format;
|
||||
IFCALL(client->rdpsnd->SendSamples, client->rdpsnd, msg->buf, msg->nFrames, msg->wTimestamp);
|
||||
SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES* msg = (SHADOW_MSG_OUT_AUDIO_OUT_SAMPLES*) message->wParam;
|
||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||
{
|
||||
client->rdpsnd->src_format = msg->audio_format;
|
||||
IFCALL(client->rdpsnd->SendSamples, client->rdpsnd, msg->buf, msg->nFrames, msg->wTimestamp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (message->id == SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID)
|
||||
{
|
||||
SHADOW_MSG_OUT_AUDIO_OUT_VOLUME* msg = (SHADOW_MSG_OUT_AUDIO_OUT_VOLUME*) message->wParam;
|
||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
||||
{
|
||||
IFCALL(client->rdpsnd->SetVolume, client->rdpsnd, msg->left, msg->right);
|
||||
SHADOW_MSG_OUT_AUDIO_OUT_VOLUME* msg = (SHADOW_MSG_OUT_AUDIO_OUT_VOLUME*) message->wParam;
|
||||
if (client->activated && client->rdpsnd && client->rdpsnd->Activated)
|
||||
{
|
||||
IFCALL(client->rdpsnd->SetVolume, client->rdpsnd, msg->left, msg->right);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
WLog_ERR(TAG, "Unknown message id: %u", message->id);
|
||||
break;
|
||||
}
|
||||
|
||||
shadow_client_free_queued_message(message);
|
||||
@@ -1090,27 +1104,30 @@ void* shadow_client_thread(rdpShadowClient* client)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (message.id == SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID)
|
||||
|
||||
switch(message.id)
|
||||
{
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&pointerPositionMsg);
|
||||
CopyMemory(&pointerPositionMsg, &message, sizeof(wMessage));
|
||||
}
|
||||
else if (message.id == SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID)
|
||||
{
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&pointerAlphaMsg);
|
||||
CopyMemory(&pointerAlphaMsg, &message, sizeof(wMessage));
|
||||
}
|
||||
else if (message.id == SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID)
|
||||
{
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&audioVolumeMsg);
|
||||
CopyMemory(&audioVolumeMsg, &message, sizeof(wMessage));
|
||||
}
|
||||
else
|
||||
{
|
||||
shadow_client_subsystem_process_message(client, &message);
|
||||
case SHADOW_MSG_OUT_POINTER_POSITION_UPDATE_ID:
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&pointerPositionMsg);
|
||||
CopyMemory(&pointerPositionMsg, &message, sizeof(wMessage));
|
||||
break;
|
||||
|
||||
case SHADOW_MSG_OUT_POINTER_ALPHA_UPDATE_ID:
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&pointerAlphaMsg);
|
||||
CopyMemory(&pointerAlphaMsg, &message, sizeof(wMessage));
|
||||
break;
|
||||
|
||||
case SHADOW_MSG_OUT_AUDIO_OUT_VOLUME_ID:
|
||||
/* Abandon previous message */
|
||||
shadow_client_free_queued_message(&audioVolumeMsg);
|
||||
CopyMemory(&audioVolumeMsg, &message, sizeof(wMessage));
|
||||
break;
|
||||
|
||||
default:
|
||||
shadow_client_subsystem_process_message(client, &message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user