• 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_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