From: Rein Klazes Date: Wed, 27 Oct 2004 21:19:22 +0000 (+0000) Subject: - Reordered some code from the existing helper _GetTimeZoneBias to X-Git-Tag: wine-20041201~240 X-Git-Url: http://git.etersoft.ru/projects/?a=commitdiff_plain;h=d694a376c7f4ecdc754592b9f0e88cded4828c9e;p=wine%2Feterwine.git - Reordered some code from the existing helper _GetTimeZoneBias to make it more general useful (and changed the helper names to TIME_xyz). - Make GetTimeZoneInformation return the correct zone id constants. - Changed some "const LPX_Y_Z" declarations to "const X_Y_Z *". --- diff --git a/dlls/kernel/time.c b/dlls/kernel/time.c index 2be543f884..c0f291b1f2 100644 --- a/dlls/kernel/time.c +++ b/dlls/kernel/time.c @@ -60,143 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(time); ll = (((LONGLONG)((pft)->dwHighDateTime))<<32) + (pft)-> dwLowDateTime ; /*********************************************************************** - * SetLocalTime (KERNEL32.@) - * - * Set the local time using current time zone and daylight - * savings settings. - * - * RETURNS - * Success: TRUE. The time was set - * Failure: FALSE, if the time was invalid or caller does not have - * permission to change the time. - */ -BOOL WINAPI SetLocalTime( - const SYSTEMTIME *systime) /* [in] The desired local time. */ -{ - FILETIME ft; - LARGE_INTEGER st, st2; - NTSTATUS status; - - SystemTimeToFileTime( systime, &ft ); - st.u.LowPart = ft.dwLowDateTime; - st.u.HighPart = ft.dwHighDateTime; - RtlLocalTimeToSystemTime( &st, &st2 ); - - if ((status = NtSetSystemTime(&st2, NULL))) - SetLastError( RtlNtStatusToDosError(status) ); - return !status; -} - - -/*********************************************************************** - * GetSystemTimeAdjustment (KERNEL32.@) - * - * Get the period between clock interrupts and the amount the clock - * is adjusted each interrupt so as to keep it in sync with an external source. - * - * RETURNS - * TRUE. - * - * BUGS - * Only the special case of disabled time adjustments is supported. - */ -BOOL WINAPI GetSystemTimeAdjustment( - PDWORD lpTimeAdjustment, /* [out] The clock adjustment per interupt in 100's of nanoseconds. */ - PDWORD lpTimeIncrement, /* [out] The time between clock interupts in 100's of nanoseconds. */ - PBOOL lpTimeAdjustmentDisabled) /* [out] The clock synchonisation has been disabled. */ -{ - *lpTimeAdjustment = 0; - *lpTimeIncrement = 0; - *lpTimeAdjustmentDisabled = TRUE; - return TRUE; -} - - -/*********************************************************************** - * SetSystemTime (KERNEL32.@) - * - * Set the system time in utc. - * - * RETURNS - * Success: TRUE. The time was set - * Failure: FALSE, if the time was invalid or caller does not have - * permission to change the time. - */ -BOOL WINAPI SetSystemTime( - const SYSTEMTIME *systime) /* [in] The desired system time. */ -{ - FILETIME ft; - LARGE_INTEGER t; - NTSTATUS status; - - SystemTimeToFileTime( systime, &ft ); - t.u.LowPart = ft.dwLowDateTime; - t.u.HighPart = ft.dwHighDateTime; - if ((status = NtSetSystemTime(&t, NULL))) - SetLastError( RtlNtStatusToDosError(status) ); - return !status; -} - -/*********************************************************************** - * SetSystemTimeAdjustment (KERNEL32.@) - * - * Enables or disables the timing adjustments to the system's clock. - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. - */ -BOOL WINAPI SetSystemTimeAdjustment( - DWORD dwTimeAdjustment, - BOOL bTimeAdjustmentDisabled) -{ - /* Fake function for now... */ - FIXME("(%08lx,%d): stub !\n", dwTimeAdjustment, bTimeAdjustmentDisabled); - return TRUE; -} - - -/*********************************************************************** - * GetTimeZoneInformation (KERNEL32.@) - * - * Get information about the current local time zone. - * - * RETURNS - * Success: TIME_ZONE_ID_STANDARD. tzinfo contains the time zone info. - * Failure: TIME_ZONE_ID_INVALID. - * FIXME: return TIME_ZONE_ID_DAYLIGHT when daylight saving is on. - */ -DWORD WINAPI GetTimeZoneInformation( - LPTIME_ZONE_INFORMATION tzinfo) /* [out] Destination for time zone information */ -{ - NTSTATUS status; - if ((status = RtlQueryTimeZoneInformation(tzinfo))) - SetLastError( RtlNtStatusToDosError(status) ); - return TIME_ZONE_ID_STANDARD; -} - - -/*********************************************************************** - * SetTimeZoneInformation (KERNEL32.@) - * - * Change the settings of the current local time zone. - * - * RETURNS - * Success: TRUE. The time zone was updated with the settings from tzinfo - * Failure: FALSE. - */ -BOOL WINAPI SetTimeZoneInformation( - const LPTIME_ZONE_INFORMATION tzinfo) /* [in] The new time zone. */ -{ - NTSTATUS status; - if ((status = RtlSetTimeZoneInformation(tzinfo))) - SetLastError( RtlNtStatusToDosError(status) ); - return !status; -} - - -/*********************************************************************** - * _DayLightCompareDate + * TIME_DayLightCompareDate * * Compares two dates without looking at the year * @@ -207,10 +71,9 @@ BOOL WINAPI SetTimeZoneInformation( * 1 if date > compareDate * -2 if an error occures */ - -static int _DayLightCompareDate( - const LPSYSTEMTIME date, /* [in] The local time to compare. */ - const LPSYSTEMTIME compareDate) /* [in] The daylight saving begin +static int TIME_DayLightCompareDate( + const SYSTEMTIME *date, /* [in] The local time to compare. */ + const SYSTEMTIME *compareDate) /* [in] The daylight saving begin or end date */ { int limit_day, dayinsecs; @@ -295,96 +158,273 @@ static int _DayLightCompareDate( 0; /* date is equal to the date limit. */ } - /*********************************************************************** - * _GetTimezoneBias + * TIME_CompTimeZoneID * - * Calculates the local time bias for a given time zone + * Computes the local time bias for a given time and time zone * - * RETURNS - * - * Returns TRUE when the time zone bias was calculated. + * Returns: + * TIME_ZONE_ID_INVALID An error occurred + * TIME_ZONE_ID_UNKNOWN There are no transition time known + * TIME_ZONE_ID_STANDARD Current time is standard time + * TIME_ZONE_ID_DAYLIGHT Current time is dayligh saving time */ - -static BOOL _GetTimezoneBias( - const LPTIME_ZONE_INFORMATION - lpTimeZoneInformation, /* [in] The time zone data. */ - LPSYSTEMTIME lpSysOrLocalTime, /* [in] The system or local time. */ - BOOL islocal, /* [in] it is local time */ - LONG* pBias /* [out] The calulated bias in minutes */ +static BOOL TIME_CompTimeZoneID ( + const TIME_ZONE_INFORMATION *pTZinfo, /* [in] The time zone data. */ + FILETIME *lpFileTime, /* [in] The system or local time. */ + BOOL islocal /* [in] it is local time */ ) { int ret; BOOL beforeStandardDate, afterDaylightDate; - BOOL daylightsaving = FALSE; - LONG bias = lpTimeZoneInformation->Bias; - FILETIME ft; + DWORD retval = TIME_ZONE_ID_INVALID; LONGLONG llTime = 0; /* initialized to prevent gcc complaining */ - SYSTEMTIME stTemp; - LPSYSTEMTIME lpTime = lpSysOrLocalTime; + SYSTEMTIME SysTime; + FILETIME ftTemp; - if (lpTimeZoneInformation->DaylightDate.wMonth != 0) + if (pTZinfo->DaylightDate.wMonth != 0) { - if (lpTimeZoneInformation->StandardDate.wMonth == 0 || - lpTimeZoneInformation->StandardDate.wDay<1 || - lpTimeZoneInformation->StandardDate.wDay>5 || - lpTimeZoneInformation->DaylightDate.wDay<1 || - lpTimeZoneInformation->DaylightDate.wDay>5) + if (pTZinfo->StandardDate.wMonth == 0 || + pTZinfo->StandardDate.wDay<1 || + pTZinfo->StandardDate.wDay>5 || + pTZinfo->DaylightDate.wDay<1 || + pTZinfo->DaylightDate.wDay>5) { SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + return TIME_ZONE_ID_INVALID; } if (!islocal) { - if (!SystemTimeToFileTime(lpSysOrLocalTime, &ft)) return -2; - FILETIME2LL( &ft, llTime ); - llTime -= ( lpTimeZoneInformation->Bias + - lpTimeZoneInformation->DaylightBias ) * (LONGLONG)600000000; - LL2FILETIME( llTime, &ft) - FileTimeToSystemTime(&ft, &stTemp); - lpTime = &stTemp; + FILETIME2LL( lpFileTime, llTime ); + llTime -= ( pTZinfo->Bias + pTZinfo->DaylightBias ) + * (LONGLONG)600000000; + LL2FILETIME( llTime, &ftTemp) + lpFileTime = &ftTemp; } + + FileTimeToSystemTime(lpFileTime, &SysTime); /* check for daylight saving */ - ret = _DayLightCompareDate(lpTime, &lpTimeZoneInformation->StandardDate); + ret = TIME_DayLightCompareDate( &SysTime, &pTZinfo->StandardDate); if (ret == -2) - return FALSE; + return TIME_ZONE_ID_INVALID; beforeStandardDate = ret < 0; if (!islocal) { - llTime -= ( lpTimeZoneInformation->StandardBias - - lpTimeZoneInformation->DaylightBias ) * (LONGLONG)600000000; - LL2FILETIME( llTime, &ft) - FileTimeToSystemTime(&ft, &stTemp); - lpTime = &stTemp; + llTime -= ( pTZinfo->StandardBias - pTZinfo->DaylightBias ) + * (LONGLONG)600000000; + LL2FILETIME( llTime, &ftTemp) + FileTimeToSystemTime(lpFileTime, &SysTime); } - ret = _DayLightCompareDate(lpTime, &lpTimeZoneInformation->DaylightDate); + ret = TIME_DayLightCompareDate( &SysTime, &pTZinfo->DaylightDate); if (ret == -2) - return FALSE; + return TIME_ZONE_ID_INVALID; afterDaylightDate = ret >= 0; - if( lpTimeZoneInformation->DaylightDate.wMonth < /* Northern */ - lpTimeZoneInformation->StandardDate.wMonth ) { /* hemisphere */ + retval = TIME_ZONE_ID_STANDARD; + if( pTZinfo->DaylightDate.wMonth < pTZinfo->StandardDate.wMonth ) { + /* Northern hemisphere */ if( beforeStandardDate && afterDaylightDate ) - daylightsaving = TRUE; + retval = TIME_ZONE_ID_DAYLIGHT; } else /* Down south */ if( beforeStandardDate || afterDaylightDate ) - daylightsaving = TRUE; - } + retval = TIME_ZONE_ID_DAYLIGHT; + } else + /* No transition date */ + retval = TIME_ZONE_ID_UNKNOWN; + + return retval; +} + +/*********************************************************************** + * TIME_TimeZoneID + * + * Calculates whether daylight saving is on now. + * + * Returns: + * TIME_ZONE_ID_INVALID An error occurred + * TIME_ZONE_ID_UNKNOWN There are no transition time known + * TIME_ZONE_ID_STANDARD Current time is standard time + * TIME_ZONE_ID_DAYLIGHT Current time is dayligh saving time + */ +static DWORD TIME_ZoneID( + const TIME_ZONE_INFORMATION *pTzi /* Timezone info */ + ) +{ + FILETIME ftTime; + GetSystemTimeAsFileTime( &ftTime); + return TIME_CompTimeZoneID( pTzi, &ftTime, FALSE); +} - if (daylightsaving) - bias += lpTimeZoneInformation->DaylightBias; - else if (lpTimeZoneInformation->StandardDate.wMonth != 0) - bias += lpTimeZoneInformation->StandardBias; +/*********************************************************************** + * TIME_GetTimezoneBias + * + * Calculates the local time bias for a given time zone + * + * RETURNS + * + * Returns TRUE when the time zone bias was calculated. + */ +static BOOL TIME_GetTimezoneBias( + const TIME_ZONE_INFORMATION + *pTZinfo, /* [in] The time zone data. */ + FILETIME *lpFileTime, /* [in] The system or local time. */ + BOOL islocal, /* [in] it is local time */ + LONG *pBias /* [out] The calulated bias in minutes */ + ) +{ + LONG bias = pTZinfo->Bias; + DWORD tzid = TIME_CompTimeZoneID( pTZinfo, lpFileTime, islocal); + if( tzid == TIME_ZONE_ID_INVALID) + return FALSE; + if (tzid == TIME_ZONE_ID_DAYLIGHT) + bias += pTZinfo->DaylightBias; + else if (tzid == TIME_ZONE_ID_STANDARD) + bias += pTZinfo->StandardBias; *pBias = bias; + return TRUE; +} + + +/*********************************************************************** + * SetLocalTime (KERNEL32.@) + * + * Set the local time using current time zone and daylight + * savings settings. + * + * RETURNS + * Success: TRUE. The time was set + * Failure: FALSE, if the time was invalid or caller does not have + * permission to change the time. + */ +BOOL WINAPI SetLocalTime( + const SYSTEMTIME *systime) /* [in] The desired local time. */ +{ + FILETIME ft; + LARGE_INTEGER st, st2; + NTSTATUS status; + + SystemTimeToFileTime( systime, &ft ); + st.u.LowPart = ft.dwLowDateTime; + st.u.HighPart = ft.dwHighDateTime; + RtlLocalTimeToSystemTime( &st, &st2 ); + + if ((status = NtSetSystemTime(&st2, NULL))) + SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + + +/*********************************************************************** + * GetSystemTimeAdjustment (KERNEL32.@) + * + * Get the period between clock interrupts and the amount the clock + * is adjusted each interrupt so as to keep it in sync with an external source. + * + * RETURNS + * TRUE. + * + * BUGS + * Only the special case of disabled time adjustments is supported. + */ +BOOL WINAPI GetSystemTimeAdjustment( + PDWORD lpTimeAdjustment, /* [out] The clock adjustment per interupt in 100's of nanoseconds. */ + PDWORD lpTimeIncrement, /* [out] The time between clock interupts in 100's of nanoseconds. */ + PBOOL lpTimeAdjustmentDisabled) /* [out] The clock synchonisation has been disabled. */ +{ + *lpTimeAdjustment = 0; + *lpTimeIncrement = 0; + *lpTimeAdjustmentDisabled = TRUE; + return TRUE; +} + +/*********************************************************************** + * SetSystemTime (KERNEL32.@) + * + * Set the system time in utc. + * + * RETURNS + * Success: TRUE. The time was set + * Failure: FALSE, if the time was invalid or caller does not have + * permission to change the time. + */ +BOOL WINAPI SetSystemTime( + const SYSTEMTIME *systime) /* [in] The desired system time. */ +{ + FILETIME ft; + LARGE_INTEGER t; + NTSTATUS status; + + SystemTimeToFileTime( systime, &ft ); + t.u.LowPart = ft.dwLowDateTime; + t.u.HighPart = ft.dwHighDateTime; + if ((status = NtSetSystemTime(&t, NULL))) + SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/*********************************************************************** + * SetSystemTimeAdjustment (KERNEL32.@) + * + * Enables or disables the timing adjustments to the system's clock. + * + * RETURNS + * Success: TRUE. + * Failure: FALSE. + */ +BOOL WINAPI SetSystemTimeAdjustment( + DWORD dwTimeAdjustment, + BOOL bTimeAdjustmentDisabled) +{ + /* Fake function for now... */ + FIXME("(%08lx,%d): stub !\n", dwTimeAdjustment, bTimeAdjustmentDisabled); return TRUE; } +/*********************************************************************** + * GetTimeZoneInformation (KERNEL32.@) + * + * Get information about the current local time zone. + * + * RETURNS + * TIME_ZONE_ID_INVALID An error occurred + * TIME_ZONE_ID_UNKNOWN There are no transition time known + * TIME_ZONE_ID_STANDARD Current time is standard time + * TIME_ZONE_ID_DAYLIGHT Current time is dayligh saving time + */ +DWORD WINAPI GetTimeZoneInformation( + LPTIME_ZONE_INFORMATION tzinfo) /* [out] Destination for time zone information */ +{ + NTSTATUS status; + if ((status = RtlQueryTimeZoneInformation(tzinfo))) { + SetLastError( RtlNtStatusToDosError(status) ); + return TIME_ZONE_ID_INVALID; + } + return TIME_ZoneID( tzinfo ); +} + +/*********************************************************************** + * SetTimeZoneInformation (KERNEL32.@) + * + * Change the settings of the current local time zone. + * + * RETURNS + * Success: TRUE. The time zone was updated with the settings from tzinfo + * Failure: FALSE. + */ +BOOL WINAPI SetTimeZoneInformation( + const TIME_ZONE_INFORMATION *tzinfo) /* [in] The new time zone. */ +{ + NTSTATUS status; + if ((status = RtlSetTimeZoneInformation(tzinfo))) + SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} /*********************************************************************** * SystemTimeToTzSpecificLocalTime (KERNEL32.@) @@ -420,7 +460,7 @@ BOOL WINAPI SystemTimeToTzSpecificLocalTime( if (!SystemTimeToFileTime(lpUniversalTime, &ft)) return FALSE; FILETIME2LL( &ft, llTime) - if (!_GetTimezoneBias(&tzinfo, lpUniversalTime, FALSE, &lBias)) + if (!TIME_GetTimezoneBias(&tzinfo, &ft, FALSE, &lBias)) return FALSE; /* convert minutes to 100-nanoseconds-ticks */ llTime -= (LONGLONG)lBias * 600000000; @@ -462,7 +502,7 @@ BOOL WINAPI TzSpecificLocalTimeToSystemTime( if (!SystemTimeToFileTime(lpLocalTime, &ft)) return FALSE; FILETIME2LL( &ft, t) - if (!_GetTimezoneBias(&tzinfo, lpLocalTime, TRUE, &lBias)) + if (!TIME_GetTimezoneBias(&tzinfo, &ft, TRUE, &lBias)) return FALSE; /* convert minutes to 100-nanoseconds-ticks */ t += (LONGLONG)lBias * 600000000; @@ -894,12 +934,10 @@ VOID WINAPI GetSystemTime(LPSYSTEMTIME systime) /* [O] Destination for current t */ BOOL WINAPI GetDaylightFlag(void) { - time_t t = time(NULL); - struct tm *ptm = localtime( &t); - return ptm->tm_isdst > 0; + TIME_ZONE_INFORMATION tzinfo; + return GetTimeZoneInformation( &tzinfo) == TIME_ZONE_ID_DAYLIGHT; } - /*********************************************************************** * DosDateTimeToFileTime (KERNEL32.@) */ diff --git a/include/winbase.h b/include/winbase.h index bdd36ca2c8..c162fccc38 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1638,7 +1638,7 @@ DWORD WINAPI SetThreadIdealProcessor(HANDLE,DWORD); BOOL WINAPI SetThreadPriority(HANDLE,INT); BOOL WINAPI SetThreadPriorityBoost(HANDLE,BOOL); BOOL WINAPI SetThreadToken(PHANDLE,HANDLE); -BOOL WINAPI SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION); +BOOL WINAPI SetTimeZoneInformation(const TIME_ZONE_INFORMATION *); BOOL WINAPI SetVolumeMountPointA(LPCSTR,LPCSTR); BOOL WINAPI SetVolumeMountPointW(LPCSTR,LPCSTR); #define SetVolumeMountPoint WINELIB_NAME_AW(SetVolumeMountPoint)