Blame libfreerdp/core/message.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * Asynchronous Message Queue
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 * Copyright 2017 Armin Novak <armin.novak@thincast.com>
Packit 1fb8d4
 * Copyright 2017 Thincast Technologies GmbH
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <assert.h>
Packit 1fb8d4
Packit 1fb8d4
#include "rdp.h"
Packit 1fb8d4
#include "message.h"
Packit 1fb8d4
#include "transport.h"
Packit 1fb8d4
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
#include <freerdp/freerdp.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
#include <winpr/collections.h>
Packit 1fb8d4
Packit 1fb8d4
#include "../cache/pointer.h"
Packit 1fb8d4
#include "../cache/bitmap.h"
Packit 1fb8d4
#include "../cache/palette.h"
Packit 1fb8d4
#include "../cache/glyph.h"
Packit 1fb8d4
#include "../cache/brush.h"
Packit 1fb8d4
#include "../cache/cache.h"
Packit 1fb8d4
Packit 1fb8d4
#define TAG FREERDP_TAG("core.message")
Packit 1fb8d4
Packit 1fb8d4
/* Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_BeginPaint(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, BeginPaint), NULL, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_EndPaint(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, EndPaint), NULL, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SetBounds(rdpContext* context,
Packit 1fb8d4
                                     const rdpBounds* bounds)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpBounds* wParam = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (bounds)
Packit 1fb8d4
	{
Packit 1fb8d4
		wParam = (rdpBounds*) malloc(sizeof(rdpBounds));
Packit 1fb8d4
Packit 1fb8d4
		if (!wParam)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(wParam, bounds, sizeof(rdpBounds));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SetBounds), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_Synchronize(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, Synchronize), NULL, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DesktopResize(rdpContext* context)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, DesktopResize), NULL, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_BitmapUpdate(rdpContext* context,
Packit 1fb8d4
                                        const BITMAP_UPDATE* bitmap)
Packit 1fb8d4
{
Packit 1fb8d4
	BITMAP_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !bitmap)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_bitmap_update(context, bitmap);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, BitmapUpdate), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_Palette(rdpContext* context,
Packit 1fb8d4
                                   const PALETTE_UPDATE* palette)
Packit 1fb8d4
{
Packit 1fb8d4
	PALETTE_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !palette)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_palette_update(context, palette);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, Palette), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PlaySound(rdpContext* context,
Packit 1fb8d4
                                     const PLAY_SOUND_UPDATE* playSound)
Packit 1fb8d4
{
Packit 1fb8d4
	PLAY_SOUND_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !playSound)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (PLAY_SOUND_UPDATE*) malloc(sizeof(PLAY_SOUND_UPDATE));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, playSound, sizeof(PLAY_SOUND_UPDATE));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, PlaySound), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SetKeyboardIndicators(rdpContext* context, UINT16 led_flags)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SetKeyboardIndicators), (void*)(size_t)led_flags, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SetKeyboardImeStatus(rdpContext* context, UINT16 imeId, UINT32 imeState,
Packit 1fb8d4
        UINT32 imeConvMode)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SetKeyboardImeStatus), (void*)(size_t)((imeId << 16UL) | imeState),
Packit 1fb8d4
	                         (void*)(size_t) imeConvMode);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_RefreshRect(rdpContext* context, BYTE count,
Packit 1fb8d4
                                       const RECTANGLE_16* areas)
Packit 1fb8d4
{
Packit 1fb8d4
	RECTANGLE_16* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !areas)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	lParam = (RECTANGLE_16*) calloc(count, sizeof(RECTANGLE_16));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, areas, sizeof(RECTANGLE_16) * count);
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, RefreshRect), (void*)(size_t) count, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SuppressOutput(rdpContext* context, BYTE allow,
Packit 1fb8d4
        const RECTANGLE_16* area)
Packit 1fb8d4
{
Packit 1fb8d4
	RECTANGLE_16* lParam = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (area)
Packit 1fb8d4
	{
Packit 1fb8d4
		lParam = (RECTANGLE_16*) malloc(sizeof(RECTANGLE_16));
Packit 1fb8d4
Packit 1fb8d4
		if (!lParam)
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(lParam, area, sizeof(RECTANGLE_16));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SuppressOutput), (void*)(size_t) allow, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SurfaceCommand(rdpContext* context, wStream* s)
Packit 1fb8d4
{
Packit 1fb8d4
	wStream* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !s)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = Stream_New(NULL, Stream_GetRemainingLength(s));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Copy(s, wParam, Stream_GetRemainingLength(s));
Packit 1fb8d4
	Stream_SetPosition(wParam, 0);
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SurfaceCommand), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SurfaceBits(rdpContext* context,
Packit 1fb8d4
                                       const SURFACE_BITS_COMMAND* surfaceBitsCommand)
Packit 1fb8d4
{
Packit 1fb8d4
	SURFACE_BITS_COMMAND* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !surfaceBitsCommand)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_surface_bits_command(context, surfaceBitsCommand);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SurfaceBits), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SurfaceFrameMarker(rdpContext* context,
Packit 1fb8d4
        const SURFACE_FRAME_MARKER* surfaceFrameMarker)
Packit 1fb8d4
{
Packit 1fb8d4
	SURFACE_FRAME_MARKER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !surfaceFrameMarker)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (SURFACE_FRAME_MARKER*) malloc(sizeof(SURFACE_FRAME_MARKER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, surfaceFrameMarker, sizeof(SURFACE_FRAME_MARKER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SurfaceFrameMarker), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SurfaceFrameAcknowledge(rdpContext* context, UINT32 frameId)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!context || !context->update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(Update, SurfaceFrameAcknowledge), (void*)(size_t) frameId, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Primary Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DstBlt(rdpContext* context, const DSTBLT_ORDER* dstBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	DSTBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !dstBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DSTBLT_ORDER*) malloc(sizeof(DSTBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, dstBlt, sizeof(DSTBLT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, DstBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PatBlt(rdpContext* context, PATBLT_ORDER* patBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	PATBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !patBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (PATBLT_ORDER*) malloc(sizeof(PATBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, patBlt, sizeof(PATBLT_ORDER));
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, PatBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_ScrBlt(rdpContext* context,
Packit 1fb8d4
                                  const SCRBLT_ORDER* scrBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	SCRBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !scrBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (SCRBLT_ORDER*) malloc(sizeof(SCRBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, scrBlt, sizeof(SCRBLT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, ScrBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_OpaqueRect(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const OPAQUE_RECT_ORDER* opaqueRect)
Packit 1fb8d4
{
Packit 1fb8d4
	OPAQUE_RECT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !opaqueRect)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (OPAQUE_RECT_ORDER*) malloc(sizeof(OPAQUE_RECT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, opaqueRect, sizeof(OPAQUE_RECT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, OpaqueRect), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawNineGrid(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_NINE_GRID_ORDER* drawNineGrid)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_NINE_GRID_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawNineGrid)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_NINE_GRID_ORDER*) malloc(sizeof(DRAW_NINE_GRID_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawNineGrid, sizeof(DRAW_NINE_GRID_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, DrawNineGrid), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MultiDstBlt(rdpContext* context,
Packit 1fb8d4
                                       const MULTI_DSTBLT_ORDER* multiDstBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	MULTI_DSTBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !multiDstBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MULTI_DSTBLT_ORDER*) malloc(sizeof(MULTI_DSTBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, multiDstBlt, sizeof(MULTI_DSTBLT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MultiDstBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MultiPatBlt(rdpContext* context,
Packit 1fb8d4
                                       const MULTI_PATBLT_ORDER* multiPatBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	MULTI_PATBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !multiPatBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MULTI_PATBLT_ORDER*) malloc(sizeof(MULTI_PATBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, multiPatBlt, sizeof(MULTI_PATBLT_ORDER));
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MultiPatBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MultiScrBlt(rdpContext* context,
Packit 1fb8d4
                                       const MULTI_SCRBLT_ORDER* multiScrBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	MULTI_SCRBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !multiScrBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MULTI_SCRBLT_ORDER*) malloc(sizeof(MULTI_SCRBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, multiScrBlt, sizeof(MULTI_SCRBLT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MultiScrBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MultiOpaqueRect(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const MULTI_OPAQUE_RECT_ORDER* multiOpaqueRect)
Packit 1fb8d4
{
Packit 1fb8d4
	MULTI_OPAQUE_RECT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !multiOpaqueRect)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MULTI_OPAQUE_RECT_ORDER*) malloc(sizeof(MULTI_OPAQUE_RECT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, multiOpaqueRect, sizeof(MULTI_OPAQUE_RECT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MultiOpaqueRect), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MultiDrawNineGrid(rdpContext* context,
Packit 1fb8d4
        const MULTI_DRAW_NINE_GRID_ORDER* multiDrawNineGrid)
Packit 1fb8d4
{
Packit 1fb8d4
	MULTI_DRAW_NINE_GRID_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !multiDrawNineGrid)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MULTI_DRAW_NINE_GRID_ORDER*) malloc(sizeof(MULTI_DRAW_NINE_GRID_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, multiDrawNineGrid, sizeof(MULTI_DRAW_NINE_GRID_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MultiDrawNineGrid), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_LineTo(rdpContext* context,
Packit 1fb8d4
                                  const LINE_TO_ORDER* lineTo)
Packit 1fb8d4
{
Packit 1fb8d4
	LINE_TO_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !lineTo)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (LINE_TO_ORDER*) malloc(sizeof(LINE_TO_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, lineTo, sizeof(LINE_TO_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, LineTo), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_Polyline(rdpContext* context,
Packit 1fb8d4
                                    const POLYLINE_ORDER* polyline)
Packit 1fb8d4
{
Packit 1fb8d4
	POLYLINE_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !polyline)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (POLYLINE_ORDER*) malloc(sizeof(POLYLINE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, polyline, sizeof(POLYLINE_ORDER));
Packit 1fb8d4
	wParam->points = (DELTA_POINT*) calloc(wParam->numDeltaEntries, sizeof(DELTA_POINT));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam->points)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam->points, polyline->points, sizeof(DELTA_POINT) * wParam->numDeltaEntries);
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, Polyline), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MemBlt(rdpContext* context, MEMBLT_ORDER* memBlt)
Packit 1fb8d4
{
Packit 1fb8d4
	MEMBLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !memBlt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MEMBLT_ORDER*) malloc(sizeof(MEMBLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, memBlt, sizeof(MEMBLT_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, MemBlt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_Mem3Blt(rdpContext* context, MEM3BLT_ORDER* mem3Blt)
Packit 1fb8d4
{
Packit 1fb8d4
	MEM3BLT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !mem3Blt)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (MEM3BLT_ORDER*) malloc(sizeof(MEM3BLT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, mem3Blt, sizeof(MEM3BLT_ORDER));
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, Mem3Blt), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SaveBitmap(rdpContext* context,
Packit 1fb8d4
                                      const SAVE_BITMAP_ORDER* saveBitmap)
Packit 1fb8d4
{
Packit 1fb8d4
	SAVE_BITMAP_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !saveBitmap)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (SAVE_BITMAP_ORDER*) malloc(sizeof(SAVE_BITMAP_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, saveBitmap, sizeof(SAVE_BITMAP_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, SaveBitmap), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_GlyphIndex(rdpContext* context,
Packit 1fb8d4
                                      GLYPH_INDEX_ORDER* glyphIndex)
Packit 1fb8d4
{
Packit 1fb8d4
	GLYPH_INDEX_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !glyphIndex)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (GLYPH_INDEX_ORDER*) malloc(sizeof(GLYPH_INDEX_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, glyphIndex, sizeof(GLYPH_INDEX_ORDER));
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, GlyphIndex), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_FastIndex(rdpContext* context,
Packit 1fb8d4
                                     const FAST_INDEX_ORDER* fastIndex)
Packit 1fb8d4
{
Packit 1fb8d4
	FAST_INDEX_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !fastIndex)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (FAST_INDEX_ORDER*) malloc(sizeof(FAST_INDEX_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, fastIndex, sizeof(FAST_INDEX_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, FastIndex), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_FastGlyph(rdpContext* context,
Packit 1fb8d4
                                     const FAST_GLYPH_ORDER* fastGlyph)
Packit 1fb8d4
{
Packit 1fb8d4
	FAST_GLYPH_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !fastGlyph)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (FAST_GLYPH_ORDER*) malloc(sizeof(FAST_GLYPH_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, fastGlyph, sizeof(FAST_GLYPH_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (wParam->cbData > 1)
Packit 1fb8d4
	{
Packit 1fb8d4
		wParam->glyphData.aj = (BYTE*) malloc(fastGlyph->glyphData.cb);
Packit 1fb8d4
Packit 1fb8d4
		if (!wParam->glyphData.aj)
Packit 1fb8d4
		{
Packit 1fb8d4
			free(wParam);
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(wParam->glyphData.aj, fastGlyph->glyphData.aj, fastGlyph->glyphData.cb);
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		wParam->glyphData.aj = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, FastGlyph), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PolygonSC(rdpContext* context,
Packit 1fb8d4
                                     const POLYGON_SC_ORDER* polygonSC)
Packit 1fb8d4
{
Packit 1fb8d4
	POLYGON_SC_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !polygonSC)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (POLYGON_SC_ORDER*) malloc(sizeof(POLYGON_SC_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, polygonSC, sizeof(POLYGON_SC_ORDER));
Packit 1fb8d4
	wParam->points = (DELTA_POINT*) calloc(wParam->numPoints, sizeof(DELTA_POINT));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam->points)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam->points, polygonSC, sizeof(DELTA_POINT) * wParam->numPoints);
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, PolygonSC), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PolygonCB(rdpContext* context, POLYGON_CB_ORDER* polygonCB)
Packit 1fb8d4
{
Packit 1fb8d4
	POLYGON_CB_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !polygonCB)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (POLYGON_CB_ORDER*) malloc(sizeof(POLYGON_CB_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, polygonCB, sizeof(POLYGON_CB_ORDER));
Packit 1fb8d4
	wParam->points = (DELTA_POINT*) calloc(wParam->numPoints, sizeof(DELTA_POINT));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam->points)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam->points, polygonCB, sizeof(DELTA_POINT) * wParam->numPoints);
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, PolygonCB), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_EllipseSC(rdpContext* context,
Packit 1fb8d4
                                     const ELLIPSE_SC_ORDER* ellipseSC)
Packit 1fb8d4
{
Packit 1fb8d4
	ELLIPSE_SC_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !ellipseSC)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (ELLIPSE_SC_ORDER*) malloc(sizeof(ELLIPSE_SC_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, ellipseSC, sizeof(ELLIPSE_SC_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, EllipseSC), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_EllipseCB(rdpContext* context,
Packit 1fb8d4
                                     const ELLIPSE_CB_ORDER* ellipseCB)
Packit 1fb8d4
{
Packit 1fb8d4
	ELLIPSE_CB_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !ellipseCB)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (ELLIPSE_CB_ORDER*) malloc(sizeof(ELLIPSE_CB_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, ellipseCB, sizeof(ELLIPSE_CB_ORDER));
Packit 1fb8d4
	wParam->brush.data = (BYTE*) wParam->brush.p8x8;
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PrimaryUpdate, EllipseCB), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Secondary Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheBitmap(rdpContext* context,
Packit 1fb8d4
                                       const CACHE_BITMAP_ORDER* cacheBitmapOrder)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_BITMAP_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheBitmapOrder)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_bitmap_order(context, cacheBitmapOrder);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheBitmap), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheBitmapV2(rdpContext* context,
Packit 1fb8d4
        CACHE_BITMAP_V2_ORDER* cacheBitmapV2Order)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_BITMAP_V2_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheBitmapV2Order)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_bitmap_v2_order(context, cacheBitmapV2Order);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheBitmapV2), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheBitmapV3(rdpContext* context,
Packit 1fb8d4
        CACHE_BITMAP_V3_ORDER* cacheBitmapV3Order)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_BITMAP_V3_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheBitmapV3Order)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_bitmap_v3_order(context, cacheBitmapV3Order);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheBitmapV3), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheColorTable(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CACHE_COLOR_TABLE_ORDER* cacheColorTableOrder)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_COLOR_TABLE_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheColorTableOrder)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_color_table_order(context, cacheColorTableOrder);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheColorTable), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheGlyph(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CACHE_GLYPH_ORDER* cacheGlyphOrder)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_GLYPH_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheGlyphOrder)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_glyph_order(context, cacheGlyphOrder);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheGlyph), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheGlyphV2(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CACHE_GLYPH_V2_ORDER* cacheGlyphV2Order)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_GLYPH_V2_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheGlyphV2Order)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_glyph_v2_order(context, cacheGlyphV2Order);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheGlyphV2), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CacheBrush(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CACHE_BRUSH_ORDER* cacheBrushOrder)
Packit 1fb8d4
{
Packit 1fb8d4
	CACHE_BRUSH_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !cacheBrushOrder)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_cache_brush_order(context, cacheBrushOrder);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(SecondaryUpdate, CacheBrush), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Alternate Secondary Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CreateOffscreenBitmap(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CREATE_OFFSCREEN_BITMAP_ORDER* createOffscreenBitmap)
Packit 1fb8d4
{
Packit 1fb8d4
	CREATE_OFFSCREEN_BITMAP_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !createOffscreenBitmap)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (CREATE_OFFSCREEN_BITMAP_ORDER*) malloc(sizeof(CREATE_OFFSCREEN_BITMAP_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, createOffscreenBitmap, sizeof(CREATE_OFFSCREEN_BITMAP_ORDER));
Packit 1fb8d4
	wParam->deleteList.cIndices = createOffscreenBitmap->deleteList.cIndices;
Packit 1fb8d4
	wParam->deleteList.sIndices = wParam->deleteList.cIndices;
Packit 1fb8d4
	wParam->deleteList.indices = (UINT16*) calloc(wParam->deleteList.cIndices, sizeof(UINT16));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam->deleteList.indices)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam->deleteList.indices, createOffscreenBitmap->deleteList.indices,
Packit 1fb8d4
	           wParam->deleteList.cIndices);
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, CreateOffscreenBitmap), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_SwitchSurface(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const SWITCH_SURFACE_ORDER* switchSurface)
Packit 1fb8d4
{
Packit 1fb8d4
	SWITCH_SURFACE_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !switchSurface)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (SWITCH_SURFACE_ORDER*) malloc(sizeof(SWITCH_SURFACE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, switchSurface, sizeof(SWITCH_SURFACE_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, SwitchSurface), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_CreateNineGridBitmap(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const CREATE_NINE_GRID_BITMAP_ORDER* createNineGridBitmap)
Packit 1fb8d4
{
Packit 1fb8d4
	CREATE_NINE_GRID_BITMAP_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !createNineGridBitmap)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (CREATE_NINE_GRID_BITMAP_ORDER*) malloc(sizeof(CREATE_NINE_GRID_BITMAP_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, createNineGridBitmap, sizeof(CREATE_NINE_GRID_BITMAP_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, CreateNineGridBitmap), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_FrameMarker(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const FRAME_MARKER_ORDER* frameMarker)
Packit 1fb8d4
{
Packit 1fb8d4
	FRAME_MARKER_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !frameMarker)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (FRAME_MARKER_ORDER*) malloc(sizeof(FRAME_MARKER_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, frameMarker, sizeof(FRAME_MARKER_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, FrameMarker), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_StreamBitmapFirst(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const STREAM_BITMAP_FIRST_ORDER* streamBitmapFirst)
Packit 1fb8d4
{
Packit 1fb8d4
	STREAM_BITMAP_FIRST_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !streamBitmapFirst)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (STREAM_BITMAP_FIRST_ORDER*) malloc(sizeof(STREAM_BITMAP_FIRST_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, streamBitmapFirst, sizeof(STREAM_BITMAP_FIRST_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, StreamBitmapFirst), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_StreamBitmapNext(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const STREAM_BITMAP_NEXT_ORDER* streamBitmapNext)
Packit 1fb8d4
{
Packit 1fb8d4
	STREAM_BITMAP_NEXT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !streamBitmapNext)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (STREAM_BITMAP_NEXT_ORDER*) malloc(sizeof(STREAM_BITMAP_NEXT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, streamBitmapNext, sizeof(STREAM_BITMAP_NEXT_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, StreamBitmapNext), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusFirst(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_FIRST_ORDER* drawGdiPlusFirst)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_FIRST_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusFirst)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_FIRST_ORDER*) malloc(sizeof(DRAW_GDIPLUS_FIRST_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusFirst, sizeof(DRAW_GDIPLUS_FIRST_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusFirst), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusNext(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_NEXT_ORDER* drawGdiPlusNext)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_NEXT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusNext)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_NEXT_ORDER*) malloc(sizeof(DRAW_GDIPLUS_NEXT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusNext, sizeof(DRAW_GDIPLUS_NEXT_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusNext), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusEnd(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_END_ORDER* drawGdiPlusEnd)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_END_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusEnd)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_END_ORDER*) malloc(sizeof(DRAW_GDIPLUS_END_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusEnd, sizeof(DRAW_GDIPLUS_END_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusEnd), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusCacheFirst(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_CACHE_FIRST_ORDER* drawGdiPlusCacheFirst)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_CACHE_FIRST_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusCacheFirst)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_CACHE_FIRST_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_FIRST_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusCacheFirst, sizeof(DRAW_GDIPLUS_CACHE_FIRST_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusCacheFirst), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusCacheNext(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_CACHE_NEXT_ORDER* drawGdiPlusCacheNext)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_CACHE_NEXT_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusCacheNext)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_CACHE_NEXT_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_NEXT_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusCacheNext, sizeof(DRAW_GDIPLUS_CACHE_NEXT_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusCacheNext), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_DrawGdiPlusCacheEnd(
Packit 1fb8d4
    rdpContext* context,
Packit 1fb8d4
    const DRAW_GDIPLUS_CACHE_END_ORDER* drawGdiPlusCacheEnd)
Packit 1fb8d4
{
Packit 1fb8d4
	DRAW_GDIPLUS_CACHE_END_ORDER* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !drawGdiPlusCacheEnd)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (DRAW_GDIPLUS_CACHE_END_ORDER*) malloc(sizeof(DRAW_GDIPLUS_CACHE_END_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, drawGdiPlusCacheEnd, sizeof(DRAW_GDIPLUS_CACHE_END_ORDER));
Packit 1fb8d4
	/* TODO: complete copy */
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(AltSecUpdate, DrawGdiPlusCacheEnd), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Window Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
                                        WINDOW_STATE_ORDER* windowState)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	WINDOW_STATE_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !windowState)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (WINDOW_STATE_ORDER*) malloc(sizeof(WINDOW_STATE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, WindowCreate), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL	update_message_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
                                        WINDOW_STATE_ORDER* windowState)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	WINDOW_STATE_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !windowState)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (WINDOW_STATE_ORDER*) malloc(sizeof(WINDOW_STATE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, windowState, sizeof(WINDOW_STATE_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, WindowUpdate), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
                                      WINDOW_ICON_ORDER* windowIcon)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	WINDOW_ICON_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !windowIcon)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (WINDOW_ICON_ORDER*) calloc(1, sizeof(WINDOW_ICON_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, windowIcon, sizeof(WINDOW_ICON_ORDER));
Packit 1fb8d4
	WLog_VRB(TAG,  "update_message_WindowIcon");
Packit 1fb8d4
Packit 1fb8d4
	if (windowIcon->iconInfo->cbBitsColor > 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		lParam->iconInfo->bitsColor = (BYTE*) malloc(windowIcon->iconInfo->cbBitsColor);
Packit 1fb8d4
Packit 1fb8d4
		if (!lParam->iconInfo->bitsColor)
Packit 1fb8d4
			goto out_fail;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(lParam->iconInfo->bitsColor, windowIcon->iconInfo->bitsColor,
Packit 1fb8d4
		           windowIcon->iconInfo->cbBitsColor);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (windowIcon->iconInfo->cbBitsMask > 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		lParam->iconInfo->bitsMask = (BYTE*) malloc(windowIcon->iconInfo->cbBitsMask);
Packit 1fb8d4
Packit 1fb8d4
		if (!lParam->iconInfo->bitsMask)
Packit 1fb8d4
			goto out_fail;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(lParam->iconInfo->bitsMask, windowIcon->iconInfo->bitsMask,
Packit 1fb8d4
		           windowIcon->iconInfo->cbBitsMask);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (windowIcon->iconInfo->cbColorTable > 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		lParam->iconInfo->colorTable = (BYTE*) malloc(windowIcon->iconInfo->cbColorTable);
Packit 1fb8d4
Packit 1fb8d4
		if (!lParam->iconInfo->colorTable)
Packit 1fb8d4
			goto out_fail;
Packit 1fb8d4
Packit 1fb8d4
		CopyMemory(lParam->iconInfo->colorTable, windowIcon->iconInfo->colorTable,
Packit 1fb8d4
		           windowIcon->iconInfo->cbColorTable);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, WindowIcon), (void*) wParam, (void*) lParam);
Packit 1fb8d4
out_fail:
Packit 1fb8d4
	free(lParam->iconInfo->bitsColor);
Packit 1fb8d4
	free(lParam->iconInfo->bitsMask);
Packit 1fb8d4
	free(lParam->iconInfo->colorTable);
Packit 1fb8d4
	free(lParam);
Packit 1fb8d4
	free(wParam);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
        WINDOW_CACHED_ICON_ORDER* windowCachedIcon)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	WINDOW_CACHED_ICON_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !windowCachedIcon)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (WINDOW_CACHED_ICON_ORDER*) malloc(sizeof(WINDOW_CACHED_ICON_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, windowCachedIcon, sizeof(WINDOW_CACHED_ICON_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, WindowCachedIcon), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, WindowDelete), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
        NOTIFY_ICON_STATE_ORDER* notifyIconState)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	NOTIFY_ICON_STATE_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !notifyIconState)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (NOTIFY_ICON_STATE_ORDER*) malloc(sizeof(NOTIFY_ICON_STATE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, NotifyIconCreate), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
        NOTIFY_ICON_STATE_ORDER* notifyIconState)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	NOTIFY_ICON_STATE_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !notifyIconState)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (NOTIFY_ICON_STATE_ORDER*) malloc(sizeof(NOTIFY_ICON_STATE_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, notifyIconState, sizeof(NOTIFY_ICON_STATE_ORDER));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, NotifyIconUpdate), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, NotifyIconDelete), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo,
