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_offset_transition.h"
16 #include "error_util.h"
17 #include "i18n_hilog.h"
18 #include "zone_offset_transition_addon.h"
19 #include "js_utils.h"
20 #include "variable_convertor.h"
21
22 namespace OHOS {
23 namespace Global {
24 namespace I18n {
25 static thread_local napi_ref g_zoneOffsetTransConstructor = nullptr;
26
ZoneOffsetTransitionAddon()27 ZoneOffsetTransitionAddon::ZoneOffsetTransitionAddon() {}
28
~ZoneOffsetTransitionAddon()29 ZoneOffsetTransitionAddon::~ZoneOffsetTransitionAddon() {}
30
Destructor(napi_env env,void * nativeObject,void * hint)31 void ZoneOffsetTransitionAddon::Destructor(napi_env env, void *nativeObject, void *hint)
32 {
33 if (!nativeObject) {
34 return;
35 }
36 delete reinterpret_cast<ZoneOffsetTransitionAddon *>(nativeObject);
37 nativeObject = nullptr;
38 }
39
InitZoneOffsetTransition(napi_env env,napi_value exports)40 napi_value ZoneOffsetTransitionAddon::InitZoneOffsetTransition(napi_env env, napi_value exports)
41 {
42 napi_property_descriptor properties[] = {
43 DECLARE_NAPI_FUNCTION("getMilliseconds", GetMilliseconds),
44 DECLARE_NAPI_FUNCTION("getOffsetAfter", GetOffsetAfter),
45 DECLARE_NAPI_FUNCTION("getOffsetBefore", GetOffsetBefore),
46 };
47 napi_value constructor = nullptr;
48 napi_status status = napi_define_class(env, "ZoneOffsetTransition", NAPI_AUTO_LENGTH,
49 I18nZoneOffsetTransitionConstructor, nullptr,
50 sizeof(properties) / sizeof(napi_property_descriptor), properties, &constructor);
51 if (status != napi_ok) {
52 HILOG_ERROR_I18N("InitZoneOffsetTransition: Failed to define class ZoneOffsetTransition at Init");
53 return nullptr;
54 }
55 status = napi_set_named_property(env, exports, "ZoneOffsetTransition", constructor);
56 if (status != napi_ok) {
57 HILOG_ERROR_I18N("InitZoneOffsetTransition: Set property ZoneOffsetTransition failed.");
58 return nullptr;
59 }
60 status = napi_create_reference(env, constructor, 1, &g_zoneOffsetTransConstructor);
61 if (status != napi_ok) {
62 HILOG_ERROR_I18N("InitZoneOffsetTransition: Failed to create reference g_timezoneConstructor at init");
63 return nullptr;
64 }
65 return exports;
66 }
67
I18nZoneOffsetTransitionConstructor(napi_env env,napi_callback_info info)68 napi_value ZoneOffsetTransitionAddon::I18nZoneOffsetTransitionConstructor(napi_env env, napi_callback_info info)
69 {
70 size_t argc = 3;
71 napi_value argv[3] = { 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("ZoneOffsetTransitionAddon: Get parameter info failed");
76 return nullptr;
77 }
78 if (argc < CONSTRUCTOR_ARGS_COUNT) {
79 HILOG_ERROR_I18N("ZoneOffsetTransitionAddon: Constructor args count less then required");
80 return nullptr;
81 }
82 int32_t code = 0;
83 double milliSecond = VariableConvertor::GetDouble(env, argv[0], code);
84 if (code != 0) {
85 return nullptr;
86 }
87 int32_t offsetBefore = VariableConvertor::GetInt(env, argv[1], code);
88 if (code != 0) {
89 return nullptr;
90 }
91 int32_t offsetAfter = VariableConvertor::GetInt(env, argv[2], code);
92 if (code != 0) {
93 return nullptr;
94 }
95 ZoneOffsetTransitionAddon* obj = new (std::nothrow) ZoneOffsetTransitionAddon();
96 if (obj == nullptr) {
97 HILOG_ERROR_I18N("ZoneOffsetTransitionAddon: Create ZoneOffsetTransitionAddon object failed");
98 return nullptr;
99 }
100 status = napi_wrap(env, thisVar, reinterpret_cast<void *>(obj),
101 ZoneOffsetTransitionAddon::Destructor, nullptr, nullptr);
102 if (status != napi_ok) {
103 delete obj;
104 HILOG_ERROR_I18N("ZoneOffsetTransitionAddon: Wrap ZoneOffsetTransition failed");
105 return nullptr;
106 }
107 obj->zoneOffsetTransition_ = std::make_unique<ZoneOffsetTransition>(milliSecond, offsetBefore, offsetAfter);
108 if (!obj->zoneOffsetTransition_) {
109 delete obj;
110 HILOG_ERROR_I18N("ZoneOffsetTransitionAddon: Create ZoneOffsetTransition failed");
111 return nullptr;
112 }
113 return thisVar;
114 }
115
GetZoneOffsetTransObject(napi_env env,ZoneOffsetTransition * zoneOffsetTrans)116 napi_value ZoneOffsetTransitionAddon::GetZoneOffsetTransObject(napi_env env, ZoneOffsetTransition* zoneOffsetTrans)
117 {
118 if (g_zoneOffsetTransConstructor == nullptr) {
119 HILOG_ERROR_I18N("GetZoneOffsetTransObject: g_zoneOffsetTransConstructor is nullptr");
120 return nullptr;
121 }
122 size_t argc = 3;
123 napi_value argv[3] = { nullptr };
124 napi_value milliseconds = nullptr;
125 napi_status status = napi_create_double(env, zoneOffsetTrans->GetMilliseconds(), &milliseconds);
126 if (status != napi_ok || milliseconds == nullptr) {
127 HILOG_ERROR_I18N("ErrorUtil::NapiThrow: create napi double failed");
128 return nullptr;
129 }
130 argv[0] = milliseconds;
131 napi_value offsetBefore = nullptr;
132 status = napi_create_int32(env, zoneOffsetTrans->GetOffsetBefore(), &offsetBefore);
133 if (status != napi_ok || offsetBefore == nullptr) {
134 HILOG_ERROR_I18N("ErrorUtil::NapiThrow: create int32 failed");
135 return nullptr;
136 }
137 argv[1] = offsetBefore;
138 napi_value offsetAfter = nullptr;
139 status = napi_create_int32(env, zoneOffsetTrans->GetOffsetAfter(), &offsetAfter);
140 if (status != napi_ok || offsetAfter == nullptr) {
141 HILOG_ERROR_I18N("ErrorUtil::NapiThrow: create int32 failed");
142 return nullptr;
143 }
144 argv[CONSTRUCTOR_ARGS_COUNT - 1] = offsetAfter;
145 napi_value constructor = nullptr;
146 status = napi_get_reference_value(env, g_zoneOffsetTransConstructor, &constructor);
147 if (status != napi_ok || constructor == nullptr) {
148 HILOG_ERROR_I18N("Failed to create reference of normalizer Constructor");
149 return nullptr;
150 }
151 napi_value result = nullptr;
152 status = napi_new_instance(env, constructor, argc, argv, &result);
153 if (status != napi_ok || result == nullptr) {
154 HILOG_ERROR_I18N("create normalizer instance failed");
155 return nullptr;
156 }
157 return result;
158 }
159
GetMilliseconds(napi_env env,napi_callback_info info)160 napi_value ZoneOffsetTransitionAddon::GetMilliseconds(napi_env env, napi_callback_info info)
161 {
162 size_t argc = 0;
163 napi_value *argv = nullptr;
164 napi_value thisVar = nullptr;
165 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
166 if (status != napi_ok) {
167 HILOG_ERROR_I18N("GetMilliseconds: Get parameter info failed");
168 return nullptr;
169 }
170 ZoneOffsetTransitionAddon *obj = nullptr;
171 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
172 if (status != napi_ok || !obj || !obj->zoneOffsetTransition_) {
173 HILOG_ERROR_I18N("GetMilliseconds: Get ZoneOffsetTransition object failed");
174 return nullptr;
175 }
176 double time = obj->zoneOffsetTransition_->GetMilliseconds();
177 napi_value result = nullptr;
178 status = napi_create_double(env, time, &result);
179 if (status != napi_ok || result == nullptr) {
180 HILOG_ERROR_I18N("GetMilliseconds: create double js variable failed.");
181 return nullptr;
182 }
183 return result;
184 }
185
GetOffsetAfter(napi_env env,napi_callback_info info)186 napi_value ZoneOffsetTransitionAddon::GetOffsetAfter(napi_env env, napi_callback_info info)
187 {
188 size_t argc = 0;
189 napi_value *argv = nullptr;
190 napi_value thisVar = nullptr;
191 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
192 if (status != napi_ok) {
193 HILOG_ERROR_I18N("GetOffsetAfter: Get parameter info failed");
194 return nullptr;
195 }
196 ZoneOffsetTransitionAddon *obj = nullptr;
197 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
198 if (status != napi_ok || !obj || !obj->zoneOffsetTransition_) {
199 HILOG_ERROR_I18N("GetOffsetAfter: Get ZoneOffsetTransition object failed");
200 return nullptr;
201 }
202 int32_t offsetAfter = obj->zoneOffsetTransition_->GetOffsetAfter();
203 return VariableConvertor::CreateNumber(env, offsetAfter);
204 }
205
GetOffsetBefore(napi_env env,napi_callback_info info)206 napi_value ZoneOffsetTransitionAddon::GetOffsetBefore(napi_env env, napi_callback_info info)
207 {
208 size_t argc = 0;
209 napi_value *argv = nullptr;
210 napi_value thisVar = nullptr;
211 napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
212 if (status != napi_ok) {
213 HILOG_ERROR_I18N("GetOffsetBefore: Get parameter info failed");
214 return nullptr;
215 }
216 ZoneOffsetTransitionAddon *obj = nullptr;
217 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
218 if (status != napi_ok || !obj || !obj->zoneOffsetTransition_) {
219 HILOG_ERROR_I18N("GetOffsetBefore: Get ZoneOffsetTransition object failed");
220 return nullptr;
221 }
222 int32_t offsetBefore = obj->zoneOffsetTransition_->GetOffsetBefore();
223 return VariableConvertor::CreateNumber(env, offsetBefore);
224 }
225 } // namespace I18n
226 } // namespace Global
227 } // namespace OHOS