Ejemplo n.º 1
0
void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings)
{
	size_t length;
	uint8* standardName;
	uint8* daylightName;
	size_t standardNameLength;
	size_t daylightNameLength;
	TIME_ZONE_INFO* clientTimeZone;

	rdp_get_client_time_zone(s, settings);
	clientTimeZone = settings->client_time_zone;

	standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length);
	standardNameLength = length;

	daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length);
	daylightNameLength = length;

	if (standardNameLength > 62)
		standardNameLength = 62;

	if (daylightNameLength > 62)
		daylightNameLength = 62;

	stream_write_uint32(s, clientTimeZone->bias); /* Bias */

	/* standardName (64 bytes) */
	stream_write(s, standardName, standardNameLength);
	stream_write_zero(s, 64 - standardNameLength);

	rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
	stream_write_uint32(s, clientTimeZone->standardBias); /* StandardBias */

	/* daylightName (64 bytes) */
	stream_write(s, daylightName, daylightNameLength);
	stream_write_zero(s, 64 - daylightNameLength);

	rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
	stream_write_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */

	xfree(standardName);
	xfree(daylightName);
}
Ejemplo n.º 2
0
BOOL rdp_write_client_time_zone(wStream* s, rdpSettings* settings)
{
	LPTIME_ZONE_INFORMATION tz;
	DWORD rc;

	tz = settings->ClientTimeZone;
	if (!tz)
		return FALSE;

	rc = GetTimeZoneInformation(tz);

	/* Bias */
	Stream_Write_UINT32(s, tz->Bias);

	/* standardName (64 bytes) */
	Stream_Write(s, tz->StandardName, sizeof(tz->StandardName));

	/* StandardDate */
	rdp_write_system_time(s, &tz->StandardDate);

	DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'", tz->Bias,
			   tz->StandardName, tz->DaylightName);

	/* Note that StandardBias is ignored if no valid standardDate is provided. */
	/* StandardBias */
	Stream_Write_UINT32(s, tz->StandardBias);
	DEBUG_TIMEZONE("StandardBias=%d", tz->StandardBias);

	/* daylightName (64 bytes) */
	Stream_Write(s, tz->DaylightName, sizeof(tz->DaylightName));

	/* DaylightDate */
	rdp_write_system_time(s, &tz->DaylightDate);

	/* Note that DaylightBias is ignored if no valid daylightDate is provided. */
	/* DaylightBias */
	Stream_Write_UINT32(s, tz->DaylightBias);
	DEBUG_TIMEZONE("DaylightBias=%d", tz->DaylightBias);

	return TRUE;
}
Ejemplo n.º 3
0
void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings)
{
	UINT32 bias;
	INT32 sbias;
	UINT32 bias2c;
	WCHAR* standardName;
	WCHAR* daylightName;
	int standardNameLength;
	int daylightNameLength;
	TIME_ZONE_INFO* clientTimeZone;

	clientTimeZone = settings->ClientTimeZone;
	freerdp_time_zone_detect(clientTimeZone);

	standardNameLength = ConvertToUnicode(CP_UTF8, 0, clientTimeZone->standardName, -1, &standardName, 0) * 2;
	daylightNameLength = ConvertToUnicode(CP_UTF8, 0, clientTimeZone->daylightName, -1, &daylightName, 0) * 2;

	if (standardNameLength > 62)
		standardNameLength = 62;

	if (daylightNameLength > 62)
		daylightNameLength = 62;

	/* UTC = LocalTime + Bias <-> Bias = UTC - LocalTime */

	/* Translate from biases used throughout libfreerdp-locale/timezone.c
	 * to what RDP expects, which is minutes *west* of UTC.
	 * Though MS-RDPBCGR specifies bias as unsigned, two's complement
	 * (a negative integer) works fine for zones east of UTC.
	 */
	
	if (clientTimeZone->bias <= 720)
		bias = -1 * clientTimeZone->bias;
	else
		bias = 1440 - clientTimeZone->bias;

	stream_write_UINT32(s, bias); /* Bias */

	/* standardName (64 bytes) */
	stream_write(s, standardName, standardNameLength);
	stream_write_zero(s, 64 - standardNameLength);

	rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */

	DEBUG_TIMEZONE("bias=%d stdName='%s' dlName='%s'",
		bias, clientTimeZone->standardName, clientTimeZone->daylightName);

	sbias = clientTimeZone->standardBias - clientTimeZone->bias;
	
	if (sbias < 0)
		bias2c = (UINT32) sbias;
	else
		bias2c = ~((UINT32) sbias) + 1;

	/* Note that StandardBias is ignored if no valid standardDate is provided. */
	stream_write_UINT32(s, bias2c); /* StandardBias */
	DEBUG_TIMEZONE("StandardBias=%d", bias2c);

	/* daylightName (64 bytes) */
	stream_write(s, daylightName, daylightNameLength);
	stream_write_zero(s, 64 - daylightNameLength);

	rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */

	sbias = clientTimeZone->daylightBias - clientTimeZone->bias;

	if (sbias < 0)
		bias2c = (UINT32) sbias;
	else
		bias2c = ~((UINT32) sbias) + 1;

	/* Note that DaylightBias is ignored if no valid daylightDate is provided. */
	stream_write_UINT32(s, bias2c); /* DaylightBias */
	DEBUG_TIMEZONE("DaylightBias=%d", bias2c);

	free(standardName);
	free(daylightName);
}