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