示例#1
0
int
tsmf_ifman_update_geometry_info(TSMF_IFMAN * ifman)
{
	TSMF_PRESENTATION * presentation;
	uint32 numGeometryInfo;
	uint32 Left;
	uint32 Top;
	uint32 Width;
	uint32 Height;
	uint32 cbVisibleRect;
	RD_RECT * rects = NULL;
	int num_rects = 0;
	int i;
	int error = 0;

	numGeometryInfo = GET_UINT32(ifman->input_buffer, 16);
	Width = GET_UINT32(ifman->input_buffer, 20 + 12);
	Height = GET_UINT32(ifman->input_buffer, 20 + 16);
	Left = GET_UINT32(ifman->input_buffer, 20 + 20);
	Top = GET_UINT32(ifman->input_buffer, 20 + 24);

	cbVisibleRect = GET_UINT32(ifman->input_buffer, 20 + numGeometryInfo);
	num_rects = cbVisibleRect / 16;

	LLOGLN(10, ("tsmf_ifman_update_geometry_info: numGeometryInfo %d "
		"Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d",
		numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects));

	presentation = tsmf_presentation_find_by_id(ifman->input_buffer);
	if (presentation == NULL)
		error = 1;
	else
	{
		if (num_rects > 0)
		{
			rects = (RD_RECT *) malloc(sizeof(RD_RECT) * num_rects);
			for (i = 0; i < num_rects; i++)
			{
				rects[i].x = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 4);
				rects[i].y = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16);
				rects[i].width = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 12) - rects[i].x;
				rects[i].height = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 8) - rects[i].y;
				LLOGLN(10, ("rect %d: %d %d %d %d", i, rects[i].x, rects[i].y, rects[i].width, rects[i].height));
			}
		}
		tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects);
	}
	ifman->output_pending = 1;
	return 0;
}
示例#2
0
int tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman)
{
	TSMF_PRESENTATION* presentation;
	UINT32 numGeometryInfo;
	UINT32 Left;
	UINT32 Top;
	UINT32 Width;
	UINT32 Height;
	UINT32 cbVisibleRect;
	RDP_RECT* rects = NULL;
	int num_rects = 0;
	int error = 0;
	int i;
	int pos;

	presentation = tsmf_presentation_find_by_id(Stream_Pointer(ifman->input));
	Stream_Seek(ifman->input, 16);

	Stream_Read_UINT32(ifman->input, numGeometryInfo);
	pos = Stream_GetPosition(ifman->input);

	Stream_Seek(ifman->input, 12); /* VideoWindowId (8 bytes), VideoWindowState (4 bytes) */
	Stream_Read_UINT32(ifman->input, Width);
	Stream_Read_UINT32(ifman->input, Height);
	Stream_Read_UINT32(ifman->input, Left);
	Stream_Read_UINT32(ifman->input, Top);

	Stream_SetPosition(ifman->input, pos + numGeometryInfo);
	Stream_Read_UINT32(ifman->input, cbVisibleRect);
	num_rects = cbVisibleRect / 16;

	DEBUG_DVC("numGeometryInfo %d Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d",
		numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects);

	if (presentation == NULL)
	{
		error = 1;
	}
	else
	{
		if (num_rects > 0)
		{
			rects = (RDP_RECT*) malloc(sizeof(RDP_RECT) * num_rects);
			ZeroMemory(rects, sizeof(RDP_RECT) * num_rects);

			for (i = 0; i < num_rects; i++)
			{
				Stream_Read_UINT16(ifman->input, rects[i].y); /* Top */
				Stream_Seek_UINT16(ifman->input);
				Stream_Read_UINT16(ifman->input, rects[i].x); /* Left */
				Stream_Seek_UINT16(ifman->input);
				Stream_Read_UINT16(ifman->input, rects[i].height); /* Bottom */
				Stream_Seek_UINT16(ifman->input);
				Stream_Read_UINT16(ifman->input, rects[i].width); /* Right */
				Stream_Seek_UINT16(ifman->input);
				rects[i].width -= rects[i].x;
				rects[i].height -= rects[i].y;

				DEBUG_DVC("rect %d: %d %d %d %d", i,
					rects[i].x, rects[i].y, rects[i].width, rects[i].height);
			}
		}
		tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects);
	}
	
	ifman->output_pending = TRUE;

	return error;
}
示例#3
0
/**
 * Function description
 *
 * @return 0 on success, otherwise a Win32 error code
 */
UINT tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman)
{
	TSMF_PRESENTATION* presentation;
	UINT32 numGeometryInfo;
	UINT32 Left;
	UINT32 Top;
	UINT32 Width;
	UINT32 Height;
	UINT32 cbVisibleRect;
	RDP_RECT *rects = NULL;
	int num_rects = 0;
	UINT error = CHANNEL_RC_OK;
	int i;
	int pos;

	if (Stream_GetRemainingLength(ifman->input) < GUID_SIZE + 32)
		return ERROR_INVALID_DATA;

	presentation = tsmf_presentation_find_by_id(Stream_Pointer(ifman->input));
	if (!presentation)
		return ERROR_NOT_FOUND;

	Stream_Seek(ifman->input, 16);
	Stream_Read_UINT32(ifman->input, numGeometryInfo);
	pos = Stream_GetPosition(ifman->input);
	Stream_Seek(ifman->input, 12); /* VideoWindowId (8 bytes), VideoWindowState (4 bytes) */
	Stream_Read_UINT32(ifman->input, Width);
	Stream_Read_UINT32(ifman->input, Height);
	Stream_Read_UINT32(ifman->input, Left);
	Stream_Read_UINT32(ifman->input, Top);

	Stream_SetPosition(ifman->input, pos + numGeometryInfo);
	Stream_Read_UINT32(ifman->input, cbVisibleRect);
	num_rects = cbVisibleRect / 16;
	DEBUG_TSMF("numGeometryInfo %d Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d",
			   numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects);

	if (num_rects > 0)
	{
		rects = (RDP_RECT*) calloc(num_rects, sizeof(RDP_RECT));

		for (i = 0; i < num_rects; i++)
		{
			Stream_Read_UINT16(ifman->input, rects[i].y); /* Top */
			Stream_Seek_UINT16(ifman->input);
			Stream_Read_UINT16(ifman->input, rects[i].x); /* Left */
			Stream_Seek_UINT16(ifman->input);
			Stream_Read_UINT16(ifman->input, rects[i].height); /* Bottom */
			Stream_Seek_UINT16(ifman->input);
			Stream_Read_UINT16(ifman->input, rects[i].width); /* Right */
			Stream_Seek_UINT16(ifman->input);
			rects[i].width -= rects[i].x;
			rects[i].height -= rects[i].y;
			DEBUG_TSMF("rect %d: %d %d %d %d", i,
					   rects[i].x, rects[i].y, rects[i].width, rects[i].height);
		}
	}

	if (!tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects))
		return ERROR_INVALID_OPERATION;

	ifman->output_pending = TRUE;

	return error;
}