1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Copyright (C) 1996-2013, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h" // for 'typeid' to work 927f654740f2a26ad62a5c155af9199af9e69b889claireho 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucal.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/timezone.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/gregocal.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/strenum.h" 2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/localpointer.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrenum.h" 26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "uenumimp.h" 27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "ulist.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic TimeZone* 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) { 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = NULL; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ec!=NULL && U_SUCCESS(*ec)) { 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note that if zoneID is invalid, we get back GMT. This odd 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // behavior is by design and goes back to the JDK. The only 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // failure we will see is a memory allocation failure. 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t l = (len<0 ? u_strlen(zoneID) : len); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString zoneStrID; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */ 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zone = TimeZone::createTimeZone(zoneStrID); 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (zone == NULL) { 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *ec = U_MEMORY_ALLOCATION_ERROR; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return zone; 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoucal_openTimeZoneIDEnumeration(USystemTimeZoneType zoneType, const char* region, 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t* rawOffset, UErrorCode* ec) { 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return uenum_openFromStringEnumeration(TimeZone::createTimeZoneIDEnumeration( 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho zoneType, region, rawOffset, *ec), ec); 54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CAPI UEnumeration* U_EXPORT2 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_openTimeZones(UErrorCode* ec) { 58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return uenum_openFromStringEnumeration(TimeZone::createEnumeration(), ec); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_openCountryTimeZones(const char* country, UErrorCode* ec) { 63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return uenum_openFromStringEnumeration(TimeZone::createEnumeration(country), ec); 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) { 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ec!=NULL && U_SUCCESS(*ec)) { 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = TimeZone::createDefault(); 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (zone == NULL) { 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *ec = U_MEMORY_ALLOCATION_ERROR; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zone->getID(id); 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete zone; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = id.extract(result, resultCapacity, *ec); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return len; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) { 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = _createTimeZone(zoneID, -1, ec); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (zone != NULL) { 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone::adoptDefault(zone); 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) { 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t result = 0; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = _createTimeZone(zoneID, -1, ec); 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(*ec)) { 9627f654740f2a26ad62a5c155af9199af9e69b889claireho SimpleTimeZone* stz = dynamic_cast<SimpleTimeZone*>(zone); 9727f654740f2a26ad62a5c155af9199af9e69b889claireho if (stz != NULL) { 9827f654740f2a26ad62a5c155af9199af9e69b889claireho result = stz->getDSTSavings(); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Since there is no getDSTSavings on TimeZone, we use a 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // heuristic: Starting with the current time, march 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // forwards for one year, looking for DST savings. 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Stepping by weeks is sufficient. 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate d = Calendar::getNow(); 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<53; ++i, d+=U_MILLIS_PER_DAY*7.0) { 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t raw, dst; 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zone->getOffset(d, FALSE, raw, dst, *ec); 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*ec)) { 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (dst != 0) { 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = dst; 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete zone; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate U_EXPORT2 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getNow() 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return Calendar::getNow(); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY) 129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCalendar* U_EXPORT2 131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_open( const UChar* zoneID, 132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len, 133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* locale, 134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCalendarType caltype, 135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode* status) 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return 0; 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault() 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : _createTimeZone(zoneID, len, status); 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( caltype == UCAL_GREGORIAN ) { 148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char localeBuf[ULOC_LOCALE_IDENTIFIER_CAPACITY]; 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ( locale == NULL ) { 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho locale = uloc_getDefault(); 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_strncpy(localeBuf, locale, ULOC_LOCALE_IDENTIFIER_CAPACITY); 153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uloc_setKeywordValue("calendar", "gregorian", localeBuf, ULOC_LOCALE_IDENTIFIER_CAPACITY, status); 154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status)) { 155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return (UCalendar*)Calendar::createInstance(zone, Locale(localeBuf), *status); 158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UCalendar*)Calendar::createInstance(zone, Locale(locale), *status); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_close(UCalendar *cal) 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete (Calendar*) cal; 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CAPI UCalendar* U_EXPORT2 170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruucal_clone(const UCalendar* cal, 171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode* status) 172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(*status)) return 0; 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar* res = ((Calendar*)cal)->clone(); 176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(res == 0) { 178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return (UCalendar*) res; 183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setTimeZone( UCalendar* cal, 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* zoneID, 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len, 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault() 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : _createTimeZone(zoneID, len, status); 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (zone != NULL) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->adoptTimeZone(zone); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 2048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusucal_getTimeZoneID(const UCalendar *cal, 2058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UChar *result, 2068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int32_t resultLength, 2078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode *status) 2088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{ 2098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(*status)) { 2108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return 0; 2118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 2128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius const TimeZone& tz = ((Calendar*)cal)->getTimeZone(); 2138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UnicodeString id; 2148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius tz.getID(id); 2158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return id.extract(result, resultLength, *status); 2168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 2178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 2188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_CAPI int32_t U_EXPORT2 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getTimeZoneDisplayName(const UCalendar* cal, 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDisplayNameType type, 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale, 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* result, 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLength, 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status) 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return -1; 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const TimeZone& tz = ((Calendar*)cal)->getTimeZone(); 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id; 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(result==NULL && resultLength==0)) { 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL destination for pure preflighting: empty dummy string 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // otherwise, alias the destination buffer 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru id.setTo(result, 0, resultLength); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(type) { 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_STANDARD: 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tz.getDisplayName(FALSE, TimeZone::LONG, Locale(locale), id); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_SHORT_STANDARD: 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tz.getDisplayName(FALSE, TimeZone::SHORT, Locale(locale), id); 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_DST: 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tz.getDisplayName(TRUE, TimeZone::LONG, Locale(locale), id); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_SHORT_DST: 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tz.getDisplayName(TRUE, TimeZone::SHORT, Locale(locale), id); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return id.extract(result, resultLength, *status); 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_inDaylightTime( const UCalendar* cal, 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status ) 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return (UBool) -1; 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->inDaylightTime(*status); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setGregorianChange(UCalendar *cal, UDate date, UErrorCode *pErrorCode) { 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*pErrorCode)) { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Calendar *cpp_cal = (Calendar *)cal; 27327f654740f2a26ad62a5c155af9199af9e69b889claireho GregorianCalendar *gregocal = dynamic_cast<GregorianCalendar *>(cpp_cal); 27427f654740f2a26ad62a5c155af9199af9e69b889claireho // Not if(gregocal == NULL) { 27527f654740f2a26ad62a5c155af9199af9e69b889claireho // because we really want to work only with a GregorianCalendar, not with 27627f654740f2a26ad62a5c155af9199af9e69b889claireho // its subclasses like BuddhistCalendar. 277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cpp_cal == NULL) { 278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We normally don't check "this" pointers for NULL, but this here avoids 279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // compiler-generated exception-throwing code in case cal == NULL. 280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; 281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 28327f654740f2a26ad62a5c155af9199af9e69b889claireho if(typeid(*cpp_cal) != typeid(GregorianCalendar)) { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode = U_UNSUPPORTED_ERROR; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 28727f654740f2a26ad62a5c155af9199af9e69b889claireho gregocal->setGregorianChange(date, *pErrorCode); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate U_EXPORT2 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getGregorianChange(const UCalendar *cal, UErrorCode *pErrorCode) { 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*pErrorCode)) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)0; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 29527f654740f2a26ad62a5c155af9199af9e69b889claireho const Calendar *cpp_cal = (const Calendar *)cal; 29627f654740f2a26ad62a5c155af9199af9e69b889claireho const GregorianCalendar *gregocal = dynamic_cast<const GregorianCalendar *>(cpp_cal); 29727f654740f2a26ad62a5c155af9199af9e69b889claireho // Not if(gregocal == NULL) { 29827f654740f2a26ad62a5c155af9199af9e69b889claireho // see comments in ucal_setGregorianChange(). 299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (cpp_cal == NULL) { 300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We normally don't check "this" pointers for NULL, but this here avoids 301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // compiler-generated exception-throwing code in case cal == NULL. 302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; 303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (UDate)0; 304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 30527f654740f2a26ad62a5c155af9199af9e69b889claireho if(typeid(*cpp_cal) != typeid(GregorianCalendar)) { 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pErrorCode = U_UNSUPPORTED_ERROR; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UDate)0; 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 30927f654740f2a26ad62a5c155af9199af9e69b889claireho return gregocal->getGregorianChange(); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getAttribute( const UCalendar* cal, 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarAttribute attr) 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(attr) { 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_LENIENT: 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->isLenient(); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_FIRST_DAY_OF_WEEK: 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getFirstDayOfWeek(); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_MINIMAL_DAYS_IN_FIRST_WEEK: 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getMinimalDaysInFirstWeek(); 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius case UCAL_REPEATED_WALL_TIME: 328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return ((Calendar*)cal)->getRepeatedWallTimeOption(); 329103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 330103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius case UCAL_SKIPPED_WALL_TIME: 331103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return ((Calendar*)cal)->getSkippedWallTimeOption(); 332103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setAttribute( UCalendar* cal, 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarAttribute attr, 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t newValue) 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(attr) { 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_LENIENT: 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->setLenient((UBool)newValue); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_FIRST_DAY_OF_WEEK: 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->setFirstDayOfWeek((UCalendarDaysOfWeek)newValue); 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_MINIMAL_DAYS_IN_FIRST_WEEK: 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->setMinimalDaysInFirstWeek((uint8_t)newValue); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 357103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 358103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius case UCAL_REPEATED_WALL_TIME: 359103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ((Calendar*)cal)->setRepeatedWallTimeOption((UCalendarWallTimeOption)newValue); 360103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 361103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius case UCAL_SKIPPED_WALL_TIME: 363103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ((Calendar*)cal)->setSkippedWallTimeOption((UCalendarWallTimeOption)newValue); 364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getAvailable(int32_t index) 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uloc_getAvailable(index); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_countAvailable() 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return uloc_countAvailable(); 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate U_EXPORT2 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getMillis( const UCalendar* cal, 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status) 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return (UDate) 0; 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getTime(*status); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setMillis( UCalendar* cal, 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate dateTime, 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status ) 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return; 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->setTime(dateTime, *status); 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TBD: why does this take an UErrorCode? 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDate( UCalendar* cal, 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t year, 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t month, 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t date, 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return; 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->set(year, month, date); 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TBD: why does this take an UErrorCode? 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDateTime( UCalendar* cal, 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t year, 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t month, 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t date, 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t hour, 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minute, 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t second, 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->set(year, month, date, hour, minute, second); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_equivalentTo( const UCalendar* cal1, 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UCalendar* cal2) 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal1)->isEquivalentTo(*((Calendar*)cal2)); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_add( UCalendar* cal, 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field, 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t amount, 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status) 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->add(field, amount, *status); 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_roll( UCalendar* cal, 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field, 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t amount, 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status) 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->roll(field, amount, *status); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_get( const UCalendar* cal, 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field, 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status ) 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) return -1; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->get(field, *status); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_set( UCalendar* cal, 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field, 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t value) 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->set(field, value); 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_isSet( const UCalendar* cal, 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field) 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->isSet(field); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_clearField( UCalendar* cal, 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field) 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)cal)->clear(field); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_clear(UCalendar* calendar) 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((Calendar*)calendar)->clear(); 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getLimit( const UCalendar* cal, 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarDateFields field, 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCalendarLimitType type, 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status==0 || U_FAILURE(*status)) { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(type) { 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_MINIMUM: 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getMinimum(field); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_MAXIMUM: 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getMaximum(field); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_GREATEST_MINIMUM: 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getGreatestMinimum(field); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_LEAST_MAXIMUM: 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getLeastMaximum(field); 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_ACTUAL_MINIMUM: 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getActualMinimum(field, 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCAL_ACTUAL_MAXIMUM: 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getActualMaximum(field, 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status); 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char * U_EXPORT2 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status) 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (cal == NULL) { 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(*status)) { 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ((Calendar*)cal)->getLocaleID(type, *status); 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char * U_EXPORT2 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getTZDataVersion(UErrorCode* status) 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TimeZone::getTZDataVersion(*status); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruucal_getCanonicalTimeZoneID(const UChar* id, int32_t len, 565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status) { 566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(status == 0 || U_FAILURE(*status)) { 567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (isSystemID) { 570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *isSystemID = FALSE; 571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (id == 0 || len == 0 || result == 0 || resultCapacity <= 0) { 573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t reslen = 0; 577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString canonical; 578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool systemID = FALSE; 579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TimeZone::getCanonicalID(UnicodeString(id, len), canonical, systemID, *status); 580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_SUCCESS(*status)) { 581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (isSystemID) { 582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *isSystemID = systemID; 583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru reslen = canonical.extract(result, resultCapacity, *status); 585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return reslen; 587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI const char * U_EXPORT2 590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_getType(const UCalendar *cal, UErrorCode* status) 591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status)) { 593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return ((Calendar*)cal)->getType(); 596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 59850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UCalendarWeekdayType U_EXPORT2 59950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_getDayOfWeekType(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode* status) 60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UCAL_WEEKDAY; 60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 60450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((Calendar*)cal)->getDayOfWeekType(dayOfWeek, *status); 60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 60650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 60750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2 60850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_getWeekendTransition(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode *status) 60950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 61050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 61150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 61250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((Calendar*)cal)->getWeekendTransition(dayOfWeek, *status); 61450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 61550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 61650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UBool U_EXPORT2 61750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_isWeekend(const UCalendar *cal, UDate date, UErrorCode *status) 61850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 61950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 62050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 62150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 62250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return ((Calendar*)cal)->isWeekend(date, *status); 62350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 62450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CAPI int32_t U_EXPORT2 626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoucal_getFieldDifference(UCalendar* cal, UDate target, 627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCalendarDateFields field, 628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode* status ) 629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(*status)) { 631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return 0; 632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return ((Calendar*)cal)->fieldDifference(target, field, *status); 634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UEnumeration defaultKeywordValues = { 638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru NULL, 639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru NULL, 640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_close_keyword_values_iterator, 641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_count_keyword_values, 642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_unextDefault, 643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_next_keyword_value, 644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_reset_keyword_values_iterator 645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char * const CAL_TYPES[] = { 648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "gregorian", 649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "japanese", 650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "buddhist", 651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "roc", 652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "persian", 653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "islamic-civil", 654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "islamic", 655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "hebrew", 656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "chinese", 657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "indian", 658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "coptic", 659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "ethiopic", 660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "ethiopic-amete-alem", 66159d709d503bab6e2b61931737e662dd293b40578ccornelius "iso8601", 66259d709d503bab6e2b61931737e662dd293b40578ccornelius "dangi", 66359d709d503bab6e2b61931737e662dd293b40578ccornelius "islamic-umalqura", 66459d709d503bab6e2b61931737e662dd293b40578ccornelius "islamic-tbla", 66559d709d503bab6e2b61931737e662dd293b40578ccornelius "islamic-rgsa", 666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru NULL 667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2 670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool commonlyUsed, UErrorCode *status) { 671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Resolve region 672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char prefRegion[ULOC_FULLNAME_CAPACITY] = ""; 673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t prefRegionLength = 0; 674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru prefRegionLength = uloc_getCountry(locale, prefRegion, sizeof(prefRegion), status); 675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (prefRegionLength == 0) { 676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char loc[ULOC_FULLNAME_CAPACITY] = ""; 677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uloc_addLikelySubtags(locale, loc, sizeof(loc), status); 678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru prefRegionLength = uloc_getCountry(loc, prefRegion, sizeof(prefRegion), status); 680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Read preferred calendar values from supplementalData calendarPreference 683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UResourceBundle *rb = ures_openDirect(NULL, "supplementalData", status); 684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ures_getByKey(rb, "calendarPreferenceData", rb, status); 685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UResourceBundle *order = ures_getByKey(rb, prefRegion, NULL, status); 686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (*status == U_MISSING_RESOURCE_ERROR && rb != NULL) { 687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *status = U_ZERO_ERROR; 688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru order = ures_getByKey(rb, "001", NULL, status); 689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Create a list of calendar type strings 692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UList *values = NULL; 693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(*status)) { 694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru values = ulist_createEmptyList(status); 695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(*status)) { 696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int i = 0; i < ures_getSize(order); i++) { 697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len; 698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar *type = ures_getStringByIndex(order, i, &len, status); 699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char *caltype = (char*)uprv_malloc(len + 1); 700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (caltype == NULL) { 701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_UCharsToChars(type, caltype, len); 705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *(caltype + len) = 0; 706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_addItemEndList(values, caltype, TRUE, status); 708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status)) { 709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(*status) && !commonlyUsed) { 714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // If not commonlyUsed, add other available values 715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; CAL_TYPES[i] != NULL; i++) { 71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!ulist_containsString(values, CAL_TYPES[i], (int32_t)uprv_strlen(CAL_TYPES[i]))) { 717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_addItemEndList(values, CAL_TYPES[i], FALSE, status); 718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status)) { 719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status)) { 725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_deleteList(values); 726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru values = NULL; 727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ures_close(order); 732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ures_close(rb); 733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(*status) || values == NULL) { 735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Create string enumeration 739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UEnumeration *en = (UEnumeration*)uprv_malloc(sizeof(UEnumeration)); 740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (en == NULL) { 741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_deleteList(values); 743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulist_resetList(values); 746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); 747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru en->context = values; 748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return en; 749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 75154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2 75254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusucal_getTimeZoneTransitionDate(const UCalendar* cal, UTimeZoneTransitionType type, 75354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UDate* transition, UErrorCode* status) 75454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 75554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(*status)) { 75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return FALSE; 75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UDate base = ((Calendar*)cal)->getTime(*status); 75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const TimeZone& tz = ((Calendar*)cal)->getTimeZone(); 76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const BasicTimeZone * btz = dynamic_cast<const BasicTimeZone *>(&tz); 76154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (btz != NULL && U_SUCCESS(*status)) { 76254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TimeZoneTransition tzt; 76354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool inclusive = (type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE || type == UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE); 76454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool result = (type == UCAL_TZ_TRANSITION_NEXT || type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE)? 7658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius btz->getNextTransition(base, inclusive, tzt): 7668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius btz->getPreviousTransition(base, inclusive, tzt); 76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (result) { 76854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *transition = tzt.getTime(); 76954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return TRUE; 77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 77154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return FALSE; 77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 77454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 77559d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef U_HIDE_DRAFT_API 77659d709d503bab6e2b61931737e662dd293b40578ccorneliusU_CAPI int32_t U_EXPORT2 77759d709d503bab6e2b61931737e662dd293b40578ccorneliusucal_getWindowsTimeZoneID(const UChar* id, int32_t len, UChar* winid, int32_t winidCapacity, UErrorCode* status) { 77859d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(*status)) { 77959d709d503bab6e2b61931737e662dd293b40578ccornelius return 0; 78059d709d503bab6e2b61931737e662dd293b40578ccornelius } 78159d709d503bab6e2b61931737e662dd293b40578ccornelius 78259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t resultLen = 0; 78359d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString resultWinID; 78459d709d503bab6e2b61931737e662dd293b40578ccornelius 78559d709d503bab6e2b61931737e662dd293b40578ccornelius TimeZone::getWindowsID(UnicodeString(id, len), resultWinID, *status); 78659d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_SUCCESS(*status) && resultWinID.length() > 0) { 78759d709d503bab6e2b61931737e662dd293b40578ccornelius resultLen = resultWinID.length(); 78859d709d503bab6e2b61931737e662dd293b40578ccornelius resultWinID.extract(winid, winidCapacity, *status); 78959d709d503bab6e2b61931737e662dd293b40578ccornelius } 79059d709d503bab6e2b61931737e662dd293b40578ccornelius 79159d709d503bab6e2b61931737e662dd293b40578ccornelius return resultLen; 79259d709d503bab6e2b61931737e662dd293b40578ccornelius} 79359d709d503bab6e2b61931737e662dd293b40578ccornelius 79459d709d503bab6e2b61931737e662dd293b40578ccorneliusU_CAPI int32_t U_EXPORT2 79559d709d503bab6e2b61931737e662dd293b40578ccorneliusucal_getTimeZoneIDForWindowsID(const UChar* winid, int32_t len, const char* region, UChar* id, int32_t idCapacity, UErrorCode* status) { 79659d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(*status)) { 79759d709d503bab6e2b61931737e662dd293b40578ccornelius return 0; 79859d709d503bab6e2b61931737e662dd293b40578ccornelius } 79959d709d503bab6e2b61931737e662dd293b40578ccornelius 80059d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t resultLen = 0; 80159d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString resultID; 80259d709d503bab6e2b61931737e662dd293b40578ccornelius 80359d709d503bab6e2b61931737e662dd293b40578ccornelius TimeZone::getIDForWindowsID(UnicodeString(winid, len), region, resultID, *status); 80459d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_SUCCESS(*status) && resultID.length() > 0) { 80559d709d503bab6e2b61931737e662dd293b40578ccornelius resultLen = resultID.length(); 80659d709d503bab6e2b61931737e662dd293b40578ccornelius resultID.extract(id, idCapacity, *status); 80759d709d503bab6e2b61931737e662dd293b40578ccornelius } 80859d709d503bab6e2b61931737e662dd293b40578ccornelius 80959d709d503bab6e2b61931737e662dd293b40578ccornelius return resultLen; 81059d709d503bab6e2b61931737e662dd293b40578ccornelius} 81159d709d503bab6e2b61931737e662dd293b40578ccornelius 81259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif /* U_HIDE_DRAFT_API */ 81359d709d503bab6e2b61931737e662dd293b40578ccornelius 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 815