1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "zone_rules_addon.h"
16
17 #include "character.h"
18 #include "error_util.h"
19 #include "i18n_hilog.h"
20 #include "js_utils.h"
21 #include "variable_convertor.h"
22 #include "zone_offset_transition_addon.h"
23
24 namespace OHOS {
25 namespace Global {
26 namespace I18n {
27 static thread_local napi_ref g_zoneRulesConstructor = nullptr;
28
ZoneRulesAddon()29 ZoneRulesAddon::ZoneRulesAddon() {}
30
~ZoneRulesAddon()31 ZoneRulesAddon::~ZoneRulesAddon() {}
32
Destructor(napi_env env,void * nativeObject,void * hint)33 void ZoneRulesAddon::Destructor(napi_env env, void *nativeObject, void *hint)
34 {
35 if (!nativeObject) {
36 return;
37 }
38 delete reinterpret_cast<ZoneRulesAddon *>(nativeObject);
39 nativeObject = nullptr;
40 }
41
InitI18nZoneRules(napi_env env,napi_value exports)42 napi_value ZoneRulesAddon::InitI18nZoneRules(napi_env env, napi_value exports)
43 {
44 napi_property_descriptor properties[] = {
45 DECLARE_NAPI_FUNCTION("nextTransition", NextTransition),
46 };
47
48 napi_value constructor = nullptr;
49 napi_status status = napi_define_class(env, "ZoneRules", NAPI_AUTO_LENGTH, ZoneRulesConstructor, nullptr,
50 sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
51 if (status != napi_ok) {
52 HILOG_ERROR_I18N("InitI18nZoneRules: Define class failed when InitI18nZoneRules.");
53 return nullptr;
54 }
55 status = napi_set_named_property(env, exports, "ZoneRules", constructor);
56 if (status != napi_ok) {
57 HILOG_ERROR_I18N("InitI18nZoneRules: Set property ZoneRules failed.");
58 return nullptr;
59 }
60 status = napi_create_reference(env, constructor, 1, &g_zoneRulesConstructor);
61 if (status != napi_ok) {
62 HILOG_ERROR_I18N("InitI18nZoneRules: Failed to create reference at init.");
63 return nullptr;
64 }
65 return exports;
66 }
67
ZoneRulesConstructor(napi_env env,napi_callback_info info)68 napi_value ZoneRulesAddon::ZoneRulesConstructor(napi_env env, napi_callback_info info)
69 {
70 size_t argc = 1;
71 napi_value argv[1] = { nullptr };
72 napi_value thisVar = nullptr;
73 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
74 if (status != napi_ok) {
75 HILOG_ERROR_I18N("ZoneRulesConstructor: Get parameter info failed");
76 return nullptr;
77 }
78 std::string tzId;
79 napi_valuetype valueType = napi_valuetype::napi_undefined;
80 if (argc < 1) {
81 HILOG_ERROR_I18N("ZoneRulesConstructor: Param count less then required");
82 return nullptr;
83 }
84 status = napi_typeof(env, argv[0], &valueType);
85 if (status != napi_ok) {
86 HILOG_ERROR_I18N("ZoneRulesConstructor: Get param type failed.");
87 return nullptr;
88 }
89 if (valueType != napi_valuetype::napi_string) {
90 HILOG_ERROR_I18N("ZoneRulesConstructor: Param type error.");
91 return nullptr;
92 }
93 int32_t code = 0;
94 tzId = VariableConvertor::GetString(env, argv[0], code);
95 if (code != 0) {
96 return nullptr;
97 }
98 ZoneRulesAddon* obj = new (std::nothrow) ZoneRulesAddon();
99 if (obj == nullptr) {
100 HILOG_ERROR_I18N("ZoneRulesConstructor: Create ZoneRulesAddon failed.");
101 return nullptr;
102 }
103 status =
104 napi_wrap(env, thisVar, reinterpret_cast<void *>(obj), ZoneRulesAddon::Destructor, nullptr, nullptr);
105 if (status != napi_ok) {
106 delete obj;
107 HILOG_ERROR_I18N("ZoneRulesConstructor: warp ZoneRulesAddon failed.");
108 return nullptr;
109 }
110 obj->zoneRules_ = std::make_unique<ZoneRules>(tzId);
111 if (!obj->zoneRules_) {
112 delete obj;
113 HILOG_ERROR_I18N("ZoneRulesConstructor: Param type error.");
114 return nullptr;
115 }
116 return thisVar;
117 }
118
NextTransition(napi_env env,napi_callback_info info)119 napi_value ZoneRulesAddon::NextTransition(napi_env env, napi_callback_info info)
120 {
121 size_t argc = 1;
122 napi_value argv[1] = { nullptr };
123 napi_value thisVar = nullptr;
124 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
125 if (status != napi_ok) {
126 HILOG_ERROR_I18N("ZoneRulesAddon::NextTransition: Get parameter info failed");
127 return nullptr;
128 }
129 ZoneRulesAddon *obj = nullptr;
130 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
131 if (status != napi_ok || !obj || !obj->zoneRules_) {
132 HILOG_ERROR_I18N("ZoneRulesAddon::NextTransition, Get ZoneRulesAddon object failed");
133 return nullptr;
134 }
135 std::unique_ptr<ZoneOffsetTransition> zoneOffsetTrans;
136 if (argc < 1) {
137 zoneOffsetTrans = obj->zoneRules_->NextTransition();
138 } else {
139 int32_t errorCode = 0;
140 double paramDate = GetFirstParameter(env, argv[0], errorCode);
141 if (errorCode != 0) {
142 return nullptr;
143 }
144 zoneOffsetTrans = obj->zoneRules_->NextTransition(paramDate);
145 }
146 return ZoneOffsetTransitionAddon::GetZoneOffsetTransObject(env, zoneOffsetTrans.get());
147 }
148
GetFirstParameter(napi_env env,napi_value argValue,int32_t & errorCode)149 double ZoneRulesAddon::GetFirstParameter(napi_env env, napi_value argValue, int32_t &errorCode)
150 {
151 if (!VariableConvertor::CheckNapiIsNull(env, argValue)) {
152 HILOG_ERROR_I18N("ZoneRulesAddon::GetFirstParameter, parameter is null.");
153 errorCode = -1;
154 return 0;
155 }
156 napi_valuetype valueType = napi_valuetype::napi_undefined;
157 napi_status status = napi_typeof(env, argValue, &valueType);
158 if (status != napi_ok) {
159 HILOG_ERROR_I18N("ZoneRulesAddon::GetFirstParameter, get parameter type failed.");
160 errorCode = -1;
161 return 0;
162 }
163 if (valueType != napi_valuetype::napi_number) {
164 HILOG_ERROR_I18N("ZoneRulesAddon::GetFirstParameter, parameter type error.");
165 errorCode = -1;
166 return 0;
167 }
168 double date = 0;
169 status = napi_get_value_double(env, argValue, &date);
170 if (status != napi_ok) {
171 HILOG_ERROR_I18N("ZoneRulesAddon::GetFirstParameter, Get parameter date failed");
172 errorCode = -1;
173 return 0;
174 }
175 return date;
176 }
177
GetZoneRulesObject(napi_env env,std::string tzId)178 napi_value ZoneRulesAddon::GetZoneRulesObject(napi_env env, std::string tzId)
179 {
180 if (g_zoneRulesConstructor == nullptr) {
181 HILOG_ERROR_I18N("ZoneRulesAddon::GetZoneRulesObject: g_zoneRulesConstructor is nullptr");
182 return nullptr;
183 }
184 size_t argc = 1;
185 napi_value argv[1] = { nullptr };
186 napi_value param = nullptr;
187 napi_status status = napi_create_string_latin1(env, tzId.c_str(), NAPI_AUTO_LENGTH, ¶m);
188 if (status != napi_ok) {
189 HILOG_ERROR_I18N("ErrorUtil::NapiThrow: create string failed");
190 return nullptr;
191 }
192 argv[0] = param;
193 napi_value constructor = nullptr;
194 status = napi_get_reference_value(env, g_zoneRulesConstructor, &constructor);
195 if (status != napi_ok || constructor == nullptr) {
196 HILOG_ERROR_I18N("Failed to create reference of normalizer Constructor");
197 return nullptr;
198 }
199 napi_value result = nullptr;
200 status = napi_new_instance(env, constructor, argc, argv, &result);
201 if (status != napi_ok || result == nullptr) {
202 HILOG_ERROR_I18N("create normalizer instance failed");
203 return nullptr;
204 }
205 return result;
206 }
207 } // namespace I18n
208 } // namespace Global
209 } // namespace OHOS