BOOL shadow_client_refresh_rect(rdpShadowClient* client, BYTE count, RECTANGLE_16* areas) { wMessage message = { 0 }; SHADOW_MSG_IN_REFRESH_OUTPUT* wParam; wMessagePipe* MsgPipe = client->subsystem->MsgPipe; if (count && !areas) return FALSE; if (!(wParam = (SHADOW_MSG_IN_REFRESH_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_REFRESH_OUTPUT)))) return FALSE; wParam->numRects = (UINT32) count; if (wParam->numRects) { wParam->rects = (RECTANGLE_16*) calloc(wParam->numRects, sizeof(RECTANGLE_16)); if (!wParam->rects) { free (wParam); return FALSE; } shadow_client_convert_rects(client, wParam->rects, areas, wParam->numRects); } message.id = SHADOW_MSG_IN_REFRESH_OUTPUT_ID; message.wParam = (void*) wParam; message.lParam = NULL; message.context = (void*) client; message.Free = shadow_client_message_free; return MessageQueue_Dispatch(MsgPipe->In, &message); }
static UINT VCAPITYPE FreeRDP_VirtualChannelWriteEx(LPVOID pInitHandle, DWORD openHandle, LPVOID pData, ULONG dataLength, LPVOID pUserData) { rdpChannels* channels = NULL; CHANNEL_INIT_DATA* pChannelInitData = NULL; CHANNEL_OPEN_DATA* pChannelOpenData = NULL; CHANNEL_OPEN_EVENT* pChannelOpenEvent = NULL; wMessage message; if (!pInitHandle) return CHANNEL_RC_BAD_INIT_HANDLE; pChannelInitData = (CHANNEL_INIT_DATA*) pInitHandle; channels = pChannelInitData->channels; if (!channels) return CHANNEL_RC_BAD_CHANNEL_HANDLE; pChannelOpenData = HashTable_GetItemValue(channels->openHandles, (void*)(UINT_PTR) openHandle); if (!pChannelOpenData) return CHANNEL_RC_BAD_CHANNEL_HANDLE; if (!channels->connected) return CHANNEL_RC_NOT_CONNECTED; if (!pData) return CHANNEL_RC_NULL_DATA; if (!dataLength) return CHANNEL_RC_ZERO_LENGTH; if (pChannelOpenData->flags != 2) return CHANNEL_RC_NOT_OPEN; pChannelOpenEvent = (CHANNEL_OPEN_EVENT*) malloc(sizeof(CHANNEL_OPEN_EVENT)); if (!pChannelOpenEvent) return CHANNEL_RC_NO_MEMORY; pChannelOpenEvent->Data = pData; pChannelOpenEvent->DataLength = dataLength; pChannelOpenEvent->UserData = pUserData; pChannelOpenEvent->pChannelOpenData = pChannelOpenData; message.context = channels; message.id = 0; message.wParam = pChannelOpenEvent; message.lParam = NULL; message.Free = channel_queue_message_free; if (!MessageQueue_Dispatch(channels->queue, &message)) { channel_queue_message_free(&message); return CHANNEL_RC_NO_MEMORY; } return CHANNEL_RC_OK; }
void MessageQueue_Post(wMessageQueue* queue, void* context, UINT32 type, void* wParam, void* lParam) { wMessage message; message.context = context; message.id = type; message.wParam = wParam; message.lParam = lParam; MessageQueue_Dispatch(queue, &message); }
static BOOL shadow_client_refresh_request(rdpShadowClient* client) { wMessage message = { 0 }; wMessagePipe* MsgPipe = client->subsystem->MsgPipe; message.id = SHADOW_MSG_IN_REFRESH_REQUEST_ID; message.wParam = NULL; message.lParam = NULL; message.context = (void*) client; message.Free = NULL; return MessageQueue_Dispatch(MsgPipe->In, &message); }
static BOOL shadow_client_dispatch_msg(rdpShadowClient* client, wMessage* message) { /* Add reference when it is posted */ shadow_msg_out_addref(message); if (MessageQueue_Dispatch(client->MsgQueue, message)) { return TRUE; } else { /* Release the reference since post failed */ shadow_msg_out_release(message); return FALSE; } }
BOOL shadow_client_suppress_output(rdpShadowClient* client, BYTE allow, RECTANGLE_16* area) { wMessage message = { 0 }; SHADOW_MSG_IN_SUPPRESS_OUTPUT* wParam; wMessagePipe* MsgPipe = client->subsystem->MsgPipe; wParam = (SHADOW_MSG_IN_SUPPRESS_OUTPUT*) calloc(1, sizeof(SHADOW_MSG_IN_SUPPRESS_OUTPUT)); if (!wParam) return FALSE; wParam->allow = (UINT32) allow; if (area) shadow_client_convert_rects(client, &(wParam->rect), area, 1); message.id = SHADOW_MSG_IN_SUPPRESS_OUTPUT_ID; message.wParam = (void*) wParam; message.lParam = NULL; message.context = (void*) client; message.Free = shadow_client_message_free; return MessageQueue_Dispatch(MsgPipe->In, &message); }