19596a2c1Sopenharmony_ci/*
29596a2c1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
39596a2c1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
49596a2c1Sopenharmony_ci * you may not use this file except in compliance with the License.
59596a2c1Sopenharmony_ci * You may obtain a copy of the License at
69596a2c1Sopenharmony_ci *
79596a2c1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
89596a2c1Sopenharmony_ci *
99596a2c1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
109596a2c1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
119596a2c1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129596a2c1Sopenharmony_ci * See the License for the specific language governing permissions and
139596a2c1Sopenharmony_ci * limitations under the License.
149596a2c1Sopenharmony_ci */
159596a2c1Sopenharmony_ci
169596a2c1Sopenharmony_ci#include <unordered_map>
179596a2c1Sopenharmony_ci#include <unordered_set>
189596a2c1Sopenharmony_ci
199596a2c1Sopenharmony_ci#include "error_util.h"
209596a2c1Sopenharmony_ci#include "i18n_hilog.h"
219596a2c1Sopenharmony_ci#include "i18n_calendar_addon.h"
229596a2c1Sopenharmony_ci#include "js_utils.h"
239596a2c1Sopenharmony_ci#include "variable_convertor.h"
249596a2c1Sopenharmony_ci
259596a2c1Sopenharmony_cinamespace OHOS {
269596a2c1Sopenharmony_cinamespace Global {
279596a2c1Sopenharmony_cinamespace I18n {
289596a2c1Sopenharmony_cistatic thread_local napi_ref* g_constructor = nullptr;
299596a2c1Sopenharmony_cistatic std::unordered_map<std::string, UCalendarDateFields> g_fieldsMap {
309596a2c1Sopenharmony_ci    { "era", UCAL_ERA },
319596a2c1Sopenharmony_ci    { "year", UCAL_YEAR },
329596a2c1Sopenharmony_ci    { "month", UCAL_MONTH },
339596a2c1Sopenharmony_ci    { "week_of_year", UCAL_WEEK_OF_YEAR },
349596a2c1Sopenharmony_ci    { "week_of_month", UCAL_WEEK_OF_MONTH },
359596a2c1Sopenharmony_ci    { "date", UCAL_DATE },
369596a2c1Sopenharmony_ci    { "day_of_year", UCAL_DAY_OF_YEAR },
379596a2c1Sopenharmony_ci    { "day_of_week", UCAL_DAY_OF_WEEK },
389596a2c1Sopenharmony_ci    { "day_of_week_in_month", UCAL_DAY_OF_WEEK_IN_MONTH },
399596a2c1Sopenharmony_ci    { "ap_pm", UCAL_AM_PM },
409596a2c1Sopenharmony_ci    { "hour", UCAL_HOUR },
419596a2c1Sopenharmony_ci    { "hour_of_day", UCAL_HOUR_OF_DAY },
429596a2c1Sopenharmony_ci    { "minute", UCAL_MINUTE },
439596a2c1Sopenharmony_ci    { "second", UCAL_SECOND },
449596a2c1Sopenharmony_ci    { "millisecond", UCAL_MILLISECOND },
459596a2c1Sopenharmony_ci    { "zone_offset", UCAL_ZONE_OFFSET },
469596a2c1Sopenharmony_ci    { "dst_offset", UCAL_DST_OFFSET },
479596a2c1Sopenharmony_ci    { "year_woy", UCAL_YEAR_WOY },
489596a2c1Sopenharmony_ci    { "dow_local", UCAL_DOW_LOCAL },
499596a2c1Sopenharmony_ci    { "extended_year", UCAL_EXTENDED_YEAR },
509596a2c1Sopenharmony_ci    { "julian_day", UCAL_JULIAN_DAY },
519596a2c1Sopenharmony_ci    { "milliseconds_in_day", UCAL_MILLISECONDS_IN_DAY },
529596a2c1Sopenharmony_ci    { "is_leap_month", UCAL_IS_LEAP_MONTH },
539596a2c1Sopenharmony_ci};
549596a2c1Sopenharmony_cistatic std::unordered_set<std::string> g_fieldsInFunctionAdd {
559596a2c1Sopenharmony_ci    "year", "month", "date", "hour", "minute", "second", "millisecond",
569596a2c1Sopenharmony_ci    "week_of_year", "week_of_month", "day_of_year", "day_of_week",
579596a2c1Sopenharmony_ci    "day_of_week_in_month", "hour_of_day", "milliseconds_in_day",
589596a2c1Sopenharmony_ci};
599596a2c1Sopenharmony_cistatic std::unordered_map<std::string, CalendarType> g_typeMap {
609596a2c1Sopenharmony_ci    { "buddhist", CalendarType::BUDDHIST },
619596a2c1Sopenharmony_ci    { "chinese", CalendarType::CHINESE },
629596a2c1Sopenharmony_ci    { "coptic", CalendarType::COPTIC },
639596a2c1Sopenharmony_ci    { "ethiopic", CalendarType::ETHIOPIC },
649596a2c1Sopenharmony_ci    { "hebrew", CalendarType::HEBREW },
659596a2c1Sopenharmony_ci    { "gregory", CalendarType::GREGORY },
669596a2c1Sopenharmony_ci    { "indian", CalendarType::INDIAN },
679596a2c1Sopenharmony_ci    { "islamic_civil", CalendarType::ISLAMIC_CIVIL },
689596a2c1Sopenharmony_ci    { "islamic_tbla", CalendarType::ISLAMIC_TBLA },
699596a2c1Sopenharmony_ci    { "islamic_umalqura", CalendarType::ISLAMIC_UMALQURA },
709596a2c1Sopenharmony_ci    { "japanese", CalendarType::JAPANESE },
719596a2c1Sopenharmony_ci    { "persion", CalendarType::PERSIAN },
729596a2c1Sopenharmony_ci};
739596a2c1Sopenharmony_ci
749596a2c1Sopenharmony_ciI18nCalendarAddon::I18nCalendarAddon() {}
759596a2c1Sopenharmony_ci
769596a2c1Sopenharmony_ciI18nCalendarAddon::~I18nCalendarAddon() {}
779596a2c1Sopenharmony_ci
789596a2c1Sopenharmony_civoid I18nCalendarAddon::Destructor(napi_env env, void *nativeObject, void *hint)
799596a2c1Sopenharmony_ci{
809596a2c1Sopenharmony_ci    if (!nativeObject) {
819596a2c1Sopenharmony_ci        return;
829596a2c1Sopenharmony_ci    }
839596a2c1Sopenharmony_ci    delete reinterpret_cast<I18nCalendarAddon *>(nativeObject);
849596a2c1Sopenharmony_ci    nativeObject = nullptr;
859596a2c1Sopenharmony_ci}
869596a2c1Sopenharmony_ci
879596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::InitI18nCalendar(napi_env env, napi_value exports)
889596a2c1Sopenharmony_ci{
899596a2c1Sopenharmony_ci    napi_property_descriptor properties[] = {
909596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("setTime", SetTime),
919596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("set", Set),
929596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("getTimeZone", GetTimeZone),
939596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("setTimeZone", SetTimeZone),
949596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("getFirstDayOfWeek", GetFirstDayOfWeek),
959596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("setFirstDayOfWeek", SetFirstDayOfWeek),
969596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("getMinimalDaysInFirstWeek", GetMinimalDaysInFirstWeek),
979596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("setMinimalDaysInFirstWeek", SetMinimalDaysInFirstWeek),
989596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("get", Get),
999596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("add", Add),
1009596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("getDisplayName", GetDisplayName),
1019596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("getTimeInMillis", GetTimeInMillis),
1029596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("isWeekend", IsWeekend),
1039596a2c1Sopenharmony_ci        DECLARE_NAPI_FUNCTION("compareDays", CompareDays)
1049596a2c1Sopenharmony_ci    };
1059596a2c1Sopenharmony_ci    napi_value constructor = nullptr;
1069596a2c1Sopenharmony_ci    napi_status status = napi_define_class(env, "Calendar", NAPI_AUTO_LENGTH, I18nCalendarConstructor, nullptr,
1079596a2c1Sopenharmony_ci        sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
1089596a2c1Sopenharmony_ci    if (status != napi_ok) {
1099596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Failed to define class at Init");
1109596a2c1Sopenharmony_ci        return nullptr;
1119596a2c1Sopenharmony_ci    }
1129596a2c1Sopenharmony_ci    exports = I18nCalendarAddon::InitCalendar(env, exports);
1139596a2c1Sopenharmony_ci    g_constructor = new (std::nothrow) napi_ref;
1149596a2c1Sopenharmony_ci    if (!g_constructor) {
1159596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Failed to create ref at init");
1169596a2c1Sopenharmony_ci        return nullptr;
1179596a2c1Sopenharmony_ci    }
1189596a2c1Sopenharmony_ci    status = napi_create_reference(env, constructor, 1, g_constructor);
1199596a2c1Sopenharmony_ci    if (status != napi_ok) {
1209596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Failed to create reference at init");
1219596a2c1Sopenharmony_ci        return nullptr;
1229596a2c1Sopenharmony_ci    }
1239596a2c1Sopenharmony_ci    return exports;
1249596a2c1Sopenharmony_ci}
1259596a2c1Sopenharmony_ci
1269596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::InitCalendar(napi_env env, napi_value exports)
1279596a2c1Sopenharmony_ci{
1289596a2c1Sopenharmony_ci    napi_property_descriptor properties[] = {};
1299596a2c1Sopenharmony_ci    napi_value constructor = nullptr;
1309596a2c1Sopenharmony_ci    napi_status status = napi_define_class(env, "I18nCalendar", NAPI_AUTO_LENGTH, JSUtils::DefaultConstructor, nullptr,
1319596a2c1Sopenharmony_ci        sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
1329596a2c1Sopenharmony_ci    if (status != napi_ok) {
1339596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("InitCalendar: Failed to define class Calendar.");
1349596a2c1Sopenharmony_ci        return nullptr;
1359596a2c1Sopenharmony_ci    }
1369596a2c1Sopenharmony_ci    status = napi_set_named_property(env, exports, "Calendar", constructor);
1379596a2c1Sopenharmony_ci    if (status != napi_ok) {
1389596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("InitCalendar: Set property failed When InitCalendar.");
1399596a2c1Sopenharmony_ci        return nullptr;
1409596a2c1Sopenharmony_ci    }
1419596a2c1Sopenharmony_ci    return exports;
1429596a2c1Sopenharmony_ci}
1439596a2c1Sopenharmony_ci
1449596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetCalendar(napi_env env, napi_callback_info info)
1459596a2c1Sopenharmony_ci{
1469596a2c1Sopenharmony_ci    size_t argc = 2; // retrieve 2 arguments
1479596a2c1Sopenharmony_ci    napi_value argv[2] = { 0 };
1489596a2c1Sopenharmony_ci    argv[0] = nullptr;
1499596a2c1Sopenharmony_ci    argv[1] = nullptr;
1509596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
1519596a2c1Sopenharmony_ci    void *data = nullptr;
1529596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1539596a2c1Sopenharmony_ci    napi_value constructor = nullptr;
1549596a2c1Sopenharmony_ci    napi_status status = napi_get_reference_value(env, *g_constructor, &constructor);
1559596a2c1Sopenharmony_ci    if (status != napi_ok) {
1569596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Failed to create reference at GetCalendar");
1579596a2c1Sopenharmony_ci        return nullptr;
1589596a2c1Sopenharmony_ci    }
1599596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
1609596a2c1Sopenharmony_ci    napi_typeof(env, argv[1], &valueType);
1619596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
1629596a2c1Sopenharmony_ci        status = napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, argv + 1);
1639596a2c1Sopenharmony_ci        if (status != napi_ok) {
1649596a2c1Sopenharmony_ci            return nullptr;
1659596a2c1Sopenharmony_ci        }
1669596a2c1Sopenharmony_ci    }
1679596a2c1Sopenharmony_ci    napi_value result = nullptr;
1689596a2c1Sopenharmony_ci    status = napi_new_instance(env, constructor, 2, argv, &result); // 2 arguments
1699596a2c1Sopenharmony_ci    if (status != napi_ok) {
1709596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get calendar create instance failed");
1719596a2c1Sopenharmony_ci        return nullptr;
1729596a2c1Sopenharmony_ci    }
1739596a2c1Sopenharmony_ci    return result;
1749596a2c1Sopenharmony_ci}
1759596a2c1Sopenharmony_ci
1769596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::I18nCalendarConstructor(napi_env env, napi_callback_info info)
1779596a2c1Sopenharmony_ci{
1789596a2c1Sopenharmony_ci    size_t argc = 2;
1799596a2c1Sopenharmony_ci    napi_value argv[2] = { 0 };
1809596a2c1Sopenharmony_ci    argv[0] = nullptr;
1819596a2c1Sopenharmony_ci    argv[1] = nullptr;
1829596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
1839596a2c1Sopenharmony_ci    void *data = nullptr;
1849596a2c1Sopenharmony_ci    napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
1859596a2c1Sopenharmony_ci    if (status != napi_ok) {
1869596a2c1Sopenharmony_ci        return nullptr;
1879596a2c1Sopenharmony_ci    }
1889596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
1899596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
1909596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
1919596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("CalendarConstructor: Parameter type does not match");
1929596a2c1Sopenharmony_ci        return nullptr;
1939596a2c1Sopenharmony_ci    }
1949596a2c1Sopenharmony_ci    int32_t code = 0;
1959596a2c1Sopenharmony_ci    std::string localeTag = VariableConvertor::GetString(env, argv[0], code);
1969596a2c1Sopenharmony_ci    if (code) {
1979596a2c1Sopenharmony_ci        return nullptr;
1989596a2c1Sopenharmony_ci    }
1999596a2c1Sopenharmony_ci    CalendarType type = GetCalendarType(env, argv[1]);
2009596a2c1Sopenharmony_ci    std::unique_ptr<I18nCalendarAddon> obj = nullptr;
2019596a2c1Sopenharmony_ci    obj = std::make_unique<I18nCalendarAddon>();
2029596a2c1Sopenharmony_ci    status =
2039596a2c1Sopenharmony_ci        napi_wrap(env, thisVar, reinterpret_cast<void *>(obj.get()), I18nCalendarAddon::Destructor, nullptr, nullptr);
2049596a2c1Sopenharmony_ci    if (status != napi_ok) {
2059596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("CalendarConstructor: Wrap II18nAddon failed");
2069596a2c1Sopenharmony_ci        return nullptr;
2079596a2c1Sopenharmony_ci    }
2089596a2c1Sopenharmony_ci    if (!obj->InitCalendarContext(env, info, localeTag, type)) {
2099596a2c1Sopenharmony_ci        return nullptr;
2109596a2c1Sopenharmony_ci    }
2119596a2c1Sopenharmony_ci    obj.release();
2129596a2c1Sopenharmony_ci    return thisVar;
2139596a2c1Sopenharmony_ci}
2149596a2c1Sopenharmony_ci
2159596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::SetTime(napi_env env, napi_callback_info info)
2169596a2c1Sopenharmony_ci{
2179596a2c1Sopenharmony_ci    size_t argc = 1;
2189596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
2199596a2c1Sopenharmony_ci    argv[0] = nullptr;
2209596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
2219596a2c1Sopenharmony_ci    void *data = nullptr;
2229596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
2239596a2c1Sopenharmony_ci    if (!argv[0]) {
2249596a2c1Sopenharmony_ci        return nullptr;
2259596a2c1Sopenharmony_ci    }
2269596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
2279596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
2289596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
2299596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetTime: Get calendar object failed");
2309596a2c1Sopenharmony_ci        return nullptr;
2319596a2c1Sopenharmony_ci    }
2329596a2c1Sopenharmony_ci    napi_valuetype type = napi_valuetype::napi_undefined;
2339596a2c1Sopenharmony_ci    status = napi_typeof(env, argv[0], &type);
2349596a2c1Sopenharmony_ci    if (status != napi_ok) {
2359596a2c1Sopenharmony_ci        return nullptr;
2369596a2c1Sopenharmony_ci    }
2379596a2c1Sopenharmony_ci    if (type == napi_valuetype::napi_number) {
2389596a2c1Sopenharmony_ci        obj->SetMilliseconds(env, argv[0]);
2399596a2c1Sopenharmony_ci        return nullptr;
2409596a2c1Sopenharmony_ci    } else {
2419596a2c1Sopenharmony_ci        napi_value val = GetDate(env, argv[0]);
2429596a2c1Sopenharmony_ci        if (!val) {
2439596a2c1Sopenharmony_ci            return nullptr;
2449596a2c1Sopenharmony_ci        }
2459596a2c1Sopenharmony_ci        obj->SetMilliseconds(env, val);
2469596a2c1Sopenharmony_ci        return nullptr;
2479596a2c1Sopenharmony_ci    }
2489596a2c1Sopenharmony_ci}
2499596a2c1Sopenharmony_ci
2509596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::Set(napi_env env, napi_callback_info info)
2519596a2c1Sopenharmony_ci{
2529596a2c1Sopenharmony_ci    size_t argc = 6; // Set may have 6 arguments
2539596a2c1Sopenharmony_ci    napi_value argv[6] = { 0 };
2549596a2c1Sopenharmony_ci    for (size_t i = 0; i < argc; ++i) {
2559596a2c1Sopenharmony_ci        argv[i] = nullptr;
2569596a2c1Sopenharmony_ci    }
2579596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
2589596a2c1Sopenharmony_ci    void *data = nullptr;
2599596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
2609596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
2619596a2c1Sopenharmony_ci    napi_status status = napi_ok;
2629596a2c1Sopenharmony_ci    int32_t times[3] = { 0 }; // There are at least 3 arguments.
2639596a2c1Sopenharmony_ci    for (int i = 0; i < 3; ++i) { // There are at least 3 arguments.
2649596a2c1Sopenharmony_ci        napi_typeof(env, argv[i], &valueType);
2659596a2c1Sopenharmony_ci        if (valueType != napi_valuetype::napi_number) {
2669596a2c1Sopenharmony_ci            HILOG_ERROR_I18N("Set: Parameter type does not match");
2679596a2c1Sopenharmony_ci            return nullptr;
2689596a2c1Sopenharmony_ci        }
2699596a2c1Sopenharmony_ci        status = napi_get_value_int32(env, argv[i], times + i);
2709596a2c1Sopenharmony_ci        if (status != napi_ok) {
2719596a2c1Sopenharmony_ci            HILOG_ERROR_I18N("Set: Retrieve time value failed");
2729596a2c1Sopenharmony_ci            return nullptr;
2739596a2c1Sopenharmony_ci        }
2749596a2c1Sopenharmony_ci    }
2759596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
2769596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
2779596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
2789596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Set: Get calendar object failed");
2799596a2c1Sopenharmony_ci        return nullptr;
2809596a2c1Sopenharmony_ci    }
2819596a2c1Sopenharmony_ci    obj->calendar_->Set(times[0], times[1], times[2]); // 2 is the index of date
2829596a2c1Sopenharmony_ci    obj->SetField(env, argv[3], UCalendarDateFields::UCAL_HOUR_OF_DAY); // 3 is the index of hour
2839596a2c1Sopenharmony_ci    obj->SetField(env, argv[4], UCalendarDateFields::UCAL_MINUTE); // 4 is the index of minute
2849596a2c1Sopenharmony_ci    obj->SetField(env, argv[5], UCalendarDateFields::UCAL_SECOND); // 5 is the index of second
2859596a2c1Sopenharmony_ci    return nullptr;
2869596a2c1Sopenharmony_ci}
2879596a2c1Sopenharmony_ci
2889596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetTimeZone(napi_env env, napi_callback_info info)
2899596a2c1Sopenharmony_ci{
2909596a2c1Sopenharmony_ci    size_t argc = 0;
2919596a2c1Sopenharmony_ci    napi_value *argv = nullptr;
2929596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
2939596a2c1Sopenharmony_ci    void *data = nullptr;
2949596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
2959596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
2969596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
2979596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
2989596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetTimeZone: Get calendar object failed");
2999596a2c1Sopenharmony_ci        return nullptr;
3009596a2c1Sopenharmony_ci    }
3019596a2c1Sopenharmony_ci    std::string temp = obj->calendar_->GetTimeZone();
3029596a2c1Sopenharmony_ci    napi_value result = nullptr;
3039596a2c1Sopenharmony_ci    status = napi_create_string_utf8(env, temp.c_str(), NAPI_AUTO_LENGTH, &result);
3049596a2c1Sopenharmony_ci    if (status != napi_ok) {
3059596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Create timezone string failed");
3069596a2c1Sopenharmony_ci        return nullptr;
3079596a2c1Sopenharmony_ci    }
3089596a2c1Sopenharmony_ci    return result;
3099596a2c1Sopenharmony_ci}
3109596a2c1Sopenharmony_ci
3119596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::SetTimeZone(napi_env env, napi_callback_info info)
3129596a2c1Sopenharmony_ci{
3139596a2c1Sopenharmony_ci    size_t argc = 1;
3149596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
3159596a2c1Sopenharmony_ci    argv[0] = nullptr;
3169596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
3179596a2c1Sopenharmony_ci    void *data = nullptr;
3189596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
3199596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
3209596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
3219596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
3229596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetTimeZone: Parameter type does not match");
3239596a2c1Sopenharmony_ci        return nullptr;
3249596a2c1Sopenharmony_ci    }
3259596a2c1Sopenharmony_ci    size_t len = 0;
3269596a2c1Sopenharmony_ci    napi_status status = napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
3279596a2c1Sopenharmony_ci    if (status != napi_ok) {
3289596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetTimeZone: Get timezone length failed");
3299596a2c1Sopenharmony_ci        return nullptr;
3309596a2c1Sopenharmony_ci    }
3319596a2c1Sopenharmony_ci    std::vector<char> buf(len + 1);
3329596a2c1Sopenharmony_ci    status = napi_get_value_string_utf8(env, argv[0], buf.data(), len + 1, &len);
3339596a2c1Sopenharmony_ci    if (status != napi_ok) {
3349596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetTimeZone: Get timezone failed");
3359596a2c1Sopenharmony_ci        return nullptr;
3369596a2c1Sopenharmony_ci    }
3379596a2c1Sopenharmony_ci    std::string timezone(buf.data());
3389596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
3399596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
3409596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
3419596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetTimeZone: Get calendar object failed");
3429596a2c1Sopenharmony_ci        return nullptr;
3439596a2c1Sopenharmony_ci    }
3449596a2c1Sopenharmony_ci    obj->calendar_->SetTimeZone(timezone);
3459596a2c1Sopenharmony_ci    return nullptr;
3469596a2c1Sopenharmony_ci}
3479596a2c1Sopenharmony_ci
3489596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetFirstDayOfWeek(napi_env env, napi_callback_info info)
3499596a2c1Sopenharmony_ci{
3509596a2c1Sopenharmony_ci    size_t argc = 0;
3519596a2c1Sopenharmony_ci    napi_value *argv = nullptr;
3529596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
3539596a2c1Sopenharmony_ci    void *data = nullptr;
3549596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
3559596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
3569596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
3579596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
3589596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetFirstDayOfWeek: Get calendar object failed");
3599596a2c1Sopenharmony_ci        return nullptr;
3609596a2c1Sopenharmony_ci    }
3619596a2c1Sopenharmony_ci    int32_t temp = obj->calendar_->GetFirstDayOfWeek();
3629596a2c1Sopenharmony_ci    napi_value result = nullptr;
3639596a2c1Sopenharmony_ci    status = napi_create_int32(env, temp, &result);
3649596a2c1Sopenharmony_ci    if (status != napi_ok) {
3659596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetFirstDayOfWeek: Create int32 failed");
3669596a2c1Sopenharmony_ci        return nullptr;
3679596a2c1Sopenharmony_ci    }
3689596a2c1Sopenharmony_ci    return result;
3699596a2c1Sopenharmony_ci}
3709596a2c1Sopenharmony_ci
3719596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::SetFirstDayOfWeek(napi_env env, napi_callback_info info)
3729596a2c1Sopenharmony_ci{
3739596a2c1Sopenharmony_ci    size_t argc = 1;
3749596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
3759596a2c1Sopenharmony_ci    argv[0] = nullptr;
3769596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
3779596a2c1Sopenharmony_ci    void *data = nullptr;
3789596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
3799596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
3809596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
3819596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
3829596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetFirstDayOfWeek: Parameter type does not match");
3839596a2c1Sopenharmony_ci        return nullptr;
3849596a2c1Sopenharmony_ci    }
3859596a2c1Sopenharmony_ci    int32_t value = 0;
3869596a2c1Sopenharmony_ci    napi_status status = napi_get_value_int32(env, argv[0], &value);
3879596a2c1Sopenharmony_ci    if (status != napi_ok) {
3889596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetFirstDayOfWeek: Get int32 failed");
3899596a2c1Sopenharmony_ci        return nullptr;
3909596a2c1Sopenharmony_ci    }
3919596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
3929596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
3939596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
3949596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetFirstDayOfWeek: Get calendar object failed");
3959596a2c1Sopenharmony_ci        return nullptr;
3969596a2c1Sopenharmony_ci    }
3979596a2c1Sopenharmony_ci    obj->calendar_->SetFirstDayOfWeek(value);
3989596a2c1Sopenharmony_ci    return nullptr;
3999596a2c1Sopenharmony_ci}
4009596a2c1Sopenharmony_ci
4019596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetMinimalDaysInFirstWeek(napi_env env, napi_callback_info info)
4029596a2c1Sopenharmony_ci{
4039596a2c1Sopenharmony_ci    size_t argc = 0;
4049596a2c1Sopenharmony_ci    napi_value *argv = nullptr;
4059596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
4069596a2c1Sopenharmony_ci    void *data = nullptr;
4079596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
4089596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
4099596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
4109596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
4119596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetMinimalDaysInFirstWeek: Get calendar object failed");
4129596a2c1Sopenharmony_ci        return nullptr;
4139596a2c1Sopenharmony_ci    }
4149596a2c1Sopenharmony_ci    int32_t temp = obj->calendar_->GetMinimalDaysInFirstWeek();
4159596a2c1Sopenharmony_ci    napi_value result = nullptr;
4169596a2c1Sopenharmony_ci    status = napi_create_int32(env, temp, &result);
4179596a2c1Sopenharmony_ci    if (status != napi_ok) {
4189596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetMinimalDaysInFirstWeek: Create int32 failed");
4199596a2c1Sopenharmony_ci        return nullptr;
4209596a2c1Sopenharmony_ci    }
4219596a2c1Sopenharmony_ci    return result;
4229596a2c1Sopenharmony_ci}
4239596a2c1Sopenharmony_ci
4249596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::SetMinimalDaysInFirstWeek(napi_env env, napi_callback_info info)
4259596a2c1Sopenharmony_ci{
4269596a2c1Sopenharmony_ci    size_t argc = 1;
4279596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
4289596a2c1Sopenharmony_ci    argv[0] = nullptr;
4299596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
4309596a2c1Sopenharmony_ci    void *data = nullptr;
4319596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
4329596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
4339596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
4349596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
4359596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetMinimalDaysInFirstWeek: Parameter type does not match");
4369596a2c1Sopenharmony_ci        return nullptr;
4379596a2c1Sopenharmony_ci    }
4389596a2c1Sopenharmony_ci    int32_t value = 0;
4399596a2c1Sopenharmony_ci    napi_status status = napi_get_value_int32(env, argv[0], &value);
4409596a2c1Sopenharmony_ci    if (status != napi_ok) {
4419596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetMinimalDaysInFirstWeek: Get int32 failed");
4429596a2c1Sopenharmony_ci        return nullptr;
4439596a2c1Sopenharmony_ci    }
4449596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
4459596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
4469596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
4479596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetMinimalDaysInFirstWeek: Get calendar object failed");
4489596a2c1Sopenharmony_ci        return nullptr;
4499596a2c1Sopenharmony_ci    }
4509596a2c1Sopenharmony_ci    obj->calendar_->SetMinimalDaysInFirstWeek(value);
4519596a2c1Sopenharmony_ci    return nullptr;
4529596a2c1Sopenharmony_ci}
4539596a2c1Sopenharmony_ci
4549596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::Get(napi_env env, napi_callback_info info)
4559596a2c1Sopenharmony_ci{
4569596a2c1Sopenharmony_ci    size_t argc = 1;
4579596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
4589596a2c1Sopenharmony_ci    argv[0] = nullptr;
4599596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
4609596a2c1Sopenharmony_ci    void *data = nullptr;
4619596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
4629596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
4639596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
4649596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
4659596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get: Parameter type does not match");
4669596a2c1Sopenharmony_ci        return nullptr;
4679596a2c1Sopenharmony_ci    }
4689596a2c1Sopenharmony_ci    size_t len = 0;
4699596a2c1Sopenharmony_ci    napi_status status = napi_get_value_string_utf8(env, argv[0], nullptr, 0, &len);
4709596a2c1Sopenharmony_ci    if (status != napi_ok) {
4719596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get field length failed");
4729596a2c1Sopenharmony_ci        return nullptr;
4739596a2c1Sopenharmony_ci    }
4749596a2c1Sopenharmony_ci    std::vector<char> buf(len + 1);
4759596a2c1Sopenharmony_ci    status = napi_get_value_string_utf8(env, argv[0], buf.data(), len + 1, &len);
4769596a2c1Sopenharmony_ci    if (status != napi_ok) {
4779596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get field failed");
4789596a2c1Sopenharmony_ci        return nullptr;
4799596a2c1Sopenharmony_ci    }
4809596a2c1Sopenharmony_ci    std::string field(buf.data());
4819596a2c1Sopenharmony_ci    if (g_fieldsMap.find(field) == g_fieldsMap.end()) {
4829596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Invalid field");
4839596a2c1Sopenharmony_ci        return nullptr;
4849596a2c1Sopenharmony_ci    }
4859596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
4869596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
4879596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
4889596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get: Get calendar object failed");
4899596a2c1Sopenharmony_ci        return nullptr;
4909596a2c1Sopenharmony_ci    }
4919596a2c1Sopenharmony_ci    int32_t value = obj->calendar_->Get(g_fieldsMap[field]);
4929596a2c1Sopenharmony_ci    napi_value result = nullptr;
4939596a2c1Sopenharmony_ci    status = napi_create_int32(env, value, &result);
4949596a2c1Sopenharmony_ci    if (status != napi_ok) {
4959596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get: Create int32 failed");
4969596a2c1Sopenharmony_ci        return nullptr;
4979596a2c1Sopenharmony_ci    }
4989596a2c1Sopenharmony_ci    return result;
4999596a2c1Sopenharmony_ci}
5009596a2c1Sopenharmony_ci
5019596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::Add(napi_env env, napi_callback_info info)
5029596a2c1Sopenharmony_ci{
5039596a2c1Sopenharmony_ci    size_t argc = 2;
5049596a2c1Sopenharmony_ci    napi_value argv[2] = { 0 };
5059596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
5069596a2c1Sopenharmony_ci    void *data = nullptr;
5079596a2c1Sopenharmony_ci    napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
5089596a2c1Sopenharmony_ci    if (status != napi_ok) {
5099596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Add: can not obtain add function param.");
5109596a2c1Sopenharmony_ci        return nullptr;
5119596a2c1Sopenharmony_ci    }
5129596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
5139596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
5149596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
5159596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Parameter type does not match argv[0]");
5169596a2c1Sopenharmony_ci        ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "field", "string", true);
5179596a2c1Sopenharmony_ci        return nullptr;
5189596a2c1Sopenharmony_ci    }
5199596a2c1Sopenharmony_ci    int32_t code = 0;
5209596a2c1Sopenharmony_ci    std::string field = GetAddField(env, argv[0], code);
5219596a2c1Sopenharmony_ci    if (code) {
5229596a2c1Sopenharmony_ci        return nullptr;
5239596a2c1Sopenharmony_ci    }
5249596a2c1Sopenharmony_ci    napi_typeof(env, argv[1], &valueType);
5259596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
5269596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Parameter type does not match argv[1]");
5279596a2c1Sopenharmony_ci        ErrorUtil::NapiThrow(env, I18N_NOT_FOUND, "amount", "number", true);
5289596a2c1Sopenharmony_ci        return nullptr;
5299596a2c1Sopenharmony_ci    }
5309596a2c1Sopenharmony_ci    int32_t amount;
5319596a2c1Sopenharmony_ci    status = napi_get_value_int32(env, argv[1], &amount);
5329596a2c1Sopenharmony_ci    if (status != napi_ok) {
5339596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Add: Can not obtain add function param.");
5349596a2c1Sopenharmony_ci        return nullptr;
5359596a2c1Sopenharmony_ci    }
5369596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
5379596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
5389596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
5399596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Add: Get calendar object failed");
5409596a2c1Sopenharmony_ci        return nullptr;
5419596a2c1Sopenharmony_ci    }
5429596a2c1Sopenharmony_ci    obj->calendar_->Add(g_fieldsMap[field], amount);
5439596a2c1Sopenharmony_ci    return nullptr;
5449596a2c1Sopenharmony_ci}
5459596a2c1Sopenharmony_ci
5469596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetDisplayName(napi_env env, napi_callback_info info)
5479596a2c1Sopenharmony_ci{
5489596a2c1Sopenharmony_ci    size_t argc = 1;
5499596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
5509596a2c1Sopenharmony_ci    argv[0] = nullptr;
5519596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
5529596a2c1Sopenharmony_ci    void *data = nullptr;
5539596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
5549596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
5559596a2c1Sopenharmony_ci    napi_typeof(env, argv[0], &valueType);
5569596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_string) {
5579596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetDisplayName: Parameter type does not match");
5589596a2c1Sopenharmony_ci        return nullptr;
5599596a2c1Sopenharmony_ci    }
5609596a2c1Sopenharmony_ci    int32_t code = 0;
5619596a2c1Sopenharmony_ci    std::string localeTag = VariableConvertor::GetString(env, argv[0], code);
5629596a2c1Sopenharmony_ci    if (code) {
5639596a2c1Sopenharmony_ci        return nullptr;
5649596a2c1Sopenharmony_ci    }
5659596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
5669596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
5679596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
5689596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetDisplayName: Get calendar object failed");
5699596a2c1Sopenharmony_ci        return nullptr;
5709596a2c1Sopenharmony_ci    }
5719596a2c1Sopenharmony_ci    if (!obj->calendar_) {
5729596a2c1Sopenharmony_ci        return nullptr;
5739596a2c1Sopenharmony_ci    }
5749596a2c1Sopenharmony_ci    std::string name = obj->calendar_->GetDisplayName(localeTag);
5759596a2c1Sopenharmony_ci    napi_value result = nullptr;
5769596a2c1Sopenharmony_ci    status = napi_create_string_utf8(env, name.c_str(), NAPI_AUTO_LENGTH, &result);
5779596a2c1Sopenharmony_ci    if (status != napi_ok) {
5789596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Create calendar name string failed");
5799596a2c1Sopenharmony_ci        return nullptr;
5809596a2c1Sopenharmony_ci    }
5819596a2c1Sopenharmony_ci    return result;
5829596a2c1Sopenharmony_ci}
5839596a2c1Sopenharmony_ci
5849596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetTimeInMillis(napi_env env, napi_callback_info info)
5859596a2c1Sopenharmony_ci{
5869596a2c1Sopenharmony_ci    bool flag = true;
5879596a2c1Sopenharmony_ci    size_t argc = 0;
5889596a2c1Sopenharmony_ci    napi_value *argv = nullptr;
5899596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
5909596a2c1Sopenharmony_ci    void *data = nullptr;
5919596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
5929596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
5939596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
5949596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
5959596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetTimeInMillis: Get calendar object failed");
5969596a2c1Sopenharmony_ci        flag = false;
5979596a2c1Sopenharmony_ci    }
5989596a2c1Sopenharmony_ci    UDate temp = 0;
5999596a2c1Sopenharmony_ci    if (flag) {
6009596a2c1Sopenharmony_ci        temp = obj->calendar_->GetTimeInMillis();
6019596a2c1Sopenharmony_ci    }
6029596a2c1Sopenharmony_ci    napi_value result = nullptr;
6039596a2c1Sopenharmony_ci    status = napi_create_double(env, temp, &result);
6049596a2c1Sopenharmony_ci    if (status != napi_ok) {
6059596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Create UDate failed");
6069596a2c1Sopenharmony_ci        napi_create_double(env, 0, &result);
6079596a2c1Sopenharmony_ci    }
6089596a2c1Sopenharmony_ci    return result;
6099596a2c1Sopenharmony_ci}
6109596a2c1Sopenharmony_ci
6119596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::IsWeekend(napi_env env, napi_callback_info info)
6129596a2c1Sopenharmony_ci{
6139596a2c1Sopenharmony_ci    size_t argc = 1;
6149596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
6159596a2c1Sopenharmony_ci    argv[0] = nullptr;
6169596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
6179596a2c1Sopenharmony_ci    void *data = nullptr;
6189596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
6199596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
6209596a2c1Sopenharmony_ci    bool isWeekEnd = false;
6219596a2c1Sopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
6229596a2c1Sopenharmony_ci    do {
6239596a2c1Sopenharmony_ci        if (status != napi_ok || !obj || !obj->calendar_) {
6249596a2c1Sopenharmony_ci            HILOG_ERROR_I18N("IsWeekend: Get calendar object failed");
6259596a2c1Sopenharmony_ci            break;
6269596a2c1Sopenharmony_ci        }
6279596a2c1Sopenharmony_ci        if (!VariableConvertor::CheckNapiValueType(env, argv[0])) {
6289596a2c1Sopenharmony_ci            isWeekEnd = obj->calendar_->IsWeekend();
6299596a2c1Sopenharmony_ci        } else {
6309596a2c1Sopenharmony_ci            napi_value funcGetDateInfo = nullptr;
6319596a2c1Sopenharmony_ci            status = napi_get_named_property(env, argv[0], "valueOf", &funcGetDateInfo);
6329596a2c1Sopenharmony_ci            if (status != napi_ok) {
6339596a2c1Sopenharmony_ci                HILOG_ERROR_I18N("Get method now failed");
6349596a2c1Sopenharmony_ci                break;
6359596a2c1Sopenharmony_ci            }
6369596a2c1Sopenharmony_ci            napi_value value = nullptr;
6379596a2c1Sopenharmony_ci            status = napi_call_function(env, argv[0], funcGetDateInfo, 0, nullptr, &value);
6389596a2c1Sopenharmony_ci            if (status != napi_ok) {
6399596a2c1Sopenharmony_ci                HILOG_ERROR_I18N("IsWeekend: Get milliseconds failed");
6409596a2c1Sopenharmony_ci                break;
6419596a2c1Sopenharmony_ci            }
6429596a2c1Sopenharmony_ci            double milliseconds = 0;
6439596a2c1Sopenharmony_ci            status = napi_get_value_double(env, value, &milliseconds);
6449596a2c1Sopenharmony_ci            if (status != napi_ok) {
6459596a2c1Sopenharmony_ci                HILOG_ERROR_I18N("IsWeekend: Retrieve milliseconds failed");
6469596a2c1Sopenharmony_ci                break;
6479596a2c1Sopenharmony_ci            }
6489596a2c1Sopenharmony_ci            UErrorCode error = U_ZERO_ERROR;
6499596a2c1Sopenharmony_ci            isWeekEnd = obj->calendar_->IsWeekend(milliseconds, error);
6509596a2c1Sopenharmony_ci        }
6519596a2c1Sopenharmony_ci    } while (false);
6529596a2c1Sopenharmony_ci    napi_value result = nullptr;
6539596a2c1Sopenharmony_ci    status = napi_get_boolean(env, isWeekEnd, &result);
6549596a2c1Sopenharmony_ci    if (status != napi_ok) {
6559596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Create boolean failed");
6569596a2c1Sopenharmony_ci        return nullptr;
6579596a2c1Sopenharmony_ci    }
6589596a2c1Sopenharmony_ci    return result;
6599596a2c1Sopenharmony_ci}
6609596a2c1Sopenharmony_ci
6619596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::CompareDays(napi_env env, napi_callback_info info)
6629596a2c1Sopenharmony_ci{
6639596a2c1Sopenharmony_ci    size_t argc = 1;
6649596a2c1Sopenharmony_ci    napi_value argv[1] = { 0 };
6659596a2c1Sopenharmony_ci    napi_value thisVar = nullptr;
6669596a2c1Sopenharmony_ci    void *data = nullptr;
6679596a2c1Sopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
6689596a2c1Sopenharmony_ci    napi_value result = nullptr;
6699596a2c1Sopenharmony_ci    UDate milliseconds = 0;
6709596a2c1Sopenharmony_ci    napi_status status = napi_get_date_value(env, argv[0], &milliseconds);
6719596a2c1Sopenharmony_ci    if (status != napi_ok) {
6729596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("compareDays: function param is not Date");
6739596a2c1Sopenharmony_ci        return nullptr;
6749596a2c1Sopenharmony_ci    }
6759596a2c1Sopenharmony_ci
6769596a2c1Sopenharmony_ci    I18nCalendarAddon *obj = nullptr;
6779596a2c1Sopenharmony_ci    status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
6789596a2c1Sopenharmony_ci    if (status != napi_ok || !obj || !obj->calendar_) {
6799596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("CompareDays: Get calendar object failed");
6809596a2c1Sopenharmony_ci        status = napi_create_int32(env, 0, &result); // if error return 0
6819596a2c1Sopenharmony_ci        return result;
6829596a2c1Sopenharmony_ci    }
6839596a2c1Sopenharmony_ci
6849596a2c1Sopenharmony_ci    int32_t diff_date = obj->calendar_->CompareDays(milliseconds);
6859596a2c1Sopenharmony_ci    status = napi_create_int32(env, diff_date, &result);
6869596a2c1Sopenharmony_ci    return result;
6879596a2c1Sopenharmony_ci}
6889596a2c1Sopenharmony_ci
6899596a2c1Sopenharmony_cibool I18nCalendarAddon::InitCalendarContext(napi_env env, napi_callback_info info, const std::string &localeTag,
6909596a2c1Sopenharmony_ci    CalendarType type)
6919596a2c1Sopenharmony_ci{
6929596a2c1Sopenharmony_ci    calendar_ = std::make_unique<I18nCalendar>(localeTag, type);
6939596a2c1Sopenharmony_ci    return calendar_ != nullptr;
6949596a2c1Sopenharmony_ci}
6959596a2c1Sopenharmony_ci
6969596a2c1Sopenharmony_ciCalendarType I18nCalendarAddon::GetCalendarType(napi_env env, napi_value value)
6979596a2c1Sopenharmony_ci{
6989596a2c1Sopenharmony_ci    CalendarType type = CalendarType::UNDEFINED;
6999596a2c1Sopenharmony_ci    if (value != nullptr) {
7009596a2c1Sopenharmony_ci        napi_valuetype valueType = napi_valuetype::napi_undefined;
7019596a2c1Sopenharmony_ci        napi_typeof(env, value, &valueType);
7029596a2c1Sopenharmony_ci        if (valueType != napi_valuetype::napi_string) {
7039596a2c1Sopenharmony_ci            HILOG_ERROR_I18N("GetCalendarType: Parameter type does not match");
7049596a2c1Sopenharmony_ci            return type;
7059596a2c1Sopenharmony_ci        }
7069596a2c1Sopenharmony_ci        int32_t code = 0;
7079596a2c1Sopenharmony_ci        std::string calendarType = VariableConvertor::GetString(env, value, code);
7089596a2c1Sopenharmony_ci        if (code) {
7099596a2c1Sopenharmony_ci            return type;
7109596a2c1Sopenharmony_ci        }
7119596a2c1Sopenharmony_ci        if (g_typeMap.find(calendarType) != g_typeMap.end()) {
7129596a2c1Sopenharmony_ci            type = g_typeMap[calendarType];
7139596a2c1Sopenharmony_ci        }
7149596a2c1Sopenharmony_ci    }
7159596a2c1Sopenharmony_ci    return type;
7169596a2c1Sopenharmony_ci}
7179596a2c1Sopenharmony_ci
7189596a2c1Sopenharmony_civoid I18nCalendarAddon::SetField(napi_env env, napi_value value, UCalendarDateFields field)
7199596a2c1Sopenharmony_ci{
7209596a2c1Sopenharmony_ci    if (!VariableConvertor::CheckNapiValueType(env, value)) {
7219596a2c1Sopenharmony_ci        return;
7229596a2c1Sopenharmony_ci    }
7239596a2c1Sopenharmony_ci    int32_t val = 0;
7249596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
7259596a2c1Sopenharmony_ci    napi_typeof(env, value, &valueType);
7269596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
7279596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetField: Parameter type does not match");
7289596a2c1Sopenharmony_ci        return;
7299596a2c1Sopenharmony_ci    }
7309596a2c1Sopenharmony_ci    napi_status status = napi_get_value_int32(env, value, &val);
7319596a2c1Sopenharmony_ci    if (status != napi_ok) {
7329596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetField: Retrieve field failed");
7339596a2c1Sopenharmony_ci        return;
7349596a2c1Sopenharmony_ci    }
7359596a2c1Sopenharmony_ci    if (calendar_ != nullptr) {
7369596a2c1Sopenharmony_ci        calendar_->Set(field, val);
7379596a2c1Sopenharmony_ci    }
7389596a2c1Sopenharmony_ci}
7399596a2c1Sopenharmony_ci
7409596a2c1Sopenharmony_cistd::string I18nCalendarAddon::GetAddField(napi_env &env, napi_value &value, int32_t &code)
7419596a2c1Sopenharmony_ci{
7429596a2c1Sopenharmony_ci    std::string field = VariableConvertor::GetString(env, value, code);
7439596a2c1Sopenharmony_ci    if (code != 0) {
7449596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetAddField: can't get string from js array param.");
7459596a2c1Sopenharmony_ci        return field;
7469596a2c1Sopenharmony_ci    }
7479596a2c1Sopenharmony_ci    if (g_fieldsInFunctionAdd.find(field) == g_fieldsInFunctionAdd.end()) {
7489596a2c1Sopenharmony_ci        code = 1;
7499596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Parameter rangs do not match");
7509596a2c1Sopenharmony_ci        ErrorUtil::NapiThrow(env, I18N_NOT_VALID, "field", "a valid field", true);
7519596a2c1Sopenharmony_ci        return field;
7529596a2c1Sopenharmony_ci    }
7539596a2c1Sopenharmony_ci    return field;
7549596a2c1Sopenharmony_ci}
7559596a2c1Sopenharmony_ci
7569596a2c1Sopenharmony_cinapi_value I18nCalendarAddon::GetDate(napi_env env, napi_value value)
7579596a2c1Sopenharmony_ci{
7589596a2c1Sopenharmony_ci    if (!value) {
7599596a2c1Sopenharmony_ci        return nullptr;
7609596a2c1Sopenharmony_ci    }
7619596a2c1Sopenharmony_ci    napi_value funcGetDateInfo = nullptr;
7629596a2c1Sopenharmony_ci    napi_status status = napi_get_named_property(env, value, "valueOf", &funcGetDateInfo);
7639596a2c1Sopenharmony_ci    if (status != napi_ok) {
7649596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("Get method valueOf failed");
7659596a2c1Sopenharmony_ci        return nullptr;
7669596a2c1Sopenharmony_ci    }
7679596a2c1Sopenharmony_ci    napi_value ret_value = nullptr;
7689596a2c1Sopenharmony_ci    status = napi_call_function(env, value, funcGetDateInfo, 0, nullptr, &ret_value);
7699596a2c1Sopenharmony_ci    if (status != napi_ok) {
7709596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("GetDate: Get milliseconds failed");
7719596a2c1Sopenharmony_ci        return nullptr;
7729596a2c1Sopenharmony_ci    }
7739596a2c1Sopenharmony_ci    return ret_value;
7749596a2c1Sopenharmony_ci}
7759596a2c1Sopenharmony_ci
7769596a2c1Sopenharmony_civoid I18nCalendarAddon::SetMilliseconds(napi_env env, napi_value value)
7779596a2c1Sopenharmony_ci{
7789596a2c1Sopenharmony_ci    if (!value) {
7799596a2c1Sopenharmony_ci        return;
7809596a2c1Sopenharmony_ci    }
7819596a2c1Sopenharmony_ci    double milliseconds = 0;
7829596a2c1Sopenharmony_ci    napi_valuetype valueType = napi_valuetype::napi_undefined;
7839596a2c1Sopenharmony_ci    napi_typeof(env, value, &valueType);
7849596a2c1Sopenharmony_ci    if (valueType != napi_valuetype::napi_number) {
7859596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetMilliseconds: Parameter type does not match");
7869596a2c1Sopenharmony_ci        return;
7879596a2c1Sopenharmony_ci    }
7889596a2c1Sopenharmony_ci    napi_status status = napi_get_value_double(env, value, &milliseconds);
7899596a2c1Sopenharmony_ci    if (status != napi_ok) {
7909596a2c1Sopenharmony_ci        HILOG_ERROR_I18N("SetMilliseconds: Retrieve milliseconds failed");
7919596a2c1Sopenharmony_ci        return;
7929596a2c1Sopenharmony_ci    }
7939596a2c1Sopenharmony_ci    if (calendar_ != nullptr) {
7949596a2c1Sopenharmony_ci        calendar_->SetTime(milliseconds);
7959596a2c1Sopenharmony_ci    }
7969596a2c1Sopenharmony_ci}
7979596a2c1Sopenharmony_ci
7989596a2c1Sopenharmony_ci} // namespace I18n
7999596a2c1Sopenharmony_ci} // namespace Global
8009596a2c1Sopenharmony_ci} // namespace OHOS