Packit 1fb8d4
        MONITORED_DESKTOP_ORDER* monitoredDesktop)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
	MONITORED_DESKTOP_ORDER* lParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo || !monitoredDesktop)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	lParam = (MONITORED_DESKTOP_ORDER*) malloc(sizeof(MONITORED_DESKTOP_ORDER));
Packit 1fb8d4
Packit 1fb8d4
	if (!lParam)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(wParam);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(lParam, monitoredDesktop, sizeof(MONITORED_DESKTOP_ORDER));
Packit 1fb8d4
	lParam->windowIds = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (lParam->numWindowIds)
Packit 1fb8d4
	{
Packit 1fb8d4
		lParam->windowIds = (UINT32*) calloc(lParam->numWindowIds, sizeof(UINT32));
Packit 1fb8d4
		CopyMemory(lParam->windowIds, monitoredDesktop->windowIds, lParam->numWindowIds);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, MonitoredDesktop), (void*) wParam, (void*) lParam);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	WINDOW_ORDER_INFO* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !orderInfo)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = (WINDOW_ORDER_INFO*) malloc(sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	CopyMemory(wParam, orderInfo, sizeof(WINDOW_ORDER_INFO));
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(WindowUpdate, NonMonitoredDesktop), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Pointer Update */
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PointerPosition(rdpContext* context,
Packit 1fb8d4
        const POINTER_POSITION_UPDATE* pointerPosition)
Packit 1fb8d4
{
Packit 1fb8d4
	POINTER_POSITION_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !pointerPosition)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_pointer_position_update(context, pointerPosition);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PointerUpdate, PointerPosition), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PointerSystem(rdpContext* context,
Packit 1fb8d4
        const POINTER_SYSTEM_UPDATE* pointerSystem)
