Index: icu46/source/i18n/wintzimpl.cpp |
=================================================================== |
--- icu46/source/i18n/wintzimpl.cpp (revision 0) |
+++ icu46/source/i18n/wintzimpl.cpp (revision 0) |
@@ -0,0 +1,157 @@ |
+/* |
+******************************************************************************** |
+* Copyright (C) 2009, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+******************************************************************************** |
+* |
+* File WINTZIMPL.CPP |
+* |
+******************************************************************************** |
+*/ |
+ |
+#include "unicode/utypes.h" |
+ |
+#ifdef U_WINDOWS |
+ |
+#include "wintzimpl.h" |
+ |
+#include "unicode/unistr.h" |
+#include "unicode/timezone.h" |
+#include "unicode/basictz.h" |
+#include "putilimp.h" |
+#include "uassert.h" |
+#include "cmemory.h" |
+ |
+# define WIN32_LEAN_AND_MEAN |
+# define VC_EXTRALEAN |
+# define NOUSER |
+# define NOSERVICE |
+# define NOIME |
+# define NOMCX |
+ |
+#include <windows.h> |
+ |
+U_NAMESPACE_USE |
+ |
+static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SYSTEMTIME &standardDate, int32_t &bias, int32_t &daylightBias, int32_t &standardBias) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ UBool result = TRUE; |
+ BasicTimeZone *btz = (BasicTimeZone*)tz; // we should check type |
+ InitialTimeZoneRule *initial = NULL; |
+ AnnualTimeZoneRule *std = NULL, *dst = NULL; |
+ |
+ btz->getSimpleRulesNear(uprv_getUTCtime(), initial, std, dst, status); |
+ if (U_SUCCESS(status)) { |
+ if (std == NULL || dst == NULL) { |
+ bias = -1 * (initial->getRawOffset()/60000); |
+ standardBias = 0; |
+ daylightBias = 0; |
+ // Do not use DST. Set 0 to all stadardDate/daylightDate fields |
+ standardDate.wYear = standardDate.wMonth = standardDate.wDayOfWeek = standardDate.wDay = |
+ standardDate.wHour = standardDate.wMinute = standardDate.wSecond = standardDate.wMilliseconds = 0; |
+ daylightDate.wYear = daylightDate.wMonth = daylightDate.wDayOfWeek = daylightDate.wDay = |
+ daylightDate.wHour = daylightDate.wMinute = daylightDate.wSecond = daylightDate.wMilliseconds = 0; |
+ } else { |
+ U_ASSERT(std->getRule()->getDateRuleType() == DateTimeRule::DOW); |
+ U_ASSERT(dst->getRule()->getDateRuleType() == DateTimeRule::DOW); |
+ |
+ bias = -1 * (std->getRawOffset()/60000); |
+ standardBias = 0; |
+ daylightBias = -1 * (dst->getDSTSavings()/60000); |
+ // Always use DOW type rule |
+ int32_t hour, min, sec, mil; |
+ standardDate.wYear = 0; |
+ standardDate.wMonth = std->getRule()->getRuleMonth() + 1; |
+ standardDate.wDay = std->getRule()->getRuleWeekInMonth(); |
+ if (standardDate.wDay < 0) { |
+ standardDate.wDay = 5; |
+ } |
+ standardDate.wDayOfWeek = std->getRule()->getRuleDayOfWeek() - 1; |
+ |
+ mil = std->getRule()->getRuleMillisInDay(); |
+ hour = mil/3600000; |
+ mil %= 3600000; |
+ min = mil/60000; |
+ mil %= 60000; |
+ sec = mil/1000; |
+ mil %= 1000; |
+ |
+ standardDate.wHour = hour; |
+ standardDate.wMinute = min; |
+ standardDate.wSecond = sec; |
+ standardDate.wMilliseconds = mil; |
+ |
+ daylightDate.wYear = 0; |
+ daylightDate.wMonth = dst->getRule()->getRuleMonth() + 1; |
+ daylightDate.wDay = dst->getRule()->getRuleWeekInMonth(); |
+ if (daylightDate.wDay < 0) { |
+ daylightDate.wDay = 5; |
+ } |
+ daylightDate.wDayOfWeek = dst->getRule()->getRuleDayOfWeek() - 1; |
+ |
+ mil = dst->getRule()->getRuleMillisInDay(); |
+ hour = mil/3600000; |
+ mil %= 3600000; |
+ min = mil/60000; |
+ mil %= 60000; |
+ sec = mil/1000; |
+ mil %= 1000; |
+ |
+ daylightDate.wHour = hour; |
+ daylightDate.wMinute = min; |
+ daylightDate.wSecond = sec; |
+ daylightDate.wMilliseconds = mil; |
+ } |
+ } else { |
+ result = FALSE; |
+ } |
+ |
+ delete initial; |
+ delete std; |
+ delete dst; |
+ |
+ return result; |
+} |
+ |
+static UBool getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length) { |
+ UBool result = FALSE; |
+ UnicodeString id = UnicodeString(icuid, length); |
+ TimeZone *tz = TimeZone::createTimeZone(id); |
+ |
+ if (tz != NULL) { |
+ int32_t bias; |
+ int32_t daylightBias; |
+ int32_t standardBias; |
+ SYSTEMTIME daylightDate; |
+ SYSTEMTIME standardDate; |
+ |
+ if (getSystemTimeInformation(tz, daylightDate, standardDate, bias, daylightBias, standardBias)) { |
+ uprv_memset(zoneInfo, 0, sizeof(TIME_ZONE_INFORMATION)); // We do not set standard/daylight names, so nullify first. |
+ zoneInfo->Bias = bias; |
+ zoneInfo->DaylightBias = daylightBias; |
+ zoneInfo->StandardBias = standardBias; |
+ zoneInfo->DaylightDate = daylightDate; |
+ zoneInfo->StandardDate = standardDate; |
+ |
+ result = TRUE; |
+ } |
+ } |
+ |
+ return result; |
+} |
+ |
+/* |
+ * Given the timezone icuid, fill in zoneInfo by calling auxillary functions that creates a timezone and extract the |
+ * information to put into zoneInfo. This includes bias and standard time date and daylight saving date. |
+ */ |
+U_CAPI UBool U_EXPORT2 |
+uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length) |
+{ |
+ if (getWindowsTimeZoneInfo(zoneInfo, icuid, length)) { |
+ return TRUE; |
+ } else { |
+ return FALSE; |
+ } |
+} |
+ |
+#endif |
Property changes on: icu46/source/i18n/wintzimpl.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |