16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2005-2013, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File WINDTFMT.CPP 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/format.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/fmtable.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/datefmt.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/msgfmt.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gregocal.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/timezone.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utmscale.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "windtfmt.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "wintzimpl.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define WIN32_LEAN_AND_MEAN 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define VC_EXTRALEAN 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOUSER 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOSERVICE 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOIME 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define NOMCX 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <windows.h> 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(Win32DateFormat) 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NEW_ARRAY(type,count) (type *) uprv_malloc((count) * sizeof(type)) 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DELETE_ARRAY(array) uprv_free((void *) (array)) 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STACK_BUFFER_SIZE 64 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString* Win32DateFormat::getTimeDateFormat(const Calendar *cal, const Locale *locale, UErrorCode &status) const 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *result = NULL; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *type = cal->getType(); 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *base = locale->getBaseName(); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *topBundle = ures_open((char *) 0, base, &status); 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *calBundle = ures_getByKey(topBundle, "calendar", NULL, &status); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *typBundle = ures_getByKeyWithFallback(calBundle, type, NULL, &status); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *patBundle = ures_getByKeyWithFallback(typBundle, "DateTimePatterns", NULL, &status); 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_MISSING_RESOURCE_ERROR) { 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typBundle = ures_getByKeyWithFallback(calBundle, "gregorian", typBundle, &status); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patBundle = ures_getByKeyWithFallback(typBundle, "DateTimePatterns", patBundle, &status); 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar defaultPattern[] = {0x007B, 0x0031, 0x007D, 0x0020, 0x007B, 0x0030, 0x007D, 0x0000}; // "{1} {0}" 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new UnicodeString(defaultPattern, ARRAY_SIZE(defaultPattern)); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t resStrLen = 0; 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t glueIndex = DateFormat::kDateTime; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t patSize = ures_getSize(patBundle); 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (patSize >= (DateFormat::kDateTimeOffset + DateFormat::kShort + 1)) { 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Get proper date time format 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org glueIndex = (int32_t)(DateFormat::kDateTimeOffset + (fDateStyle - DateFormat::kDateOffset)); 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *resStr = ures_getStringByIndex(patBundle, glueIndex, &resStrLen, &status); 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = new UnicodeString(TRUE, resStr, resStrLen); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(patBundle); 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(typBundle); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(calBundle); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(topBundle); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TODO: Range-check timeStyle, dateStyle 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgWin32DateFormat::Win32DateFormat(DateFormat::EStyle timeStyle, DateFormat::EStyle dateStyle, const Locale &locale, UErrorCode &status) 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : DateFormat(), fDateTimeMsg(NULL), fTimeStyle(timeStyle), fDateStyle(dateStyle), fLocale(locale), fZoneID() 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fLCID = locale.getLCID(); 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTZI = NEW_ARRAY(TIME_ZONE_INFORMATION, 1); 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memset(fTZI, 0, sizeof(TIME_ZONE_INFORMATION)); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org adoptCalendar(Calendar::createInstance(locale, status)); 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgWin32DateFormat::Win32DateFormat(const Win32DateFormat &other) 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : DateFormat(other) 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *this = other; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgWin32DateFormat::~Win32DateFormat() 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// delete fCalendar; 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free(fTZI); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fDateTimeMsg; 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgWin32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other) 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The following handles fCalendar 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat::operator=(other); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// delete fCalendar; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fDateTimeMsg = other.fDateTimeMsg; 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fTimeStyle = other.fTimeStyle; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fDateStyle = other.fDateStyle; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fLocale = other.fLocale; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fLCID = other.fLCID; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// this->fCalendar = other.fCalendar->clone(); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fZoneID = other.fZoneID; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->fTZI = NEW_ARRAY(TIME_ZONE_INFORMATION, 1); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *this->fTZI = *other.fTZI; 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return *this; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFormat *Win32DateFormat::clone(void) const 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new Win32DateFormat(*this); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TODO: Is just ignoring pos the right thing? 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition &pos) const 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILETIME ft; 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SYSTEMTIME st_gmt; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SYSTEMTIME st_local; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TIME_ZONE_INFORMATION tzi = *fTZI; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const TimeZone &tz = cal.getTimeZone(); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t uct, uft; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org setTimeZoneInfo(&tzi, tz); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uct = utmscale_fromInt64((int64_t) cal.getTime(status), UDTS_ICU4C_TIME, &status); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uft = utmscale_toInt64(uct, UDTS_WINDOWS_FILE_TIME, &status); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ft.dwLowDateTime = (DWORD) (uft & 0xFFFFFFFF); 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ft.dwHighDateTime = (DWORD) ((uft >> 32) & 0xFFFFFFFF); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FileTimeToSystemTime(&ft, &st_gmt); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SystemTimeToTzSpecificLocalTime(&tzi, &st_gmt, &st_local); 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fDateStyle != DateFormat::kNone && fTimeStyle != DateFormat::kNone) { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *date = new UnicodeString(); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *time = new UnicodeString(); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *pattern = fDateTimeMsg; 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable timeDateArray[2]; 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatDate(&st_local, *date); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatTime(&st_local, *time); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org timeDateArray[0].adoptString(time); 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org timeDateArray[1].adoptString(date); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (strcmp(fCalendar->getType(), cal.getType()) != 0) { 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pattern = getTimeDateFormat(&cal, &fLocale, status); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessageFormat::format(*pattern, timeDateArray, 2, appendTo, status); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (fDateStyle != DateFormat::kNone) { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatDate(&st_local, appendTo); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (fTimeStyle != DateFormat::kNone) { 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatTime(&st_local, appendTo); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return appendTo; 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& pos) const 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos.setErrorIndex(pos.getIndex()); 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::adoptCalendar(Calendar *newCalendar) 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fCalendar == NULL || strcmp(fCalendar->getType(), newCalendar->getType()) != 0) { 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fDateStyle != DateFormat::kNone && fTimeStyle != DateFormat::kNone) { 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fDateTimeMsg; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fDateTimeMsg = getTimeDateFormat(newCalendar, &fLocale, status); 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fCalendar; 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fCalendar = newCalendar; 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fZoneID = setTimeZoneInfo(fTZI, fCalendar->getTimeZone()); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::setCalendar(const Calendar &newCalendar) 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org adoptCalendar(newCalendar.clone()); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::adoptTimeZone(TimeZone *zoneToAdopt) 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fZoneID = setTimeZoneInfo(fTZI, *zoneToAdopt); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fCalendar->adoptTimeZone(zoneToAdopt); 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::setTimeZone(const TimeZone& zone) 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fZoneID = setTimeZoneInfo(fTZI, zone); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fCalendar->setTimeZone(zone); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const DWORD dfFlags[] = {DATE_LONGDATE, DATE_LONGDATE, DATE_SHORTDATE, DATE_SHORTDATE}; 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::formatDate(const SYSTEMTIME *st, UnicodeString &appendTo) const 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result; 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar stackBuffer[STACK_BUFFER_SIZE]; 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *buffer = stackBuffer; 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, STACK_BUFFER_SIZE); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int newLength = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, NULL, 0); 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer = NEW_ARRAY(UChar, newLength); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, newLength); 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendTo.append(buffer, (int32_t) wcslen(buffer)); 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (buffer != stackBuffer) { 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DELETE_ARRAY(buffer); 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const DWORD tfFlags[] = {0, 0, 0, TIME_NOSECONDS}; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid Win32DateFormat::formatTime(const SYSTEMTIME *st, UnicodeString &appendTo) const 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int result; 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar stackBuffer[STACK_BUFFER_SIZE]; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *buffer = stackBuffer; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, STACK_BUFFER_SIZE); 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result == 0) { 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int newLength = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, NULL, 0); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer = NEW_ARRAY(UChar, newLength); 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetDateFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, newLength); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendTo.append(buffer, (int32_t) wcslen(buffer)); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (buffer != stackBuffer) { 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DELETE_ARRAY(buffer); 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString Win32DateFormat::setTimeZoneInfo(TIME_ZONE_INFORMATION *tzi, const TimeZone &zone) const 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString zoneID; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone.getID(zoneID); 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (zoneID.compare(fZoneID) != 0) { 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString icuid; 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone.getID(icuid); 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! uprv_getWindowsTimeZoneInfo(tzi, icuid.getBuffer(), icuid.length())) { 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool found = FALSE; 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ec = TimeZone::countEquivalentIDs(icuid); 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int z = 0; z < ec; z += 1) { 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString equiv = TimeZone::getEquivalentID(icuid, z); 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (found = uprv_getWindowsTimeZoneInfo(tzi, equiv.getBuffer(), equiv.length())) { 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! found) { 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GetTimeZoneInformation(tzi); 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return zoneID; 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // U_PLATFORM_HAS_WIN32_API 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 323