Packit 1fb8d4
{
Packit 1fb8d4
	POINTER_SYSTEM_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !pointerSystem)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_pointer_system_update(context, pointerSystem);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PointerUpdate, PointerSystem), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PointerColor(rdpContext* context,
Packit 1fb8d4
                                        const POINTER_COLOR_UPDATE* pointerColor)
Packit 1fb8d4
{
Packit 1fb8d4
	POINTER_COLOR_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !pointerColor)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_pointer_color_update(context, pointerColor);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PointerUpdate, PointerColor), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PointerNew(rdpContext* context,
Packit 1fb8d4
                                      const POINTER_NEW_UPDATE* pointerNew)
Packit 1fb8d4
{
Packit 1fb8d4
	POINTER_NEW_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !pointerNew)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_pointer_new_update(context, pointerNew);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PointerUpdate, PointerNew), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_PointerCached(rdpContext* context,
Packit 1fb8d4
        const POINTER_CACHED_UPDATE* pointerCached)
Packit 1fb8d4
{
Packit 1fb8d4
	POINTER_CACHED_UPDATE* wParam;
Packit 1fb8d4
Packit 1fb8d4
	if (!context || !context->update || !pointerCached)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	wParam = copy_pointer_cached_update(context, pointerCached);
Packit 1fb8d4
Packit 1fb8d4
	if (!wParam)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(context->update->queue, (void*) context,
Packit 1fb8d4
	                         MakeMessageId(PointerUpdate, PointerCached), (void*) wParam, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Message Queue */
Packit 1fb8d4
static BOOL update_message_free_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpContext* context;
Packit 1fb8d4
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	context = (rdpContext*) msg->context;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Update_BeginPaint:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_EndPaint:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SetBounds:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_Synchronize:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_DesktopResize:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_BitmapUpdate:
Packit 1fb8d4
			{
Packit 1fb8d4
				BITMAP_UPDATE* wParam = (BITMAP_UPDATE*) msg->wParam;
Packit 1fb8d4
				free_bitmap_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_Palette:
Packit 1fb8d4
			{
Packit 1fb8d4
				PALETTE_UPDATE* palette = (PALETTE_UPDATE*)msg->wParam;
Packit 1fb8d4
				free_palette_update(context, palette);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_PlaySound:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_RefreshRect:
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SuppressOutput:
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceCommand:
Packit 1fb8d4
			{
Packit 1fb8d4
				wStream* s = (wStream*) msg->wParam;
Packit 1fb8d4
				Stream_Free(s, TRUE);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceBits:
Packit 1fb8d4
			{
Packit 1fb8d4
				SURFACE_BITS_COMMAND* wParam = (SURFACE_BITS_COMMAND*) msg->wParam;
Packit 1fb8d4
				free_surface_bits_command(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceFrameMarker:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceFrameAcknowledge:
Packit 1fb8d4
		case Update_SetKeyboardIndicators:
Packit 1fb8d4
		case Update_SetKeyboardImeStatus:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_update_class(rdpUpdateProxy* proxy, wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Update_BeginPaint:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->BeginPaint, msg->context);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_EndPaint:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->EndPaint, msg->context);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SetBounds:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SetBounds, msg->context, (rdpBounds*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_Synchronize:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->Synchronize, msg->context);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_DesktopResize:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->DesktopResize, msg->context);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_BitmapUpdate:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->BitmapUpdate, msg->context, (BITMAP_UPDATE*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_Palette:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->Palette, msg->context, (PALETTE_UPDATE*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_PlaySound:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->PlaySound, msg->context, (PLAY_SOUND_UPDATE*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_RefreshRect:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->RefreshRect, msg->context,
Packit 1fb8d4
			                  (BYTE)(size_t) msg->wParam, (RECTANGLE_16*) msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SuppressOutput:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SuppressOutput, msg->context,
Packit 1fb8d4
			                  (BYTE)(size_t) msg->wParam, (RECTANGLE_16*) msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceCommand:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SurfaceCommand, msg->context, (wStream*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceBits:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SurfaceBits, msg->context, (SURFACE_BITS_COMMAND*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceFrameMarker:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SurfaceFrameMarker, msg->context,
Packit 1fb8d4
			                  (SURFACE_FRAME_MARKER*) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SurfaceFrameAcknowledge:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SurfaceFrameAcknowledge, msg->context,
Packit 1fb8d4
			                  (UINT32)(size_t) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SetKeyboardIndicators:
Packit 1fb8d4
			rc = IFCALLRESULT(FALSE, proxy->SetKeyboardIndicators, msg->context, (UINT16)(size_t) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Update_SetKeyboardImeStatus:
Packit 1fb8d4
			{
Packit 1fb8d4
				const UINT16 imeId = ((size_t)msg->wParam) >> 16 & 0xFFFF;
Packit 1fb8d4
				const UINT32 imeState = ((size_t)msg->wParam) & 0xFFFF;
Packit 1fb8d4
				const UINT32 imeConvMode = ((size_t)msg->lParam);
Packit 1fb8d4
				rc = IFCALLRESULT(FALSE, proxy->SetKeyboardImeStatus, msg->context, imeId, imeState, imeConvMode);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_primary_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case PrimaryUpdate_DstBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PatBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_ScrBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_OpaqueRect:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_DrawNineGrid:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiDstBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiPatBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiScrBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiOpaqueRect:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiDrawNineGrid:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_LineTo:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Polyline:
Packit 1fb8d4
			{
Packit 1fb8d4
				POLYLINE_ORDER* wParam = (POLYLINE_ORDER*) msg->wParam;
Packit 1fb8d4
				free(wParam->points);
Packit 1fb8d4
				free(wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MemBlt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Mem3Blt:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_SaveBitmap:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_GlyphIndex:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_FastIndex:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_FastGlyph:
Packit 1fb8d4
			{
Packit 1fb8d4
				FAST_GLYPH_ORDER* wParam = (FAST_GLYPH_ORDER*) msg->wParam;
Packit 1fb8d4
				free(wParam->glyphData.aj);
Packit 1fb8d4
				free(wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PolygonSC:
Packit 1fb8d4
			{
Packit 1fb8d4
				POLYGON_SC_ORDER* wParam = (POLYGON_SC_ORDER*) msg->wParam;
Packit 1fb8d4
				free(wParam->points);
Packit 1fb8d4
				free(wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PolygonCB:
Packit 1fb8d4
			{
Packit 1fb8d4
				POLYGON_CB_ORDER* wParam = (POLYGON_CB_ORDER*) msg->wParam;
Packit 1fb8d4
				free(wParam->points);
Packit 1fb8d4
				free(wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_EllipseSC:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_EllipseCB:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_primary_update_class(rdpUpdateProxy* proxy, wMessage* msg,
Packit 1fb8d4
        int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case PrimaryUpdate_DstBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DstBlt, msg->context, (DSTBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PatBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PatBlt, msg->context, (PATBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_ScrBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->ScrBlt, msg->context, (SCRBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_OpaqueRect:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->OpaqueRect, msg->context, (OPAQUE_RECT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_DrawNineGrid:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawNineGrid, msg->context, (DRAW_NINE_GRID_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiDstBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MultiDstBlt, msg->context, (MULTI_DSTBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiPatBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MultiPatBlt, msg->context, (MULTI_PATBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiScrBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MultiScrBlt, msg->context, (MULTI_SCRBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiOpaqueRect:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MultiOpaqueRect, msg->context,
Packit 1fb8d4
			                    (MULTI_OPAQUE_RECT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MultiDrawNineGrid:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MultiDrawNineGrid, msg->context,
Packit 1fb8d4
			                    (MULTI_DRAW_NINE_GRID_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_LineTo:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->LineTo, msg->context, (LINE_TO_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Polyline:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->Polyline, msg->context, (POLYLINE_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_MemBlt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MemBlt, msg->context, (MEMBLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Mem3Blt:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->Mem3Blt, msg->context, (MEM3BLT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_SaveBitmap:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->SaveBitmap, msg->context, (SAVE_BITMAP_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_GlyphIndex:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->GlyphIndex, msg->context, (GLYPH_INDEX_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_FastIndex:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->FastIndex, msg->context, (FAST_INDEX_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_FastGlyph:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->FastGlyph, msg->context, (FAST_GLYPH_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PolygonSC:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PolygonSC, msg->context, (POLYGON_SC_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_PolygonCB:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PolygonCB, msg->context, (POLYGON_CB_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_EllipseSC:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->EllipseSC, msg->context, (ELLIPSE_SC_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_EllipseCB:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->EllipseCB, msg->context, (ELLIPSE_CB_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_secondary_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpContext* context;
Packit 1fb8d4
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	context = msg->context;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmap:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_BITMAP_ORDER* wParam = (CACHE_BITMAP_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_bitmap_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmapV2:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_BITMAP_V2_ORDER* wParam = (CACHE_BITMAP_V2_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_bitmap_v2_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmapV3:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_BITMAP_V3_ORDER* wParam = (CACHE_BITMAP_V3_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_bitmap_v3_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheColorTable:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_COLOR_TABLE_ORDER* wParam = (CACHE_COLOR_TABLE_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_color_table_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheGlyph:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_GLYPH_ORDER* wParam = (CACHE_GLYPH_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_glyph_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheGlyphV2:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_GLYPH_V2_ORDER* wParam = (CACHE_GLYPH_V2_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_glyph_v2_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBrush:
Packit 1fb8d4
			{
Packit 1fb8d4
				CACHE_BRUSH_ORDER* wParam = (CACHE_BRUSH_ORDER*) msg->wParam;
Packit 1fb8d4
				free_cache_brush_order(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_secondary_update_class(rdpUpdateProxy* proxy, wMessage* msg,
Packit 1fb8d4
        int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmap:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheBitmap, msg->context, (CACHE_BITMAP_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmapV2:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheBitmapV2, msg->context,
Packit 1fb8d4
			                    (CACHE_BITMAP_V2_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBitmapV3:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheBitmapV3, msg->context,
Packit 1fb8d4
			                    (CACHE_BITMAP_V3_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheColorTable:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheColorTable, msg->context,
Packit 1fb8d4
			                    (CACHE_COLOR_TABLE_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheGlyph:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheGlyph, msg->context, (CACHE_GLYPH_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheGlyphV2:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheGlyphV2, msg->context, (CACHE_GLYPH_V2_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_CacheBrush:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CacheBrush, msg->context, (CACHE_BRUSH_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_altsec_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case AltSecUpdate_CreateOffscreenBitmap:
Packit 1fb8d4
			{
Packit 1fb8d4
				CREATE_OFFSCREEN_BITMAP_ORDER* wParam = (CREATE_OFFSCREEN_BITMAP_ORDER*) msg->wParam;
Packit 1fb8d4
				free(wParam->deleteList.indices);
Packit 1fb8d4
				free(wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_SwitchSurface:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_CreateNineGridBitmap:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_FrameMarker:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_StreamBitmapFirst:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_StreamBitmapNext:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusFirst:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusNext:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusEnd:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheFirst:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheNext:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheEnd:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_altsec_update_class(rdpUpdateProxy* proxy, wMessage* msg,
Packit 1fb8d4
        int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case AltSecUpdate_CreateOffscreenBitmap:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CreateOffscreenBitmap, msg->context,
Packit 1fb8d4
			                    (CREATE_OFFSCREEN_BITMAP_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_SwitchSurface:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->SwitchSurface, msg->context, (SWITCH_SURFACE_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_CreateNineGridBitmap:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->CreateNineGridBitmap, msg->context,
Packit 1fb8d4
			                    (CREATE_NINE_GRID_BITMAP_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_FrameMarker:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->FrameMarker, msg->context, (FRAME_MARKER_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_StreamBitmapFirst:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->StreamBitmapFirst, msg->context,
Packit 1fb8d4
			                    (STREAM_BITMAP_FIRST_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_StreamBitmapNext:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->StreamBitmapNext, msg->context,
Packit 1fb8d4
			                    (STREAM_BITMAP_NEXT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusFirst:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusFirst, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_FIRST_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusNext:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusNext, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_NEXT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusEnd:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusEnd, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_END_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheFirst:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusCacheFirst, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_CACHE_FIRST_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheNext:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusCacheNext, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_CACHE_NEXT_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_DrawGdiPlusCacheEnd:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->DrawGdiPlusCacheEnd, msg->context,
Packit 1fb8d4
			                    (DRAW_GDIPLUS_CACHE_END_ORDER*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_window_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case WindowUpdate_WindowCreate:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowUpdate:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowIcon:
Packit 1fb8d4
			{
Packit 1fb8d4
				WINDOW_ORDER_INFO* orderInfo = (WINDOW_ORDER_INFO*) msg->wParam;
Packit 1fb8d4
				WINDOW_ICON_ORDER* windowIcon = (WINDOW_ICON_ORDER*) msg->lParam;
Packit 1fb8d4
Packit 1fb8d4
				if (windowIcon->iconInfo->cbBitsColor > 0)
Packit 1fb8d4
				{
Packit 1fb8d4
					free(windowIcon->iconInfo->bitsColor);
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				if (windowIcon->iconInfo->cbBitsMask > 0)
Packit 1fb8d4
				{
Packit 1fb8d4
					free(windowIcon->iconInfo->bitsMask);
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				if (windowIcon->iconInfo->cbColorTable > 0)
Packit 1fb8d4
				{
Packit 1fb8d4
					free(windowIcon->iconInfo->colorTable);
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				free(orderInfo);
Packit 1fb8d4
				free(windowIcon);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowCachedIcon:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowDelete:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconCreate:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconUpdate:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			free(msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconDelete:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_MonitoredDesktop:
Packit 1fb8d4
			{
Packit 1fb8d4
				MONITORED_DESKTOP_ORDER* lParam = (MONITORED_DESKTOP_ORDER*) msg->lParam;
Packit 1fb8d4
				free(msg->wParam);
Packit 1fb8d4
				free(lParam->windowIds);
Packit 1fb8d4
				free(lParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NonMonitoredDesktop:
Packit 1fb8d4
			free(msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_window_update_class(rdpUpdateProxy* proxy, wMessage* msg,
Packit 1fb8d4
        int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case WindowUpdate_WindowCreate:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->WindowCreate, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (WINDOW_STATE_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowUpdate:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->WindowCreate, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (WINDOW_STATE_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowIcon:
Packit 1fb8d4
			{
Packit 1fb8d4
				WINDOW_ORDER_INFO* orderInfo = (WINDOW_ORDER_INFO*) msg->wParam;
Packit 1fb8d4
				WINDOW_ICON_ORDER* windowIcon = (WINDOW_ICON_ORDER*) msg->lParam;
Packit 1fb8d4
				return IFCALLRESULT(FALSE, proxy->WindowIcon, msg->context, orderInfo, windowIcon);
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowCachedIcon:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->WindowCachedIcon, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (WINDOW_CACHED_ICON_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_WindowDelete:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->WindowDelete, msg->context, (WINDOW_ORDER_INFO*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconCreate:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->NotifyIconCreate, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (NOTIFY_ICON_STATE_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconUpdate:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->NotifyIconUpdate, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (NOTIFY_ICON_STATE_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NotifyIconDelete:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->NotifyIconDelete, msg->context, (WINDOW_ORDER_INFO*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_MonitoredDesktop:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->MonitoredDesktop, msg->context, (WINDOW_ORDER_INFO*) msg->wParam,
Packit 1fb8d4
			                    (MONITORED_DESKTOP_ORDER*) msg->lParam);
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_NonMonitoredDesktop:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->NonMonitoredDesktop, msg->context,
Packit 1fb8d4
			                    (WINDOW_ORDER_INFO*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_pointer_update_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpContext* context;
Packit 1fb8d4
Packit 1fb8d4
	if (!msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	context = msg->context;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case PointerUpdate_PointerPosition:
Packit 1fb8d4
			{
Packit 1fb8d4
				POINTER_POSITION_UPDATE* wParam = (POINTER_POSITION_UPDATE*)msg->wParam;
Packit 1fb8d4
				free_pointer_position_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerSystem:
Packit 1fb8d4
			{
Packit 1fb8d4
				POINTER_SYSTEM_UPDATE* wParam = (POINTER_SYSTEM_UPDATE*)msg->wParam;
Packit 1fb8d4
				free_pointer_system_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerCached:
Packit 1fb8d4
			{
Packit 1fb8d4
				POINTER_CACHED_UPDATE* wParam = (POINTER_CACHED_UPDATE*) msg->wParam;
Packit 1fb8d4
				free_pointer_cached_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerColor:
Packit 1fb8d4
			{
Packit 1fb8d4
				POINTER_COLOR_UPDATE* wParam = (POINTER_COLOR_UPDATE*) msg->wParam;
Packit 1fb8d4
				free_pointer_color_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerNew:
Packit 1fb8d4
			{
Packit 1fb8d4
				POINTER_NEW_UPDATE* wParam = (POINTER_NEW_UPDATE*) msg->wParam;
Packit 1fb8d4
				free_pointer_new_update(context, wParam);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_process_pointer_update_class(rdpUpdateProxy* proxy, wMessage* msg,
Packit 1fb8d4
        int type)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case PointerUpdate_PointerPosition:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PointerPosition, msg->context,
Packit 1fb8d4
			                    (POINTER_POSITION_UPDATE*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerSystem:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PointerSystem, msg->context,
Packit 1fb8d4
			                    (POINTER_SYSTEM_UPDATE*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerColor:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PointerColor, msg->context, (POINTER_COLOR_UPDATE*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerNew:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PointerNew, msg->context, (POINTER_NEW_UPDATE*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_PointerCached:
Packit 1fb8d4
			return IFCALLRESULT(FALSE, proxy->PointerCached, msg->context,
Packit 1fb8d4
			                    (POINTER_CACHED_UPDATE*) msg->wParam);
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_free_class(wMessage* msg, int msgClass, int msgType)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL status = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (msgClass)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Update_Class:
Packit 1fb8d4
			status = update_message_free_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Class:
Packit 1fb8d4
			status = update_message_free_primary_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_Class:
Packit 1fb8d4
			status = update_message_free_secondary_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_Class:
Packit 1fb8d4
			status = update_message_free_altsec_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_Class:
Packit 1fb8d4
			status = update_message_free_window_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_Class:
Packit 1fb8d4
			status = update_message_free_pointer_update_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!status)
Packit 1fb8d4
		WLog_ERR(TAG,  "Unknown message: class: %d type: %d", msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int update_message_process_class(rdpUpdateProxy* proxy, wMessage* msg, int msgClass,
Packit 1fb8d4
                                        int msgType)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL status = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	switch (msgClass)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Update_Class:
Packit 1fb8d4
			status = update_message_process_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PrimaryUpdate_Class:
Packit 1fb8d4
			status = update_message_process_primary_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SecondaryUpdate_Class:
Packit 1fb8d4
			status = update_message_process_secondary_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case AltSecUpdate_Class:
Packit 1fb8d4
			status = update_message_process_altsec_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WindowUpdate_Class:
Packit 1fb8d4
			status = update_message_process_window_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case PointerUpdate_Class:
Packit 1fb8d4
			status = update_message_process_pointer_update_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			status = FALSE;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!status)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG,  "message: class: %d type: %d failed", msgClass, msgType);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int update_message_queue_process_message(rdpUpdate* update, wMessage* message)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	int msgClass;
Packit 1fb8d4
	int msgType;
Packit 1fb8d4
Packit 1fb8d4
	if (!update || !message)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (message->id == WMQ_QUIT)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	msgClass = GetMessageClass(message->id);
Packit 1fb8d4
	msgType = GetMessageType(message->id);
Packit 1fb8d4
	status = update_message_process_class(update->proxy, message, msgClass, msgType);
Packit 1fb8d4
	update_message_free_class(message, msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int update_message_queue_free_message(wMessage* message)
Packit 1fb8d4
{
Packit 1fb8d4
	int msgClass;
Packit 1fb8d4
	int msgType;
Packit 1fb8d4
Packit 1fb8d4
	if (!message)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (message->id == WMQ_QUIT)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	msgClass = GetMessageClass(message->id);
Packit 1fb8d4
	msgType = GetMessageType(message->id);
Packit 1fb8d4
	return update_message_free_class(message, msgClass, msgType);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int update_message_queue_process_pending_messages(rdpUpdate* update)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	wMessage message;
Packit 1fb8d4
	wMessageQueue* queue;
Packit 1fb8d4
Packit 1fb8d4
	if (!update || !update->queue)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	status = 1;
Packit 1fb8d4
	queue = update->queue;
Packit 1fb8d4
Packit 1fb8d4
	while (MessageQueue_Peek(queue, &message, TRUE))
Packit 1fb8d4
	{
Packit 1fb8d4
		status = update_message_queue_process_message(update, &message);
Packit 1fb8d4
Packit 1fb8d4
		if (!status)
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL update_message_register_interface(rdpUpdateProxy* message, rdpUpdate* update)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpPrimaryUpdate* primary;
Packit 1fb8d4
	rdpSecondaryUpdate* secondary;
Packit 1fb8d4
	rdpAltSecUpdate* altsec;
Packit 1fb8d4
	rdpWindowUpdate* window;
Packit 1fb8d4
	rdpPointerUpdate* pointer;
Packit 1fb8d4
Packit 1fb8d4
	if (!message || !update)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	primary = update->primary;
Packit 1fb8d4
	secondary = update->secondary;
Packit 1fb8d4
	altsec = update->altsec;
Packit 1fb8d4
	window = update->window;
Packit 1fb8d4
	pointer = update->pointer;
Packit 1fb8d4
Packit 1fb8d4
	if (!primary || !secondary || !altsec || !window || !pointer)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	/* Update */
Packit 1fb8d4
	message->BeginPaint = update->BeginPaint;
Packit 1fb8d4
	message->EndPaint = update->EndPaint;
Packit 1fb8d4
	message->SetBounds = update->SetBounds;
Packit 1fb8d4
	message->Synchronize = update->Synchronize;
Packit 1fb8d4
	message->DesktopResize = update->DesktopResize;
Packit 1fb8d4
	message->BitmapUpdate = update->BitmapUpdate;
Packit 1fb8d4
	message->Palette = update->Palette;
Packit 1fb8d4
	message->PlaySound = update->PlaySound;
Packit 1fb8d4
	message->SetKeyboardIndicators = update->SetKeyboardIndicators;
Packit 1fb8d4
	message->SetKeyboardImeStatus = update->SetKeyboardImeStatus;
Packit 1fb8d4
	message->RefreshRect = update->RefreshRect;
Packit 1fb8d4
	message->SuppressOutput = update->SuppressOutput;
Packit 1fb8d4
	message->SurfaceCommand = update->SurfaceCommand;
Packit 1fb8d4
	message->SurfaceBits = update->SurfaceBits;
Packit 1fb8d4
	message->SurfaceFrameMarker = update->SurfaceFrameMarker;
Packit 1fb8d4
	message->SurfaceFrameAcknowledge = update->SurfaceFrameAcknowledge;
Packit 1fb8d4
	update->BeginPaint = update_message_BeginPaint;
Packit 1fb8d4
	update->EndPaint = update_message_EndPaint;
Packit 1fb8d4
	update->SetBounds = update_message_SetBounds;
Packit 1fb8d4
	update->Synchronize = update_message_Synchronize;
Packit 1fb8d4
	update->DesktopResize = update_message_DesktopResize;
Packit 1fb8d4
	update->BitmapUpdate = update_message_BitmapUpdate;
Packit 1fb8d4
	update->Palette = update_message_Palette;
Packit 1fb8d4
	update->PlaySound = update_message_PlaySound;
Packit 1fb8d4
	update->SetKeyboardIndicators = update_message_SetKeyboardIndicators;
Packit 1fb8d4
	update->SetKeyboardImeStatus = update_message_SetKeyboardImeStatus;
Packit 1fb8d4
	update->RefreshRect = update_message_RefreshRect;
Packit 1fb8d4
	update->SuppressOutput = update_message_SuppressOutput;
Packit 1fb8d4
	update->SurfaceCommand = update_message_SurfaceCommand;
Packit 1fb8d4
	update->SurfaceBits = update_message_SurfaceBits;
Packit 1fb8d4
	update->SurfaceFrameMarker = update_message_SurfaceFrameMarker;
Packit 1fb8d4
	update->SurfaceFrameAcknowledge = update_message_SurfaceFrameAcknowledge;
Packit 1fb8d4
	/* Primary Update */
Packit 1fb8d4
	message->DstBlt = primary->DstBlt;
Packit 1fb8d4
	message->PatBlt = primary->PatBlt;
Packit 1fb8d4
	message->ScrBlt = primary->ScrBlt;
Packit 1fb8d4
	message->OpaqueRect = primary->OpaqueRect;
Packit 1fb8d4
	message->DrawNineGrid = primary->DrawNineGrid;
Packit 1fb8d4
	message->MultiDstBlt = primary->MultiDstBlt;
Packit 1fb8d4
	message->MultiPatBlt = primary->MultiPatBlt;
Packit 1fb8d4
	message->MultiScrBlt = primary->MultiScrBlt;
Packit 1fb8d4
	message->MultiOpaqueRect = primary->MultiOpaqueRect;
Packit 1fb8d4
	message->MultiDrawNineGrid = primary->MultiDrawNineGrid;
Packit 1fb8d4
	message->LineTo = primary->LineTo;
Packit 1fb8d4
	message->Polyline = primary->Polyline;
Packit 1fb8d4
	message->MemBlt = primary->MemBlt;
Packit 1fb8d4
	message->Mem3Blt = primary->Mem3Blt;
Packit 1fb8d4
	message->SaveBitmap = primary->SaveBitmap;
Packit 1fb8d4
	message->GlyphIndex = primary->GlyphIndex;
Packit 1fb8d4
	message->FastIndex = primary->FastIndex;
Packit 1fb8d4
	message->FastGlyph = primary->FastGlyph;
Packit 1fb8d4
	message->PolygonSC = primary->PolygonSC;
Packit 1fb8d4
	message->PolygonCB = primary->PolygonCB;
Packit 1fb8d4
	message->EllipseSC = primary->EllipseSC;
Packit 1fb8d4
	message->EllipseCB = primary->EllipseCB;
Packit 1fb8d4
	primary->DstBlt = update_message_DstBlt;
Packit 1fb8d4
	primary->PatBlt = update_message_PatBlt;
Packit 1fb8d4
	primary->ScrBlt = update_message_ScrBlt;
Packit 1fb8d4
	primary->OpaqueRect = update_message_OpaqueRect;
Packit 1fb8d4
	primary->DrawNineGrid = update_message_DrawNineGrid;
Packit 1fb8d4
	primary->MultiDstBlt = update_message_MultiDstBlt;
Packit 1fb8d4
	primary->MultiPatBlt = update_message_MultiPatBlt;
Packit 1fb8d4
	primary->MultiScrBlt = update_message_MultiScrBlt;
Packit 1fb8d4
	primary->MultiOpaqueRect = update_message_MultiOpaqueRect;
Packit 1fb8d4
	primary->MultiDrawNineGrid = update_message_MultiDrawNineGrid;
Packit 1fb8d4
	primary->LineTo = update_message_LineTo;
Packit 1fb8d4
	primary->Polyline = update_message_Polyline;
Packit 1fb8d4
	primary->MemBlt = update_message_MemBlt;
Packit 1fb8d4
	primary->Mem3Blt = update_message_Mem3Blt;
Packit 1fb8d4
	primary->SaveBitmap = update_message_SaveBitmap;
Packit 1fb8d4
	primary->GlyphIndex = update_message_GlyphIndex;
Packit 1fb8d4
	primary->FastIndex = update_message_FastIndex;
Packit 1fb8d4
	primary->FastGlyph = update_message_FastGlyph;
Packit 1fb8d4
	primary->PolygonSC = update_message_PolygonSC;
Packit 1fb8d4
	primary->PolygonCB = update_message_PolygonCB;
Packit 1fb8d4
	primary->EllipseSC = update_message_EllipseSC;
Packit 1fb8d4
	primary->EllipseCB = update_message_EllipseCB;
Packit 1fb8d4
	/* Secondary Update */
Packit 1fb8d4
	message->CacheBitmap = secondary->CacheBitmap;
Packit 1fb8d4
	message->CacheBitmapV2 = secondary->CacheBitmapV2;
Packit 1fb8d4
	message->CacheBitmapV3 = secondary->CacheBitmapV3;
Packit 1fb8d4
	message->CacheColorTable = secondary->CacheColorTable;
Packit 1fb8d4
	message->CacheGlyph = secondary->CacheGlyph;
Packit 1fb8d4
	message->CacheGlyphV2 = secondary->CacheGlyphV2;
Packit 1fb8d4
	message->CacheBrush = secondary->CacheBrush;
Packit 1fb8d4
	secondary->CacheBitmap = update_message_CacheBitmap;
Packit 1fb8d4
	secondary->CacheBitmapV2 = update_message_CacheBitmapV2;
Packit 1fb8d4
	secondary->CacheBitmapV3 = update_message_CacheBitmapV3;
Packit 1fb8d4
	secondary->CacheColorTable = update_message_CacheColorTable;
Packit 1fb8d4
	secondary->CacheGlyph = update_message_CacheGlyph;
Packit 1fb8d4
	secondary->CacheGlyphV2 = update_message_CacheGlyphV2;
Packit 1fb8d4
	secondary->CacheBrush = update_message_CacheBrush;
Packit 1fb8d4
	/* Alternate Secondary Update */
Packit 1fb8d4
	message->CreateOffscreenBitmap = altsec->CreateOffscreenBitmap;
Packit 1fb8d4
	message->SwitchSurface = altsec->SwitchSurface;
Packit 1fb8d4
	message->CreateNineGridBitmap = altsec->CreateNineGridBitmap;
Packit 1fb8d4
	message->FrameMarker = altsec->FrameMarker;
Packit 1fb8d4
	message->StreamBitmapFirst = altsec->StreamBitmapFirst;
Packit 1fb8d4
	message->StreamBitmapNext = altsec->StreamBitmapNext;
Packit 1fb8d4
	message->DrawGdiPlusFirst = altsec->DrawGdiPlusFirst;
Packit 1fb8d4
	message->DrawGdiPlusNext = altsec->DrawGdiPlusNext;
Packit 1fb8d4
	message->DrawGdiPlusEnd = altsec->DrawGdiPlusEnd;
Packit 1fb8d4
	message->DrawGdiPlusCacheFirst = altsec->DrawGdiPlusCacheFirst;
Packit 1fb8d4
	message->DrawGdiPlusCacheNext = altsec->DrawGdiPlusCacheNext;
Packit 1fb8d4
	message->DrawGdiPlusCacheEnd = altsec->DrawGdiPlusCacheEnd;
Packit 1fb8d4
	altsec->CreateOffscreenBitmap = update_message_CreateOffscreenBitmap;
Packit 1fb8d4
	altsec->SwitchSurface = update_message_SwitchSurface;
Packit 1fb8d4
	altsec->CreateNineGridBitmap = update_message_CreateNineGridBitmap;
Packit 1fb8d4
	altsec->FrameMarker = update_message_FrameMarker;
Packit 1fb8d4
	altsec->StreamBitmapFirst = update_message_StreamBitmapFirst;
Packit 1fb8d4
	altsec->StreamBitmapNext = update_message_StreamBitmapNext;
Packit 1fb8d4
	altsec->DrawGdiPlusFirst = update_message_DrawGdiPlusFirst;
Packit 1fb8d4
	altsec->DrawGdiPlusNext = update_message_DrawGdiPlusNext;
Packit 1fb8d4
	altsec->DrawGdiPlusEnd = update_message_DrawGdiPlusEnd;
Packit 1fb8d4
	altsec->DrawGdiPlusCacheFirst = update_message_DrawGdiPlusCacheFirst;
Packit 1fb8d4
	altsec->DrawGdiPlusCacheNext = update_message_DrawGdiPlusCacheNext;
Packit 1fb8d4
	altsec->DrawGdiPlusCacheEnd = update_message_DrawGdiPlusCacheEnd;
Packit 1fb8d4
	/* Window Update */
Packit 1fb8d4
	message->WindowCreate = window->WindowCreate;
Packit 1fb8d4
	message->WindowUpdate = window->WindowUpdate;
Packit 1fb8d4
	message->WindowIcon = window->WindowIcon;
Packit 1fb8d4
	message->WindowCachedIcon = window->WindowCachedIcon;
Packit 1fb8d4
	message->WindowDelete = window->WindowDelete;
Packit 1fb8d4
	message->NotifyIconCreate = window->NotifyIconCreate;
Packit 1fb8d4
	message->NotifyIconUpdate = window->NotifyIconUpdate;
Packit 1fb8d4
	message->NotifyIconDelete = window->NotifyIconDelete;
Packit 1fb8d4
	message->MonitoredDesktop = window->MonitoredDesktop;
Packit 1fb8d4
	message->NonMonitoredDesktop = window->NonMonitoredDesktop;
Packit 1fb8d4
	window->WindowCreate = update_message_WindowCreate;
Packit 1fb8d4
	window->WindowUpdate = update_message_WindowUpdate;
Packit 1fb8d4
	window->WindowIcon = update_message_WindowIcon;
Packit 1fb8d4
	window->WindowCachedIcon = update_message_WindowCachedIcon;
Packit 1fb8d4
	window->WindowDelete = update_message_WindowDelete;
Packit 1fb8d4
	window->NotifyIconCreate = update_message_NotifyIconCreate;
Packit 1fb8d4
	window->NotifyIconUpdate = update_message_NotifyIconUpdate;
Packit 1fb8d4
	window->NotifyIconDelete = update_message_NotifyIconDelete;
Packit 1fb8d4
	window->MonitoredDesktop = update_message_MonitoredDesktop;
Packit 1fb8d4
	window->NonMonitoredDesktop = update_message_NonMonitoredDesktop;
Packit 1fb8d4
	/* Pointer Update */
Packit 1fb8d4
	message->PointerPosition = pointer->PointerPosition;
Packit 1fb8d4
	message->PointerSystem = pointer->PointerSystem;
Packit 1fb8d4
	message->PointerColor = pointer->PointerColor;
Packit 1fb8d4
	message->PointerNew = pointer->PointerNew;
Packit 1fb8d4
	message->PointerCached = pointer->PointerCached;
Packit 1fb8d4
	pointer->PointerPosition = update_message_PointerPosition;
Packit 1fb8d4
	pointer->PointerSystem = update_message_PointerSystem;
Packit 1fb8d4
	pointer->PointerColor = update_message_PointerColor;
Packit 1fb8d4
	pointer->PointerNew = update_message_PointerNew;
Packit 1fb8d4
	pointer->PointerCached = update_message_PointerCached;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static DWORD WINAPI update_message_proxy_thread(LPVOID arg)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpUpdate* update = (rdpUpdate*)arg;
Packit 1fb8d4
	wMessage message;
Packit 1fb8d4
Packit 1fb8d4
	if (!update || !update->queue)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "update=%p, update->queue=%p", (void*) update,
Packit 1fb8d4
		         (void*)(update ? update->queue : NULL));
Packit 1fb8d4
		ExitThread(1);
Packit 1fb8d4
		return 1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	while (MessageQueue_Wait(update->queue))
Packit 1fb8d4
	{
Packit 1fb8d4
		int status = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (MessageQueue_Peek(update->queue, &message, TRUE))
Packit 1fb8d4
			status = update_message_queue_process_message(update, &message);
Packit 1fb8d4
Packit 1fb8d4
		if (!status)
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	ExitThread(0);
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
rdpUpdateProxy* update_message_proxy_new(rdpUpdate* update)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpUpdateProxy* message;
Packit 1fb8d4
Packit 1fb8d4
	if (!update)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (!(message = (rdpUpdateProxy*) calloc(1, sizeof(rdpUpdateProxy))))
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	message->update = update;
Packit 1fb8d4
	update_message_register_interface(message, update);
Packit 1fb8d4
Packit 1fb8d4
	if (!(message->thread = CreateThread(NULL, 0, update_message_proxy_thread,
Packit 1fb8d4
	                                     update, 0, NULL)))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "Failed to create proxy thread");
Packit 1fb8d4
		free(message);
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return message;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void update_message_proxy_free(rdpUpdateProxy* message)
Packit 1fb8d4
{
Packit 1fb8d4
	if (message)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (MessageQueue_PostQuit(message->update->queue, 0))
Packit 1fb8d4
			WaitForSingleObject(message->thread, INFINITE);
Packit 1fb8d4
Packit 1fb8d4
		CloseHandle(message->thread);
Packit 1fb8d4
		free(message);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Input */
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_SynchronizeEvent(rdpInput* input, UINT32 flags)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, SynchronizeEvent), (void*)(size_t) flags, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_KeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, KeyboardEvent), (void*)(size_t) flags, (void*)(size_t) code);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_UnicodeKeyboardEvent(rdpInput* input, UINT16 flags, UINT16 code)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, UnicodeKeyboardEvent), (void*)(size_t) flags, (void*)(size_t) code);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_MouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 pos = (x << 16) | y;
Packit 1fb8d4
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, MouseEvent), (void*)(size_t) flags, (void*)(size_t) pos);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_ExtendedMouseEvent(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 pos = (x << 16) | y;
Packit 1fb8d4
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, ExtendedMouseEvent), (void*)(size_t) flags, (void*)(size_t) pos);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_FocusInEvent(rdpInput* input, UINT16 toggleStates)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, FocusInEvent), (void*)(size_t) toggleStates, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_KeyboardPauseEvent(rdpInput* input)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return MessageQueue_Post(input->queue, (void*) input,
Packit 1fb8d4
	                         MakeMessageId(Input, KeyboardPauseEvent), NULL, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
/* Event Queue */
Packit 1fb8d4
static int input_message_free_input_class(wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	int status = 0;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Input_SynchronizeEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_KeyboardEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_UnicodeKeyboardEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_MouseEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_ExtendedMouseEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_FocusInEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_KeyboardPauseEvent:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			status = -1;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int input_message_process_input_class(rdpInputProxy* proxy, wMessage* msg, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	int status = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (!proxy || !msg)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	switch (type)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Input_SynchronizeEvent:
Packit 1fb8d4
			IFCALL(proxy->SynchronizeEvent, msg->context, (UINT32)(size_t) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_KeyboardEvent:
Packit 1fb8d4
			IFCALL(proxy->KeyboardEvent, msg->context, (UINT16)(size_t) msg->wParam,
Packit 1fb8d4
			       (UINT16)(size_t) msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_UnicodeKeyboardEvent:
Packit 1fb8d4
			IFCALL(proxy->UnicodeKeyboardEvent, msg->context, (UINT16)(size_t) msg->wParam,
Packit 1fb8d4
			       (UINT16)(size_t) msg->lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_MouseEvent:
Packit 1fb8d4
			{
Packit 1fb8d4
				UINT32 pos;
Packit 1fb8d4
				UINT16 x, y;
Packit 1fb8d4
				pos = (UINT32)(size_t) msg->lParam;
Packit 1fb8d4
				x = ((pos & 0xFFFF0000) >> 16);
Packit 1fb8d4
				y = (pos & 0x0000FFFF);
Packit 1fb8d4
				IFCALL(proxy->MouseEvent, msg->context, (UINT16)(size_t) msg->wParam, x, y);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_ExtendedMouseEvent:
Packit 1fb8d4
			{
Packit 1fb8d4
				UINT32 pos;
Packit 1fb8d4
				UINT16 x, y;
Packit 1fb8d4
				pos = (UINT32)(size_t) msg->lParam;
Packit 1fb8d4
				x = ((pos & 0xFFFF0000) >> 16);
Packit 1fb8d4
				y = (pos & 0x0000FFFF);
Packit 1fb8d4
				IFCALL(proxy->ExtendedMouseEvent, msg->context, (UINT16)(size_t) msg->wParam, x, y);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_FocusInEvent:
Packit 1fb8d4
			IFCALL(proxy->FocusInEvent, msg->context, (UINT16)(size_t) msg->wParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case Input_KeyboardPauseEvent:
Packit 1fb8d4
			IFCALL(proxy->KeyboardPauseEvent, msg->context);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			status = -1;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int input_message_free_class(wMessage* msg, int msgClass, int msgType)
Packit 1fb8d4
{
Packit 1fb8d4
	int status = 0;
Packit 1fb8d4
Packit 1fb8d4
	switch (msgClass)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Input_Class:
Packit 1fb8d4
			status = input_message_free_input_class(msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			status = -1;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		WLog_ERR(TAG,  "Unknown event: class: %d type: %d", msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int input_message_process_class(rdpInputProxy* proxy, wMessage* msg, int msgClass,
Packit 1fb8d4
                                       int msgType)
Packit 1fb8d4
{
Packit 1fb8d4
	int status = 0;
Packit 1fb8d4
Packit 1fb8d4
	switch (msgClass)
Packit 1fb8d4
	{
Packit 1fb8d4
		case Input_Class:
Packit 1fb8d4
			status = input_message_process_input_class(proxy, msg, msgType);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			status = -1;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		WLog_ERR(TAG,  "Unknown event: class: %d type: %d", msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int input_message_queue_free_message(wMessage* message)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	int msgClass;
Packit 1fb8d4
	int msgType;
Packit 1fb8d4
Packit 1fb8d4
	if (!message)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (message->id == WMQ_QUIT)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	msgClass = GetMessageClass(message->id);
Packit 1fb8d4
	msgType = GetMessageType(message->id);
Packit 1fb8d4
	status = input_message_free_class(message, msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int input_message_queue_process_message(rdpInput* input, wMessage* message)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	int msgClass;
Packit 1fb8d4
	int msgType;
Packit 1fb8d4
Packit 1fb8d4
	if (!input || !message)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (message->id == WMQ_QUIT)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	msgClass = GetMessageClass(message->id);
Packit 1fb8d4
	msgType = GetMessageType(message->id);
Packit 1fb8d4
	status = input_message_process_class(input->proxy, message, msgClass, msgType);
Packit 1fb8d4
	input_message_free_class(message, msgClass, msgType);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int input_message_queue_process_pending_messages(rdpInput* input)
Packit 1fb8d4
{
Packit 1fb8d4
	int count;
Packit 1fb8d4
	int status;
Packit 1fb8d4
	wMessage message;
Packit 1fb8d4
	wMessageQueue* queue;
Packit 1fb8d4
Packit 1fb8d4
	if (!input || !input->queue)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	count = 0;
Packit 1fb8d4
	status = 1;
Packit 1fb8d4
	queue = input->queue;
Packit 1fb8d4
Packit 1fb8d4
	while (MessageQueue_Peek(queue, &message, TRUE))
Packit 1fb8d4
	{
Packit 1fb8d4
		status = input_message_queue_process_message(input, &message);
Packit 1fb8d4
Packit 1fb8d4
		if (!status)
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		count++;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL input_message_proxy_register(rdpInputProxy* proxy, rdpInput* input)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!proxy || !input)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	/* Input */
Packit 1fb8d4
	proxy->SynchronizeEvent = input->SynchronizeEvent;
Packit 1fb8d4
	proxy->KeyboardEvent = input->KeyboardEvent;
Packit 1fb8d4
	proxy->UnicodeKeyboardEvent = input->UnicodeKeyboardEvent;
Packit 1fb8d4
	proxy->MouseEvent = input->MouseEvent;
Packit 1fb8d4
	proxy->ExtendedMouseEvent = input->ExtendedMouseEvent;
Packit 1fb8d4
	proxy->FocusInEvent = input->FocusInEvent;
Packit 1fb8d4
	proxy->KeyboardPauseEvent = input->KeyboardPauseEvent;
Packit 1fb8d4
	input->SynchronizeEvent = input_message_SynchronizeEvent;
Packit 1fb8d4
	input->KeyboardEvent = input_message_KeyboardEvent;
Packit 1fb8d4
	input->UnicodeKeyboardEvent = input_message_UnicodeKeyboardEvent;
Packit 1fb8d4
	input->MouseEvent = input_message_MouseEvent;
Packit 1fb8d4
	input->ExtendedMouseEvent = input_message_ExtendedMouseEvent;
Packit 1fb8d4
	input->FocusInEvent = input_message_FocusInEvent;
Packit 1fb8d4
	input->KeyboardPauseEvent = input_message_KeyboardPauseEvent;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
rdpInputProxy* input_message_proxy_new(rdpInput* input)
Packit 1fb8d4
{
Packit 1fb8d4
	rdpInputProxy* proxy;
Packit 1fb8d4
	proxy = (rdpInputProxy*) calloc(1, sizeof(rdpInputProxy));
Packit 1fb8d4
Packit 1fb8d4
	if (!proxy)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	proxy->input = input;
Packit 1fb8d4
Packit 1fb8d4
	if (!input_message_proxy_register(proxy, input))
Packit 1fb8d4
	{
Packit 1fb8d4
		free(proxy);
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return proxy;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void input_message_proxy_free(rdpInputProxy* proxy)
Packit 1fb8d4
{
Packit 1fb8d4
	free(proxy);
Packit 1fb8d4
}