Esempio n. 1
0
void rdp_process_bitmap_capset(rdpRdp * rdp, STREAM s)
{
	uint16 preferredBitsPerPixel;
	uint16 desktopWidth;
	uint16 desktopHeight;
	uint16 desktopResizeFlag;
	uint16 bitmapCompressionFlag;
	uint8 drawingFlags;

	/*
	 * preferredBitsPerPixel (2 bytes):
	 * A 16-bit, unsigned integer. Color depth of the remote session. In RDP 4.0 and 5.0,
	 * this field MUST be set to 8 (even for a 16-color session)
	 */

	in_uint16_le(s, preferredBitsPerPixel); /* preferredBitsPerPixel */
	in_uint8s(s, 6); /* Ignore receive1BitPerPixel, receive4BitPerPixel, receive8BitPerPixel */
	in_uint16_le(s, desktopWidth); /* desktopWidth */
	in_uint16_le(s, desktopHeight); /* desktopHeight */
	in_uint8s(s, 2); /* pad */
	in_uint16_le(s, desktopResizeFlag); /* desktopResizeFlag */
	in_uint16_le(s, bitmapCompressionFlag); /* bitmapCompressionFlag */
	in_uint8s(s, 1); /* Ignore highColorFlags */
	in_uint8(s, drawingFlags); /* drawingFlags */

	/*
	 * The server may limit depth and change the size of the desktop (for
	 * example when shadowing another session).
	 */
	if (rdp->settings->server_depth != preferredBitsPerPixel)
	{
		ui_warning(rdp->inst, "Remote desktop does not support color depth %d; falling back to %d\n",
			rdp->settings->server_depth, preferredBitsPerPixel);
		rdp->settings->server_depth = preferredBitsPerPixel;
		ui_resize_window(rdp->inst);
	}
	if (rdp->settings->width != desktopWidth || rdp->settings->height != desktopHeight)
	{
		ui_warning(rdp->inst, "Remote desktop changed from %dx%d to %dx%d.\n", rdp->settings->width,
			rdp->settings->height, desktopWidth, desktopHeight);
		rdp->settings->width = desktopWidth;
		rdp->settings->height = desktopHeight;
		ui_resize_window(rdp->inst);
	}
}
Esempio n. 2
0
/* initialise the persistent bitmap cache */
RD_BOOL
pstcache_init(rdpPcache * pcache, uint8 cache_id)
{
	int fd;
	char filename[256];

	if (pcache->pstcache_enumerated)
		return True;

	pcache->pstcache_fd[cache_id] = 0;

	if (!(pcache->rdp->settings->bitmap_cache &&
	      pcache->rdp->settings->bitmap_cache_persist_enable))
		return False;

	if (!rd_pstcache_mkdir())
	{
		DEBUG("failed to get/make cache directory!\n");
		return False;
	}

	pcache->pstcache_Bpp = (pcache->rdp->settings->server_depth + 7) / 8;
	sprintf(filename, "cache/pstcache_%d_%d", cache_id, pcache->pstcache_Bpp);
	DEBUG("persistent bitmap cache file: %s\n", filename);

	fd = rd_open_file(filename);
	if (fd == -1)
		return False;

	if (!rd_lock_file(fd, 0, 0))
	{
		ui_warning(pcache->rdp->inst, "Persistent bitmap caching is disabled. (The file is already in use)\n");
		rd_close_file(fd);
		return False;
	}

	pcache->pstcache_fd[cache_id] = fd;
	return True;
}