• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &para, 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, &parameterCount, 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