• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param);
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