2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <unicode/ucal.h>
18 #include <utils_i18n_ucalendar.h>
19 #include <utils_i18n_private.h>
21 int i18n_ucalendar_create ( const i18n_uchar *zone_id, int32_t len, const char *locale, i18n_ucalendar_type_e type, i18n_ucalendar_h *calendar )
23 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
25 i18n_error_code_e i18n_error;
26 UErrorCode icu_error = U_ZERO_ERROR;
27 *calendar = ucal_open(zone_id, len, locale, type, &icu_error);
28 ERR("Error code: %d", icu_error);
29 ERR_MAPPING(icu_error, i18n_error);
33 int i18n_ucalendar_destroy ( i18n_ucalendar_h calendar )
35 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
38 return I18N_ERROR_NONE;
41 int i18n_ucalendar_clone ( const i18n_ucalendar_h cal, i18n_ucalendar_h *identical_to_cal )
43 retv_if(cal == NULL || identical_to_cal == NULL, I18N_ERROR_INVALID_PARAMETER);
45 i18n_error_code_e i18n_error;
46 UErrorCode icu_error = U_ZERO_ERROR;
47 *identical_to_cal = ucal_clone(cal, &icu_error);
48 ERR("Error code: %d", icu_error);
49 ERR_MAPPING(icu_error, i18n_error);
53 int i18n_ucalendar_add ( i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field, int32_t amount )
55 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
57 i18n_error_code_e i18n_error;
58 UErrorCode icu_error = U_ZERO_ERROR;
59 ucal_add(calendar, field, amount, &icu_error);
60 ERR("Error code: %d", icu_error);
61 ERR_MAPPING(icu_error, i18n_error);
65 int i18n_ucalendar_is_equivalent_to ( const i18n_ucalendar_h calendar1, const i18n_ucalendar_h calendar2, i18n_ubool *equiv )
67 retv_if(equiv == NULL || calendar1 == NULL || calendar2 == NULL, I18N_ERROR_INVALID_PARAMETER);
69 *equiv = ucal_equivalentTo(calendar1, calendar2);
70 return I18N_ERROR_NONE;
73 int i18n_ucalendar_get_milliseconds ( const i18n_ucalendar_h calendar, i18n_udate *date )
75 retv_if(calendar == NULL || date == NULL, I18N_ERROR_INVALID_PARAMETER);
77 i18n_error_code_e i18n_error;
78 UErrorCode icu_error = U_ZERO_ERROR;
79 *date = ucal_getMillis(calendar, &icu_error);
80 ERR("Error code: %d", icu_error);
81 ERR_MAPPING(icu_error, i18n_error);
85 int i18n_ucalendar_get ( const i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field, int32_t *val )
87 retv_if(calendar == NULL || val == NULL, I18N_ERROR_INVALID_PARAMETER);
89 i18n_error_code_e i18n_error;
90 UErrorCode icu_error = U_ZERO_ERROR;
91 *val = ucal_get(calendar, field, &icu_error);
92 ERR("Error code: %d", icu_error);
93 ERR_MAPPING(icu_error, i18n_error);
97 int i18n_ucalendar_get_attribute ( i18n_ucalendar_h calendar, i18n_ucalendar_attribute_e attr, int32_t *val)
99 retv_if(calendar == NULL || val == NULL, I18N_ERROR_INVALID_PARAMETER);
101 *val = ucal_getAttribute(calendar, attr);
102 return I18N_ERROR_NONE;
105 int i18n_ucalendar_get_timezone_displayname ( const i18n_ucalendar_h calendar, i18n_ucalendar_displayname_type_e type, const char *locale,
106 i18n_uchar *result, int32_t result_len, int32_t *buf_size_needed )
108 retv_if(calendar == NULL || result == NULL || buf_size_needed == NULL, I18N_ERROR_INVALID_PARAMETER);
110 i18n_error_code_e i18n_error;
111 UErrorCode icu_error = U_ZERO_ERROR;
112 *buf_size_needed = ucal_getTimeZoneDisplayName(calendar, type, locale, result, result_len, &icu_error);
113 ERR("Error code: %d", icu_error);
114 ERR_MAPPING(icu_error, i18n_error);
118 int i18n_ucalendar_is_in_daylight_time ( const i18n_ucalendar_h calendar, i18n_ubool *is_in )
120 retv_if(calendar == NULL || is_in == NULL, I18N_ERROR_INVALID_PARAMETER);
122 i18n_error_code_e i18n_error;
123 UErrorCode icu_error = U_ZERO_ERROR;
124 *is_in = ucal_inDaylightTime(calendar, &icu_error);
125 ERR("Error code: %d", icu_error);
126 ERR_MAPPING(icu_error, i18n_error);
130 int i18n_ucalendar_set ( i18n_ucalendar_h cal, i18n_ucalendar_date_fields_e field, int32_t val )
132 retv_if(cal == NULL, I18N_ERROR_INVALID_PARAMETER);
134 ucal_set(cal, field, val);
135 return I18N_ERROR_NONE;
138 int i18n_ucalendar_set_attribute ( i18n_ucalendar_h calendar, i18n_ucalendar_attribute_e attr, int32_t val )
140 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
142 ucal_setAttribute(calendar, attr, val);
143 return I18N_ERROR_NONE;
146 int i18n_ucalendar_set_date_time ( i18n_ucalendar_h calendar, int32_t year, int32_t month, int32_t date, int32_t hour, int32_t min, int32_t sec )
148 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
150 i18n_error_code_e i18n_error;
151 UErrorCode icu_error = U_ZERO_ERROR;
152 ucal_setDateTime(calendar, year, month, date, hour, min, sec, &icu_error);
153 ERR("Error code: %d", icu_error);
154 ERR_MAPPING(icu_error, i18n_error);
158 int i18n_ucalendar_set_milliseconds ( i18n_ucalendar_h calendar, i18n_udate milliseconds )
160 retv_if(calendar == NULL, I18N_ERROR_INVALID_PARAMETER);
162 i18n_error_code_e i18n_error;
163 UErrorCode icu_error = U_ZERO_ERROR;
164 ucal_setMillis(calendar, milliseconds, &icu_error);
165 ERR("Error code: %d", icu_error);
166 ERR_MAPPING(icu_error, i18n_error);
170 int i18n_ucalendar_set_default_timezone ( const i18n_uchar *zone_id )
172 retv_if(zone_id == NULL, I18N_ERROR_INVALID_PARAMETER);
174 i18n_error_code_e i18n_error;
175 UErrorCode icu_error = U_ZERO_ERROR;
176 ucal_setDefaultTimeZone(zone_id, &icu_error);
177 ERR("Error code: %d", icu_error);
178 ERR_MAPPING(icu_error, i18n_error);
182 int32_t i18n_ucalendar_get_field_difference ( i18n_ucalendar_h calendar, i18n_udate target, i18n_ucalendar_date_fields_e field, i18n_error_code_e *status )
187 *status = I18N_ERROR_INVALID_PARAMETER;
192 UErrorCode icu_error = U_ZERO_ERROR;
193 int32_t result = ucal_getFieldDifference(calendar, target, field, &icu_error);
194 ERR("Error code: %d", icu_error);
197 ERR_MAPPING(icu_error, *status);
203 int i18n_ucalendar_get_now ( i18n_udate *date )
205 retv_if(date == NULL, I18N_ERROR_INVALID_PARAMETER);
207 *date = ucal_getNow();
208 return I18N_ERROR_NONE;
212 int i18n_ucalendar_timezone_id_enumeration_create ( i18n_system_timezone_type_e zone_type, const char *region, const int32_t *raw_offset, i18n_uenumeration_h *enumeration )
214 if(region == NULL || enumeration == NULL){
215 return I18N_ERROR_INVALID_PARAMETER;
217 i18n_error_code_e i18n_error;
218 UErrorCode icu_error = U_ZERO_ERROR;
219 *enumeration = (i18n_uenumeration_h)ucal_openTimeZoneIDEnumeration (zone_type, region, raw_offset, &icu_error);
220 ERR("Error code: %d", icu_error);
221 ERR_MAPPING(icu_error, i18n_error);
225 int i18n_ucalendar_timezones_create (i18n_uenumeration_h *enumeration)
227 if(enumeration == NULL){
228 return I18N_ERROR_INVALID_PARAMETER;
230 i18n_error_code_e i18n_error;
231 UErrorCode icu_error = U_ZERO_ERROR;
232 *enumeration = (i18n_uenumeration_h)ucal_openTimeZones(&icu_error);
233 ERR("ErrorCode : %d", icu_error);
234 ERR_MAPPING(icu_error, i18n_error);
238 int i18n_ucalendar_country_timezones_create (const char *country, i18n_uenumeration_h *enumeration)
240 if (country == NULL || enumeration == NULL) {
241 return I18N_ERROR_INVALID_PARAMETER;
243 i18n_error_code_e i18n_error;
244 UErrorCode icu_error = U_ZERO_ERROR;
245 *enumeration = (i18n_uenumeration_h)ucal_openCountryTimeZones(country, &icu_error);
246 ERR("ErrorCode : %d", icu_error);
247 ERR_MAPPING(icu_error, i18n_error);
251 int32_t i18n_ucalendar_get_default_timezone (i18n_uchar *result, int32_t result_capacity)
253 i18n_error_code_e i18n_error;
254 UErrorCode icu_error = U_ZERO_ERROR;
255 int32_t result_ucal_getDefaultTimeZone = ucal_getDefaultTimeZone(result, result_capacity, &icu_error);
256 ERR("ErrorCode : %d", icu_error);
257 ERR_MAPPING(icu_error, i18n_error);
258 set_last_result(i18n_error);
259 return result_ucal_getDefaultTimeZone;
262 int i18n_ucalendar_set_timezone ( i18n_ucalendar_h calendar, const i18n_uchar *zone_id, int32_t length)
264 if (calendar == NULL) {
265 return I18N_ERROR_INVALID_PARAMETER;
267 i18n_error_code_e i18n_error;
268 UErrorCode icu_error = U_ZERO_ERROR;
269 ucal_setTimeZone(calendar, zone_id, length, &icu_error);
270 ERR("ErrorCode : %d", icu_error);
271 ERR_MAPPING(icu_error, i18n_error);
275 int32_t i18n_ucalendar_get_timezone_id (const i18n_ucalendar_h calendar, i18n_uchar *result, int32_t result_length)
277 if (calendar == NULL || result == NULL) {
278 set_last_result(I18N_ERROR_INVALID_PARAMETER);
281 i18n_error_code_e i18n_error;
282 UErrorCode icu_error = U_ZERO_ERROR;
283 int32_t result_ucal_getTimeZoneID = ucal_getTimeZoneID(calendar, result, result_length, &icu_error);
284 ERR("ErrorCode : %d", icu_error);
285 ERR_MAPPING(icu_error, i18n_error);
286 set_last_result(i18n_error);
287 return result_ucal_getTimeZoneID;
290 int i18n_ucalendar_set_gregorian_change ( i18n_ucalendar_h calendar, i18n_udate date)
292 if (calendar == NULL) {
293 return I18N_ERROR_INVALID_PARAMETER;
295 i18n_error_code_e i18n_error;
296 UErrorCode icu_error = U_ZERO_ERROR;
297 ucal_setGregorianChange(calendar, date, &icu_error);
298 ERR("ErrorCode : %d", icu_error);
299 ERR_MAPPING(icu_error, i18n_error);
304 int i18n_ucalendar_get_gregorian_change ( const i18n_ucalendar_h calendar, i18n_udate *date)
306 if (calendar == NULL || date == NULL) {
307 return I18N_ERROR_INVALID_PARAMETER;
309 i18n_error_code_e i18n_error;
310 UErrorCode icu_error = U_ZERO_ERROR;
311 *date = ucal_getGregorianChange(calendar, &icu_error);
312 ERR("ErrorCode : %d", icu_error);
313 ERR_MAPPING(icu_error, i18n_error);
317 const char * i18n_ucalendar_get_available ( int32_t locale_index )
319 if (locale_index < 0) {
320 set_last_result(I18N_ERROR_INVALID_PARAMETER);
324 set_last_result(I18N_ERROR_NONE);
325 return ucal_getAvailable(locale_index);
328 int32_t i18n_ucalendar_count_available ( void )
330 set_last_result(I18N_ERROR_NONE);
331 return ucal_countAvailable();
334 int i18n_ucalendar_set_date ( i18n_ucalendar_h calendar, int32_t year, int32_t month, int32_t date)
336 if (calendar == NULL) {
337 return I18N_ERROR_INVALID_PARAMETER;
339 i18n_error_code_e i18n_error;
340 UErrorCode icu_error = U_ZERO_ERROR;
341 ucal_setDate(calendar, year, month, date, &icu_error);
342 ERR("ErrorCode : %d", icu_error);
343 ERR_MAPPING(icu_error, i18n_error);
347 int i18n_ucalendar_roll ( i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field, int32_t amount)
349 if (calendar == NULL) {
350 return I18N_ERROR_INVALID_PARAMETER;
352 i18n_error_code_e i18n_error;
353 UErrorCode icu_error = U_ZERO_ERROR;
354 ucal_roll(calendar, field, amount, &icu_error);
355 ERR("ErrorCode : %d", icu_error);
356 ERR_MAPPING(icu_error, i18n_error);
360 i18n_ubool i18n_ucalendar_is_set ( const i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field )
362 if (calendar == NULL) {
363 set_last_result(I18N_ERROR_INVALID_PARAMETER);
367 set_last_result(I18N_ERROR_NONE);
368 return ucal_isSet (calendar, field);
370 int i18n_ucalendar_clear_field ( i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field )
372 if (calendar == NULL) {
373 return I18N_ERROR_INVALID_PARAMETER;
375 ucal_clearField (calendar, field);
376 return I18N_ERROR_NONE;
379 int i18n_ucalendar_clear ( i18n_ucalendar_h calendar )
381 if (calendar == NULL) {
382 return I18N_ERROR_INVALID_PARAMETER;
384 ucal_clear(calendar);
385 return I18N_ERROR_NONE;
388 int32_t i18n_ucalendar_get_limit ( const i18n_ucalendar_h calendar, i18n_ucalendar_date_fields_e field, i18n_ucalendar_limit_type_e type)
390 if (calendar == NULL) {
391 set_last_result(I18N_ERROR_INVALID_PARAMETER);
395 int32_t result_ucal_getLimit = 0;
397 case I18N_UCALENDAR_YEAR_WOY:
398 case I18N_UCALENDAR_DOW_LOCAL:
399 case I18N_UCALENDAR_EXTENDED_YEAR:
400 case I18N_UCALENDAR_JULIAN_DAY:
401 case I18N_UCALENDAR_MILLISECONDS_IN_DAY:
402 case I18N_UCALENDAR_IS_LEAP_MONTH:
403 case I18N_UCALENDAR_FIELD_COUNT:
405 set_last_result(I18N_ERROR_INVALID_PARAMETER);
406 ERR("Unsupported filed");
411 i18n_error_code_e i18n_error = I18N_ERROR_NONE;
412 UErrorCode icu_error = U_ZERO_ERROR;
413 int32_t limit = ucal_getLimit(calendar, field, type, &icu_error);
414 ERR("ErrorCode : %d", icu_error);
415 ERR_MAPPING(icu_error, i18n_error);
416 set_last_result(i18n_error);
417 if(i18n_error == I18N_ERROR_NONE)
418 result_ucal_getLimit = limit;
422 return result_ucal_getLimit;
425 const char *i18n_ucalendar_get_locale_by_type ( const i18n_ucalendar_h calendar, i18n_ulocale_data_locale_type_e type )
427 if (calendar == NULL) {
428 set_last_result(I18N_ERROR_INVALID_PARAMETER);
431 i18n_error_code_e i18n_error;
432 UErrorCode icu_error = U_ZERO_ERROR;
433 const char *result_ucal_getLocaleByType = ucal_getLocaleByType(calendar, type, &icu_error);
434 ERR("ErrorCode : %d", icu_error);
435 ERR_MAPPING(icu_error, i18n_error);
436 set_last_result(i18n_error);
437 return result_ucal_getLocaleByType;
440 const char *i18n_ucalendar_get_tz_data_version (void)
442 i18n_error_code_e i18n_error;
443 UErrorCode icu_error = U_ZERO_ERROR;
444 const char *result_ucal_getTZDataVersion = ucal_getTZDataVersion(&icu_error);
445 ERR("ErrorCode : %d", icu_error);
446 ERR_MAPPING(icu_error, i18n_error);
447 set_last_result(i18n_error);
448 return result_ucal_getTZDataVersion;
451 int32_t i18n_ucalendar_get_canonical_timezone_id ( const i18n_uchar *id, int32_t length, i18n_uchar *result, int32_t result_capacity, i18n_ubool *is_system_id )
454 set_last_result(I18N_ERROR_INVALID_PARAMETER);
457 i18n_error_code_e i18n_error;
458 UErrorCode icu_error = U_ZERO_ERROR;
459 int32_t result_ucal_getCanonicalTimeZoneID = ucal_getCanonicalTimeZoneID(id, length, result, result_capacity, is_system_id, &icu_error);
460 ERR("ErrorCode : %d", icu_error);
461 ERR_MAPPING(icu_error, i18n_error);
462 set_last_result(i18n_error);
463 return result_ucal_getCanonicalTimeZoneID ;
466 const char *i18n_ucalendar_get_type ( const i18n_ucalendar_h calendar )
468 if (calendar == NULL) {
469 set_last_result(I18N_ERROR_INVALID_PARAMETER);
472 i18n_error_code_e i18n_error;
473 UErrorCode icu_error = U_ZERO_ERROR;
474 const char *result_ucal_getType = ucal_getType(calendar, &icu_error);
475 ERR("ErrorCode : %d", icu_error);
476 ERR_MAPPING(icu_error, i18n_error);
477 set_last_result(i18n_error);
478 return result_ucal_getType;
481 int i18n_ucalendar_get_keyword_values_for_locale ( const char *key, const char *locale, i18n_ubool commonly_used, i18n_uenumeration_h * enumeration )
483 if (key == NULL || enumeration == NULL) {
484 return I18N_ERROR_INVALID_PARAMETER;
486 i18n_error_code_e i18n_error;
487 UErrorCode icu_error = U_ZERO_ERROR;
488 *enumeration = (i18n_uenumeration_h )ucal_getKeywordValuesForLocale(key, locale, commonly_used, &icu_error);
489 ERR("ErrorCode : %d", icu_error);
490 ERR_MAPPING(icu_error, i18n_error);
494 int i18n_ucalendar_get_day_of_week_type ( const i18n_ucalendar_h calendar, i18n_ucalendar_days_of_week_e day_of_week, i18n_ucalendar_weekday_type_e *weekday_type )
496 if (calendar == NULL || weekday_type == NULL) {
497 return I18N_ERROR_INVALID_PARAMETER;
499 i18n_error_code_e i18n_error;
500 UErrorCode icu_error = U_ZERO_ERROR;
501 *weekday_type = ucal_getDayOfWeekType(calendar, day_of_week, &icu_error);
502 ERR("ErrorCode : %d", icu_error);
503 ERR_MAPPING(icu_error, i18n_error);
507 int32_t i18n_ucalendar_get_weekend_transition ( const i18n_ucalendar_h calendar, i18n_ucalendar_days_of_week_e day_of_week )
509 if (calendar == NULL) {
510 set_last_result(I18N_ERROR_INVALID_PARAMETER);
513 i18n_error_code_e i18n_error;
514 UErrorCode icu_error = U_ZERO_ERROR;
515 int32_t result_ucal_getWeekendTransition = ucal_getWeekendTransition(calendar, day_of_week, &icu_error);
516 ERR("ErrorCode : %d", icu_error);
517 ERR_MAPPING(icu_error, i18n_error);
518 set_last_result(i18n_error);
519 return result_ucal_getWeekendTransition;
522 i18n_ubool i18n_ucalendar_is_weekend ( i18n_ucalendar_h calendar, i18n_udate date )
524 if (calendar == NULL) {
525 set_last_result(I18N_ERROR_INVALID_PARAMETER);
528 i18n_error_code_e i18n_error;
529 UErrorCode icu_error = U_ZERO_ERROR;
530 i18n_ubool result_ucal_isWeekend = ucal_isWeekend(calendar, date, &icu_error);
531 ERR("ErrorCode : %d", icu_error);
532 ERR_MAPPING(icu_error, i18n_error);
533 set_last_result(i18n_error);
534 return result_ucal_isWeekend;
537 i18n_ubool i18n_ucalendar_get_timezone_transition_date ( const i18n_ucalendar_h calendar, i18n_utimezone_transition_type_e type, i18n_udate *transition)
539 if (calendar == NULL || transition == NULL) {
540 set_last_result(I18N_ERROR_INVALID_PARAMETER);
543 i18n_error_code_e i18n_error;
544 UErrorCode icu_error = U_ZERO_ERROR;
545 i18n_ubool result_ucal_getTimeZoneTransitionDate = ucal_getTimeZoneTransitionDate(calendar, type, transition, &icu_error);
546 ERR("ErrorCode : %d", icu_error);
547 ERR_MAPPING(icu_error, i18n_error);
548 set_last_result(i18n_error);
549 return result_ucal_getTimeZoneTransitionDate;