2 * Copyright (c) 2016 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 <utils_i18n.h>
23 #include "util_time.h"
26 static i18n_udatepg_h _util_time_generator_get(const char *timezone_id)
28 static i18n_udatepg_h generator;
31 if (tz && !strcmp(tz, timezone_id)) {
36 i18n_udatepg_destroy(generator);
40 int ret = i18n_udatepg_create(timezone_id, &generator);
41 if (ret != I18N_ERROR_NONE) {
42 ERR("i18n_udatepg_create failed: %s", get_error_message(ret));
46 tz = strdup(timezone_id);
50 static i18n_udate_format_h __util_time_date_formatter_get(const char *locale, const char *timezone_id, const char *skeleton)
53 i18n_uchar u_skeleton[64] = {0,};
54 int32_t skeleton_len = 0, pattern_len;
56 i18n_uchar u_best_pattern[64] = {0,};
57 int32_t u_best_pattern_capacity;
58 i18n_udate_format_h formatter = NULL;
60 const i18n_udatepg_h generator = _util_time_generator_get(timezone_id);
62 ERR("_util_time_generator_get failed");
66 i18n_ustring_copy_ua_n(u_skeleton, skeleton, strlen(skeleton));
67 skeleton_len = i18n_ustring_get_length(u_skeleton);
69 u_best_pattern_capacity =
70 (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0]));
72 status = i18n_udatepg_get_best_pattern(generator, u_skeleton, skeleton_len,
73 u_best_pattern, u_best_pattern_capacity, &pattern_len);
74 if (status != I18N_ERROR_NONE) {
75 ERR("i18n_udatepg_get_best_pattern failed: %s", get_error_message(status));
79 i18n_uchar u_timezone_id[64] = {0,};
80 i18n_ustring_copy_ua_n(u_timezone_id, timezone_id, sizeof(u_timezone_id));
81 status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, locale, u_timezone_id, -1,
82 u_best_pattern, -1, &formatter);
83 if (status != I18N_ERROR_NONE) {
84 ERR("i18n_udate_create() failed");
91 static i18n_udate_format_h __util_time_time_formatter_get(bool use24hformat, const char *locale, const char *timezone_id)
95 i18n_uchar u_pattern[64] = {0,};
96 i18n_uchar u_best_pattern[64] = {0,};
97 int32_t u_best_pattern_capacity, u_best_pattern_len;
98 char a_best_pattern[128] = {0,};
100 i18n_udate_format_h formatter = NULL;
102 const i18n_udatepg_h generator = _util_time_generator_get(timezone_id);
104 ERR("_util_time_generator_get failed");
109 snprintf(buf, sizeof(buf)-1, "%s", "HH:mm");
111 /* set time format 12 */
112 snprintf(buf, sizeof(buf)-1, "%s", "h:mm");
115 i18n_ustring_copy_ua_n(u_pattern, buf, sizeof(u_pattern));
117 u_best_pattern_capacity =
118 (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0]));
120 status = i18n_udatepg_get_best_pattern(generator, u_pattern, sizeof(u_pattern),
121 u_best_pattern, u_best_pattern_capacity, &u_best_pattern_len);
122 if (status != I18N_ERROR_NONE) {
123 ERR("i18n_udatepg_get_best_pattern() failed: %s", get_error_message(status));
127 i18n_ustring_copy_au(a_best_pattern, u_best_pattern);
129 char *a_best_pattern_fixed = strtok(a_best_pattern, "a");
130 a_best_pattern_fixed = strtok(a_best_pattern_fixed, " ");
131 if (a_best_pattern_fixed) {
132 i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_fixed);
135 i18n_uchar u_timezone_id[64] = {0,};
136 i18n_ustring_copy_ua_n(u_timezone_id, timezone_id, sizeof(u_timezone_id));
138 status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, locale, u_timezone_id, -1,
139 u_best_pattern, -1, &formatter);
140 if (status != I18N_ERROR_NONE) {
141 ERR("i18n_udate_create() failed");
148 static i18n_udate_format_h __util_time_ampm_formatter_get(const char *locale, const char *timezone_id)
152 i18n_uchar u_best_pattern[64] = {0,};
153 i18n_udate_format_h formatter = NULL;
155 i18n_ustring_copy_ua(u_best_pattern, "a");
157 i18n_uchar u_timezone_id[64] = {0,};
158 i18n_ustring_copy_ua_n(u_timezone_id, timezone_id, sizeof(u_timezone_id));
160 status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, locale, u_timezone_id, -1,
161 u_best_pattern, -1, &formatter);
163 if (status != I18N_ERROR_NONE) {
164 ERR("i18n_udate_create() failed");
171 static int __util_time_formatted_time_get(i18n_udate_format_h formatter, time_t tt, char *buf, int buf_len)
173 if (!formatter) return -1;
175 i18n_udate u_time = (i18n_udate)tt * 1000;
176 i18n_uchar u_formatted_str[64] = {0,};
177 int32_t u_formatted_str_capacity, buf_needed;
180 u_formatted_str_capacity = (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0]));
182 status = i18n_udate_format_date(formatter, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &buf_needed);
183 if (status != I18N_ERROR_NONE) {
184 ERR("i18n_udate_format_date() failed");
188 i18n_ustring_copy_au_n(buf,u_formatted_str, buf_len - 1);
189 DBG("time(%d) formatted(%s)", tt, buf);
191 return (int)i18n_ustring_get_length(u_formatted_str);
194 bool util_time_formatted_time_get(time_t time, const char *locale, const char *timezone, bool use24hformat, char **str_time, char **str_meridiem)
197 char buf_time[512] = {0,};
198 char buf_ampm[512] = {0,};
199 localtime_r(&time, &st);
201 i18n_udate_format_h timef, ampmf;
203 timef = __util_time_time_formatter_get(use24hformat, locale, timezone);
204 __util_time_formatted_time_get(timef, time, buf_time, sizeof(buf_time)-1);
207 ampmf = __util_time_ampm_formatter_get(locale, timezone);
208 int ampm_len = __util_time_formatted_time_get(ampmf, time, buf_ampm, sizeof(buf_ampm)-1);
210 if (st.tm_hour >= 0 && st.tm_hour < 12) {
211 snprintf(buf_ampm, sizeof(buf_ampm)-1, "AM");
213 snprintf(buf_ampm, sizeof(buf_ampm)-1, "PM");
218 if (str_time) *str_time = strdup(buf_time);
219 if (str_meridiem) *str_meridiem = strdup(buf_ampm);
224 bool util_time_formatted_date_get(time_t time, const char *locale, const char *timezone, const char *skeleton, char **str_date)
227 char buf_date[512] = {0,};
228 localtime_r(&time, &st);
229 i18n_udate_format_h datef;
231 datef = __util_time_date_formatter_get(locale, timezone, skeleton ? skeleton : "MMMMEd");
233 __util_time_formatted_time_get(datef, time, buf_date, sizeof(buf_date));
234 if (str_date != NULL) {
235 *str_date = strdup(buf_date);