1 /*
2 * Copyright (C) 2024 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
16 #include "napi_esim.h"
17
18 #include <memory>
19 #include <string>
20 #include <string_view>
21 #include "cancel_session_callback.h"
22 #include "delete_profile_callback.h"
23 #include "download_profile_callback.h"
24 #include "esim_state_type.h"
25 #include "esim_service_client.h"
26 #include "get_default_smdp_address_callback.h"
27 #include "get_downloadable_profile_metadata_callback.h"
28 #include "get_downloadable_profiles_callback.h"
29 #include "get_eid_callback.h"
30 #include "get_euicc_info_callback.h"
31 #include "get_euicc_profile_info_list_callback.h"
32 #include "napi_parameter_util.h"
33 #include "napi_util.h"
34 #include "network_state.h"
35 #include "reset_memory_callback.h"
36 #include "set_default_smdp_address_callback.h"
37 #include "set_profile_nick_name_callback.h"
38 #include "start_osu_callback.h"
39 #include "switch_to_profile.h"
40 #include "telephony_log_wrapper.h"
41 #include "telephony_permission.h"
42 #include "get_supported_pkids_callback.h"
43 #include "get_contract_info_callback.h"
44
45 namespace OHOS {
46 namespace Telephony {
47 namespace {
48 const int32_t UNDEFINED_VALUE = -1;
49 const int32_t PARAMETER_COUNT_ONE = 1;
50 const int32_t PARAMETER_COUNT_TWO = 2;
51 struct AsyncPara {
52 std::string funcName = "";
53 napi_env env = nullptr;
54 napi_callback_info info = nullptr;
55 napi_async_execute_callback execute = nullptr;
56 napi_async_complete_callback complete = nullptr;
57 };
58 struct PermissionPara {
59 std::string func = "";
60 std::string permission = "";
61 };
62 size_t resetParameterCount = 0;
63
IsValidSlotId(int32_t slotId)64 static inline bool IsValidSlotId(int32_t slotId)
65 {
66 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
67 }
68
69 template<typename T, napi_async_execute_callback exec, napi_async_complete_callback complete>
NapiCreateAsyncWork(napi_env env,napi_callback_info info,std::string_view funcName)70 napi_value NapiCreateAsyncWork(napi_env env, napi_callback_info info, std::string_view funcName)
71 {
72 size_t argc = PARAMETER_COUNT_TWO;
73 napi_value argv[]{nullptr, nullptr};
74 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
75
76 std::unique_ptr<AsyncContext<T>> asyncContext = std::make_unique<AsyncContext<T>>();
77 BaseContext &context = asyncContext->context;
78 auto inParaTp = std::make_tuple(&asyncContext->slotId, &context.callbackRef);
79 std::optional<NapiError> errCode = MatchParameters(env, argv, argc, inParaTp);
80 if (errCode.has_value()) {
81 JsError error = NapiUtil::ConverEsimErrorMessageForJs(errCode.value());
82 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
83 return nullptr;
84 }
85
86 napi_value result = nullptr;
87 if (context.callbackRef == nullptr) {
88 NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
89 } else {
90 NAPI_CALL(env, napi_get_undefined(env, &result));
91 }
92
93 napi_value resourceName = nullptr;
94 NAPI_CALL(env, napi_create_string_utf8(env, funcName.data(), funcName.length(), &resourceName));
95 AsyncContext<T> *pContext = asyncContext.release();
96 NAPI_CALL(env, napi_create_async_work(
97 env, nullptr, resourceName, exec, complete, static_cast<void *>(pContext), &context.work));
98 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) != napi_ok) {
99 delete pContext;
100 result = nullptr;
101 }
102 return result;
103 }
104
105 template<typename AsyncContextType, typename... Ts>
NapiCreateAsyncWork2(const AsyncPara & para,AsyncContextType * asyncContext,std::tuple<Ts...> & theTuple)106 napi_value NapiCreateAsyncWork2(const AsyncPara ¶, AsyncContextType *asyncContext, std::tuple<Ts...> &theTuple)
107 {
108 if (asyncContext == nullptr) {
109 return nullptr;
110 }
111
112 napi_env env = para.env;
113 BaseContext &context = asyncContext->asyncContext.context;
114
115 size_t argc = sizeof...(Ts);
116 napi_value argv[sizeof...(Ts)]{nullptr};
117 NAPI_CALL(env, napi_get_cb_info(env, para.info, &argc, argv, nullptr, nullptr));
118
119 std::optional<NapiError> errCode = MatchParameters(env, argv, argc, theTuple);
120 if (errCode.has_value()) {
121 JsError error = NapiUtil::ConverEsimErrorMessageForJs(errCode.value());
122 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
123 return nullptr;
124 }
125
126 napi_value result = nullptr;
127 if (context.callbackRef == nullptr) {
128 NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
129 } else {
130 NAPI_CALL(env, napi_get_undefined(env, &result));
131 }
132
133 napi_value resourceName = nullptr;
134 NAPI_CALL(env, napi_create_string_utf8(env, para.funcName.c_str(), para.funcName.length(), &resourceName));
135 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, para.execute, para.complete,
136 static_cast<void *>(asyncContext), &context.work));
137 return result;
138 }
139
140 template<typename T>
NapiAsyncBaseCompleteCallback(napi_env env,const AsyncContext<T> & asyncContext,JsError error,bool funcIgnoreReturnVal=false)141 void NapiAsyncBaseCompleteCallback(
142 napi_env env, const AsyncContext<T> &asyncContext, JsError error, bool funcIgnoreReturnVal = false)
143 {
144 const BaseContext &context = asyncContext.context;
145 if (context.deferred != nullptr && !context.resolved) {
146 napi_value errorMessage = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
147 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, context.deferred, errorMessage));
148 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
149 return;
150 }
151
152 if (context.deferred != nullptr && context.resolved) {
153 napi_value resValue =
154 (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
155 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, context.deferred, resValue));
156 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
157 return;
158 }
159
160 napi_value res =
161 (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
162 napi_value callbackValue[] { NapiUtil::CreateUndefined(env), res };
163 if (!context.resolved) {
164 callbackValue[0] = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
165 callbackValue[1] = NapiUtil::CreateUndefined(env);
166 }
167 napi_value undefined = nullptr;
168 napi_value callback = nullptr;
169 napi_value result = nullptr;
170 NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
171 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, context.callbackRef, &callback));
172 NAPI_CALL_RETURN_VOID(
173 env, napi_call_function(env, undefined, callback, std::size(callbackValue), callbackValue, &result));
174 NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, context.callbackRef));
175 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
176 }
177
178 template<typename T>
NapiAsyncPermissionCompleteCallback(napi_env env,napi_status status,const AsyncContext<T> & asyncContext,bool funcIgnoreReturnVal,PermissionPara permissionPara)179 void NapiAsyncPermissionCompleteCallback(napi_env env, napi_status status, const AsyncContext<T> &asyncContext,
180 bool funcIgnoreReturnVal, PermissionPara permissionPara)
181 {
182 if (status != napi_ok) {
183 napi_throw_type_error(env, nullptr, "excute failed");
184 return;
185 }
186
187 JsError error = NapiUtil::ConverEsimErrorMessageWithPermissionForJs(
188 asyncContext.context.errorCode, permissionPara.func, permissionPara.permission);
189 NapiAsyncBaseCompleteCallback(env, asyncContext, error, funcIgnoreReturnVal);
190 }
191
EuiccInfoConversion(napi_env env,const EuiccInfo & resultInfo)192 napi_value EuiccInfoConversion(napi_env env, const EuiccInfo &resultInfo)
193 {
194 napi_value val = nullptr;
195 napi_create_object(env, &val);
196 SetPropertyToNapiObject(env, val, "osVersion", NapiUtil::ToUtf8(resultInfo.osVersion_));
197
198 return val;
199 }
200
DownloadProfileResultConversion(napi_env env,const DownloadProfileResult & resultInfo)201 napi_value DownloadProfileResultConversion(napi_env env, const DownloadProfileResult &resultInfo)
202 {
203 napi_value val = nullptr;
204 napi_create_object(env, &val);
205 SetPropertyToNapiObject(env, val, "responseResult", static_cast<int32_t>(resultInfo.result_));
206 SetPropertyToNapiObject(env, val, "solvableErrors", static_cast<int32_t>(resultInfo.resolvableErrors_));
207 SetPropertyToNapiObject(env, val, "cardId", resultInfo.cardId_);
208
209 return val;
210 }
211
AccessRuleInfoConversion(napi_env env,const AccessRule & accessInfo)212 napi_value AccessRuleInfoConversion(napi_env env, const AccessRule &accessInfo)
213 {
214 napi_value val = nullptr;
215 napi_create_object(env, &val);
216 SetPropertyToNapiObject(env, val, "certificateHashHexStr", NapiUtil::ToUtf8(accessInfo.certificateHashHexStr_));
217 SetPropertyToNapiObject(env, val, "packageName", NapiUtil::ToUtf8(accessInfo.packageName_));
218 SetPropertyToNapiObject(env, val, "accessType", accessInfo.accessType_);
219
220 return val;
221 }
222
ProfileInfoConversion(napi_env env,const DownloadableProfile & profileInfo)223 napi_value ProfileInfoConversion(napi_env env, const DownloadableProfile &profileInfo)
224 {
225 napi_value val = nullptr;
226 napi_create_object(env, &val);
227 SetPropertyToNapiObject(env, val, "activationCode", NapiUtil::ToUtf8(profileInfo.encodedActivationCode_));
228 SetPropertyToNapiObject(env, val, "confirmationCode", NapiUtil::ToUtf8(profileInfo.confirmationCode_));
229 SetPropertyToNapiObject(env, val, "carrierName", NapiUtil::ToUtf8(profileInfo.carrierName_));
230 napi_value resultArray = nullptr;
231 napi_create_array(env, &resultArray);
232 for (size_t i = 0; i < profileInfo.accessRules_.size(); i++) {
233 napi_value res = AccessRuleInfoConversion(env, profileInfo.accessRules_.at(i));
234 napi_set_element(env, resultArray, i, res);
235 }
236 napi_set_named_property(env, val, "accessRules", resultArray);
237
238 return val;
239 }
240
ProfileResultListConversion(napi_env env,const GetDownloadableProfilesResult & resultListInfo)241 napi_value ProfileResultListConversion(napi_env env, const GetDownloadableProfilesResult &resultListInfo)
242 {
243 napi_value val = nullptr;
244 napi_create_object(env, &val);
245 SetPropertyToNapiObject(env, val, "responseResult", static_cast<int32_t>(resultListInfo.result_));
246 napi_value resultArray = nullptr;
247 napi_create_array(env, &resultArray);
248 for (size_t i = 0; i < resultListInfo.downloadableProfiles_.size(); i++) {
249 napi_value res = ProfileInfoConversion(env, resultListInfo.downloadableProfiles_.at(i));
250 napi_set_element(env, resultArray, i, res);
251 }
252 napi_set_named_property(env, val, "downloadableProfiles", resultArray);
253
254 return val;
255 }
256
MetadataResultConversion(napi_env env,const GetDownloadableProfileMetadataResult & metadataInfo)257 napi_value MetadataResultConversion(napi_env env, const GetDownloadableProfileMetadataResult &metadataInfo)
258 {
259 napi_value val = nullptr;
260 napi_create_object(env, &val);
261 napi_value res = ProfileInfoConversion(env, metadataInfo.downloadableProfiles_);
262 napi_set_named_property(env, val, "downloadableProfile", res);
263 SetPropertyToNapiObject(env, val, "pprType", metadataInfo.pprType_);
264 SetPropertyToNapiObject(env, val, "pprFlag", metadataInfo.pprFlag_);
265 SetPropertyToNapiObject(env, val, "iccid", NapiUtil::ToUtf8(metadataInfo.iccId_));
266 SetPropertyToNapiObject(env, val, "serviceProviderName", NapiUtil::ToUtf8(metadataInfo.serviceProviderName_));
267 SetPropertyToNapiObject(env, val, "profileName", NapiUtil::ToUtf8(metadataInfo.profileName_));
268 SetPropertyToNapiObject(env, val, "profileClass", static_cast<int32_t>(metadataInfo.profileClass_));
269 SetPropertyToNapiObject(env, val, "solvableErrors", static_cast<int32_t>(metadataInfo.resolvableErrors_));
270 SetPropertyToNapiObject(env, val, "responseResult", static_cast<int32_t>(metadataInfo.result_));
271
272 return val;
273 }
274
OperatorIdConversion(napi_env env,const OperatorId & operatorId)275 napi_value OperatorIdConversion(napi_env env, const OperatorId &operatorId)
276 {
277 napi_value val = nullptr;
278 napi_create_object(env, &val);
279 SetPropertyToNapiObject(env, val, "mcc", NapiUtil::ToUtf8(operatorId.mcc_));
280 SetPropertyToNapiObject(env, val, "mnc", NapiUtil::ToUtf8(operatorId.mnc_));
281 SetPropertyToNapiObject(env, val, "gid1", NapiUtil::ToUtf8(operatorId.gid1_));
282 SetPropertyToNapiObject(env, val, "gid2", NapiUtil::ToUtf8(operatorId.gid2_));
283
284 return val;
285 }
286
EuiccProfileInfoConversion(napi_env env,const EuiccProfile & euiccProfileInfo)287 napi_value EuiccProfileInfoConversion(napi_env env, const EuiccProfile &euiccProfileInfo)
288 {
289 napi_value val = nullptr;
290 napi_create_object(env, &val);
291 SetPropertyToNapiObject(env, val, "iccid", NapiUtil::ToUtf8(euiccProfileInfo.iccId_));
292 SetPropertyToNapiObject(env, val, "nickName", NapiUtil::ToUtf8(euiccProfileInfo.nickName_));
293 SetPropertyToNapiObject(env, val, "serviceProviderName", NapiUtil::ToUtf8(euiccProfileInfo.serviceProviderName_));
294 SetPropertyToNapiObject(env, val, "profileName", NapiUtil::ToUtf8(euiccProfileInfo.profileName_));
295 SetPropertyToNapiObject(env, val, "state", static_cast<int32_t>(euiccProfileInfo.state_));
296 SetPropertyToNapiObject(env, val, "profileClass", static_cast<int32_t>(euiccProfileInfo.profileClass_));
297 napi_value res = OperatorIdConversion(env, euiccProfileInfo.carrierId_);
298 napi_set_named_property(env, val, "operatorId", res);
299 SetPropertyToNapiObject(env, val, "policyRules", static_cast<int32_t>(euiccProfileInfo.policyRules_));
300 napi_value resultArray = nullptr;
301 napi_create_array(env, &resultArray);
302 for (size_t i = 0; i < euiccProfileInfo.accessRules_.size(); i++) {
303 napi_value res = AccessRuleInfoConversion(env, euiccProfileInfo.accessRules_.at(i));
304 napi_set_element(env, resultArray, i, res);
305 }
306 napi_set_named_property(env, val, "accessRules", resultArray);
307
308 return val;
309 }
310
EuiccProfileListConversion(napi_env env,const GetEuiccProfileInfoListResult & euiccListInfo)311 napi_value EuiccProfileListConversion(napi_env env, const GetEuiccProfileInfoListResult &euiccListInfo)
312 {
313 napi_value val = nullptr;
314 napi_create_object(env, &val);
315 SetPropertyToNapiObject(env, val, "responseResult", static_cast<int32_t>(euiccListInfo.result_));
316 SetPropertyToNapiObject(env, val, "isRemovable", euiccListInfo.isRemovable_);
317 napi_value resultArray = nullptr;
318 napi_create_array(env, &resultArray);
319 for (size_t i = 0; i < euiccListInfo.profiles_.size(); i++) {
320 napi_value res = EuiccProfileInfoConversion(env, euiccListInfo.profiles_.at(i));
321 napi_set_element(env, resultArray, i, res);
322 }
323 napi_set_named_property(env, val, "profiles", resultArray);
324
325 return val;
326 }
327
GetAccessRuleInfo(AsyncAccessRule & accessType)328 AccessRule GetAccessRuleInfo(AsyncAccessRule &accessType)
329 {
330 AccessRule access;
331 access.certificateHashHexStr_ = NapiUtil::ToUtf16(accessType.certificateHashHexStr.data());
332 access.packageName_ = NapiUtil::ToUtf16(accessType.packageName.data());
333 access.accessType_ = accessType.accessType;
334
335 return access;
336 }
337
GetProfileInfo(AsyncDownloadableProfile & profileInfo)338 DownloadableProfile GetProfileInfo(AsyncDownloadableProfile &profileInfo)
339 {
340 if (profileInfo.activationCode.length() == 0) {
341 TELEPHONY_LOGE("GetProfileInfo activationCode is null.");
342 }
343 if (profileInfo.confirmationCode.length() == 0) {
344 TELEPHONY_LOGE("GetProfileInfo confirmationCode is null.");
345 }
346 if (profileInfo.carrierName.length() == 0) {
347 TELEPHONY_LOGE("GetProfileInfo carrierName is null.");
348 }
349 if (profileInfo.accessRules.size() == 0) {
350 TELEPHONY_LOGE("GetProfileInfo accessRules is null.");
351 }
352 DownloadableProfile profile;
353 profile.encodedActivationCode_ = NapiUtil::ToUtf16(profileInfo.activationCode.data());
354 profile.confirmationCode_ = NapiUtil::ToUtf16(profileInfo.confirmationCode.data());
355 profile.carrierName_ = NapiUtil::ToUtf16(profileInfo.carrierName.data());
356
357 for (size_t i = 0; i < profileInfo.accessRules.size(); i++) {
358 AccessRule access = GetAccessRuleInfo(profileInfo.accessRules.at(i));
359 profile.accessRules_.push_back(std::move(access));
360 }
361
362 return profile;
363 }
364
AccessRuleInfoAnalyze(napi_env env,napi_value arg,AsyncAccessRule & accessType)365 void AccessRuleInfoAnalyze(napi_env env, napi_value arg, AsyncAccessRule &accessType)
366 {
367 napi_value hashState = NapiUtil::GetNamedProperty(env, arg, "certificateHashHexStr");
368 if (hashState) {
369 std::array<char, ARRAY_SIZE> hashHexStr = {0};
370 NapiValueToCppValue(env, hashState, napi_string, std::data(hashHexStr));
371 accessType.certificateHashHexStr = std::string(hashHexStr.data());
372 }
373
374 napi_value nameState = NapiUtil::GetNamedProperty(env, arg, "packageName");
375 if (nameState) {
376 std::array<char, ARRAY_SIZE> nameStr = {0};
377 NapiValueToCppValue(env, nameState, napi_string, std::data(nameStr));
378 accessType.packageName = std::string(nameStr.data());
379 }
380
381 napi_value type = NapiUtil::GetNamedProperty(env, arg, "accessType");
382 if (type) {
383 NapiValueToCppValue(env, type, napi_number, &accessType.accessType);
384 }
385 }
386
ProfileInfoAnalyze(napi_env env,napi_value arg,AsyncDownloadableProfile & profileInfo)387 void ProfileInfoAnalyze(napi_env env, napi_value arg, AsyncDownloadableProfile &profileInfo)
388 {
389 napi_value activateState = NapiUtil::GetNamedProperty(env, arg, "activationCode");
390 if (activateState) {
391 std::array<char, ARRAY_SIZE> activationStr = {0};
392 NapiValueToCppValue(env, activateState, napi_string, std::data(activationStr));
393 profileInfo.activationCode = std::string(activationStr.data());
394 }
395
396 napi_value confirmState = NapiUtil::GetNamedProperty(env, arg, "confirmationCode");
397 if (confirmState) {
398 std::array<char, ARRAY_SIZE> confirmationStr = {0};
399 NapiValueToCppValue(env, confirmState, napi_string, std::data(confirmationStr));
400 profileInfo.confirmationCode = std::string(confirmationStr.data());
401 }
402
403 napi_value nameState = NapiUtil::GetNamedProperty(env, arg, "carrierName");
404 if (nameState) {
405 std::array<char, ARRAY_SIZE> carrierStr = {0};
406 NapiValueToCppValue(env, nameState, napi_string, std::data(carrierStr));
407 profileInfo.carrierName = std::string(carrierStr.data());
408 }
409
410 napi_value ruleState = NapiUtil::GetNamedProperty(env, arg, "accessRules");
411 if (ruleState) {
412 uint32_t array_length;
413 napi_get_array_length(env, ruleState, &array_length);
414 for (uint32_t i = 0; i < array_length; i++) {
415 napi_value name;
416 if (napi_get_element(env, ruleState, i, &name) != napi_ok) {
417 TELEPHONY_LOGE("accessRules get element fail");
418 }
419 AsyncAccessRule accessRuleInfo;
420 AccessRuleInfoAnalyze(env, name, accessRuleInfo);
421 profileInfo.accessRules.push_back(std::move(accessRuleInfo));
422 }
423 }
424 }
425
ConfigurationInfoAnalyze(napi_env env,napi_value arg,AsyncDownloadConfiguration & configuration)426 void ConfigurationInfoAnalyze(napi_env env, napi_value arg, AsyncDownloadConfiguration &configuration)
427 {
428 napi_value switchState = NapiUtil::GetNamedProperty(env, arg, "switchAfterDownload");
429 if (switchState) {
430 NapiValueToCppValue(env, switchState, napi_boolean, &configuration.switchAfterDownload);
431 }
432
433 napi_value forceState = NapiUtil::GetNamedProperty(env, arg, "forceDisableProfile");
434 if (forceState) {
435 NapiValueToCppValue(env, forceState, napi_boolean, &configuration.forceDisableProfile);
436 }
437
438 napi_value alowState = NapiUtil::GetNamedProperty(env, arg, "isPprAllowed");
439 if (alowState) {
440 NapiValueToCppValue(env, alowState, napi_boolean, &configuration.isPprAllowed);
441 }
442 }
443
ContractRequestDataAnalyze(napi_env env,napi_value arg,AsyncContractRequestData & contractRequestData)444 void ContractRequestDataAnalyze(napi_env env, napi_value arg, AsyncContractRequestData &contractRequestData)
445 {
446 napi_value publicKey = NapiUtil::GetNamedProperty(env, arg, "publicKey");
447 if (publicKey != nullptr) {
448 std::array<char, ARRAY_SIZE> publicKeyStr = {0};
449 NapiValueToCppValue(env, publicKey, napi_string, std::data(publicKeyStr));
450 contractRequestData.publicKey = std::string(publicKeyStr.data());
451 }
452
453 napi_value nonce = NapiUtil::GetNamedProperty(env, arg, "nonce");
454 if (nonce) {
455 std::array<char, ARRAY_SIZE> nonceStr = {0};
456 NapiValueToCppValue(env, nonce, napi_string, std::data(nonceStr));
457 contractRequestData.nonce = std::string(nonceStr.data());
458 }
459
460 napi_value pkid = NapiUtil::GetNamedProperty(env, arg, "pkid");
461 if (pkid) {
462 std::array<char, ARRAY_SIZE> pkidStr = {0};
463 NapiValueToCppValue(env, pkid, napi_string, std::data(pkidStr));
464 contractRequestData.pkid = std::string(pkidStr.data());
465 }
466 }
467
GetDefaultResetOption(void)468 ResetOption GetDefaultResetOption(void)
469 {
470 return ResetOption::DELETE_OPERATIONAL_PROFILES;
471 }
472
NativeGetEid(napi_env env,void * data)473 void NativeGetEid(napi_env env, void *data)
474 {
475 if (data == nullptr) {
476 return;
477 }
478 auto euiccEidContext = static_cast<AsyncContext<std::string> *>(data);
479 if (!IsValidSlotId(euiccEidContext->slotId)) {
480 TELEPHONY_LOGE("NativeGetEid slotId is invalid");
481 euiccEidContext->context.errorCode = ERROR_SLOT_ID_INVALID;
482 return;
483 }
484 std::unique_ptr<GetEidResultCallback> callback = std::make_unique<GetEidResultCallback>(euiccEidContext);
485 std::unique_lock<std::mutex> callbackLock(euiccEidContext->callbackMutex);
486 int32_t errorCode =
487 DelayedRefSingleton<EsimServiceClient>::GetInstance().GetEid(euiccEidContext->slotId, callback.release());
488 TELEPHONY_LOGI("NAPI NativeGetEid %{public}d", errorCode);
489 euiccEidContext->context.errorCode = errorCode;
490 if (errorCode == TELEPHONY_SUCCESS) {
491 euiccEidContext->cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
492 [euiccEidContext] { return euiccEidContext->isCallbackEnd; });
493 }
494 }
495
GetEidCallback(napi_env env,napi_status status,void * data)496 void GetEidCallback(napi_env env, napi_status status, void *data)
497 {
498 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
499 std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
500 if (context == nullptr) {
501 TELEPHONY_LOGE("GetEidCallback context is nullptr");
502 return;
503 }
504 if ((!context->isCallbackEnd) && (context->context.errorCode == TELEPHONY_SUCCESS)) {
505 TELEPHONY_LOGE("GetEidCallback get result timeout.");
506 context->context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
507 }
508 NapiAsyncPermissionCompleteCallback(
509 env, status, *context, false, { "GetEid", Permission::GET_TELEPHONY_ESIM_STATE });
510 }
511
GetEid(napi_env env,napi_callback_info info)512 napi_value GetEid(napi_env env, napi_callback_info info)
513 {
514 return NapiCreateAsyncWork<std::string, NativeGetEid, GetEidCallback>(env, info, "GetEid");
515 }
516
IsSupported(napi_env env,napi_callback_info info)517 napi_value IsSupported(napi_env env, napi_callback_info info)
518 {
519 size_t parameterCount = PARAMETER_COUNT_ONE;
520 napi_value parameters[] = { nullptr };
521 napi_get_cb_info(env, info, ¶meterCount, parameters, nullptr, nullptr);
522 bool isSupported = false;
523 napi_value value = nullptr;
524 if (parameterCount != PARAMETER_COUNT_ONE ||
525 !NapiUtil::MatchParameters(env, parameters, { napi_number })) {
526 TELEPHONY_LOGE("isSupported parameter count is incorrect");
527 NapiUtil::ThrowParameterError(env);
528 return nullptr;
529 }
530 int32_t slotId = UNDEFINED_VALUE;
531 if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
532 TELEPHONY_LOGE("isSupported convert parameter fail");
533 NAPI_CALL(env, napi_create_int32(env, isSupported, &value));
534 return value;
535 }
536
537 if (!IsValidSlotId(slotId)) {
538 NapiUtil::ThrowParameterError(env);
539 return nullptr;
540 }
541 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().IsSupported(slotId);
542 if (errorCode != TELEPHONY_SUCCESS) {
543 isSupported = false;
544 } else {
545 isSupported = true;
546 }
547 NAPI_CALL(env, napi_get_boolean(env, isSupported, &value));
548 return value;
549 }
550
NativeAddProfile(napi_env env,void * data)551 void NativeAddProfile(napi_env env, void *data)
552 {
553 if (data == nullptr) {
554 return;
555 }
556 AsyncAddProfileInfo *addProfileContext = static_cast<AsyncAddProfileInfo *>(data);
557 int32_t slotId = GetDefaultEsimSlotId<int32_t>();
558 DownloadableProfile profile = GetProfileInfo(addProfileContext->profile);
559 int32_t errcode = DelayedRefSingleton<EsimServiceClient>::GetInstance().AddProfile(slotId, profile);
560 TELEPHONY_LOGI("NAPI NativeAddProfile %{public}d", errcode);
561 addProfileContext->asyncContext.context.errorCode = errcode;
562 if (errcode == ERROR_NONE) {
563 addProfileContext->asyncContext.context.resolved = true;
564 addProfileContext->asyncContext.callbackVal = true;
565 } else {
566 addProfileContext->asyncContext.context.resolved = false;
567 addProfileContext->asyncContext.callbackVal = false;
568 }
569 }
570
AddProfileCallback(napi_env env,napi_status status,void * data)571 void AddProfileCallback(napi_env env, napi_status status, void *data)
572 {
573 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
574 std::unique_ptr<AsyncAddProfileInfo> context(static_cast<AsyncAddProfileInfo *>(data));
575 if (context == nullptr) {
576 TELEPHONY_LOGE("AddProfileCallback context is nullptr");
577 return;
578 }
579 NapiAsyncPermissionCompleteCallback(
580 env, status, context->asyncContext, false, { "AddProfile", Permission::SET_TELEPHONY_ESIM_STATE_OPEN });
581 }
582
AddProfile(napi_env env,napi_callback_info info)583 napi_value AddProfile(napi_env env, napi_callback_info info)
584 {
585 auto addProfile = std::make_unique<AsyncAddProfileInfo>();
586 if (addProfile == nullptr) {
587 return nullptr;
588 }
589 BaseContext &context = addProfile->asyncContext.context;
590 napi_value object = NapiUtil::CreateUndefined(env);
591 auto initPara = std::make_tuple(&object, &context.callbackRef);
592 AsyncPara para{
593 .funcName = "AddProfile",
594 .env = env,
595 .info = info,
596 .execute = NativeAddProfile,
597 .complete = AddProfileCallback,
598 };
599 napi_value result = NapiCreateAsyncWork2<AsyncAddProfileInfo>(para, addProfile.get(), initPara);
600 if (result == nullptr) {
601 TELEPHONY_LOGE("creat asyncwork failed!");
602 return nullptr;
603 }
604 ProfileInfoAnalyze(env, object, addProfile->profile);
605 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
606 addProfile.release();
607 }
608 return result;
609 }
610
NativeGetEuiccInfo(napi_env env,void * data)611 void NativeGetEuiccInfo(napi_env env, void *data)
612 {
613 if (data == nullptr) {
614 return;
615 }
616 auto euiccContext = static_cast<AsyncEuiccInfo *>(data);
617 if (!IsValidSlotId(euiccContext->asyncContext.slotId)) {
618 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
619 euiccContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
620 return;
621 }
622 std::unique_ptr<GetEuiccInformationCallback> callback = std::make_unique<GetEuiccInformationCallback>(euiccContext);
623 std::unique_lock<std::mutex> callbackLock(euiccContext->asyncContext.callbackMutex);
624 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetEuiccInfo(
625 euiccContext->asyncContext.slotId, callback.release());
626
627 TELEPHONY_LOGI("NAPI NativeGetEuiccInfo %{public}d", errorCode);
628 euiccContext->asyncContext.context.errorCode = errorCode;
629 if (errorCode == TELEPHONY_SUCCESS) {
630 euiccContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
631 [euiccContext] { return euiccContext->asyncContext.isCallbackEnd; });
632 }
633 }
634
GetEuiccInfoCallback(napi_env env,napi_status status,void * data)635 void GetEuiccInfoCallback(napi_env env, napi_status status, void *data)
636 {
637 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
638 std::unique_ptr<AsyncEuiccInfo> context(static_cast<AsyncEuiccInfo *>(data));
639 if (context == nullptr) {
640 TELEPHONY_LOGE("GetEuiccInfoCallback context is nullptr");
641 return;
642 }
643 AsyncContext<napi_value> &asyncContext = context->asyncContext;
644 if (asyncContext.context.resolved) {
645 asyncContext.callbackVal = EuiccInfoConversion(env, context->result);
646 }
647 if ((!asyncContext.isCallbackEnd) && (asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
648 TELEPHONY_LOGE("GetEuiccInfoCallback get result timeout.");
649 asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
650 }
651 NapiAsyncPermissionCompleteCallback(
652 env, status, context->asyncContext, false, { "GetEuiccInfo", Permission::GET_TELEPHONY_ESIM_STATE });
653 }
654
GetEuiccInfo(napi_env env,napi_callback_info info)655 napi_value GetEuiccInfo(napi_env env, napi_callback_info info)
656 {
657 auto euiccInfo = std::make_unique<AsyncEuiccInfo>();
658 if (euiccInfo == nullptr) {
659 return nullptr;
660 }
661 BaseContext &context = euiccInfo->asyncContext.context;
662
663 auto initPara = std::make_tuple(&euiccInfo->asyncContext.slotId, &context.callbackRef);
664 AsyncPara para {
665 .funcName = "GetEuiccInfo",
666 .env = env,
667 .info = info,
668 .execute = NativeGetEuiccInfo,
669 .complete = GetEuiccInfoCallback,
670 };
671 napi_value result = NapiCreateAsyncWork2<AsyncEuiccInfo>(para, euiccInfo.get(), initPara);
672 if (result == nullptr) {
673 TELEPHONY_LOGE("creat asyncwork failed!");
674 return nullptr;
675 }
676 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
677 euiccInfo.release();
678 }
679 return result;
680 }
681
NativeGetDefaultSmdpAddress(napi_env env,void * data)682 void NativeGetDefaultSmdpAddress(napi_env env, void *data)
683 {
684 if (data == nullptr) {
685 return;
686 }
687 auto contextInfo = static_cast<AsyncContext<std::string> *>(data);
688 if (!IsValidSlotId(contextInfo->slotId)) {
689 TELEPHONY_LOGE("NativeGetDefaultSmdpAddress slotId is invalid");
690 contextInfo->context.errorCode = ERROR_SLOT_ID_INVALID;
691 return;
692 }
693 std::unique_ptr<GetDefaultSmdpAddressResultCallback> callback =
694 std::make_unique<GetDefaultSmdpAddressResultCallback>(contextInfo);
695 std::unique_lock<std::mutex> callbackLock(contextInfo->callbackMutex);
696 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetDefaultSmdpAddress(
697 contextInfo->slotId, callback.release());
698
699 TELEPHONY_LOGI("NAPI NativeGetDefaultSmdpAddress %{public}d", errorCode);
700 contextInfo->context.errorCode = errorCode;
701 if (errorCode == TELEPHONY_SUCCESS) {
702 contextInfo->cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
703 [contextInfo] { return contextInfo->isCallbackEnd; });
704 }
705 }
706
GetDefaultSmdpAddressCallback(napi_env env,napi_status status,void * data)707 void GetDefaultSmdpAddressCallback(napi_env env, napi_status status, void *data)
708 {
709 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
710 std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
711 if (context == nullptr) {
712 TELEPHONY_LOGE("GetDefaultSmdpAddressCallback context is nullptr");
713 return;
714 }
715 if ((!context->isCallbackEnd) && (context->context.errorCode == TELEPHONY_SUCCESS)) {
716 TELEPHONY_LOGE("GetDefaultSmdpAddressCallback get result timeout.");
717 context->context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
718 }
719 NapiAsyncPermissionCompleteCallback(
720 env, status, *context, false, { "GetDefaultSmdpAddress", Permission::GET_TELEPHONY_ESIM_STATE });
721 }
722
GetDefaultSmdpAddress(napi_env env,napi_callback_info info)723 napi_value GetDefaultSmdpAddress(napi_env env, napi_callback_info info)
724 {
725 return NapiCreateAsyncWork<std::string, NativeGetDefaultSmdpAddress, GetDefaultSmdpAddressCallback>(env,
726 info, "GetDefaultSmdpAddress");
727 }
728
NativeSetDefaultSmdpAddress(napi_env env,void * data)729 void NativeSetDefaultSmdpAddress(napi_env env, void *data)
730 {
731 if (data == nullptr) {
732 return;
733 }
734 auto context = static_cast<AsyncContextInfo *>(data);
735 if (!IsValidSlotId(context->asyncContext.slotId)) {
736 TELEPHONY_LOGE("NativeSetDefaultSmdpAddress slotId is invalid");
737 context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
738 return;
739 }
740 std::unique_ptr<SetDefaultSmdpAddressResultCallback> callback =
741 std::make_unique<SetDefaultSmdpAddressResultCallback>(context);
742 std::unique_lock<std::mutex> callbackLock(context->asyncContext.callbackMutex);
743 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().SetDefaultSmdpAddress(
744 context->asyncContext.slotId, context->inputStr, callback.release());
745
746 TELEPHONY_LOGI("NAPI NativeSetDefaultSmdpAddress %{public}d", errorCode);
747 if (errorCode == TELEPHONY_SUCCESS) {
748 context->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
749 [context] { return context->asyncContext.isCallbackEnd; });
750 }
751 context->asyncContext.context.errorCode = errorCode;
752 }
753
SetDefaultSmdpAddressCallback(napi_env env,napi_status status,void * data)754 void SetDefaultSmdpAddressCallback(napi_env env, napi_status status, void *data)
755 {
756 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
757 std::unique_ptr<AsyncContextInfo> context(static_cast<AsyncContextInfo *>(data));
758 if (context == nullptr) {
759 TELEPHONY_LOGE("SetDefaultSmdpAddressCallback context is nullptr");
760 return;
761 }
762 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
763 TELEPHONY_LOGE("SetDefaultSmdpAddressCallback get result timeout.");
764 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
765 }
766 NapiAsyncPermissionCompleteCallback(
767 env, status, context->asyncContext, false, { "SetDefaultSmdpAddress", Permission::SET_TELEPHONY_ESIM_STATE });
768 }
769
SetDefaultSmdpAddress(napi_env env,napi_callback_info info)770 napi_value SetDefaultSmdpAddress(napi_env env, napi_callback_info info)
771 {
772 auto asyncContext = std::make_unique<AsyncContextInfo>();
773 if (asyncContext == nullptr) {
774 return nullptr;
775 }
776 BaseContext &context = asyncContext->asyncContext.context;
777
778 std::array<char, ARRAY_SIZE> inputTepStr = {0};
779 auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, std::data(inputTepStr), &context.callbackRef);
780 AsyncPara para {
781 .funcName = "SetDefaultSmdpAddress",
782 .env = env,
783 .info = info,
784 .execute = NativeSetDefaultSmdpAddress,
785 .complete = SetDefaultSmdpAddressCallback,
786 };
787 napi_value result = NapiCreateAsyncWork2<AsyncContextInfo>(para, asyncContext.get(), initPara);
788 if (result == nullptr) {
789 TELEPHONY_LOGE("creat asyncwork failed!");
790 return nullptr;
791 }
792 asyncContext->inputStr = std::string(inputTepStr.data());
793 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
794 asyncContext.release();
795 }
796 return result;
797 }
798
NativeSwitchToProfile(napi_env env,void * data)799 void NativeSwitchToProfile(napi_env env, void *data)
800 {
801 if (data == nullptr) {
802 return;
803 }
804 auto profileContext = static_cast<AsyncSwitchProfileInfo *>(data);
805 if (!IsValidSlotId(profileContext->asyncContext.slotId)) {
806 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
807 profileContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
808 return;
809 }
810 std::unique_ptr<SwitchToProfileResultCallback> callback =
811 std::make_unique<SwitchToProfileResultCallback>(profileContext);
812 std::unique_lock<std::mutex> callbackLock(profileContext->asyncContext.callbackMutex);
813 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().SwitchToProfile(
814 profileContext->asyncContext.slotId, profileContext->portIndex, profileContext->iccid,
815 profileContext->forceDisableProfile, callback.release());
816
817 TELEPHONY_LOGI("NAPI NativeSwitchToProfile %{public}d", errorCode);
818 profileContext->asyncContext.context.errorCode = errorCode;
819 if (errorCode == TELEPHONY_SUCCESS) {
820 profileContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
821 [profileContext] { return profileContext->asyncContext.isCallbackEnd; });
822 }
823 }
824
SwitchToProfileCallback(napi_env env,napi_status status,void * data)825 void SwitchToProfileCallback(napi_env env, napi_status status, void *data)
826 {
827 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
828 std::unique_ptr<AsyncSwitchProfileInfo> context(static_cast<AsyncSwitchProfileInfo *>(data));
829 if (context == nullptr) {
830 TELEPHONY_LOGE("SwitchToProfileCallback context is nullptr");
831 return;
832 }
833 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
834 TELEPHONY_LOGE("SwitchToProfileCallback get result timeout.");
835 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
836 }
837 NapiAsyncPermissionCompleteCallback(
838 env, status, context->asyncContext, false, { "SwitchToProfile", Permission::SET_TELEPHONY_ESIM_STATE });
839 }
840
SwitchToProfile(napi_env env,napi_callback_info info)841 napi_value SwitchToProfile(napi_env env, napi_callback_info info)
842 {
843 auto profileContext = std::make_unique<AsyncSwitchProfileInfo>();
844 if (profileContext == nullptr) {
845 return nullptr;
846 }
847 BaseContext &context = profileContext->asyncContext.context;
848
849 std::array<char, ARRAY_SIZE> iccIdStr = {0};
850 auto initPara = std::make_tuple(&profileContext->asyncContext.slotId, &profileContext->portIndex,
851 std::data(iccIdStr), &profileContext->forceDisableProfile, &context.callbackRef);
852
853 AsyncPara para {
854 .funcName = "SwitchToProfile",
855 .env = env,
856 .info = info,
857 .execute = NativeSwitchToProfile,
858 .complete = SwitchToProfileCallback,
859 };
860 napi_value result = NapiCreateAsyncWork2<AsyncSwitchProfileInfo>(para, profileContext.get(), initPara);
861 if (result == nullptr) {
862 TELEPHONY_LOGE("creat asyncwork failed!");
863 return nullptr;
864 }
865 profileContext->iccid = std::string(iccIdStr.data());
866 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
867 profileContext.release();
868 }
869 return result;
870 }
871
NativeDeleteProfile(napi_env env,void * data)872 void NativeDeleteProfile(napi_env env, void *data)
873 {
874 if (data == nullptr) {
875 return;
876 }
877 auto context = static_cast<AsyncContextInfo *>(data);
878 if (!IsValidSlotId(context->asyncContext.slotId)) {
879 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
880 context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
881 return;
882 }
883 std::unique_ptr<DeleteProfileResultCallback> callback = std::make_unique<DeleteProfileResultCallback>(context);
884 std::unique_lock<std::mutex> callbackLock(context->asyncContext.callbackMutex);
885 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().DeleteProfile(
886 context->asyncContext.slotId, context->inputStr, callback.release());
887
888 TELEPHONY_LOGI("NAPI NativeDeleteProfile %{public}d", errorCode);
889 context->asyncContext.context.errorCode = errorCode;
890 if (errorCode == TELEPHONY_SUCCESS) {
891 context->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
892 [context] { return context->asyncContext.isCallbackEnd; });
893 }
894 }
895
DeleteProfileCallback(napi_env env,napi_status status,void * data)896 void DeleteProfileCallback(napi_env env, napi_status status, void *data)
897 {
898 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
899 std::unique_ptr<AsyncContextInfo> context(static_cast<AsyncContextInfo *>(data));
900 if (context == nullptr) {
901 TELEPHONY_LOGE("DeleteProfileCallback context is nullptr");
902 return;
903 }
904 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
905 TELEPHONY_LOGE("DeleteProfileCallback get result timeout.");
906 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
907 }
908 NapiAsyncPermissionCompleteCallback(
909 env, status, context->asyncContext, false, { "DeleteProfile", Permission::SET_TELEPHONY_ESIM_STATE });
910 }
911
DeleteProfile(napi_env env,napi_callback_info info)912 napi_value DeleteProfile(napi_env env, napi_callback_info info)
913 {
914 auto asyncContext = std::make_unique<AsyncContextInfo>();
915 if (asyncContext == nullptr) {
916 return nullptr;
917 }
918 BaseContext &context = asyncContext->asyncContext.context;
919
920 std::array<char, ARRAY_SIZE> inputTmpStr = {0};
921 auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, std::data(inputTmpStr), &context.callbackRef);
922 AsyncPara para {
923 .funcName = "DeleteProfile",
924 .env = env,
925 .info = info,
926 .execute = NativeDeleteProfile,
927 .complete = DeleteProfileCallback,
928 };
929 napi_value result = NapiCreateAsyncWork2<AsyncContextInfo>(para, asyncContext.get(), initPara);
930 if (result == nullptr) {
931 TELEPHONY_LOGE("creat asyncwork failed!");
932 return nullptr;
933 }
934 asyncContext->inputStr = std::string(inputTmpStr.data());
935 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
936 asyncContext.release();
937 }
938 return result;
939 }
940
NativeResetMemory(napi_env env,void * data)941 void NativeResetMemory(napi_env env, void *data)
942 {
943 if (data == nullptr) {
944 return;
945 }
946 auto profileContext = static_cast<AsyncResetMemory *>(data);
947 if (!IsValidSlotId(profileContext->asyncContext.slotId)) {
948 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
949 profileContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
950 return;
951 }
952 std::unique_ptr<ResetMemoryResultCallback> callback = std::make_unique<ResetMemoryResultCallback>(profileContext);
953 if (resetParameterCount == PARAMETER_COUNT_ONE) {
954 profileContext->option = static_cast<int32_t>(GetDefaultResetOption());
955 }
956 std::unique_lock<std::mutex> callbackLock(profileContext->asyncContext.callbackMutex);
957 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().ResetMemory(
958 profileContext->asyncContext.slotId, profileContext->option, callback.release());
959
960 TELEPHONY_LOGI("NAPI NativeResetMemory %{public}d", errorCode);
961 profileContext->asyncContext.context.errorCode = errorCode;
962 if (errorCode == TELEPHONY_SUCCESS) {
963 profileContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
964 [profileContext] { return profileContext->asyncContext.isCallbackEnd; });
965 }
966 }
967
ResetMemoryCallback(napi_env env,napi_status status,void * data)968 void ResetMemoryCallback(napi_env env, napi_status status, void *data)
969 {
970 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
971 std::unique_ptr<AsyncResetMemory> context(static_cast<AsyncResetMemory *>(data));
972 if (context == nullptr) {
973 TELEPHONY_LOGE("ResetMemoryCallback context is nullptr");
974 return;
975 }
976 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
977 TELEPHONY_LOGE("ResetMemoryCallback get result timeout.");
978 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
979 }
980 NapiAsyncPermissionCompleteCallback(
981 env, status, context->asyncContext, false, { "ResetMemory", Permission::SET_TELEPHONY_ESIM_STATE });
982 }
983
ResetMemory(napi_env env,napi_callback_info info)984 napi_value ResetMemory(napi_env env, napi_callback_info info)
985 {
986 resetParameterCount = 0;
987 napi_value parameters[PARAMETER_COUNT_TWO] = { 0 };
988 napi_value thisVar = nullptr;
989 void *data = nullptr;
990 napi_get_cb_info(env, info, &resetParameterCount, parameters, &thisVar, &data);
991 if (resetParameterCount == PARAMETER_COUNT_ONE) {
992 return NapiCreateAsyncWork<int32_t, NativeResetMemory, ResetMemoryCallback>(env, info, "ResetMemory");
993 }
994
995 auto profileContext = std::make_unique<AsyncResetMemory>();
996 if (profileContext == nullptr) {
997 return nullptr;
998 }
999 BaseContext &context = profileContext->asyncContext.context;
1000 auto initPara = std::make_tuple(&profileContext->asyncContext.slotId,
1001 &profileContext->option, &context.callbackRef);
1002
1003 AsyncPara para {
1004 .funcName = "ResetMemory",
1005 .env = env,
1006 .info = info,
1007 .execute = NativeResetMemory,
1008 .complete = ResetMemoryCallback,
1009 };
1010 napi_value result = NapiCreateAsyncWork2<AsyncResetMemory>(para, profileContext.get(), initPara);
1011 if (result == nullptr) {
1012 TELEPHONY_LOGE("creat asyncwork failed!");
1013 return nullptr;
1014 }
1015 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1016 profileContext.release();
1017 }
1018 return result;
1019 }
1020
NativeDownloadProfile(napi_env env,void * data)1021 void NativeDownloadProfile(napi_env env, void *data)
1022 {
1023 if (data == nullptr) {
1024 return;
1025 }
1026 auto profileContext = static_cast<AsyncDownloadProfileInfo *>(data);
1027 if (!IsValidSlotId(profileContext->asyncContext.slotId)) {
1028 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
1029 profileContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1030 return;
1031 }
1032 std::unique_ptr<DownloadProfileResultCallback> callback =
1033 std::make_unique<DownloadProfileResultCallback>(profileContext);
1034 DownloadProfileResult result;
1035 DownloadProfileConfigInfo configInfo;
1036 configInfo.portIndex_ = profileContext->portIndex;
1037 configInfo.isSwitchAfterDownload_ = profileContext->configuration.switchAfterDownload;
1038 configInfo.isForceDeactivateSim_ = profileContext->configuration.forceDisableProfile;
1039 configInfo.isPprAllowed_ = profileContext->configuration.isPprAllowed;
1040 DownloadableProfile profile = GetProfileInfo(profileContext->profile);
1041 std::unique_lock<std::mutex> callbackLock(profileContext->asyncContext.callbackMutex);
1042 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().DownloadProfile(
1043 profileContext->asyncContext.slotId, configInfo, profile, callback.release());
1044
1045 TELEPHONY_LOGI("NAPI NativeDownloadProfile %{public}d", errorCode);
1046 profileContext->asyncContext.context.errorCode = errorCode;
1047 if (errorCode == TELEPHONY_SUCCESS) {
1048 profileContext->asyncContext.cv.wait_for(
1049 callbackLock,
1050 std::chrono::seconds(WAIT_LONG_TERM_TASK_SECOND),
1051 [profileContext] { return profileContext->asyncContext.isCallbackEnd; });
1052 }
1053 }
1054
DownloadProfileCallback(napi_env env,napi_status status,void * data)1055 void DownloadProfileCallback(napi_env env, napi_status status, void *data)
1056 {
1057 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1058 std::unique_ptr<AsyncDownloadProfileInfo> context(static_cast<AsyncDownloadProfileInfo *>(data));
1059 if (context == nullptr) {
1060 TELEPHONY_LOGE("DownloadProfileCallback context is nullptr");
1061 return;
1062 }
1063 AsyncContext<napi_value> &asyncContext = context->asyncContext;
1064 if (asyncContext.context.resolved) {
1065 asyncContext.callbackVal = DownloadProfileResultConversion(env, context->result);
1066 }
1067 if ((!asyncContext.isCallbackEnd) && (asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1068 TELEPHONY_LOGE("DownloadProfileCallback get result timeout.");
1069 asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1070 }
1071 NapiAsyncPermissionCompleteCallback(
1072 env, status, context->asyncContext, false, { "DownloadProfile", Permission::SET_TELEPHONY_ESIM_STATE });
1073 }
1074
DownloadProfile(napi_env env,napi_callback_info info)1075 napi_value DownloadProfile(napi_env env, napi_callback_info info)
1076 {
1077 auto profileContext = std::make_unique<AsyncDownloadProfileInfo>();
1078 if (profileContext == nullptr) {
1079 return nullptr;
1080 }
1081 BaseContext &context = profileContext->asyncContext.context;
1082 napi_value profileObject = NapiUtil::CreateUndefined(env);
1083 napi_value configurationObject = NapiUtil::CreateUndefined(env);
1084 auto initPara = std::make_tuple(&profileContext->asyncContext.slotId, &profileContext->portIndex, &profileObject,
1085 &configurationObject, &context.callbackRef);
1086
1087 AsyncPara para {
1088 .funcName = "DownloadProfile",
1089 .env = env,
1090 .info = info,
1091 .execute = NativeDownloadProfile,
1092 .complete = DownloadProfileCallback,
1093 };
1094 napi_value result = NapiCreateAsyncWork2<AsyncDownloadProfileInfo>(para, profileContext.get(), initPara);
1095 if (result == nullptr) {
1096 TELEPHONY_LOGE("creat asyncwork failed!");
1097 return nullptr;
1098 }
1099 ProfileInfoAnalyze(env, profileObject, profileContext->profile);
1100 ConfigurationInfoAnalyze(env, configurationObject, profileContext->configuration);
1101 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1102 profileContext.release();
1103 }
1104 return result;
1105 }
1106
NativeGetDownloadableProfiles(napi_env env,void * data)1107 void NativeGetDownloadableProfiles(napi_env env, void *data)
1108 {
1109 if (data == nullptr) {
1110 return;
1111 }
1112 auto profileContext = static_cast<AsyncDefaultProfileList *>(data);
1113 if (!IsValidSlotId(profileContext->asyncContext.slotId)) {
1114 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
1115 profileContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1116 return;
1117 }
1118 std::unique_ptr<GetDownloadableProfilesResultCallback> callback =
1119 std::make_unique<GetDownloadableProfilesResultCallback>(profileContext);
1120 std::unique_lock<std::mutex> callbackLock(profileContext->asyncContext.callbackMutex);
1121 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetDownloadableProfiles(
1122 profileContext->asyncContext.slotId, profileContext->portIndex,
1123 profileContext->forceDisableProfile, callback.release());
1124
1125 TELEPHONY_LOGI("NAPI NativeGetDownloadableProfiles %{public}d", errorCode);
1126 profileContext->asyncContext.context.errorCode = errorCode;
1127 if (errorCode == TELEPHONY_SUCCESS) {
1128 profileContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1129 [profileContext] { return profileContext->asyncContext.isCallbackEnd; });
1130 }
1131 }
1132
GetDownloadableProfilesCallback(napi_env env,napi_status status,void * data)1133 void GetDownloadableProfilesCallback(napi_env env, napi_status status, void *data)
1134 {
1135 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1136 std::unique_ptr<AsyncDefaultProfileList> context(static_cast<AsyncDefaultProfileList *>(data));
1137 if (context == nullptr) {
1138 TELEPHONY_LOGE("GetDownloadableProfilesCallback context is nullptr");
1139 return;
1140 }
1141 AsyncContext<napi_value> &asyncContext = context->asyncContext;
1142 if (asyncContext.context.resolved) {
1143 asyncContext.callbackVal = ProfileResultListConversion(env, context->result);
1144 }
1145 if ((!asyncContext.isCallbackEnd) && (asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1146 TELEPHONY_LOGE("GetDownloadableProfilesCallback get result timeout.");
1147 asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1148 }
1149 NapiAsyncPermissionCompleteCallback(env, status, context->asyncContext, false,
1150 { "GetDownloadableProfiles", Permission::GET_TELEPHONY_ESIM_STATE });
1151 }
1152
GetDownloadableProfiles(napi_env env,napi_callback_info info)1153 napi_value GetDownloadableProfiles(napi_env env, napi_callback_info info)
1154 {
1155 auto profileContext = std::make_unique<AsyncDefaultProfileList>();
1156 if (profileContext == nullptr) {
1157 return nullptr;
1158 }
1159 BaseContext &context = profileContext->asyncContext.context;
1160
1161 auto initPara = std::make_tuple(&profileContext->asyncContext.slotId, &profileContext->portIndex,
1162 &profileContext->forceDisableProfile, &context.callbackRef);
1163
1164 AsyncPara para {
1165 .funcName = "GetDownloadableProfiles",
1166 .env = env,
1167 .info = info,
1168 .execute = NativeGetDownloadableProfiles,
1169 .complete = GetDownloadableProfilesCallback,
1170 };
1171 napi_value result = NapiCreateAsyncWork2<AsyncDefaultProfileList>(para, profileContext.get(), initPara);
1172 if (result == nullptr) {
1173 TELEPHONY_LOGE("creat asyncwork failed!");
1174 return nullptr;
1175 }
1176 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1177 profileContext.release();
1178 }
1179 return result;
1180 }
1181
NativeGetOsuStatus(napi_env env,void * data)1182 void NativeGetOsuStatus(napi_env env, void *data)
1183 {
1184 if (data == nullptr) {
1185 return;
1186 }
1187 AsyncContext<int32_t> *asyncContext = static_cast<AsyncContext<int32_t> *>(data);
1188 if (!IsValidSlotId(asyncContext->slotId)) {
1189 TELEPHONY_LOGE("NativeGetOsuStatus slotId is invalid");
1190 asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1191 return;
1192 }
1193 int32_t result = UNDEFINED_VALUE;
1194 int32_t errorCode =
1195 DelayedRefSingleton<EsimServiceClient>::GetInstance().GetOsuStatus(asyncContext->slotId, result);
1196 TELEPHONY_LOGI("NAPI NativeGetOsuStatus %{public}d", errorCode);
1197 if (errorCode == ERROR_NONE) {
1198 asyncContext->callbackVal = result;
1199 asyncContext->context.resolved = true;
1200 } else {
1201 asyncContext->context.resolved = false;
1202 }
1203 asyncContext->context.errorCode = errorCode;
1204 }
1205
GetOsuStatusCallback(napi_env env,napi_status status,void * data)1206 void GetOsuStatusCallback(napi_env env, napi_status status, void *data)
1207 {
1208 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1209 std::unique_ptr<AsyncContext<int32_t>> context(static_cast<AsyncContext<int32_t> *>(data));
1210 if (context == nullptr) {
1211 TELEPHONY_LOGE("GetOsuStatusCallback context is nullptr");
1212 return;
1213 }
1214 NapiAsyncPermissionCompleteCallback(
1215 env, status, *context, false, { "GetOsuStatus", Permission::GET_TELEPHONY_ESIM_STATE });
1216 }
1217
GetOsuStatus(napi_env env,napi_callback_info info)1218 napi_value GetOsuStatus(napi_env env, napi_callback_info info)
1219 {
1220 return NapiCreateAsyncWork<int32_t, NativeGetOsuStatus, GetOsuStatusCallback>(env, info, "GetOsuStatus");
1221 }
1222
NativeStartOsu(napi_env env,void * data)1223 void NativeStartOsu(napi_env env, void *data)
1224 {
1225 if (data == nullptr) {
1226 return;
1227 }
1228
1229 auto profileContext = static_cast<AsyncContext<int32_t> *>(data);
1230 if (!IsValidSlotId(profileContext->slotId)) {
1231 TELEPHONY_LOGE("NativeGetEuiccInfo slotId is invalid");
1232 profileContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1233 return;
1234 }
1235
1236 std::unique_ptr<StartOsuResultCallback> callback = std::make_unique<StartOsuResultCallback>(profileContext);
1237 std::unique_lock<std::mutex> callbackLock(profileContext->callbackMutex);
1238 int32_t errorCode =
1239 DelayedRefSingleton<EsimServiceClient>::GetInstance().StartOsu(profileContext->slotId, callback.release());
1240
1241 TELEPHONY_LOGI("NAPI NativeStartOsu %{public}d", errorCode);
1242 profileContext->context.errorCode = errorCode;
1243 if (errorCode == TELEPHONY_SUCCESS) {
1244 profileContext->cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1245 [profileContext] { return profileContext->isCallbackEnd; });
1246 }
1247 }
1248
StartOsuCallback(napi_env env,napi_status status,void * data)1249 void StartOsuCallback(napi_env env, napi_status status, void *data)
1250 {
1251 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1252 std::unique_ptr<AsyncContext<int32_t>> context(static_cast<AsyncContext<int32_t> *>(data));
1253 if (context == nullptr) {
1254 TELEPHONY_LOGE("StartOsuCallback context is nullptr");
1255 return;
1256 }
1257 if ((!context->isCallbackEnd) && (context->context.errorCode == TELEPHONY_SUCCESS)) {
1258 TELEPHONY_LOGE("StartOsuCallback get result timeout.");
1259 context->context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1260 }
1261 NapiAsyncPermissionCompleteCallback(
1262 env, status, *context, false, { "StartOsu", Permission::SET_TELEPHONY_ESIM_STATE });
1263 }
1264
StartOsu(napi_env env,napi_callback_info info)1265 napi_value StartOsu(napi_env env, napi_callback_info info)
1266 {
1267 return NapiCreateAsyncWork<int32_t, NativeStartOsu, StartOsuCallback>(env, info, "StartOsu");
1268 }
1269
NativeSetProfileNickname(napi_env env,void * data)1270 void NativeSetProfileNickname(napi_env env, void *data)
1271 {
1272 if (data == nullptr) {
1273 return;
1274 }
1275 AsyncProfileNickname *setprofileNickNameContext = static_cast<AsyncProfileNickname *>(data);
1276 if (!IsValidSlotId(setprofileNickNameContext->asyncContext.slotId)) {
1277 TELEPHONY_LOGE("NativeSetProfileNickname slotId is invalid");
1278 setprofileNickNameContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1279 return;
1280 }
1281
1282 std::unique_ptr<SetProfileNickNameResultCallback> callback =
1283 std::make_unique<SetProfileNickNameResultCallback>(setprofileNickNameContext);
1284 std::unique_lock<std::mutex> callbackLock(setprofileNickNameContext->asyncContext.callbackMutex);
1285 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().SetProfileNickname(
1286 setprofileNickNameContext->asyncContext.slotId, setprofileNickNameContext->iccid,
1287 setprofileNickNameContext->nickname, callback.release());
1288
1289 TELEPHONY_LOGI("NAPI NativeSetProfileNickname %{public}d", errorCode);
1290 setprofileNickNameContext->asyncContext.context.errorCode = errorCode;
1291 if (errorCode == TELEPHONY_SUCCESS) {
1292 setprofileNickNameContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1293 [setprofileNickNameContext] { return setprofileNickNameContext->asyncContext.isCallbackEnd; });
1294 }
1295 }
1296
SetProfileNicknameCallback(napi_env env,napi_status status,void * data)1297 void SetProfileNicknameCallback(napi_env env, napi_status status, void *data)
1298 {
1299 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1300 std::unique_ptr<AsyncProfileNickname> context(static_cast<AsyncProfileNickname *>(data));
1301 if (context == nullptr) {
1302 TELEPHONY_LOGE("SetProfileNicknameCallback context is nullptr");
1303 return;
1304 }
1305 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1306 TELEPHONY_LOGE("SetProfileNicknameCallback get result timeout.");
1307 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1308 }
1309 NapiAsyncPermissionCompleteCallback(
1310 env, status, context->asyncContext, false, { "SetProfileNickname", Permission::SET_TELEPHONY_ESIM_STATE });
1311 }
1312
SetProfileNickname(napi_env env,napi_callback_info info)1313 napi_value SetProfileNickname(napi_env env, napi_callback_info info)
1314 {
1315 auto profileContext = std::make_unique<AsyncProfileNickname>();
1316 if (profileContext == nullptr) {
1317 return nullptr;
1318 }
1319 BaseContext &context = profileContext->asyncContext.context;
1320
1321 std::array<char, ARRAY_SIZE> iccIdStr = {0};
1322 std::array<char, ARRAY_SIZE> nicknameStr = {0};
1323 auto initPara = std::make_tuple(&profileContext->asyncContext.slotId,
1324 std::data(iccIdStr), std::data(nicknameStr), &context.callbackRef);
1325
1326 AsyncPara para {
1327 .funcName = "SetProfileNickname",
1328 .env = env,
1329 .info = info,
1330 .execute = NativeSetProfileNickname,
1331 .complete = SetProfileNicknameCallback,
1332 };
1333 napi_value result = NapiCreateAsyncWork2<AsyncProfileNickname>(para, profileContext.get(), initPara);
1334 if (result == nullptr) {
1335 TELEPHONY_LOGE("creat asyncwork failed!");
1336 return nullptr;
1337 }
1338 profileContext->iccid = std::string(iccIdStr.data());
1339 profileContext->nickname = std::string(nicknameStr.data());
1340 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1341 profileContext.release();
1342 }
1343 return result;
1344 }
1345
NativeCancelSession(napi_env env,void * data)1346 void NativeCancelSession(napi_env env, void *data)
1347 {
1348 if (data == nullptr) {
1349 return;
1350 }
1351 auto cancelSessionContext = static_cast<AsyncCancelSession *>(data);
1352 if (!IsValidSlotId(cancelSessionContext->asyncContext.slotId)) {
1353 TELEPHONY_LOGE("NativeCancelSession slotId is invalid");
1354 cancelSessionContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1355 return;
1356 }
1357 std::unique_ptr<CancelSessionCallback> callback = std::make_unique<CancelSessionCallback>(cancelSessionContext);
1358 std::unique_lock<std::mutex> callbackLock(cancelSessionContext->asyncContext.callbackMutex);
1359 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().CancelSession(
1360 cancelSessionContext->asyncContext.slotId, cancelSessionContext->transactionId,
1361 cancelSessionContext->cancelReason, callback.release());
1362 TELEPHONY_LOGI("NAPI NativeCancelSession %{public}d", errorCode);
1363 cancelSessionContext->asyncContext.context.errorCode = errorCode;
1364 if (errorCode == TELEPHONY_SUCCESS) {
1365 cancelSessionContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1366 [cancelSessionContext] { return cancelSessionContext->asyncContext.isCallbackEnd; });
1367 }
1368 }
1369
CancelSessionCallback(napi_env env,napi_status status,void * data)1370 void CancelSessionCallback(napi_env env, napi_status status, void *data)
1371 {
1372 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1373 std::unique_ptr<AsyncCancelSession> context(static_cast<AsyncCancelSession *>(data));
1374 if (context == nullptr) {
1375 TELEPHONY_LOGE("CancelSessionCallback context is nullptr");
1376 return;
1377 }
1378 if ((!context->asyncContext.isCallbackEnd) && (context->asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1379 TELEPHONY_LOGE("CancelSessionCallback get result timeout.");
1380 context->asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1381 }
1382 NapiAsyncPermissionCompleteCallback(
1383 env, status, context->asyncContext, false, { "CancelSession", Permission::SET_TELEPHONY_ESIM_STATE });
1384 }
1385
CancelSession(napi_env env,napi_callback_info info)1386 napi_value CancelSession(napi_env env, napi_callback_info info)
1387 {
1388 auto sessionContext = std::make_unique<AsyncCancelSession>();
1389 if (sessionContext == nullptr) {
1390 return nullptr;
1391 }
1392 BaseContext &context = sessionContext->asyncContext.context;
1393
1394 std::array<char, ARRAY_SIZE> transactionIdStr = {0};
1395 auto initPara = std::make_tuple(&sessionContext->asyncContext.slotId, std::data(transactionIdStr),
1396 &sessionContext->cancelReason, &context.callbackRef);
1397
1398 AsyncPara para {
1399 .funcName = "CancelSession",
1400 .env = env,
1401 .info = info,
1402 .execute = NativeCancelSession,
1403 .complete = CancelSessionCallback,
1404 };
1405 napi_value result = NapiCreateAsyncWork2<AsyncCancelSession>(para, sessionContext.get(), initPara);
1406 if (result == nullptr) {
1407 TELEPHONY_LOGE("creat asyncwork failed!");
1408 return nullptr;
1409 }
1410 sessionContext->transactionId = std::string(transactionIdStr.data());
1411 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1412 sessionContext.release();
1413 }
1414 return result;
1415 }
1416
NativeGetDownloadableProfileMetadata(napi_env env,void * data)1417 void NativeGetDownloadableProfileMetadata(napi_env env, void *data)
1418 {
1419 if (data == nullptr) {
1420 return;
1421 }
1422 auto metadata = static_cast<AsyncProfileMetadataInfo *>(data);
1423 if (!IsValidSlotId(metadata->asyncContext.slotId)) {
1424 TELEPHONY_LOGE("NativeGetDownloadableProfileMetadata slotId is invalid");
1425 metadata->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1426 return;
1427 }
1428 std::unique_ptr<GetDownloadableProfileMetadataResultCallback> callback =
1429 std::make_unique<GetDownloadableProfileMetadataResultCallback>(metadata);
1430 DownloadableProfile profile = GetProfileInfo(metadata->profile);
1431 std::unique_lock<std::mutex> callbackLock(metadata->asyncContext.callbackMutex);
1432 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetDownloadableProfileMetadata(
1433 metadata->asyncContext.slotId, metadata->portIndex, profile, metadata->forceDisableProfile, callback.release());
1434 TELEPHONY_LOGI("NAPI NativeGetDownloadableProfileMetadata %{public}d", errorCode);
1435 metadata->asyncContext.context.errorCode = errorCode;
1436 if (errorCode == TELEPHONY_SUCCESS) {
1437 metadata->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_LONG_TERM_TASK_SECOND),
1438 [metadata] { return metadata->asyncContext.isCallbackEnd; });
1439 }
1440 }
1441
GetDownloadableProfileMetadataCallback(napi_env env,napi_status status,void * data)1442 void GetDownloadableProfileMetadataCallback(napi_env env, napi_status status, void *data)
1443 {
1444 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1445 std::unique_ptr<AsyncProfileMetadataInfo> context(static_cast<AsyncProfileMetadataInfo *>(data));
1446 if (context == nullptr) {
1447 TELEPHONY_LOGE("GetDownloadableProfileMetadataCallback context is nullptr");
1448 return;
1449 }
1450 AsyncContext<napi_value> &asyncContext = context->asyncContext;
1451 if (asyncContext.context.resolved) {
1452 asyncContext.callbackVal = MetadataResultConversion(env, context->result);
1453 }
1454 if ((!asyncContext.isCallbackEnd) && (asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1455 TELEPHONY_LOGE("GetDownloadableProfileMetadataCallback get result timeout.");
1456 asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1457 }
1458 NapiAsyncPermissionCompleteCallback(env, status, context->asyncContext, false,
1459 { "GetDownloadableProfileMetadata", Permission::SET_TELEPHONY_ESIM_STATE });
1460 }
1461
GetDownloadableProfileMetadata(napi_env env,napi_callback_info info)1462 napi_value GetDownloadableProfileMetadata(napi_env env, napi_callback_info info)
1463 {
1464 auto metadata = std::make_unique<AsyncProfileMetadataInfo>();
1465 if (metadata == nullptr) {
1466 return nullptr;
1467 }
1468 BaseContext &context = metadata->asyncContext.context;
1469 napi_value object = NapiUtil::CreateUndefined(env);
1470 auto initPara = std::make_tuple(&metadata->asyncContext.slotId, &metadata->portIndex,
1471 &object, &metadata->forceDisableProfile, &context.callbackRef);
1472
1473 AsyncPara para {
1474 .funcName = "GetDownloadableProfileMetadata",
1475 .env = env,
1476 .info = info,
1477 .execute = NativeGetDownloadableProfileMetadata,
1478 .complete = GetDownloadableProfileMetadataCallback,
1479 };
1480 napi_value result = NapiCreateAsyncWork2<AsyncProfileMetadataInfo>(para, metadata.get(), initPara);
1481 if (result == nullptr) {
1482 TELEPHONY_LOGE("creat asyncwork failed!");
1483 return nullptr;
1484 }
1485 ProfileInfoAnalyze(env, object, metadata->profile);
1486 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1487 metadata.release();
1488 }
1489 return result;
1490 }
1491
NativeGetEuiccProfileInfoList(napi_env env,void * data)1492 void NativeGetEuiccProfileInfoList(napi_env env, void *data)
1493 {
1494 if (data == nullptr) {
1495 return;
1496 }
1497 auto profileContext = static_cast<AsyncEuiccProfileInfoList *>(data);
1498 if (!IsValidSlotId(profileContext->asyncContext.slotId)) {
1499 TELEPHONY_LOGE("NativeGetEuiccProfileInfoList slotId is invalid");
1500 profileContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1501 return;
1502 }
1503 std::unique_ptr<GetEuiccProfileInfoListResultCallback> callback =
1504 std::make_unique<GetEuiccProfileInfoListResultCallback>(profileContext);
1505 std::unique_lock<std::mutex> callbackLock(profileContext->asyncContext.callbackMutex);
1506 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetEuiccProfileInfoList(
1507 profileContext->asyncContext.slotId, callback.release());
1508 TELEPHONY_LOGI("NAPI NativeGetEuiccProfileInfoList %{public}d", errorCode);
1509 profileContext->asyncContext.context.errorCode = errorCode;
1510 if (errorCode == TELEPHONY_SUCCESS) {
1511 profileContext->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1512 [profileContext] { return profileContext->asyncContext.isCallbackEnd; });
1513 }
1514 }
1515
GetEuiccProfileInfoListCallback(napi_env env,napi_status status,void * data)1516 void GetEuiccProfileInfoListCallback(napi_env env, napi_status status, void *data)
1517 {
1518 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1519 std::unique_ptr<AsyncEuiccProfileInfoList> context(static_cast<AsyncEuiccProfileInfoList *>(data));
1520 if (context == nullptr) {
1521 TELEPHONY_LOGE("GetEuiccProfileInfoListCallback context is nullptr");
1522 return;
1523 }
1524 AsyncContext<napi_value> &asyncContext = context->asyncContext;
1525 if (asyncContext.context.resolved) {
1526 asyncContext.callbackVal = EuiccProfileListConversion(env, context->result);
1527 }
1528 if ((!asyncContext.isCallbackEnd) && (asyncContext.context.errorCode == TELEPHONY_SUCCESS)) {
1529 TELEPHONY_LOGE("GetEuiccProfileInfoListCallback get result timeout.");
1530 asyncContext.context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1531 }
1532 NapiAsyncPermissionCompleteCallback(
1533 env, status, asyncContext, false, { "GetEuiccProfileInfoList", Permission::GET_TELEPHONY_ESIM_STATE });
1534 }
1535
GetEuiccProfileInfoList(napi_env env,napi_callback_info info)1536 napi_value GetEuiccProfileInfoList(napi_env env, napi_callback_info info)
1537 {
1538 auto euiccInfo = std::make_unique<AsyncEuiccProfileInfoList>();
1539 if (euiccInfo == nullptr) {
1540 return nullptr;
1541 }
1542 BaseContext &context = euiccInfo->asyncContext.context;
1543
1544 auto initPara = std::make_tuple(&euiccInfo->asyncContext.slotId, &context.callbackRef);
1545 AsyncPara para {
1546 .funcName = "GetEuiccProfileInfoList",
1547 .env = env,
1548 .info = info,
1549 .execute = NativeGetEuiccProfileInfoList,
1550 .complete = GetEuiccProfileInfoListCallback,
1551 };
1552 napi_value result = NapiCreateAsyncWork2<AsyncEuiccProfileInfoList>(para, euiccInfo.get(), initPara);
1553 if (result == nullptr) {
1554 TELEPHONY_LOGE("creat asyncwork failed!");
1555 return nullptr;
1556 }
1557 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1558 euiccInfo.release();
1559 }
1560 return result;
1561 }
1562
NativeReserveProfilesForFactoryRestore(napi_env env,void * data)1563 void NativeReserveProfilesForFactoryRestore(napi_env env, void *data)
1564 {
1565 if (data == nullptr) {
1566 return;
1567 }
1568
1569 AsyncCommonInfo *profileContext = static_cast<AsyncCommonInfo *>(data);
1570 AsyncContext<int32_t> &asyncContext = profileContext->asyncContext;
1571 if (!IsValidSlotId(asyncContext.slotId)) {
1572 TELEPHONY_LOGE("NativeReserveProfilesForFactoryRestore slotId is invalid");
1573 asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1574 return;
1575 }
1576
1577 int32_t result = UNDEFINED_VALUE;
1578 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().ReserveProfilesForFactoryRestore(
1579 asyncContext.slotId, result);
1580 TELEPHONY_LOGI("NAPI NativeReserveProfilesForFactoryRestore %{public}d", errorCode);
1581 if (errorCode == ERROR_NONE) {
1582 asyncContext.callbackVal = result;
1583 asyncContext.context.resolved = true;
1584 } else {
1585 asyncContext.context.resolved = false;
1586 }
1587 asyncContext.context.errorCode = errorCode;
1588 }
1589
ReserveProfilesForFactoryRestoreCallback(napi_env env,napi_status status,void * data)1590 void ReserveProfilesForFactoryRestoreCallback(napi_env env, napi_status status, void *data)
1591 {
1592 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1593 std::unique_ptr<AsyncCommonInfo> context(static_cast<AsyncCommonInfo *>(data));
1594 if (context == nullptr) {
1595 TELEPHONY_LOGE("ReserveProfilesForFactoryRestoreCallback context is nullptr");
1596 return;
1597 }
1598 NapiAsyncPermissionCompleteCallback(env, status, context->asyncContext, false,
1599 { "ReserveProfilesForFactoryRestore", Permission::SET_TELEPHONY_ESIM_STATE});
1600 }
1601
ReserveProfilesForFactoryRestore(napi_env env,napi_callback_info info)1602 napi_value ReserveProfilesForFactoryRestore(napi_env env, napi_callback_info info)
1603 {
1604 auto asyncContext = std::make_unique<AsyncCommonInfo>();
1605 if (asyncContext == nullptr) {
1606 return nullptr;
1607 }
1608 BaseContext &context = asyncContext->asyncContext.context;
1609
1610 auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, &context.callbackRef);
1611 AsyncPara para {
1612 .funcName = "ReserveProfilesForFactoryRestore",
1613 .env = env,
1614 .info = info,
1615 .execute = NativeReserveProfilesForFactoryRestore,
1616 .complete = ReserveProfilesForFactoryRestoreCallback,
1617 };
1618 napi_value result = NapiCreateAsyncWork2<AsyncCommonInfo>(para, asyncContext.get(), initPara);
1619 if (result == nullptr) {
1620 TELEPHONY_LOGE("creat asyncwork failed!");
1621 return nullptr;
1622 }
1623 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1624 asyncContext.release();
1625 }
1626 return result;
1627 }
1628
NativeGetSupportedPkids(napi_env env,void * data)1629 void NativeGetSupportedPkids(napi_env env, void *data)
1630 {
1631 if (data == nullptr) {
1632 return;
1633 }
1634 auto asyncContext = static_cast<AsyncContext<std::string> *>(data);
1635 if (!IsValidSlotId(asyncContext->slotId)) {
1636 TELEPHONY_LOGE("NativeGetSupportedPkids slotId is invalid");
1637 asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1638 return;
1639 }
1640 std::unique_ptr<GetSupportedPkidsResultCallback> callback =
1641 std::make_unique<GetSupportedPkidsResultCallback>(asyncContext);
1642 std::unique_lock<std::mutex> callbackLock(asyncContext->callbackMutex);
1643 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetSupportedPkids(
1644 asyncContext->slotId, callback.release());
1645
1646 TELEPHONY_LOGI("NAPI NativeGetSupportedPkids %{public}d", errorCode);
1647 asyncContext->context.errorCode = errorCode;
1648 if (errorCode == TELEPHONY_SUCCESS) {
1649 asyncContext->cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1650 [asyncContext] { return asyncContext->isCallbackEnd; });
1651 }
1652 }
1653
GetSupportedPkidsCallback(napi_env env,napi_status status,void * data)1654 void GetSupportedPkidsCallback(napi_env env, napi_status status, void *data)
1655 {
1656 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1657 std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1658 if ((!context->isCallbackEnd) && (context->context.errorCode == TELEPHONY_SUCCESS)) {
1659 TELEPHONY_LOGE("GetSupportedPkidsCallback get result timeout.");
1660 context->context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1661 }
1662 NapiAsyncPermissionCompleteCallback(
1663 env, status, *context, false, { "GetSupportedPkids", Permission::GET_TELEPHONY_ESIM_STATE });
1664 }
1665
GetSupportedPkids(napi_env env,napi_callback_info info)1666 napi_value GetSupportedPkids(napi_env env, napi_callback_info info)
1667 {
1668 return NapiCreateAsyncWork<std::string, NativeGetSupportedPkids, GetSupportedPkidsCallback>(
1669 env, info, "GetSupportedPkids");
1670 }
1671
NativeGetContractInfo(napi_env env,void * data)1672 void NativeGetContractInfo(napi_env env, void *data)
1673 {
1674 if (data == nullptr) {
1675 return;
1676 }
1677 auto contractInfoCtx = static_cast<AsyncGetContractInfo *>(data);
1678 if (!IsValidSlotId(contractInfoCtx->asyncContext.slotId)) {
1679 TELEPHONY_LOGE("NativeGetContractInfo slotId is invalid");
1680 contractInfoCtx->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1681 return;
1682 }
1683 std::unique_ptr<GetContractInfoResultCallback> callback =
1684 std::make_unique<GetContractInfoResultCallback>(contractInfoCtx);
1685 std::unique_lock<std::mutex> callbackLock(contractInfoCtx->asyncContext.callbackMutex);
1686 ContractRequestData contractRequestData;
1687 contractRequestData.publicKey = NapiUtil::ToUtf16(contractInfoCtx->contractRequestData.publicKey.data());
1688 contractRequestData.nonce = NapiUtil::ToUtf16(contractInfoCtx->contractRequestData.nonce.data());
1689 contractRequestData.pkid = NapiUtil::ToUtf16(contractInfoCtx->contractRequestData.pkid.data());
1690
1691 int32_t errorCode = DelayedRefSingleton<EsimServiceClient>::GetInstance().GetContractInfo(
1692 contractInfoCtx->asyncContext.slotId, contractRequestData, callback.release());
1693
1694 TELEPHONY_LOGI("NAPI NativeGetContractInfo %{public}d", errorCode);
1695 contractInfoCtx->asyncContext.context.errorCode = errorCode;
1696 if (errorCode == TELEPHONY_SUCCESS) {
1697 contractInfoCtx->asyncContext.cv.wait_for(callbackLock, std::chrono::seconds(WAIT_TIME_SECOND),
1698 [contractInfoCtx] { return contractInfoCtx->asyncContext.isCallbackEnd; });
1699 }
1700 }
1701
GetContractInfoCallback(napi_env env,napi_status status,void * data)1702 void GetContractInfoCallback(napi_env env, napi_status status, void *data)
1703 {
1704 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1705 std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1706 if ((!context->isCallbackEnd) && (context->context.errorCode == TELEPHONY_SUCCESS)) {
1707 TELEPHONY_LOGE("GetContractInfoCallback get result timeout.");
1708 context->context.errorCode = TELEPHONY_ERR_ESIM_GET_RESULT_TIMEOUT;
1709 }
1710 NapiAsyncPermissionCompleteCallback(
1711 env, status, *context, false, { "GetContractInfo", Permission::GET_TELEPHONY_ESIM_STATE });
1712 }
1713
GetContractInfo(napi_env env,napi_callback_info info)1714 napi_value GetContractInfo(napi_env env, napi_callback_info info)
1715 {
1716 auto getContractInfoCtx = std::make_unique<AsyncGetContractInfo>();
1717 BaseContext &context = getContractInfoCtx->asyncContext.context;
1718 napi_value contractRequestDataObject = NapiUtil::CreateUndefined(env);
1719
1720 auto initPara = std::make_tuple(
1721 &getContractInfoCtx->asyncContext.slotId, &contractRequestDataObject, &context.callbackRef);
1722 AsyncPara para {
1723 .funcName = "GetContractInfo",
1724 .env = env,
1725 .info = info,
1726 .execute = NativeGetContractInfo,
1727 .complete = GetContractInfoCallback,
1728 };
1729 napi_value result = NapiCreateAsyncWork2<AsyncGetContractInfo>(para, getContractInfoCtx.get(), initPara);
1730 if (result == nullptr) {
1731 TELEPHONY_LOGE("creat asyncwork failed!");
1732 return nullptr;
1733 }
1734 ContractRequestDataAnalyze(env, contractRequestDataObject, getContractInfoCtx->contractRequestData);
1735 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1736 getContractInfoCtx.release();
1737 }
1738 return result;
1739 }
1740
InitEnumResetOption(napi_env env,napi_value exports)1741 napi_status InitEnumResetOption(napi_env env, napi_value exports)
1742 {
1743 napi_property_descriptor desc[] = {
1744 DECLARE_NAPI_STATIC_PROPERTY("DELETE_OPERATIONAL_PROFILES",
1745 GetNapiValue(env, static_cast<int32_t>(ResetOption::DELETE_OPERATIONAL_PROFILES))),
1746 DECLARE_NAPI_STATIC_PROPERTY("DELETE_FIELD_LOADED_TEST_PROFILES",
1747 GetNapiValue(env, static_cast<int32_t>(ResetOption::DELETE_FIELD_LOADED_TEST_PROFILES))),
1748 DECLARE_NAPI_STATIC_PROPERTY("RESET_DEFAULT_SMDP_ADDRESS",
1749 GetNapiValue(env, static_cast<int32_t>(ResetOption::RESET_DEFAULT_SMDP_ADDRESS))),
1750 };
1751
1752 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1753 NapiUtil::DefineEnumClassByName(env, exports, "ResetOption", arrSize, desc);
1754 return napi_define_properties(env, exports, arrSize, desc);
1755 }
1756
InitEnumCancelReason(napi_env env,napi_value exports)1757 napi_status InitEnumCancelReason(napi_env env, napi_value exports)
1758 {
1759 napi_property_descriptor desc[] = {
1760 DECLARE_NAPI_STATIC_PROPERTY("CANCEL_REASON_END_USER_REJECTION",
1761 GetNapiValue(env, static_cast<int32_t>(CancelReason::CANCEL_REASON_END_USER_REJECTION))),
1762 DECLARE_NAPI_STATIC_PROPERTY("CANCEL_REASON_POSTPONED",
1763 GetNapiValue(env, static_cast<int32_t>(CancelReason::CANCEL_REASON_POSTPONED))),
1764 DECLARE_NAPI_STATIC_PROPERTY("CANCEL_REASON_TIMEOUT",
1765 GetNapiValue(env, static_cast<int32_t>(CancelReason::CANCEL_REASON_TIMEOUT))),
1766 DECLARE_NAPI_STATIC_PROPERTY("CANCEL_REASON_PPR_NOT_ALLOWED",
1767 GetNapiValue(env, static_cast<int32_t>(CancelReason::CANCEL_REASON_PPR_NOT_ALLOWED))),
1768 };
1769
1770 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1771 NapiUtil::DefineEnumClassByName(env, exports, "CancelReason", arrSize, desc);
1772 return napi_define_properties(env, exports, arrSize, desc);
1773 }
1774
InitEnumOsuStatus(napi_env env,napi_value exports)1775 napi_status InitEnumOsuStatus(napi_env env, napi_value exports)
1776 {
1777 napi_property_descriptor desc[] = {
1778 DECLARE_NAPI_STATIC_PROPERTY("EUICC_UPGRADE_IN_PROGRESS",
1779 GetNapiValue(env, static_cast<int32_t>(OsuStatus::EUICC_UPGRADE_IN_PROGRESS))),
1780 DECLARE_NAPI_STATIC_PROPERTY("EUICC_UPGRADE_FAILED",
1781 GetNapiValue(env, static_cast<int32_t>(OsuStatus::EUICC_UPGRADE_FAILED))),
1782 DECLARE_NAPI_STATIC_PROPERTY("EUICC_UPGRADE_SUCCESSFUL",
1783 GetNapiValue(env, static_cast<int32_t>(OsuStatus::EUICC_UPGRADE_SUCCESSFUL))),
1784 DECLARE_NAPI_STATIC_PROPERTY("EUICC_UPGRADE_ALREADY_LATEST",
1785 GetNapiValue(env, static_cast<int32_t>(OsuStatus::EUICC_UPGRADE_ALREADY_LATEST))),
1786 DECLARE_NAPI_STATIC_PROPERTY("EUICC_UPGRADE_SERVICE_UNAVAILABLE",
1787 GetNapiValue(env, static_cast<int32_t>(OsuStatus::EUICC_UPGRADE_SERVICE_UNAVAILABLE))),
1788 };
1789
1790 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1791 NapiUtil::DefineEnumClassByName(env, exports, "OsuStatus", arrSize, desc);
1792 return napi_define_properties(env, exports, arrSize, desc);
1793 }
1794
InitEnumProfileState(napi_env env,napi_value exports)1795 napi_status InitEnumProfileState(napi_env env, napi_value exports)
1796 {
1797 napi_property_descriptor desc[] = {
1798 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_STATE_UNSPECIFIED",
1799 GetNapiValue(env, static_cast<int32_t>(ProfileState::PROFILE_STATE_UNSPECIFIED))),
1800 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_STATE_DISABLED",
1801 GetNapiValue(env, static_cast<int32_t>(ProfileState::PROFILE_STATE_DISABLED))),
1802 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_STATE_ENABLED",
1803 GetNapiValue(env, static_cast<int32_t>(ProfileState::PROFILE_STATE_ENABLED))),
1804 };
1805
1806 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1807 NapiUtil::DefineEnumClassByName(env, exports, "ProfileState", arrSize, desc);
1808 return napi_define_properties(env, exports, arrSize, desc);
1809 }
1810
InitEnumProfileClass(napi_env env,napi_value exports)1811 napi_status InitEnumProfileClass(napi_env env, napi_value exports)
1812 {
1813 napi_property_descriptor desc[] = {
1814 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_CLASS_UNSPECIFIED",
1815 GetNapiValue(env, static_cast<int32_t>(ProfileClass::PROFILE_CLASS_UNSPECIFIED))),
1816 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_CLASS_TEST",
1817 GetNapiValue(env, static_cast<int32_t>(ProfileClass::PROFILE_CLASS_TEST))),
1818 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_CLASS_PROVISIONING",
1819 GetNapiValue(env, static_cast<int32_t>(ProfileClass::PROFILE_CLASS_PROVISIONING))),
1820 DECLARE_NAPI_STATIC_PROPERTY("PROFILE_CLASS_OPERATIONAL",
1821 GetNapiValue(env, static_cast<int32_t>(ProfileClass::PROFILE_CLASS_OPERATIONAL))),
1822 };
1823
1824 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1825 NapiUtil::DefineEnumClassByName(env, exports, "ProfileClass", arrSize, desc);
1826 return napi_define_properties(env, exports, arrSize, desc);
1827 }
1828
InitEnumPolicyRules(napi_env env,napi_value exports)1829 napi_status InitEnumPolicyRules(napi_env env, napi_value exports)
1830 {
1831 napi_property_descriptor desc[] = {
1832 DECLARE_NAPI_STATIC_PROPERTY("POLICY_RULE_DISABLE_NOT_ALLOWED",
1833 GetNapiValue(env, static_cast<int32_t>(PolicyRules::POLICY_RULE_DISABLE_NOT_ALLOWED))),
1834 DECLARE_NAPI_STATIC_PROPERTY("POLICY_RULE_DELETE_NOT_ALLOWED",
1835 GetNapiValue(env, static_cast<int32_t>(PolicyRules::POLICY_RULE_DELETE_NOT_ALLOWED))),
1836 DECLARE_NAPI_STATIC_PROPERTY("POLICY_RULE_DISABLE_AND_DELETE",
1837 GetNapiValue(env, static_cast<int32_t>(PolicyRules::POLICY_RULE_DISABLE_AND_DELETE))),
1838 };
1839
1840 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1841 NapiUtil::DefineEnumClassByName(env, exports, "PolicyRules", arrSize, desc);
1842 return napi_define_properties(env, exports, arrSize, desc);
1843 }
1844
InitEnumResultCode(napi_env env,napi_value exports)1845 napi_status InitEnumResultCode(napi_env env, napi_value exports)
1846 {
1847 napi_property_descriptor desc[] = {
1848 DECLARE_NAPI_STATIC_PROPERTY(
1849 "RESULT_SOLVABLE_ERRORS", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SOLVABLE_ERRORS))),
1850 DECLARE_NAPI_STATIC_PROPERTY(
1851 "RESULT_MUST_DISABLE_PROFILE",
1852 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_MUST_DISABLE_PROFILE))),
1853 DECLARE_NAPI_STATIC_PROPERTY("RESULT_OK", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_OK))),
1854 DECLARE_NAPI_STATIC_PROPERTY(
1855 "RESULT_GET_EID_FAILED", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_GET_EID_FAILED))),
1856 DECLARE_NAPI_STATIC_PROPERTY(
1857 "RESULT_ACTIVATION_CODE_CHANGED",
1858 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_ACTIVATION_CODE_CHANGED))),
1859 DECLARE_NAPI_STATIC_PROPERTY(
1860 "RESULT_ACTIVATION_CODE_INVALID",
1861 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_ACTIVATION_CODE_INVALID))),
1862 DECLARE_NAPI_STATIC_PROPERTY(
1863 "RESULT_SMDP_ADDRESS_INVALID",
1864 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SMDP_ADDRESS_INVALID))),
1865 DECLARE_NAPI_STATIC_PROPERTY(
1866 "RESULT_EUICC_INFO_INVALID",
1867 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_EUICC_INFO_INVALID))),
1868 DECLARE_NAPI_STATIC_PROPERTY(
1869 "RESULT_TLS_HANDSHAKE_FAILED",
1870 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_TLS_HANDSHAKE_FAILED))),
1871 DECLARE_NAPI_STATIC_PROPERTY(
1872 "RESULT_CERTIFICATE_IO_ERROR",
1873 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CERTIFICATE_IO_ERROR))),
1874 DECLARE_NAPI_STATIC_PROPERTY(
1875 "RESULT_CERTIFICATE_RESPONSE_TIMEOUT",
1876 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CERTIFICATE_RESPONSE_TIMEOUT))),
1877 DECLARE_NAPI_STATIC_PROPERTY(
1878 "RESULT_AUTHENTICATION_FAILED",
1879 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_AUTHENTICATION_FAILED))),
1880 DECLARE_NAPI_STATIC_PROPERTY(
1881 "RESULT_RESPONSE_HTTP_FAILED",
1882 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_RESPONSE_HTTP_FAILED))),
1883 DECLARE_NAPI_STATIC_PROPERTY(
1884 "RESULT_CONFIRMATION_CODE_INCORRECT",
1885 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CONFIRMATION_CODE_INCORRECT))),
1886 DECLARE_NAPI_STATIC_PROPERTY(
1887 "RESULT_EXCEEDED_CONFIRMATION_CODE_TRY_LIMIT",
1888 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_EXCEEDED_CONFIRMATION_CODE_TRY_LIMIT))),
1889 DECLARE_NAPI_STATIC_PROPERTY(
1890 "RESULT_NO_PROFILE_ON_SERVER",
1891 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_NO_PROFILE_ON_SERVER))),
1892 DECLARE_NAPI_STATIC_PROPERTY(
1893 "RESULT_TRANSACTION_ID_INVALID",
1894 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_TRANSACTION_ID_INVALID))),
1895 DECLARE_NAPI_STATIC_PROPERTY(
1896 "RESULT_SERVER_ADDRESS_INVALID",
1897 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SERVER_ADDRESS_INVALID))),
1898 DECLARE_NAPI_STATIC_PROPERTY(
1899 "RESULT_GET_BOUND_PROFILE_PACKAGE_FAILED",
1900 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_GET_BOUND_PROFILE_PACKAGE_FAILED))),
1901 DECLARE_NAPI_STATIC_PROPERTY(
1902 "RESULT_USER_CANCEL_DOWNLOAD",
1903 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_USER_CANCEL_DOWNLOAD))),
1904 DECLARE_NAPI_STATIC_PROPERTY(
1905 "RESULT_SERVER_UNAVAILABLE",
1906 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SERVER_UNAVAILABLE))),
1907 DECLARE_NAPI_STATIC_PROPERTY(
1908 "RESULT_PROFILE_NON_DELETE",
1909 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_PROFILE_NON_DELETE))),
1910 DECLARE_NAPI_STATIC_PROPERTY(
1911 "RESULT_SMDP_ADDRESS_INCORRECT",
1912 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SMDP_ADDRESS_INCORRECT))),
1913 DECLARE_NAPI_STATIC_PROPERTY(
1914 "RESULT_ANALYZE_AUTHENTICATION_SERVER_RESPONSE_FAILED",
1915 GetNapiValue(env,
1916 static_cast<int32_t>(EsimResultCode::RESULT_ANALYZE_AUTHENTICATION_SERVER_RESPONSE_FAILED))),
1917 DECLARE_NAPI_STATIC_PROPERTY(
1918 "RESULT_ANALYZE_AUTHENTICATION_CLIENT_RESPONSE_FAILED",
1919 GetNapiValue(env,
1920 static_cast<int32_t>(EsimResultCode::RESULT_ANALYZE_AUTHENTICATION_CLIENT_RESPONSE_FAILED))),
1921 DECLARE_NAPI_STATIC_PROPERTY(
1922 "RESULT_ANALYZE_AUTHENTICATION_CLIENT_MATCHING_ID_REFUSED",
1923 GetNapiValue(
1924 env, static_cast<int32_t>(EsimResultCode::RESULT_ANALYZE_AUTHENTICATION_CLIENT_MATCHING_ID_REFUSED))),
1925 DECLARE_NAPI_STATIC_PROPERTY(
1926 "RESULT_PROFILE_TYPE_ERROR_AUTHENTICATION_STOPPED",
1927 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_PROFILE_TYPE_ERROR_AUTHENTICATION_STOPPED))),
1928 DECLARE_NAPI_STATIC_PROPERTY(
1929 "RESULT_CARRIER_SERVER_REFUSED_ERRORS",
1930 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CARRIER_SERVER_REFUSED_ERRORS))),
1931 DECLARE_NAPI_STATIC_PROPERTY(
1932 "RESULT_CERTIFICATE_INVALID",
1933 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CERTIFICATE_INVALID))),
1934 DECLARE_NAPI_STATIC_PROPERTY(
1935 "RESULT_OUT_OF_MEMORY",
1936 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_OUT_OF_MEMORY))),
1937 DECLARE_NAPI_STATIC_PROPERTY(
1938 "RESULT_PPR_FORBIDDEN", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_PPR_FORBIDDEN))),
1939 DECLARE_NAPI_STATIC_PROPERTY(
1940 "RESULT_NOTHING_TO_DELETE", GetNapiValue(env,
1941 static_cast<int32_t>(EsimResultCode::RESULT_NOTHING_TO_DELETE))),
1942 DECLARE_NAPI_STATIC_PROPERTY(
1943 "RESULT_PPR_NOT_MATCH", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_PPR_NOT_MATCH))),
1944 DECLARE_NAPI_STATIC_PROPERTY(
1945 "RESULT_CAT_BUSY", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_CAT_BUSY))),
1946 DECLARE_NAPI_STATIC_PROPERTY(
1947 "RESULT_PROFILE_EID_INVALID",
1948 GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_PROFILE_EID_INVALID))),
1949 DECLARE_NAPI_STATIC_PROPERTY(
1950 "RESULT_DOWNLOAD_TIMEOUT", GetNapiValue(env,
1951 static_cast<int32_t>(EsimResultCode::RESULT_DOWNLOAD_TIMEOUT))),
1952 DECLARE_NAPI_STATIC_PROPERTY(
1953 "RESULT_SGP_22_OTHER", GetNapiValue(env, static_cast<int32_t>(EsimResultCode::RESULT_SGP_22_OTHER))),
1954 };
1955
1956 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1957 NapiUtil::DefineEnumClassByName(env, exports, "ResultCode", arrSize, desc);
1958 return napi_define_properties(env, exports, arrSize, desc);
1959 }
1960
InitEnumResolvableErrors(napi_env env,napi_value exports)1961 napi_status InitEnumResolvableErrors(napi_env env, napi_value exports)
1962 {
1963 napi_property_descriptor desc[] = {
1964 DECLARE_NAPI_STATIC_PROPERTY("SOLVABLE_ERROR_NEED_CONFIRMATION_CODE",
1965 GetNapiValue(env, static_cast<int32_t>(SolvableErrors::SOLVABLE_ERROR_NEED_CONFIRMATION_CODE))),
1966 DECLARE_NAPI_STATIC_PROPERTY("SOLVABLE_ERROR_NEED_POLICY_RULE",
1967 GetNapiValue(env, static_cast<int32_t>(SolvableErrors::SOLVABLE_ERROR_NEED_POLICY_RULE))),
1968 };
1969
1970 constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
1971 NapiUtil::DefineEnumClassByName(env, exports, "SolvableErrors", arrSize, desc);
1972 return napi_define_properties(env, exports, arrSize, desc);
1973 }
1974
InitEuiccServiceInterface(napi_env env,napi_value exports)1975 napi_status InitEuiccServiceInterface(napi_env env, napi_value exports)
1976 {
1977 napi_property_descriptor desc[] = {
1978 DECLARE_NAPI_FUNCTION("isSupported", IsSupported),
1979 DECLARE_NAPI_FUNCTION("addProfile", AddProfile),
1980 DECLARE_NAPI_FUNCTION("getEid", GetEid),
1981 DECLARE_NAPI_FUNCTION("getOsuStatus", GetOsuStatus),
1982 DECLARE_NAPI_FUNCTION("startOsu", StartOsu),
1983 DECLARE_NAPI_FUNCTION("getDownloadableProfileMetadata", GetDownloadableProfileMetadata),
1984 DECLARE_NAPI_FUNCTION("getDownloadableProfiles", GetDownloadableProfiles),
1985 DECLARE_NAPI_FUNCTION("downloadProfile", DownloadProfile),
1986 DECLARE_NAPI_FUNCTION("getEuiccProfileInfoList", GetEuiccProfileInfoList),
1987 DECLARE_NAPI_FUNCTION("getEuiccInfo", GetEuiccInfo),
1988 DECLARE_NAPI_FUNCTION("deleteProfile", DeleteProfile),
1989 DECLARE_NAPI_FUNCTION("switchToProfile", SwitchToProfile),
1990 DECLARE_NAPI_FUNCTION("setProfileNickname", SetProfileNickname),
1991 DECLARE_NAPI_FUNCTION("resetMemory", ResetMemory),
1992 DECLARE_NAPI_FUNCTION("reserveProfilesForFactoryRestore", ReserveProfilesForFactoryRestore),
1993 DECLARE_NAPI_FUNCTION("setDefaultSmdpAddress", SetDefaultSmdpAddress),
1994 DECLARE_NAPI_FUNCTION("getDefaultSmdpAddress", GetDefaultSmdpAddress),
1995 DECLARE_NAPI_FUNCTION("cancelSession", CancelSession),
1996 DECLARE_NAPI_FUNCTION("getSupportedPkids", GetSupportedPkids),
1997 DECLARE_NAPI_FUNCTION("getContractInfo", GetContractInfo),
1998 };
1999 return napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
2000 }
2001 } // namespace
2002
2003 EXTERN_C_START
InitNapiEsim(napi_env env,napi_value exports)2004 napi_value InitNapiEsim(napi_env env, napi_value exports)
2005 {
2006 NAPI_CALL(env, InitEuiccServiceInterface(env, exports));
2007 NAPI_CALL(env, InitEnumResetOption(env, exports));
2008 NAPI_CALL(env, InitEnumCancelReason(env, exports));
2009 NAPI_CALL(env, InitEnumOsuStatus(env, exports));
2010 NAPI_CALL(env, InitEnumProfileState(env, exports));
2011 NAPI_CALL(env, InitEnumProfileClass(env, exports));
2012 NAPI_CALL(env, InitEnumPolicyRules(env, exports));
2013 NAPI_CALL(env, InitEnumResultCode(env, exports));
2014 NAPI_CALL(env, InitEnumResolvableErrors(env, exports));
2015 return exports;
2016 }
2017 EXTERN_C_END
2018
2019 static napi_module _esimModule = {
2020 .nm_version = 1,
2021 .nm_flags = 0,
2022 .nm_filename = nullptr,
2023 .nm_register_func = InitNapiEsim,
2024 .nm_modname = "telephony.esim",
2025 .nm_priv = ((void *)0),
2026 .reserved = {0},
2027 };
2028
RegisterEsimCardModule(void)2029 extern "C" __attribute__((constructor)) void RegisterEsimCardModule(void)
2030 {
2031 napi_module_register(&_esimModule);
2032 }
2033 } // namespace Telephony
2034 } // namespace OHOS