• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "intl_impl.h"
16 
17 #include <vector>
18 #include <map>
19 #include "cj_lambda.h"
20 
21 using namespace OHOS::FFI;
22 
23 namespace OHOS::Global::I18n::Intl {
ArrayStringToVectorString(CArrString arrString)24 std::vector<std::string> ArrayStringToVectorString(CArrString arrString)
25 {
26     std::vector<std::string> res;
27     for (int i = 0; i < arrString.size; i++) {
28         std::string value = arrString.head[i];
29         res.push_back(value);
30     }
31     return res;
32 }
33 
IMallocCString(const std::string & origin)34 char *IMallocCString(const std::string &origin)
35 {
36     if (origin.empty()) {
37         return nullptr;
38     }
39     auto length = origin.length() + 1;
40     char *res = static_cast<char *>(malloc(sizeof(char) * length));
41     if (res == nullptr) {
42         return nullptr;
43     }
44     return std::char_traits<char>::copy(res, origin.c_str(), length);
45 }
46 
NumberFormatImpl(int32_t * errCode)47 NumberFormatImpl::NumberFormatImpl(int32_t *errCode)
48 {
49     std::vector<std::string> locale;
50     std::map<std::string, std::string> map = {};
51     numberFmt_ = std::make_unique<NumberFormat>(locale, map);
52 
53     if (numberFmt_ == nullptr) {
54         *errCode = -1;
55         HILOG_ERROR_I18N("The numberFormat is nullptr");
56         return;
57     }
58 }
59 
NumberFormatImpl(char * locale,CNumberOptions options,int64_t flag,int32_t * errCode)60 NumberFormatImpl::NumberFormatImpl(char *locale, CNumberOptions options, int64_t flag, int32_t *errCode)
61 {
62     std::vector<std::string> locale_list;
63     std::string locale_str = locale;
64     locale_list.push_back(locale_str);
65     std::map<std::string, std::string> map = {};
66     if (flag == 0) {
67         if (std::strlen(options.locale) != 0) {
68             map.insert(std::make_pair("locale", options.locale));
69         }
70         if (std::strlen(options.currency) != 0) {
71             map.insert(std::make_pair("currency", options.currency));
72         }
73         map.insert(std::make_pair("currencySign", options.currencySign));
74         map.insert(std::make_pair("currencyDisplay", options.currencyDisplay));
75         if (std::strlen(options.unit) != 0) {
76             map.insert(std::make_pair("unit", options.unit));
77         }
78         map.insert(std::make_pair("unitDisplay", options.unitDisplay));
79         map.insert(std::make_pair("unitUsage", options.unitUsage));
80         map.insert(std::make_pair("signDispaly", options.signDispaly));
81         map.insert(std::make_pair("compactDisplay", options.compactDisplay));
82         map.insert(std::make_pair("notation", options.notation));
83         map.insert(std::make_pair("localeMather", options.localeMather));
84         map.insert(std::make_pair("style", options.style));
85         if (std::strlen(options.numberingSystem) != 0) {
86             map.insert(std::make_pair("numberingSystem", options.numberingSystem));
87         }
88         std::string value = std::to_string(options.useGrouping) == "1" ? "true" : "false";
89         map.insert(std::make_pair("useGrouping", value));
90         map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
91         map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
92         map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
93         map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
94         map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
95         if (options.minimumFractionDigits != -1 && options.maximumFractionDigits != -1 &&
96             options.minimumFractionDigits > options.maximumFractionDigits) {
97             HILOG_ERROR_I18N(
98                 "GetNumberOptionValues: Invalid parameter value: minimumFractionDigits > maximumFractionDigits");
99         }
100     }
101     numberFmt_ = std::make_unique<NumberFormat>(locale_list, map);
102 
103     if (numberFmt_ == nullptr) {
104         *errCode = -1;
105         HILOG_ERROR_I18N("The numberFormat is nullptr");
106         return;
107     }
108 }
109 
NumberFormatImpl(CArrString locale,CNumberOptions options,int64_t flag,int32_t * errCode)110 NumberFormatImpl::NumberFormatImpl(CArrString locale, CNumberOptions options, int64_t flag, int32_t *errCode)
111 {
112     std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
113     std::map<std::string, std::string> map = {};
114     if (flag == 0) {
115         if (std::strlen(options.locale) != 0) {
116             map.insert(std::make_pair("locale", options.locale));
117         }
118         if (std::strlen(options.currency) != 0) {
119             map.insert(std::make_pair("currency", options.currency));
120         }
121         map.insert(std::make_pair("currencySign", options.currencySign));
122         map.insert(std::make_pair("currencyDisplay", options.currencyDisplay));
123         if (std::strlen(options.unit) != 0) {
124             map.insert(std::make_pair("unit", options.unit));
125         }
126         map.insert(std::make_pair("unitDisplay", options.unitDisplay));
127         map.insert(std::make_pair("unitUsage", options.unitUsage));
128         map.insert(std::make_pair("signDispaly", options.signDispaly));
129         map.insert(std::make_pair("compactDisplay", options.compactDisplay));
130         map.insert(std::make_pair("notation", options.notation));
131         map.insert(std::make_pair("localeMather", options.localeMather));
132         map.insert(std::make_pair("style", options.style));
133         if (std::strlen(options.numberingSystem) != 0) {
134             map.insert(std::make_pair("numberingSystem", options.numberingSystem));
135         }
136         std::string value = std::to_string(options.useGrouping) == "1" ? "true" : "false";
137         map.insert(std::make_pair("useGrouping", value));
138         map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
139         map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
140         map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
141         map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
142         map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
143 
144         if (options.minimumFractionDigits != -1 && options.maximumFractionDigits != -1 &&
145             options.minimumFractionDigits > options.maximumFractionDigits) {
146             HILOG_ERROR_I18N(
147                 "GetNumberOptionValues: Invalid parameter value: minimumFractionDigits > maximumFractionDigits");
148         }
149     }
150     numberFmt_ = std::make_unique<NumberFormat>(locale_list, map);
151 
152     if (numberFmt_ == nullptr) {
153         *errCode = -1;
154         HILOG_ERROR_I18N("The numberFormat is nullptr");
155         return;
156     }
157 }
158 
Format(double number)159 char *NumberFormatImpl::Format(double number)
160 {
161     std::string value = numberFmt_->Format(number);
162     return IMallocCString(value);
163 }
164 
ResolveOptions()165 CNumberOptions NumberFormatImpl::ResolveOptions()
166 {
167     std::map<std::string, std::string> options = {};
168     numberFmt_->GetResolvedOptions(options);
169     struct CNumberOptions numberOptions;
170     numberOptions.locale = IMallocCString(options["locale"]);
171     numberOptions.currency = IMallocCString(options["currency"]);
172     numberOptions.currencySign = IMallocCString(options["currencySign"]);
173     numberOptions.unit = IMallocCString(options["unit"]);
174     numberOptions.unitDisplay = IMallocCString(options["unitDisplay"]);
175     numberOptions.unitUsage = IMallocCString(options["unitUsage"]);
176     numberOptions.signDispaly = IMallocCString(options["signDispaly"]);
177     numberOptions.compactDisplay = IMallocCString(options["compactDisplay"]);
178     numberOptions.notation = IMallocCString(options["notation"]);
179     numberOptions.localeMather = IMallocCString(options["localeMather"]);
180     numberOptions.style = IMallocCString(options["style"]);
181     numberOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
182     numberOptions.useGrouping = (options["useGrouping"] == "true");
183     numberOptions.minimumIntegerDigits = atoi(options["minimumIntegerDigits"].c_str());
184     numberOptions.minimumFractionDigits = atoi(options["minimumFractionDigits"].c_str());
185     numberOptions.maximumFractionDigits = atoi(options["maximumFractionDigits"].c_str());
186     numberOptions.minimumSignificantDigits = atoi(options["minimumSignificantDigits"].c_str());
187     numberOptions.maximumSignificantDigits = atoi(options["maximumSignificantDigits"].c_str());
188 
189     return numberOptions;
190 }
191 
RelativeTimeFormatImpl(int32_t * errCode)192 RelativeTimeFormatImpl::RelativeTimeFormatImpl(int32_t *errCode)
193 {
194     std::vector<std::string> locale;
195     std::map<std::string, std::string> options = {};
196     relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale, options);
197 
198     if (relativeTimeFmt_ == nullptr) {
199         *errCode = -1;
200         HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
201         return;
202     }
203 }
204 
RelativeTimeFormatImpl(char * locale,CRelativeTimeFormatInputOptions options,int64_t flag,int32_t * errCode)205 RelativeTimeFormatImpl::RelativeTimeFormatImpl(
206     char *locale, CRelativeTimeFormatInputOptions options, int64_t flag, int32_t *errCode)
207 {
208     std::vector<std::string> locale_list;
209     std::string locale_str = locale;
210     locale_list.push_back(locale_str);
211     std::map<std::string, std::string> map = {};
212     if (flag == 0) {
213         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
214         map.insert(std::make_pair("numeric", options.numeric));
215         map.insert(std::make_pair("style", options.style));
216     }
217     relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale_list, map);
218     if (relativeTimeFmt_ == nullptr) {
219         *errCode = -1;
220         HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
221         return;
222     }
223 }
224 
RelativeTimeFormatImpl(CArrString locale,CRelativeTimeFormatInputOptions options,int64_t flag,int32_t * errCode)225 RelativeTimeFormatImpl::RelativeTimeFormatImpl(
226     CArrString locale, CRelativeTimeFormatInputOptions options, int64_t flag, int32_t *errCode)
227 {
228     std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
229 
230     std::map<std::string, std::string> map = {};
231     if (flag == 0) {
232         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
233         map.insert(std::make_pair("numeric", options.numeric));
234         map.insert(std::make_pair("style", options.style));
235     }
236     relativeTimeFmt_ = std::make_unique<RelativeTimeFormat>(locale_list, map);
237 
238     if (relativeTimeFmt_ == nullptr) {
239         *errCode = -1;
240         HILOG_ERROR_I18N("The RelativeTimeFormat is nullptr");
241         return;
242     }
243 }
244 
Format(double number,char * unit)245 char *RelativeTimeFormatImpl::Format(double number, char *unit)
246 {
247     std::string unitStr = unit;
248     std::string value = relativeTimeFmt_->Format(number, unitStr);
249     char *res = IMallocCString(value);
250     return res;
251 }
252 
FreeCArrArrString(CArrString * arr,size_t index)253 void FreeCArrArrString(CArrString *arr, size_t index)
254 {
255     for (size_t i = 0; i < index; i++) {
256         for (int64_t j = 0; j < arr[i].size; j++) {
257             free(arr[i].head[j]);
258         }
259         free(arr[i].head);
260     }
261 }
262 
FormatToParts(double number,char * unit)263 CArrArrString RelativeTimeFormatImpl::FormatToParts(double number, char *unit)
264 {
265     std::string unitStr = unit;
266     std::vector<std::vector<std::string>> timeVectorStr;
267 
268     CArrArrString ret = {.head = nullptr, .size = 0};
269     relativeTimeFmt_->FormatToParts(number, unitStr, timeVectorStr);
270     CArrString *res = static_cast<CArrString *>(malloc(sizeof(CArrString) * timeVectorStr.size()));
271     if (res == nullptr) {
272         HILOG_ERROR_I18N("The CArrString is nullptr");
273         return ret;
274     }
275 
276     for (size_t i = 0; i < timeVectorStr.size(); i++) {
277         std::vector<std::string> timeVector = timeVectorStr[i];
278         CArrString retime = {.head = nullptr, .size = 0};
279         char **time = static_cast<char **>(malloc(sizeof(char *) * timeVector.size()));
280         if (time == nullptr) {
281             HILOG_ERROR_I18N("The char** is nullptr");
282             FreeCArrArrString(res, i);
283             free(res);
284             return ret;
285         }
286         for (size_t j = 0; j < timeVector.size(); j++) {
287             std::string value = timeVector[j];
288             time[j] = IMallocCString(value);
289         }
290         retime.head = time;
291         retime.size = static_cast<int64_t>(timeVector.size());
292         res[i] = retime;
293     }
294     ret.head = res;
295     ret.size = static_cast<int64_t>(timeVectorStr.size());
296     return ret;
297 }
298 
ResolveOptions()299 CRelativeTimeFormatResolveOptions RelativeTimeFormatImpl::ResolveOptions()
300 {
301     std::map<std::string, std::string> options = {};
302     relativeTimeFmt_->GetResolvedOptions(options);
303     struct CRelativeTimeFormatResolveOptions relativeTimeFormatResolveOptions;
304     relativeTimeFormatResolveOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
305     relativeTimeFormatResolveOptions.numeric = IMallocCString(options["numeric"]);
306     relativeTimeFormatResolveOptions.style = IMallocCString(options["style"]);
307     relativeTimeFormatResolveOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
308     return relativeTimeFormatResolveOptions;
309 }
310 
PluralRulesImpl(int32_t * errCode)311 PluralRulesImpl::PluralRulesImpl(int32_t *errCode)
312 {
313     std::vector<std::string> locale;
314     std::map<std::string, std::string> options = {};
315     pluralRules_ = std::make_unique<PluralRules>(locale, options);
316 
317     if (pluralRules_ == nullptr) {
318         *errCode = -1;
319         HILOG_ERROR_I18N("The PluralRules is nullptr");
320         return;
321     }
322 }
323 
PluralRulesImpl(char * locale,CPluralRulesOptions options,int64_t flag,int32_t * errCode)324 PluralRulesImpl::PluralRulesImpl(char *locale, CPluralRulesOptions options, int64_t flag, int32_t *errCode)
325 {
326     std::vector<std::string> locale_list;
327     std::string locale_str = locale;
328     locale_list.push_back(locale_str);
329     std::map<std::string, std::string> map = {};
330     if (flag == 0) {
331         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
332         map.insert(std::make_pair("type", options.type));
333         map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
334         map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
335         map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
336         map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
337         map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
338     }
339     pluralRules_ = std::make_unique<PluralRules>(locale_list, map);
340 
341     if (pluralRules_ == nullptr) {
342         *errCode = -1;
343         HILOG_ERROR_I18N("The PluralRules is nullptr");
344         return;
345     }
346 }
347 
PluralRulesImpl(CArrString locale,CPluralRulesOptions options,int64_t flag,int32_t * errCode)348 PluralRulesImpl::PluralRulesImpl(CArrString locale, CPluralRulesOptions options, int64_t flag, int32_t *errCode)
349 {
350     std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
351 
352     std::map<std::string, std::string> map = {};
353     if (flag == 0) {
354         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
355         map.insert(std::make_pair("type", options.type));
356         map.insert(std::make_pair("minimumIntegerDigits", std::to_string(options.minimumIntegerDigits)));
357         map.insert(std::make_pair("minimumFractionDigits", std::to_string(options.minimumFractionDigits)));
358         map.insert(std::make_pair("maximumFractionDigits", std::to_string(options.maximumFractionDigits)));
359         map.insert(std::make_pair("minimumSignificantDigits", std::to_string(options.minimumSignificantDigits)));
360         map.insert(std::make_pair("maximumSignificantDigits", std::to_string(options.maximumSignificantDigits)));
361     }
362     pluralRules_ = std::make_unique<PluralRules>(locale_list, map);
363 
364     if (pluralRules_ == nullptr) {
365         *errCode = -1;
366         HILOG_ERROR_I18N("The PluralRules is nullptr");
367         return;
368     }
369 }
370 
Select(double n)371 char *PluralRulesImpl::Select(double n)
372 {
373     std::string value = pluralRules_->Select(n);
374     char *res = IMallocCString(value);
375     return res;
376 }
377 
CollatorImpl(int32_t * errCode)378 CollatorImpl::CollatorImpl(int32_t *errCode)
379 {
380     std::vector<std::string> locale;
381     std::map<std::string, std::string> options = {};
382     collator_ = std::make_unique<Collator>(locale, options);
383 
384     if (collator_ == nullptr) {
385         *errCode = -1;
386         HILOG_ERROR_I18N("The Collator is nullptr");
387         return;
388     }
389 }
390 
CollatorImpl(char * locale,CCollatorOptions options,int64_t flag,int32_t * errCode)391 CollatorImpl::CollatorImpl(char *locale, CCollatorOptions options, int64_t flag, int32_t *errCode)
392 {
393     std::vector<std::string> locale_list;
394     std::string locale_str = locale;
395     locale_list.push_back(locale_str);
396     std::map<std::string, std::string> map = {};
397     if (flag == 0) {
398         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
399         map.insert(std::make_pair("usage", options.usage));
400         map.insert(std::make_pair("sensitivity", options.sensitivity));
401         std::string ignore = std::to_string(options.ignorePunctuation) == "1" ? "true" : "false";
402         map.insert(std::make_pair("ignorePunctuation", ignore));
403         map.insert(std::make_pair("collation", options.collation));
404         std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
405         map.insert(std::make_pair("numeric", num));
406         map.insert(std::make_pair("caseFirst", options.caseFirst));
407     }
408     collator_ = std::make_unique<Collator>(locale_list, map);
409 
410     if (collator_ == nullptr) {
411         *errCode = -1;
412         HILOG_ERROR_I18N("The Collator is nullptr");
413         return;
414     }
415 }
416 
CollatorImpl(CArrString locale,CCollatorOptions options,int64_t flag,int32_t * errCode)417 CollatorImpl::CollatorImpl(CArrString locale, CCollatorOptions options, int64_t flag, int32_t *errCode)
418 {
419     std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
420 
421     std::map<std::string, std::string> map = {};
422     if (flag == 0) {
423         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
424         map.insert(std::make_pair("usage", options.usage));
425         map.insert(std::make_pair("sensitivity", options.sensitivity));
426         std::string ignore = std::to_string(options.ignorePunctuation) == "1" ? "true" : "false";
427         map.insert(std::make_pair("ignorePunctuation", ignore));
428         map.insert(std::make_pair("collation", options.collation));
429         std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
430         map.insert(std::make_pair("numeric", num));
431         map.insert(std::make_pair("caseFirst", options.caseFirst));
432     }
433     collator_ = std::make_unique<Collator>(locale_list, map);
434 
435     if (collator_ == nullptr) {
436         *errCode = -1;
437         HILOG_ERROR_I18N("The Collator is nullptr");
438         return;
439     }
440 }
441 
ResolveOptions()442 CCollatorOptions CollatorImpl::ResolveOptions()
443 {
444     std::map<std::string, std::string> options = {};
445     collator_->ResolvedOptions(options);
446     struct CCollatorOptions collatorResolveOptions;
447     collatorResolveOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
448     collatorResolveOptions.usage = IMallocCString(options["usage"]);
449     collatorResolveOptions.sensitivity = IMallocCString(options["sensitivity"]);
450     collatorResolveOptions.ignorePunctuation = (options["ignorePunctuation"] == "true");
451     collatorResolveOptions.collation = IMallocCString(options["collation"]);
452     collatorResolveOptions.numeric = (options["numeric"] == "true");
453     collatorResolveOptions.caseFirst = IMallocCString(options["caseFirst"]);
454 
455     return collatorResolveOptions;
456 }
457 
Compare(char * str1,char * str2)458 int32_t CollatorImpl::Compare(char *str1, char *str2)
459 {
460     std::string str1_str = str1;
461     std::string str2_str = str2;
462     int32_t result = collator_->Compare(str1_str, str2_str);
463     return result;
464 }
465 
DateTimeFormatImpl(int32_t * errCode)466 DateTimeFormatImpl::DateTimeFormatImpl(int32_t *errCode)
467 {
468     std::vector<std::string> locale;
469     std::map<std::string, std::string> options = {};
470     dateFmt_ = std::make_unique<DateTimeFormat>(locale, options);
471 
472     if (dateFmt_ == nullptr) {
473         *errCode = -1;
474         HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
475         return;
476     }
477 }
478 
DateTimeFormatImpl(char * locale,CDateTimeOptions options,int64_t flag,int32_t * errCode)479 DateTimeFormatImpl::DateTimeFormatImpl(char *locale, CDateTimeOptions options, int64_t flag, int32_t *errCode)
480 {
481     std::vector<std::string> locale_list;
482     std::string locale_str = locale;
483     locale_list.push_back(locale_str);
484     std::map<std::string, std::string> map = {};
485     if (flag == 0) {
486         if (std::strlen(options.locale) != 0) {
487             map.insert(std::make_pair("locale", options.locale));
488         }
489         if (std::strlen(options.dateStyle) != 0) {
490             map.insert(std::make_pair("dateStyle", options.dateStyle));
491         }
492         if (std::strlen(options.timeStyle) != 0) {
493             map.insert(std::make_pair("timeStyle", options.timeStyle));
494         }
495         if (std::strlen(options.hourCycle) != 0) {
496             map.insert(std::make_pair("hourCycle", options.hourCycle));
497         }
498         if (std::strlen(options.timeZone) != 0) {
499             map.insert(std::make_pair("timeZone", options.timeZone));
500         }
501         if (std::strlen(options.numberingSystem) != 0) {
502             map.insert(std::make_pair("numberingSystem", options.numberingSystem));
503         }
504         std::string h12 = std::to_string(options.hour12) == "1" ? "true" : "false";
505         map.insert(std::make_pair("hour12", h12));
506         if (std::strlen(options.weekday) != 0) {
507             map.insert(std::make_pair("weekday", options.weekday));
508         }
509         std::map<std::string, std::string> map1 = MapInsert(options);
510         map.insert(map1.begin(), map1.end());
511     }
512     dateFmt_ = std::make_unique<DateTimeFormat>(locale_list, map);
513 
514     if (dateFmt_ == nullptr) {
515         *errCode = -1;
516         HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
517         return;
518     }
519 }
520 
MapInsert(CDateTimeOptions options)521 std::map<std::string, std::string> DateTimeFormatImpl::MapInsert(CDateTimeOptions options)
522 {
523     std::map<std::string, std::string> map = {};
524     if (std::strlen(options.era) != 0) {
525         map.insert(std::make_pair("era", options.era));
526     }
527     if (std::strlen(options.year) != 0) {
528         map.insert(std::make_pair("year", options.year));
529     }
530     if (std::strlen(options.month) != 0) {
531         map.insert(std::make_pair("month", options.month));
532     }
533     if (std::strlen(options.day) != 0) {
534         map.insert(std::make_pair("day", options.day));
535     }
536     if (std::strlen(options.hour) != 0) {
537         map.insert(std::make_pair("hour", options.hour));
538     }
539     if (std::strlen(options.minute) != 0) {
540         map.insert(std::make_pair("minute", options.minute));
541     }
542     if (std::strlen(options.second) != 0) {
543         map.insert(std::make_pair("second", options.second));
544     }
545     if (std::strlen(options.timeZoneName) != 0) {
546         map.insert(std::make_pair("timeZoneName", options.timeZoneName));
547     }
548     if (std::strlen(options.dayPeriod) != 0) {
549         map.insert(std::make_pair("dayPeriod", options.dayPeriod));
550     }
551     if (std::strlen(options.localeMatcher) != 0) {
552         map.insert(std::make_pair("localeMatcher", options.localeMatcher));
553     }
554     if (std::strlen(options.formatMatcher) != 0) {
555         map.insert(std::make_pair("formatMatcher", options.formatMatcher));
556     }
557     return map;
558 }
559 
DateTimeFormatImpl(CArrString locale,CDateTimeOptions options,int64_t flag,int32_t * errCode)560 DateTimeFormatImpl::DateTimeFormatImpl(CArrString locale, CDateTimeOptions options, int64_t flag, int32_t *errCode)
561 {
562     std::vector<std::string> locale_list = ArrayStringToVectorString(locale);
563 
564     std::map<std::string, std::string> map = {};
565     if (flag == 0) {
566         if (std::strlen(options.locale) != 0) {
567             map.insert(std::make_pair("locale", options.locale));
568         }
569         if (std::strlen(options.dateStyle) != 0) {
570             map.insert(std::make_pair("dateStyle", options.dateStyle));
571         }
572         if (std::strlen(options.timeStyle) != 0) {
573             map.insert(std::make_pair("timeStyle", options.timeStyle));
574         }
575         if (std::strlen(options.hourCycle) != 0) {
576             map.insert(std::make_pair("hourCycle", options.hourCycle));
577         }
578         if (std::strlen(options.timeZone) != 0) {
579             map.insert(std::make_pair("timeZone", options.timeZone));
580         }
581         if (std::strlen(options.numberingSystem) != 0) {
582             map.insert(std::make_pair("numberingSystem", options.numberingSystem));
583         }
584         std::string h12 = std::to_string(options.hour12) == "1" ? "true" : "false";
585         map.insert(std::make_pair("hour12", h12));
586         if (std::strlen(options.weekday) != 0) {
587             map.insert(std::make_pair("weekday", options.weekday));
588         }
589         std::map<std::string, std::string> map1 = MapInsert(options);
590         map.insert(map1.begin(), map1.end());
591     }
592     dateFmt_ = std::make_unique<DateTimeFormat>(locale_list, map);
593 
594     if (dateFmt_ == nullptr) {
595         *errCode = -1;
596         HILOG_ERROR_I18N("The DateTimeFormat is nullptr");
597         return;
598     }
599 }
600 
ResolveOptions()601 CDateTimeOptions DateTimeFormatImpl::ResolveOptions()
602 {
603     std::map<std::string, std::string> options = {};
604     dateFmt_->GetResolvedOptions(options);
605     struct CDateTimeOptions dateTimeOptions;
606     dateTimeOptions.locale = IMallocCString(options["locale"]);
607     dateTimeOptions.dateStyle = IMallocCString(options["dateStyle"]);
608     dateTimeOptions.timeStyle = IMallocCString(options["timeStyle"]);
609     dateTimeOptions.hourCycle = IMallocCString(options["hourCycle"]);
610     dateTimeOptions.timeZone = IMallocCString(options["timeZone"]);
611     dateTimeOptions.numberingSystem = IMallocCString(options["numberingSystem"]);
612     bool h = (options["hour"] == "true");
613     dateTimeOptions.hour12 = h;
614     dateTimeOptions.weekday = IMallocCString(options["weekday"]);
615     dateTimeOptions.era = IMallocCString(options["era"]);
616     dateTimeOptions.year = IMallocCString(options["year"]);
617     dateTimeOptions.month = IMallocCString(options["month"]);
618     dateTimeOptions.day = IMallocCString(options["day"]);
619     dateTimeOptions.hour = IMallocCString(options["hour"]);
620     dateTimeOptions.minute = IMallocCString(options["minute"]);
621     dateTimeOptions.second = IMallocCString(options["second"]);
622     dateTimeOptions.timeZoneName = IMallocCString(options["timeZoneName"]);
623     dateTimeOptions.localeMatcher = IMallocCString(options["localeMatcher"]);
624     dateTimeOptions.formatMatcher = IMallocCString(options["formatMatcher"]);
625     return dateTimeOptions;
626 }
627 
Format(int64_t date)628 char *DateTimeFormatImpl::Format(int64_t date)
629 {
630     std::string date_str = dateFmt_->Format(date);
631     char *res = IMallocCString(date_str);
632     return res;
633 }
634 
FormatRange(int64_t startDate,int64_t endDate)635 char *DateTimeFormatImpl::FormatRange(int64_t startDate, int64_t endDate)
636 {
637     std::string date_str = dateFmt_->FormatRange(startDate, endDate);
638     char *res = IMallocCString(date_str);
639     return res;
640 }
641 
LocaleImpl(int32_t * errCode)642 LocaleImpl::LocaleImpl(int32_t *errCode)
643 {
644     std::string locale_str = "";
645     std::map<std::string, std::string> options = {};
646     locale_ = std::make_unique<LocaleInfo>(locale_str, options);
647     if (locale_ == nullptr) {
648         *errCode = -1;
649         HILOG_ERROR_I18N("The Locale is nullptr");
650         return;
651     }
652 }
653 
LocaleImpl(char * locale,CLocaleOptions options,int64_t flag,int32_t * errCode)654 LocaleImpl::LocaleImpl(char *locale, CLocaleOptions options, int64_t flag, int32_t *errCode)
655 {
656     std::string locale_str = locale;
657 
658     std::map<std::string, std::string> map = {};
659     if (flag == 0) {
660         if (std::strlen(options.calendar) != 0) {
661             map.insert(std::make_pair("calendar", options.calendar));
662         }
663         if (std::strlen(options.collation) != 0) {
664             map.insert(std::make_pair("collation", options.collation));
665         }
666         if (std::strlen(options.hourCycle) != 0) {
667             map.insert(std::make_pair("hourCycle", options.hourCycle));
668         }
669         if (std::strlen(options.numberingSystem) != 0) {
670             map.insert(std::make_pair("numberingSystem", options.numberingSystem));
671         }
672         std::string num = std::to_string(options.numeric) == "1" ? "true" : "false";
673         map.insert(std::make_pair("numeric", num));
674         if (std::strlen(options.caseFirst) != 0) {
675             map.insert(std::make_pair("caseFirst", options.caseFirst));
676         }
677     }
678     locale_ = std::make_unique<LocaleInfo>(locale_str, map);
679     if (locale_ == nullptr) {
680         *errCode = -1;
681         HILOG_ERROR_I18N("The Locale is nullptr");
682         return;
683     }
684 }
685 
ToString()686 char *LocaleImpl::ToString()
687 {
688     if (locale_ == nullptr) {
689         return nullptr;
690     }
691     std::string value = locale_->ToString();
692     char *res = IMallocCString(value);
693     return res;
694 }
695 
Maximize()696 char *LocaleImpl::Maximize()
697 {
698     std::string value = locale_->Maximize();
699     char *res = IMallocCString(value);
700     return res;
701 }
Minimize()702 char *LocaleImpl::Minimize()
703 {
704     std::string value = locale_->Minimize();
705     char *res = IMallocCString(value);
706     return res;
707 }
708 
GetLanguage()709 char *LocaleImpl::GetLanguage()
710 {
711     std::string value = locale_->GetLanguage();
712     char *res = IMallocCString(value);
713     return res;
714 }
GetRegion()715 char *LocaleImpl::GetRegion()
716 {
717     std::string value = locale_->GetRegion();
718     char *res = IMallocCString(value);
719     return res;
720 }
GetScript()721 char *LocaleImpl::GetScript()
722 {
723     std::string value = locale_->GetScript();
724     char *res = IMallocCString(value);
725     return res;
726 }
GetBaseName()727 char *LocaleImpl::GetBaseName()
728 {
729     std::string value = locale_->GetBaseName();
730     char *res = IMallocCString(value);
731     return res;
732 }
GetCaseFirst()733 char *LocaleImpl::GetCaseFirst()
734 {
735     std::string value = locale_->GetCaseFirst();
736     char *res = IMallocCString(value);
737     return res;
738 }
GetCalendar()739 char *LocaleImpl::GetCalendar()
740 {
741     std::string value = locale_->GetCalendar();
742     char *res = IMallocCString(value);
743     return res;
744 }
GetCollation()745 char *LocaleImpl::GetCollation()
746 {
747     std::string value = locale_->GetCollation();
748     char *res = IMallocCString(value);
749     return res;
750 }
GetHourCycle()751 char *LocaleImpl::GetHourCycle()
752 {
753     std::string value = locale_->GetHourCycle();
754     char *res = IMallocCString(value);
755     return res;
756 }
GetNumberingSystem()757 char *LocaleImpl::GetNumberingSystem()
758 {
759     std::string value = locale_->GetNumberingSystem();
760     char *res = IMallocCString(value);
761     return res;
762 }
GetNumeric()763 char *LocaleImpl::GetNumeric()
764 {
765     std::string value = locale_->GetNumeric();
766     char *res = IMallocCString(value);
767     return res;
768 }
769 
770 }  // namespace OHOS::Global::I18n::Intl