• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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_sim.h"
17 
18 #include <memory>
19 #include <string>
20 #include <string_view>
21 
22 #include "core_service_client.h"
23 #include "napi_parameter_util.h"
24 #include "napi_sim_type.h"
25 #include "napi_util.h"
26 #include "network_state.h"
27 #include "sim_state_type.h"
28 #include "telephony_log_wrapper.h"
29 #include "telephony_permission.h"
30 
31 namespace OHOS {
32 namespace Telephony {
33 namespace {
34 constexpr const char *CHINA_TELECOM_CARD = "china_telecom_card";
35 constexpr const char *JS_ERROR_TELEPHONY_ARGUMENT_ERROR_STRING = "Invalid parameter value.";
36 std::mutex mtx;
37 const int32_t PARAMETER_COUNT_ZERO = 0;
38 const int32_t PARAMETER_COUNT_ONE = 1;
39 const int32_t PARAMETER_COUNT_TWO = 2;
40 struct AsyncPara {
41     std::string funcName = "";
42     napi_env env = nullptr;
43     napi_callback_info info = nullptr;
44     napi_async_execute_callback execute = nullptr;
45     napi_async_complete_callback complete = nullptr;
46 };
47 struct PermissionPara {
48     std::string func = "";
49     std::string permission = "";
50 };
51 
IsValidSlotId(int32_t slotId)52 static inline bool IsValidSlotId(int32_t slotId)
53 {
54     return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
55 }
56 
IsValidSlotIdEx(int32_t slotId)57 static inline bool IsValidSlotIdEx(int32_t slotId)
58 {
59     // One more slot for VSim.
60     return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT + 1));
61 }
62 
IsValidSlotIdForDefault(int32_t slotId)63 static inline bool IsValidSlotIdForDefault(int32_t slotId)
64 {
65     return ((slotId >= DEFAULT_SIM_SLOT_ID_REMOVE) && (slotId < SIM_SLOT_COUNT));
66 }
67 
68 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)69 napi_value NapiCreateAsyncWork(napi_env env, napi_callback_info info, std::string_view funcName)
70 {
71     size_t argc = 2;
72     napi_value argv[] {nullptr, nullptr};
73     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
74 
75     std::unique_ptr<AsyncContext<T>> asyncContext = std::make_unique<AsyncContext<T>>();
76     BaseContext &context = asyncContext->context;
77     auto inParaTp = std::make_tuple(&asyncContext->slotId, &context.callbackRef);
78     std::optional<NapiError> errCode = MatchParameters(env, argv, argc, inParaTp);
79     if (errCode.has_value()) {
80         JsError error = NapiUtil::ConverErrorMessageForJs(errCode.value());
81         NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
82         return nullptr;
83     }
84 
85     napi_value result = nullptr;
86     if (context.callbackRef == nullptr) {
87         NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
88     } else {
89         NAPI_CALL(env, napi_get_undefined(env, &result));
90     }
91 
92     napi_value resourceName = nullptr;
93     NAPI_CALL(env, napi_create_string_utf8(env, funcName.data(), funcName.length(), &resourceName));
94     AsyncContext<T> *pContext = asyncContext.release();
95     NAPI_CALL(env,
96         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     napi_env env = para.env;
109     BaseContext &context = asyncContext->asyncContext.context;
110 
111     size_t argc = sizeof...(Ts);
112     napi_value argv[sizeof...(Ts)] {nullptr};
113     NAPI_CALL(env, napi_get_cb_info(env, para.info, &argc, argv, nullptr, nullptr));
114 
115     std::optional<NapiError> errCode = MatchParameters(env, argv, argc, theTuple);
116     if (errCode.has_value()) {
117         JsError error = NapiUtil::ConverErrorMessageForJs(errCode.value());
118         NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
119         delete asyncContext;
120         asyncContext = nullptr;
121         return nullptr;
122     }
123 
124     napi_value result = nullptr;
125     if (context.callbackRef == nullptr) {
126         NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
127     } else {
128         NAPI_CALL(env, napi_get_undefined(env, &result));
129     }
130 
131     napi_value resourceName = nullptr;
132     NAPI_CALL(env, napi_create_string_utf8(env, para.funcName.c_str(), para.funcName.length(), &resourceName));
133     NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, para.execute, para.complete,
134             static_cast<void *>(asyncContext), &context.work));
135     return result;
136 }
137 
138 template<typename AsyncContextType, typename... Ts>
NapiCreateAsyncWork3(const AsyncPara & para,AsyncContextType * asyncContext,std::tuple<Ts...> & theTuple)139 napi_value NapiCreateAsyncWork3(const AsyncPara &para, AsyncContextType *asyncContext, std::tuple<Ts...> &theTuple)
140 {
141     napi_env env = para.env;
142     BaseContext &context = asyncContext->asyncContext.context;
143     size_t parameterCount = 1;
144     napi_value parameters[] = { nullptr };
145     NAPI_CALL(env, napi_get_cb_info(env, para.info, &parameterCount, parameters, nullptr, nullptr));
146 
147     napi_value result = nullptr;
148     std::optional<NapiError> errCode = MatchParameters(env, parameters, parameterCount, theTuple);
149     if (parameterCount == PARAMETER_COUNT_ZERO) {
150         TELEPHONY_LOGI("parameterCount is zero");
151     } else if (parameterCount == PARAMETER_COUNT_ONE) {
152         napi_valuetype valueType = napi_undefined;
153         NAPI_CALL(env, napi_typeof(env, parameters[0], &valueType));
154         if (valueType == napi_undefined || valueType == napi_null) {
155             TELEPHONY_LOGI("undefined or null parameter detected, treating as no parameter input");
156         } else if (valueType == napi_function) {
157             TELEPHONY_LOGI("napi_function parameter detected");
158         } else {
159             if (errCode.has_value()) {
160                 JsError error = NapiUtil::ConverErrorMessageForJs(errCode.value());
161                 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
162                 delete asyncContext;
163                 asyncContext = nullptr;
164                 return nullptr;
165             }
166         }
167     } else if (parameterCount >= PARAMETER_COUNT_TWO) {
168         if (errCode.has_value()) {
169             JsError error = NapiUtil::ConverErrorMessageForJs(errCode.value());
170             NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
171             delete asyncContext;
172             asyncContext = nullptr;
173             return nullptr;
174         }
175     }
176 
177     if (context.callbackRef == nullptr) {
178         NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
179     } else {
180         NAPI_CALL(env, napi_get_undefined(env, &result));
181     }
182 
183     napi_value resourceName = nullptr;
184     NAPI_CALL(env, napi_create_string_utf8(env, para.funcName.c_str(), para.funcName.length(), &resourceName));
185     NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, para.execute, para.complete,
186                        static_cast<void *>(asyncContext), &context.work));
187     return result;
188 }
189 
190 template<typename T>
NapiAsyncCompleteCallback(napi_env env,napi_status status,const AsyncContext<T> & asyncContext,const std::string & errMessage,bool funcIgnoreReturnVal=false,int errorCode=ERROR_DEFAULT)191 void NapiAsyncCompleteCallback(napi_env env, napi_status status, const AsyncContext<T> &asyncContext,
192     const std::string &errMessage, bool funcIgnoreReturnVal = false, int errorCode = ERROR_DEFAULT)
193 {
194     if (status != napi_ok) {
195         napi_throw_type_error(env, nullptr, "excute failed");
196         return;
197     }
198 
199     const BaseContext &context = asyncContext.context;
200     if (context.deferred != nullptr) {
201         if (!context.resolved) {
202             napi_value errorMessage = NapiUtil::CreateErrorMessage(env, errMessage, errorCode);
203             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, context.deferred, errorMessage));
204         } else {
205             napi_value res =
206                 (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
207             NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, context.deferred, res));
208         }
209     } else {
210         napi_value res =
211             (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
212         napi_value callbackValue[] {NapiUtil::CreateUndefined(env), res};
213         if (!context.resolved) {
214             callbackValue[0] = NapiUtil::CreateErrorMessage(env, errMessage, errorCode);
215             callbackValue[1] = NapiUtil::CreateUndefined(env);
216         }
217         napi_value undefined = nullptr;
218         napi_value callback = nullptr;
219         napi_value result = nullptr;
220         NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
221         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, context.callbackRef, &callback));
222         NAPI_CALL_RETURN_VOID(
223             env, napi_call_function(env, undefined, callback, std::size(callbackValue), callbackValue, &result));
224         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, context.callbackRef));
225     }
226     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
227 }
228 
229 template<typename T>
NapiAsyncBaseCompleteCallback(napi_env env,const AsyncContext<T> & asyncContext,JsError error,bool funcIgnoreReturnVal=false)230 void NapiAsyncBaseCompleteCallback(
231     napi_env env, const AsyncContext<T> &asyncContext, JsError error, bool funcIgnoreReturnVal = false)
232 {
233     const BaseContext &context = asyncContext.context;
234     if (context.deferred != nullptr && !context.resolved) {
235         napi_value errorMessage = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
236         NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, context.deferred, errorMessage));
237         NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
238         TELEPHONY_LOGE("NapiAsyncBaseCompleteCallback deferred error and resolved is false");
239         return;
240     }
241 
242     if (context.deferred != nullptr && context.resolved) {
243         napi_value res =
244             (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
245         NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, context.deferred, res));
246         NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
247         TELEPHONY_LOGE("NapiAsyncBaseCompleteCallback deferred error and resolved is true");
248         return;
249     }
250 
251     napi_value res =
252         (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
253     napi_value callbackValue[] { NapiUtil::CreateUndefined(env), res };
254     if (!context.resolved) {
255         callbackValue[0] = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
256         callbackValue[1] = NapiUtil::CreateUndefined(env);
257     }
258     napi_value undefined = nullptr;
259     napi_value callback = nullptr;
260     napi_value result = nullptr;
261     NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
262     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, context.callbackRef, &callback));
263     NAPI_CALL_RETURN_VOID(
264         env, napi_call_function(env, undefined, callback, std::size(callbackValue), callbackValue, &result));
265     NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, context.callbackRef));
266     NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
267 }
268 
269 template<typename T>
NapiAsyncPermissionCompleteCallback(napi_env env,napi_status status,const AsyncContext<T> & asyncContext,bool funcIgnoreReturnVal,PermissionPara permissionPara)270 void NapiAsyncPermissionCompleteCallback(napi_env env, napi_status status, const AsyncContext<T> &asyncContext,
271     bool funcIgnoreReturnVal, PermissionPara permissionPara)
272 {
273     if (status != napi_ok) {
274         napi_throw_type_error(env, nullptr, "excute failed");
275         return;
276     }
277 
278     JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
279         asyncContext.context.errorCode, permissionPara.func, permissionPara.permission);
280     NapiAsyncBaseCompleteCallback(env, asyncContext, error, funcIgnoreReturnVal);
281 }
282 
283 template<typename T>
NapiAsyncCommomCompleteCallback(napi_env env,napi_status status,const AsyncContext<T> & asyncContext,bool funcIgnoreReturnVal)284 void NapiAsyncCommomCompleteCallback(
285     napi_env env, napi_status status, const AsyncContext<T> &asyncContext, bool funcIgnoreReturnVal)
286 {
287     if (status != napi_ok) {
288         napi_throw_type_error(env, nullptr, "excute failed");
289         return;
290     }
291 
292     JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext.context.errorCode);
293     NapiAsyncBaseCompleteCallback(env, asyncContext, error, funcIgnoreReturnVal);
294 }
295 
IccAccountInfoConversion(napi_env env,const IccAccountInfo & iccAccountInfo)296 napi_value IccAccountInfoConversion(napi_env env, const IccAccountInfo &iccAccountInfo)
297 {
298     napi_value val = nullptr;
299     napi_create_object(env, &val);
300     SetPropertyToNapiObject(env, val, "simId", iccAccountInfo.simId);
301     SetPropertyToNapiObject(env, val, "slotIndex", iccAccountInfo.slotIndex);
302     SetPropertyToNapiObject(env, val, "isEsim", iccAccountInfo.isEsim);
303     SetPropertyToNapiObject(env, val, "isActive", iccAccountInfo.isActive);
304     SetPropertyToNapiObject(env, val, "iccId", NapiUtil::ToUtf8(iccAccountInfo.iccId));
305     SetPropertyToNapiObject(env, val, "showName", NapiUtil::ToUtf8(iccAccountInfo.showName));
306     SetPropertyToNapiObject(env, val, "showNumber", NapiUtil::ToUtf8(iccAccountInfo.showNumber));
307     return val;
308 }
309 
PinOrPukUnlockConversion(napi_env env,const LockStatusResponse & response)310 napi_value PinOrPukUnlockConversion(napi_env env, const LockStatusResponse &response)
311 {
312     TELEPHONY_LOGI("PinOrPukUnlockConversion response.result %{public}d, response.remain %{public}d", response.result,
313         response.remain);
314     constexpr int32_t passWordErr = -1;
315     napi_value val = nullptr;
316     napi_create_object(env, &val);
317     SetPropertyToNapiObject(env, val, "result", response.result);
318     napi_value res =
319         (response.result == passWordErr ? GetNapiValue(env, response.remain) : NapiUtil::CreateUndefined(env));
320     napi_set_named_property(env, val, "remain", res);
321     return val;
322 }
323 
OperatorConfigAnalyze(napi_env env,const ConfigInfo & config)324 napi_value OperatorConfigAnalyze(napi_env env, const ConfigInfo &config)
325 {
326     napi_value obj = nullptr;
327     napi_create_object(env, &obj);
328     SetPropertyToNapiObject(env, obj, "field", config.field);
329     SetPropertyToNapiObject(env, obj, "value", config.value);
330     return obj;
331 }
332 
DiallingNumbersConversion(napi_env env,const TelNumbersInfo & info)333 napi_value DiallingNumbersConversion(napi_env env, const TelNumbersInfo &info)
334 {
335     napi_value val = nullptr;
336     napi_create_object(env, &val);
337     SetPropertyToNapiObject(env, val, "recordNumber", info.recordNumber);
338     SetPropertyToNapiObject(env, val, "alphaTag", std::data(info.alphaTag));
339     SetPropertyToNapiObject(env, val, "number", std::data(info.number));
340     SetPropertyToNapiObject(env, val, "pin2", std::data(info.pin2));
341     return val;
342 }
343 
SimAuthResultConversion(napi_env env,const SimAuthenticationResponse & responseResult)344 napi_value SimAuthResultConversion(napi_env env, const SimAuthenticationResponse &responseResult)
345 {
346     napi_value val = nullptr;
347     napi_create_object(env, &val);
348     NapiUtil::SetPropertyInt32(env, val, "sw1", responseResult.sw1);
349     NapiUtil::SetPropertyInt32(env, val, "sw2", responseResult.sw2);
350     NapiUtil::SetPropertyInt32(env, val, "simStatusWord1", responseResult.sw1);
351     NapiUtil::SetPropertyInt32(env, val, "simStatusWord2", responseResult.sw2);
352     NapiUtil::SetPropertyStringUtf8(env, val, "response", responseResult.response);
353     return val;
354 }
355 
GetDiallingNumberInfo(const std::shared_ptr<DiallingNumbersInfo> & telNumber,const TelNumbersInfo & info)356 void GetDiallingNumberInfo(const std::shared_ptr<DiallingNumbersInfo> &telNumber, const TelNumbersInfo &info)
357 {
358     telNumber->index_ = info.recordNumber;
359     telNumber->name_ = NapiUtil::ToUtf16(info.alphaTag.data());
360     telNumber->number_ = NapiUtil::ToUtf16(info.number.data());
361     telNumber->pin2_ = NapiUtil::ToUtf16(info.pin2.data());
362 }
363 
DiallingNumberParaAnalyze(napi_env env,napi_value arg,TelNumbersInfo & info)364 void DiallingNumberParaAnalyze(napi_env env, napi_value arg, TelNumbersInfo &info)
365 {
366     napi_value recordNumber = NapiUtil::GetNamedProperty(env, arg, "recordNumber");
367     if (recordNumber) {
368         NapiValueToCppValue(env, recordNumber, napi_number, &info.recordNumber);
369     }
370 
371     napi_value alphaTag = NapiUtil::GetNamedProperty(env, arg, "alphaTag");
372     if (alphaTag) {
373         NapiValueToCppValue(env, alphaTag, napi_string, std::data(info.alphaTag));
374     }
375 
376     napi_value number = NapiUtil::GetNamedProperty(env, arg, "number");
377     if (number) {
378         NapiValueToCppValue(env, number, napi_string, std::data(info.number));
379     }
380 
381     napi_value pin2 = NapiUtil::GetNamedProperty(env, arg, "pin2");
382     if (pin2) {
383         NapiValueToCppValue(env, pin2, napi_string, std::data(info.pin2));
384     }
385 }
386 
PinInfoParaAnalyze(napi_env env,napi_value arg,AsyncContextPIN & pinContext)387 void PinInfoParaAnalyze(napi_env env, napi_value arg, AsyncContextPIN &pinContext)
388 {
389     napi_value lockType = NapiUtil::GetNamedProperty(env, arg, "lockType");
390     if (lockType) {
391         NapiValueToCppValue(env, lockType, napi_number, &pinContext.result);
392     }
393 
394     napi_value pin = NapiUtil::GetNamedProperty(env, arg, "password");
395     if (pin) {
396         char tmpStr[ARRAY_SIZE] = {0};
397         NapiValueToCppValue(env, pin, napi_string, tmpStr);
398         pinContext.inStr1 = std::string(tmpStr);
399     }
400 
401     napi_value state = NapiUtil::GetNamedProperty(env, arg, "state");
402     if (state) {
403         NapiValueToCppValue(env, state, napi_number, &pinContext.remain);
404     }
405 }
406 
PersoLockInfoAnalyze(napi_env env,napi_value arg,AsyncContextPIN & pinContext)407 void PersoLockInfoAnalyze(napi_env env, napi_value arg, AsyncContextPIN &pinContext)
408 {
409     napi_value lockType = NapiUtil::GetNamedProperty(env, arg, "lockType");
410     if (lockType) {
411         NapiValueToCppValue(env, lockType, napi_number, &pinContext.pinEnable);
412     }
413 
414     napi_value password = NapiUtil::GetNamedProperty(env, arg, "password");
415     if (password) {
416         char tmpStr[ARRAY_SIZE] = {0};
417         NapiValueToCppValue(env, password, napi_string, tmpStr);
418         pinContext.inStr1 = std::string(tmpStr);
419     }
420 }
421 
NativeIsSimActive(napi_env env,void * data)422 void NativeIsSimActive(napi_env env, void *data)
423 {
424     if (data == nullptr) {
425         return;
426     }
427     AsyncContext<bool> *reVal = static_cast<AsyncContext<bool> *>(data);
428     if (!IsValidSlotId(reVal->slotId)) {
429         TELEPHONY_LOGE("NativeIsSimActive slotId is invalid");
430         reVal->context.errorCode = ERROR_SLOT_ID_INVALID;
431         return;
432     }
433     reVal->callbackVal = DelayedRefSingleton<CoreServiceClient>::GetInstance().IsSimActive(reVal->slotId);
434     TELEPHONY_LOGI("NAPI NativeIsSimActive %{public}d", reVal->callbackVal);
435     /* transparent return value */
436     reVal->context.resolved = true;
437 }
438 
IsSimActiveCallback(napi_env env,napi_status status,void * data)439 void IsSimActiveCallback(napi_env env, napi_status status, void *data)
440 {
441     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
442     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
443     if (context->context.errorCode == ERROR_SLOT_ID_INVALID) {
444         NapiAsyncCompleteCallback(
445             env, status, *context, JS_ERROR_TELEPHONY_ARGUMENT_ERROR_STRING, false, JS_ERROR_TELEPHONY_ARGUMENT_ERROR);
446     } else {
447         NapiAsyncCompleteCallback(env, status, *context, "get simActive state failed");
448     }
449 }
450 
IsSimActive(napi_env env,napi_callback_info info)451 napi_value IsSimActive(napi_env env, napi_callback_info info)
452 {
453     return NapiCreateAsyncWork<bool, NativeIsSimActive, IsSimActiveCallback>(env, info, "IsSimActive");
454 }
455 
IsSimActiveSync(napi_env env,napi_callback_info info)456 napi_value IsSimActiveSync(napi_env env, napi_callback_info info)
457 {
458     size_t parameterCount = 1;
459     napi_value parameters[] = { nullptr };
460     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
461     bool isSimActive = false;
462     napi_value value = nullptr;
463     if (parameterCount != 1) {
464         TELEPHONY_LOGE("parameter count is incorrect");
465         NAPI_CALL(env, napi_create_int32(env, isSimActive, &value));
466         return value;
467     }
468     int32_t slotId = -1;
469     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
470         TELEPHONY_LOGE("convert parameter fail");
471         NAPI_CALL(env, napi_create_int32(env, isSimActive, &value));
472         return value;
473     }
474     if (IsValidSlotId(slotId)) {
475         isSimActive = DelayedRefSingleton<CoreServiceClient>::GetInstance().IsSimActive(slotId);
476     }
477     NAPI_CALL(env, napi_get_boolean(env, isSimActive, &value));
478     return value;
479 }
480 
NativeActivateSim(napi_env env,void * data)481 void NativeActivateSim(napi_env env, void *data)
482 {
483     if (data == nullptr) {
484         return;
485     }
486     AsyncContext<bool> *simContext = static_cast<AsyncContext<bool> *>(data);
487     if (!IsValidSlotId(simContext->slotId)) {
488         TELEPHONY_LOGE("NativeActivateSim slotId is invalid");
489         simContext->context.errorCode = ERROR_SLOT_ID_INVALID;
490         return;
491     }
492     constexpr int32_t active = 1;
493     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SetActiveSim(simContext->slotId, active);
494     TELEPHONY_LOGI("NAPI NativeActivateSim %{public}d", errorCode);
495     simContext->context.errorCode = errorCode;
496     simContext->context.resolved = (errorCode == ERROR_NONE);
497 }
498 
ActivateSimCallback(napi_env env,napi_status status,void * data)499 void ActivateSimCallback(napi_env env, napi_status status, void *data)
500 {
501     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
502     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
503     NapiAsyncPermissionCompleteCallback(
504         env, status, *context, true, { "ActivateSim", Permission::SET_TELEPHONY_STATE });
505 }
506 
ActivateSim(napi_env env,napi_callback_info info)507 napi_value ActivateSim(napi_env env, napi_callback_info info)
508 {
509     return NapiCreateAsyncWork<bool, NativeActivateSim, ActivateSimCallback>(env, info, "ActivateSim");
510 }
511 
NativeDeactivateSim(napi_env env,void * data)512 void NativeDeactivateSim(napi_env env, void *data)
513 {
514     if (data == nullptr) {
515         return;
516     }
517     AsyncContext<bool> *simContext = static_cast<AsyncContext<bool> *>(data);
518     if (!IsValidSlotId(simContext->slotId)) {
519         TELEPHONY_LOGE("NativeDeactivateSim slotId is invalid");
520         simContext->context.errorCode = ERROR_SLOT_ID_INVALID;
521         return;
522     }
523     constexpr int32_t deactive = 0;
524     int32_t errorCode =
525         DelayedRefSingleton<CoreServiceClient>::GetInstance().SetActiveSim(simContext->slotId, deactive);
526     TELEPHONY_LOGI("NAPI NativeDeactivateSim %{public}d", errorCode);
527     simContext->context.errorCode = errorCode;
528     simContext->context.resolved = (errorCode == ERROR_NONE);
529 }
530 
DeactivateSimCallback(napi_env env,napi_status status,void * data)531 void DeactivateSimCallback(napi_env env, napi_status status, void *data)
532 {
533     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
534     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
535     NapiAsyncPermissionCompleteCallback(
536         env, status, *context, true, { "DeactivateSim", Permission::SET_TELEPHONY_STATE });
537 }
538 
DeactivateSim(napi_env env,napi_callback_info info)539 napi_value DeactivateSim(napi_env env, napi_callback_info info)
540 {
541     return NapiCreateAsyncWork<bool, NativeDeactivateSim, DeactivateSimCallback>(env, info, "DeactivateSim");
542 }
543 
NativeGetDefaultVoiceSlotId(napi_env env,void * data)544 void NativeGetDefaultVoiceSlotId(napi_env env, void *data)
545 {
546     if (data == nullptr) {
547         return;
548     }
549     AsyncContext<int32_t> *asyncContext = &(static_cast<AsyncDefaultSlotId *>(data)->asyncContext);
550 
551     asyncContext->callbackVal = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDefaultVoiceSlotId();
552     TELEPHONY_LOGI("NAPI NativeGetDefaultVoiceSlotId %{public}d", asyncContext->callbackVal);
553     asyncContext->context.resolved = (asyncContext->callbackVal > ERROR_DEFAULT);
554 }
555 
GetDefaultVoiceSlotIdCallback(napi_env env,napi_status status,void * data)556 void GetDefaultVoiceSlotIdCallback(napi_env env, napi_status status, void *data)
557 {
558     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
559     std::unique_ptr<AsyncDefaultSlotId> context(static_cast<AsyncDefaultSlotId *>(data));
560     NapiAsyncCompleteCallback(env, status, context->asyncContext, "get default voice slot id failed");
561 }
562 
GetDefaultVoiceSlotId(napi_env env,napi_callback_info info)563 napi_value GetDefaultVoiceSlotId(napi_env env, napi_callback_info info)
564 {
565     auto asyncContext = new AsyncDefaultSlotId();
566     BaseContext &context = asyncContext->asyncContext.context;
567 
568     auto initPara = std::make_tuple(&context.callbackRef);
569     AsyncPara para {
570         .funcName = "GetDefaultVoiceSlotId",
571         .env = env,
572         .info = info,
573         .execute = NativeGetDefaultVoiceSlotId,
574         .complete = GetDefaultVoiceSlotIdCallback,
575     };
576     napi_value result = NapiCreateAsyncWork2<AsyncDefaultSlotId>(para, asyncContext, initPara);
577     if (result) {
578         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_user_initiated));
579     }
580     return result;
581 }
582 
NativeGetDefaultVoiceSimId(napi_env env,void * data)583 void NativeGetDefaultVoiceSimId(napi_env env, void *data)
584 {
585     if (data == nullptr) {
586         return;
587     }
588 
589     AsyncContext<int32_t> *asyncContext = &(static_cast<AsyncDefaultSimId *>(data)->asyncContext);
590     int32_t simId = 0;
591     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDefaultVoiceSimId(simId);
592     TELEPHONY_LOGI("error: %{public}d", errorCode);
593     if (errorCode == ERROR_NONE) {
594         asyncContext->callbackVal = simId;
595         asyncContext->context.resolved = true;
596     } else {
597         asyncContext->context.resolved = false;
598     }
599     asyncContext->context.errorCode = errorCode;
600 }
601 
GetDefaultVoiceSimIdCallback(napi_env env,napi_status status,void * data)602 void GetDefaultVoiceSimIdCallback(napi_env env, napi_status status, void *data)
603 {
604     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
605     std::unique_ptr<AsyncDefaultSimId> context(static_cast<AsyncDefaultSimId *>(data));
606     NapiAsyncCommomCompleteCallback(env, status, context->asyncContext, false);
607 }
608 
GetDefaultVoiceSimId(napi_env env,napi_callback_info info)609 napi_value GetDefaultVoiceSimId(napi_env env, napi_callback_info info)
610 {
611     auto asyncContext = new AsyncDefaultSimId();
612     BaseContext &context = asyncContext->asyncContext.context;
613 
614     auto initPara = std::make_tuple(&context.callbackRef);
615     AsyncPara para {
616         .funcName = "GetDefaultVoiceSimId",
617         .env = env,
618         .info = info,
619         .execute = NativeGetDefaultVoiceSimId,
620         .complete = GetDefaultVoiceSimIdCallback,
621     };
622     napi_value result = NapiCreateAsyncWork2<AsyncDefaultSimId>(para, asyncContext, initPara);
623     if (result) {
624         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
625     }
626     return result;
627 }
628 
NativeGetIsoForSim(napi_env env,void * data)629 void NativeGetIsoForSim(napi_env env, void *data)
630 {
631     if (data == nullptr) {
632         return;
633     }
634     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
635     if (!IsValidSlotId(asyncContext->slotId)) {
636         TELEPHONY_LOGE("NativeGetIsoForSim slotId is invalid");
637         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
638         return;
639     }
640     std::u16string countryCode;
641     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetISOCountryCodeForSim(
642         asyncContext->slotId, countryCode);
643     if (errorCode == ERROR_NONE) {
644         asyncContext->callbackVal = NapiUtil::ToUtf8(countryCode);
645         asyncContext->context.resolved = true;
646     } else {
647         asyncContext->context.resolved = false;
648     }
649     TELEPHONY_LOGI("NAPI NativeGetIsoForSim %{public}d", errorCode);
650     asyncContext->context.errorCode = errorCode;
651 }
652 
GetIsoForSimCallback(napi_env env,napi_status status,void * data)653 void GetIsoForSimCallback(napi_env env, napi_status status, void *data)
654 {
655     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
656     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
657     NapiAsyncCommomCompleteCallback(env, status, *context, false);
658 }
659 
GetISOCountryCodeForSim(napi_env env,napi_callback_info info)660 napi_value GetISOCountryCodeForSim(napi_env env, napi_callback_info info)
661 {
662     return NapiCreateAsyncWork<std::string, NativeGetIsoForSim, GetIsoForSimCallback>(
663         env, info, "GetISOCountryCodeForSim");
664 }
665 
GetISOCountryCodeForSimSync(napi_env env,napi_callback_info info)666 napi_value GetISOCountryCodeForSimSync(napi_env env, napi_callback_info info)
667 {
668     size_t parameterCount = 1;
669     napi_value parameters[] = { nullptr };
670     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
671     std::u16string countryCode;
672     napi_value value = nullptr;
673     if (parameterCount != 1) {
674         TELEPHONY_LOGE("parameter count is incorrect");
675         std::string code = NapiUtil::ToUtf8(countryCode);
676         NAPI_CALL(env, napi_create_string_utf8(env, code.c_str(), code.length(), &value));
677         return value;
678     }
679     int32_t slotId = -1;
680     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
681         TELEPHONY_LOGE("convert parameter fail");
682         std::string code = NapiUtil::ToUtf8(countryCode);
683         NAPI_CALL(env, napi_create_string_utf8(env, code.c_str(), code.length(), &value));
684         return value;
685     }
686     if (IsValidSlotId(slotId)) {
687         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetISOCountryCodeForSim(slotId, countryCode);
688     }
689     std::string code = NapiUtil::ToUtf8(countryCode);
690     NAPI_CALL(env, napi_create_string_utf8(env, code.c_str(), code.length(), &value));
691     return value;
692 }
693 
NativeGetSimOperatorNumeric(napi_env env,void * data)694 void NativeGetSimOperatorNumeric(napi_env env, void *data)
695 {
696     if (data == nullptr) {
697         return;
698     }
699     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
700     if (!IsValidSlotId(asyncContext->slotId)) {
701         TELEPHONY_LOGE("NativeGetSimOperatorNumeric slotId is invalid");
702         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
703         return;
704     }
705     std::u16string operatorNumeric;
706     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimOperatorNumeric(
707         asyncContext->slotId, operatorNumeric);
708     if (errorCode == ERROR_NONE) {
709         asyncContext->callbackVal = NapiUtil::ToUtf8(operatorNumeric);
710         asyncContext->context.resolved = true;
711     } else {
712         asyncContext->context.resolved = false;
713     }
714     TELEPHONY_LOGI("NAPI NativeGetSimOperatorNumeric %{public}d", errorCode);
715     asyncContext->context.errorCode = errorCode;
716 }
717 
GetSimOperatorNumericCallback(napi_env env,napi_status status,void * data)718 void GetSimOperatorNumericCallback(napi_env env, napi_status status, void *data)
719 {
720     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
721     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
722     NapiAsyncCommomCompleteCallback(env, status, *context, false);
723 }
724 
GetSimOperatorNumeric(napi_env env,napi_callback_info info)725 napi_value GetSimOperatorNumeric(napi_env env, napi_callback_info info)
726 {
727     return NapiCreateAsyncWork<std::string, NativeGetSimOperatorNumeric, GetSimOperatorNumericCallback>(
728         env, info, "GetSimOperatorNumeric");
729 }
730 
GetSimOperatorNumericSync(napi_env env,napi_callback_info info)731 napi_value GetSimOperatorNumericSync(napi_env env, napi_callback_info info)
732 {
733     size_t parameterCount = 1;
734     napi_value parameters[] = { nullptr };
735     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
736     std::u16string operatorNumeric;
737     napi_value value = nullptr;
738     if (parameterCount != 1) {
739         TELEPHONY_LOGE("parameter count is incorrect");
740         std::string numeric = NapiUtil::ToUtf8(operatorNumeric);
741         NAPI_CALL(env, napi_create_string_utf8(env, numeric.c_str(), numeric.length(), &value));
742         return value;
743     }
744     int32_t slotId = -1;
745     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
746         TELEPHONY_LOGE("convert parameter fail");
747         std::string numeric = NapiUtil::ToUtf8(operatorNumeric);
748         NAPI_CALL(env, napi_create_string_utf8(env, numeric.c_str(), numeric.length(), &value));
749         return value;
750     }
751     if (IsValidSlotId(slotId)) {
752         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimOperatorNumeric(slotId, operatorNumeric);
753     }
754     std::string numeric = NapiUtil::ToUtf8(operatorNumeric);
755     NAPI_CALL(env, napi_create_string_utf8(env, numeric.c_str(), numeric.length(), &value));
756     return value;
757 }
758 
NativeGetSimSpn(napi_env env,void * data)759 void NativeGetSimSpn(napi_env env, void *data)
760 {
761     if (data == nullptr) {
762         return;
763     }
764     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
765     if (!IsValidSlotId(asyncContext->slotId)) {
766         TELEPHONY_LOGE("NativeGetSimSpn slotId is invalid");
767         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
768         return;
769     }
770     std::u16string spn;
771     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimSpn(asyncContext->slotId, spn);
772     if (errorCode == ERROR_NONE) {
773         asyncContext->callbackVal = NapiUtil::ToUtf8(spn);
774         asyncContext->context.resolved = true;
775     } else {
776         asyncContext->context.resolved = false;
777     }
778     TELEPHONY_LOGI("NAPI NativeGetSimSpn %{public}d", errorCode);
779     asyncContext->context.errorCode = errorCode;
780 }
781 
GetSimSpnCallback(napi_env env,napi_status status,void * data)782 void GetSimSpnCallback(napi_env env, napi_status status, void *data)
783 {
784     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
785     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
786     NapiAsyncCommomCompleteCallback(env, status, *context, false);
787 }
788 
GetSimSpn(napi_env env,napi_callback_info info)789 napi_value GetSimSpn(napi_env env, napi_callback_info info)
790 {
791     return NapiCreateAsyncWork<std::string, NativeGetSimSpn, GetSimSpnCallback>(env, info, "GetSimSpn");
792 }
793 
GetSimSpnSync(napi_env env,napi_callback_info info)794 napi_value GetSimSpnSync(napi_env env, napi_callback_info info)
795 {
796     size_t parameterCount = 1;
797     napi_value parameters[] = { nullptr };
798     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
799     std::u16string spn;
800     napi_value value = nullptr;
801     if (parameterCount != 1) {
802         TELEPHONY_LOGE("parameter count is incorrect");
803         std::string simSpn = NapiUtil::ToUtf8(spn);
804         NAPI_CALL(env, napi_create_string_utf8(env, simSpn.c_str(), simSpn.length(), &value));
805         return value;
806     }
807     int32_t slotId = -1;
808     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
809         TELEPHONY_LOGE("convert parameter fail");
810         std::string simSpn = NapiUtil::ToUtf8(spn);
811         NAPI_CALL(env, napi_create_string_utf8(env, simSpn.c_str(), simSpn.length(), &value));
812         return value;
813     }
814     if (IsValidSlotId(slotId)) {
815         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimSpn(slotId, spn);
816     }
817     std::string simSpn = NapiUtil::ToUtf8(spn);
818     NAPI_CALL(env, napi_create_string_utf8(env, simSpn.c_str(), simSpn.length(), &value));
819     return value;
820 }
821 
NativeGetDsdsMode(napi_env env,void * data)822 void NativeGetDsdsMode(napi_env env, void *data)
823 {
824     if (data == nullptr) {
825         return;
826     }
827     AsyncContext<int32_t> *asyncContext = &(static_cast<AsyncDsdsInfo *>(data)->asyncContext);
828     int32_t dsdsMode = DSDS_MODE_V2;
829     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDsdsMode(dsdsMode);
830     TELEPHONY_LOGD("NAPI NativeGetDsdsMode %{public}d", errorCode);
831     if (errorCode == ERROR_NONE) {
832         asyncContext->callbackVal = dsdsMode;
833         asyncContext->context.resolved = true;
834     } else {
835         asyncContext->context.resolved = false;
836     }
837     asyncContext->context.errorCode = errorCode;
838 }
839 
GetDsdsModeCallback(napi_env env,napi_status status,void * data)840 void GetDsdsModeCallback(napi_env env, napi_status status, void *data)
841 {
842     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
843     std::unique_ptr<AsyncDsdsInfo> context(static_cast<AsyncDsdsInfo *>(data));
844     NapiAsyncPermissionCompleteCallback(
845         env, status, context->asyncContext, false, { "GetDsdsMode", Permission::GET_TELEPHONY_STATE });
846 }
847 
GetDsdsMode(napi_env env,napi_callback_info info)848 napi_value GetDsdsMode(napi_env env, napi_callback_info info)
849 {
850     auto asyncContext = new AsyncDsdsInfo();
851     BaseContext &context = asyncContext->asyncContext.context;
852 
853     auto initPara = std::make_tuple(&context.callbackRef);
854     AsyncPara para {
855         .funcName = "GetDsdsMode",
856         .env = env,
857         .info = info,
858         .execute = NativeGetDsdsMode,
859         .complete = GetDsdsModeCallback,
860     };
861     napi_value result = NapiCreateAsyncWork3<AsyncDsdsInfo>(para, asyncContext, initPara);
862     if (result) {
863         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
864     }
865     return result;
866 }
867 
NativeGetSimAuthentication(napi_env env,void * data)868 void NativeGetSimAuthentication(napi_env env, void *data)
869 {
870     if (data == nullptr) {
871         return;
872     }
873     AsyncSimAuthInfo *asyncContext = static_cast<AsyncSimAuthInfo *>(data);
874     if (!IsValidSlotId(asyncContext->asyncContext.slotId)) {
875         TELEPHONY_LOGE("NativeGetSimAuthentication slotId is invalid");
876         asyncContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
877         return;
878     }
879     SimAuthenticationResponse response;
880     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SimAuthentication(
881         asyncContext->asyncContext.slotId, static_cast<AuthType>(asyncContext->authType),
882         asyncContext->authData, response);
883     TELEPHONY_LOGI("NAPI NativeGetSimAuthentication %{public}d", errorCode);
884     if (errorCode == ERROR_NONE) {
885         asyncContext->responseResult = response;
886         asyncContext->asyncContext.context.resolved = true;
887     } else {
888         asyncContext->asyncContext.context.resolved = false;
889     }
890     asyncContext->asyncContext.context.errorCode = errorCode;
891 }
892 
GetSimAuthenticationCallback(napi_env env,napi_status status,void * data)893 void GetSimAuthenticationCallback(napi_env env, napi_status status, void *data)
894 {
895     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
896     std::unique_ptr<AsyncSimAuthInfo> context(static_cast<AsyncSimAuthInfo *>(data));
897     AsyncContext<napi_value> &asyncContext = context->asyncContext;
898     if (asyncContext.context.resolved) {
899         asyncContext.callbackVal =  SimAuthResultConversion(env, context->responseResult);
900     }
901 
902     NapiAsyncPermissionCompleteCallback(
903         env, status, context->asyncContext, false, { "GetSimAuthentication", Permission::GET_TELEPHONY_STATE });
904 }
905 
GetSimAuthentication(napi_env env,napi_callback_info info)906 napi_value GetSimAuthentication(napi_env env, napi_callback_info info)
907 {
908     auto asyncContext = new AsyncSimAuthInfo();
909     BaseContext &context = asyncContext->asyncContext.context;
910 
911     auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, &asyncContext->authType,
912         &asyncContext->authData, &context.callbackRef);
913     AsyncPara para {
914         .funcName = "GetSimAuthentication",
915         .env = env,
916         .info = info,
917         .execute = NativeGetSimAuthentication,
918         .complete = GetSimAuthenticationCallback,
919     };
920     napi_value result = NapiCreateAsyncWork2<AsyncSimAuthInfo>(para, asyncContext, initPara);
921     if (result) {
922         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
923     }
924     return result;
925 }
926 
NativeGetSimState(napi_env env,void * data)927 void NativeGetSimState(napi_env env, void *data)
928 {
929     if (data == nullptr) {
930         return;
931     }
932     AsyncContext<int32_t> *asyncContext = static_cast<AsyncContext<int32_t> *>(data);
933     if (!IsValidSlotId(asyncContext->slotId)) {
934         TELEPHONY_LOGE("slotId is invalid");
935         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
936         return;
937     }
938     SimState simState = SimState::SIM_STATE_UNKNOWN;
939     int32_t errorCode =
940         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimState(asyncContext->slotId, simState);
941     TELEPHONY_LOGI("NAPI NativeGetSimState %{public}d", errorCode);
942     if (errorCode == ERROR_NONE) {
943         asyncContext->context.resolved = true;
944         asyncContext->callbackVal = static_cast<int32_t>(simState);
945     } else {
946         asyncContext->context.resolved = false;
947     }
948     asyncContext->context.errorCode = errorCode;
949 }
950 
GetSimStateCallback(napi_env env,napi_status status,void * data)951 void GetSimStateCallback(napi_env env, napi_status status, void *data)
952 {
953     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
954     std::unique_ptr<AsyncContext<int32_t>> context(static_cast<AsyncContext<int32_t> *>(data));
955     NapiAsyncCommomCompleteCallback(env, status, *context, false);
956     TELEPHONY_LOGI("GetSimStateCallback end");
957 }
958 
GetSimState(napi_env env,napi_callback_info info)959 napi_value GetSimState(napi_env env, napi_callback_info info)
960 {
961     TELEPHONY_LOGI("GetSimState start");
962     return NapiCreateAsyncWork<int32_t, NativeGetSimState, GetSimStateCallback>(env, info, "GetSimState");
963 }
964 
GetSimStateSync(napi_env env,napi_callback_info info)965 napi_value GetSimStateSync(napi_env env, napi_callback_info info)
966 {
967     size_t parameterCount = 1;
968     napi_value parameters[] = { nullptr };
969     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
970     SimState simState = SimState::SIM_STATE_UNKNOWN;
971     napi_value value = nullptr;
972     if (parameterCount != 1) {
973         TELEPHONY_LOGE("parameter count is incorrect");
974         NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(simState), &value));
975         return value;
976     }
977     int32_t slotId = -1;
978     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
979         TELEPHONY_LOGE("convert parameter fail");
980         NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(simState), &value));
981         return value;
982     }
983     if (IsValidSlotId(slotId)) {
984         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimState(slotId, simState);
985     }
986     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(simState), &value));
987     return value;
988 }
989 
NativeGetCardType(napi_env env,void * data)990 void NativeGetCardType(napi_env env, void *data)
991 {
992     if (data == nullptr) {
993         return;
994     }
995     AsyncContext<int32_t> *asyncContext = static_cast<AsyncContext<int32_t> *>(data);
996     if (!IsValidSlotId(asyncContext->slotId)) {
997         TELEPHONY_LOGE("NativeGetCardType slotId is invalid");
998         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
999         return;
1000     }
1001     CardType cardType = CardType::UNKNOWN_CARD;
1002     int32_t errorCode =
1003         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetCardType(asyncContext->slotId, cardType);
1004     TELEPHONY_LOGI("NAPI NativeGetCardType %{public}d", errorCode);
1005     if (errorCode == ERROR_NONE) {
1006         asyncContext->context.resolved = true;
1007         asyncContext->callbackVal = static_cast<int32_t>(cardType);
1008     } else {
1009         asyncContext->context.resolved = false;
1010     }
1011     asyncContext->context.errorCode = errorCode;
1012 }
1013 
GetCardTypeCallback(napi_env env,napi_status status,void * data)1014 void GetCardTypeCallback(napi_env env, napi_status status, void *data)
1015 {
1016     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1017     std::unique_ptr<AsyncContext<int32_t>> context(static_cast<AsyncContext<int32_t> *>(data));
1018     NapiAsyncCommomCompleteCallback(env, status, *context, false);
1019 }
1020 
GetCardType(napi_env env,napi_callback_info info)1021 napi_value GetCardType(napi_env env, napi_callback_info info)
1022 {
1023     return NapiCreateAsyncWork<int32_t, NativeGetCardType, GetCardTypeCallback>(env, info, "GetCardType");
1024 }
1025 
GetCardTypeSync(napi_env env,napi_callback_info info)1026 napi_value GetCardTypeSync(napi_env env, napi_callback_info info)
1027 {
1028     size_t parameterCount = 1;
1029     napi_value parameters[] = { nullptr };
1030     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
1031     CardType cardType = CardType::UNKNOWN_CARD;
1032     napi_value value = nullptr;
1033     if (parameterCount != 1) {
1034         TELEPHONY_LOGE("parameter count is incorrect");
1035         NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(cardType), &value));
1036         return value;
1037     }
1038     int32_t slotId = -1;
1039     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
1040         TELEPHONY_LOGE("convert parameter fail");
1041         NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(cardType), &value));
1042         return value;
1043     }
1044     if (IsValidSlotId(slotId)) {
1045         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetCardType(slotId, cardType);
1046     }
1047     NAPI_CALL(env, napi_create_int32(env, static_cast<int32_t>(cardType), &value));
1048     return value;
1049 }
1050 
NativeGetVoiceMailIdentifier(napi_env env,void * data)1051 void NativeGetVoiceMailIdentifier(napi_env env, void *data)
1052 {
1053     if (data == nullptr) {
1054         return;
1055     }
1056     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1057     if (!IsValidSlotId(asyncContext->slotId)) {
1058         TELEPHONY_LOGE("NativeGetVoiceMailIdentifier slotId is invalid");
1059         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1060         return;
1061     }
1062     std::u16string voiceMailIdentifier;
1063     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetVoiceMailIdentifier(
1064         asyncContext->slotId, voiceMailIdentifier);
1065     TELEPHONY_LOGI("NAPI NativeGetVoiceMailIdentifier %{public}d", errorCode);
1066     if (errorCode == ERROR_NONE) {
1067         asyncContext->callbackVal = NapiUtil::ToUtf8(voiceMailIdentifier);
1068         asyncContext->context.resolved = true;
1069     } else {
1070         asyncContext->context.resolved = false;
1071     }
1072     asyncContext->context.errorCode = errorCode;
1073 }
1074 
GetVoiceMailIdentifierCallback(napi_env env,napi_status status,void * data)1075 void GetVoiceMailIdentifierCallback(napi_env env, napi_status status, void *data)
1076 {
1077     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1078     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1079     NapiAsyncPermissionCompleteCallback(
1080         env, status, *context, false, { "GetVoiceMailIdentifier", Permission::GET_TELEPHONY_STATE });
1081 }
1082 
GetVoiceMailIdentifier(napi_env env,napi_callback_info info)1083 napi_value GetVoiceMailIdentifier(napi_env env, napi_callback_info info)
1084 {
1085     return NapiCreateAsyncWork<std::string, NativeGetVoiceMailIdentifier, GetVoiceMailIdentifierCallback>(
1086         env, info, "GetVoiceMailIdentifier");
1087 }
1088 
NativeGetVoiceMailNumber(napi_env env,void * data)1089 void NativeGetVoiceMailNumber(napi_env env, void *data)
1090 {
1091     if (data == nullptr) {
1092         return;
1093     }
1094     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1095     if (!IsValidSlotId(asyncContext->slotId)) {
1096         TELEPHONY_LOGE("NativeGetVoiceMailNumber slotId is invalid");
1097         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1098         return;
1099     }
1100     std::u16string voiceMailNumber;
1101     int32_t errorCode =
1102         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetVoiceMailNumber(asyncContext->slotId, voiceMailNumber);
1103     if (errorCode == ERROR_NONE) {
1104         asyncContext->callbackVal = NapiUtil::ToUtf8(voiceMailNumber);
1105         asyncContext->context.resolved = true;
1106     } else {
1107         asyncContext->context.resolved = false;
1108     }
1109     asyncContext->context.errorCode = errorCode;
1110 }
1111 
GetVoiceMailNumberCallback(napi_env env,napi_status status,void * data)1112 void GetVoiceMailNumberCallback(napi_env env, napi_status status, void *data)
1113 {
1114     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1115     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1116     NapiAsyncPermissionCompleteCallback(
1117         env, status, *context, false, { "GetVoiceMailNumber", Permission::GET_TELEPHONY_STATE });
1118 }
1119 
GetVoiceMailNumber(napi_env env,napi_callback_info info)1120 napi_value GetVoiceMailNumber(napi_env env, napi_callback_info info)
1121 {
1122     return NapiCreateAsyncWork<std::string, NativeGetVoiceMailNumber, GetVoiceMailNumberCallback>(
1123         env, info, "GetVoiceMailNumber");
1124 }
1125 
NativeGetVoiceMailCount(napi_env env,void * data)1126 void NativeGetVoiceMailCount(napi_env env, void *data)
1127 {
1128     if (data == nullptr) {
1129         return;
1130     }
1131     AsyncContext<int32_t> *asyncContext = static_cast<AsyncContext<int32_t> *>(data);
1132     if (!IsValidSlotId(asyncContext->slotId)) {
1133         TELEPHONY_LOGE("NativeGetVoiceMailCount slotId is invalid");
1134         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1135         return;
1136     }
1137     int32_t voiceMailCount = ERROR_DEFAULT;
1138     int32_t errorCode =
1139         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetVoiceMailCount(asyncContext->slotId, voiceMailCount);
1140     if (errorCode == ERROR_NONE) {
1141         asyncContext->callbackVal = voiceMailCount;
1142         asyncContext->context.resolved = true;
1143     } else {
1144         asyncContext->context.resolved = false;
1145     }
1146     asyncContext->context.errorCode = errorCode;
1147 }
1148 
GetVoiceMailCountCallback(napi_env env,napi_status status,void * data)1149 void GetVoiceMailCountCallback(napi_env env, napi_status status, void *data)
1150 {
1151     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1152     std::unique_ptr<AsyncContext<int32_t>> context(static_cast<AsyncContext<int32_t> *>(data));
1153     NapiAsyncPermissionCompleteCallback(
1154         env, status, *context, false, { "GetVoiceMailCount", Permission::GET_TELEPHONY_STATE });
1155 }
1156 
GetVoiceMailCount(napi_env env,napi_callback_info info)1157 napi_value GetVoiceMailCount(napi_env env, napi_callback_info info)
1158 {
1159     return NapiCreateAsyncWork<int32_t, NativeGetVoiceMailCount, GetVoiceMailCountCallback>(
1160         env, info, "GetVoiceMailCount");
1161 }
1162 
NativeGetSimTelephoneNumber(napi_env env,void * data)1163 void NativeGetSimTelephoneNumber(napi_env env, void *data)
1164 {
1165     if (data == nullptr) {
1166         return;
1167     }
1168     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1169     if (!IsValidSlotId(asyncContext->slotId)) {
1170         TELEPHONY_LOGE("NativeGetSimTelephoneNumber slotId is invalid");
1171         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1172         return;
1173     }
1174     std::u16string telephoneNumber;
1175     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimTelephoneNumber(
1176         asyncContext->slotId, telephoneNumber);
1177     if (errorCode == ERROR_NONE) {
1178         asyncContext->callbackVal = NapiUtil::ToUtf8(telephoneNumber);
1179         asyncContext->context.resolved = true;
1180     } else {
1181         asyncContext->context.resolved = false;
1182     }
1183     asyncContext->context.errorCode = errorCode;
1184 }
1185 
GetSimTelephoneNumberCallback(napi_env env,napi_status status,void * data)1186 void GetSimTelephoneNumberCallback(napi_env env, napi_status status, void *data)
1187 {
1188     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1189     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1190     NapiAsyncPermissionCompleteCallback(
1191         env, status, *context, false, { "GetSimTelephoneNumber", Permission::GET_TELEPHONY_STATE });
1192 }
1193 
GetSimTelephoneNumber(napi_env env,napi_callback_info info)1194 napi_value GetSimTelephoneNumber(napi_env env, napi_callback_info info)
1195 {
1196     return NapiCreateAsyncWork<std::string, NativeGetSimTelephoneNumber, GetSimTelephoneNumberCallback>(
1197         env, info, "GetSimTelephoneNumber");
1198 }
1199 
NativeGetSimGid1(napi_env env,void * data)1200 void NativeGetSimGid1(napi_env env, void *data)
1201 {
1202     if (data == nullptr) {
1203         return;
1204     }
1205     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1206     if (!IsValidSlotId(asyncContext->slotId)) {
1207         TELEPHONY_LOGE("NativeGetSimGid1 slotId is invalid");
1208         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1209         return;
1210     }
1211     std::u16string gid1;
1212     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimGid1(asyncContext->slotId, gid1);
1213     TELEPHONY_LOGI("NAPI NativeGetSimGid1 %{public}d", errorCode);
1214     if (errorCode == ERROR_NONE) {
1215         asyncContext->callbackVal = NapiUtil::ToUtf8(gid1);
1216         asyncContext->context.resolved = true;
1217     } else {
1218         asyncContext->context.resolved = false;
1219     }
1220     asyncContext->context.errorCode = errorCode;
1221 }
1222 
GetSimGid1Callback(napi_env env,napi_status status,void * data)1223 void GetSimGid1Callback(napi_env env, napi_status status, void *data)
1224 {
1225     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1226     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1227     NapiAsyncPermissionCompleteCallback(
1228         env, status, *context, false, { "GetSimGid1", Permission::GET_TELEPHONY_STATE });
1229 }
1230 
GetSimGid1(napi_env env,napi_callback_info info)1231 napi_value GetSimGid1(napi_env env, napi_callback_info info)
1232 {
1233     return NapiCreateAsyncWork<std::string, NativeGetSimGid1, GetSimGid1Callback>(env, info, "GetSimGid1");
1234 }
1235 
NativeGetSimIccId(napi_env env,void * data)1236 void NativeGetSimIccId(napi_env env, void *data)
1237 {
1238     if (data == nullptr) {
1239         return;
1240     }
1241     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1242     if (!IsValidSlotId(asyncContext->slotId)) {
1243         TELEPHONY_LOGE("NativeGetSimIccId slotId is invalid");
1244         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1245         return;
1246     }
1247     std::u16string iccId;
1248     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimIccId(asyncContext->slotId, iccId);
1249     if (errorCode == ERROR_NONE) {
1250         asyncContext->callbackVal = NapiUtil::ToUtf8(iccId);
1251         asyncContext->context.resolved = true;
1252     } else {
1253         asyncContext->context.resolved = false;
1254     }
1255     asyncContext->context.errorCode = errorCode;
1256 }
1257 
GetSimIccIdCallback(napi_env env,napi_status status,void * data)1258 void GetSimIccIdCallback(napi_env env, napi_status status, void *data)
1259 {
1260     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1261     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1262     NapiAsyncPermissionCompleteCallback(
1263         env, status, *context, false, { "GetSimIccId", Permission::GET_TELEPHONY_STATE });
1264 }
1265 
GetSimIccId(napi_env env,napi_callback_info info)1266 napi_value GetSimIccId(napi_env env, napi_callback_info info)
1267 {
1268     return NapiCreateAsyncWork<std::string, NativeGetSimIccId, GetSimIccIdCallback>(env, info, "GetSimIccId");
1269 }
1270 
NativeGetSimAccountInfo(napi_env env,void * data)1271 void NativeGetSimAccountInfo(napi_env env, void *data)
1272 {
1273     if (data == nullptr) {
1274         return;
1275     }
1276     AsyncIccAccountInfo *info = static_cast<AsyncIccAccountInfo *>(data);
1277     if (!IsValidSlotIdEx(info->asyncContext.slotId)) {
1278         TELEPHONY_LOGE("NativeGetSimAccountInfo slotId is invalid");
1279         info->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1280         return;
1281     }
1282     IccAccountInfo operInfo;
1283     int32_t errorCode =
1284         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimAccountInfo(info->asyncContext.slotId, operInfo);
1285     TELEPHONY_LOGI("NAPI NativeGetSimAccountInfo %{public}d", errorCode);
1286     if (errorCode == ERROR_NONE) {
1287         info->vecInfo.push_back(std::move(operInfo));
1288         info->asyncContext.context.resolved = true;
1289     } else {
1290         info->asyncContext.context.resolved = false;
1291     }
1292     info->asyncContext.context.errorCode = errorCode;
1293 }
1294 
GetSimAccountInfoCallback(napi_env env,napi_status status,void * data)1295 void GetSimAccountInfoCallback(napi_env env, napi_status status, void *data)
1296 {
1297     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1298     std::unique_ptr<AsyncIccAccountInfo> info(static_cast<AsyncIccAccountInfo *>(data));
1299     AsyncContext<napi_value> &asyncContext = info->asyncContext;
1300     if (asyncContext.context.resolved) {
1301         asyncContext.callbackVal = IccAccountInfoConversion(env, info->vecInfo.at(0));
1302     }
1303     NapiAsyncPermissionCompleteCallback(
1304         env, status, asyncContext, false, { "GetSimAccountInfo", Permission::GET_TELEPHONY_STATE });
1305 }
1306 
GetSimAccountInfo(napi_env env,napi_callback_info info)1307 napi_value GetSimAccountInfo(napi_env env, napi_callback_info info)
1308 {
1309     auto iccAccountInfo = new AsyncIccAccountInfo();
1310     BaseContext &context = iccAccountInfo->asyncContext.context;
1311 
1312     auto initPara = std::make_tuple(&iccAccountInfo->asyncContext.slotId, &context.callbackRef);
1313     AsyncPara para {
1314         .funcName = "GetSimAccountInfo",
1315         .env = env,
1316         .info = info,
1317         .execute = NativeGetSimAccountInfo,
1318         .complete = GetSimAccountInfoCallback,
1319     };
1320     napi_value result = NapiCreateAsyncWork2<AsyncIccAccountInfo>(para, iccAccountInfo, initPara);
1321     if (result) {
1322         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1323     }
1324     return result;
1325 }
1326 
NativeSetDefaultVoiceSlotId(napi_env env,void * data)1327 void NativeSetDefaultVoiceSlotId(napi_env env, void *data)
1328 {
1329     if (data == nullptr) {
1330         return;
1331     }
1332     AsyncContext<bool> *reVal = static_cast<AsyncContext<bool> *>(data);
1333     if (!IsValidSlotIdForDefault(reVal->slotId)) {
1334         TELEPHONY_LOGE("NativeSetDefaultVoiceSlotId slotId is invalid");
1335         reVal->context.errorCode = ERROR_SLOT_ID_INVALID;
1336         return;
1337     }
1338     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SetDefaultVoiceSlotId(reVal->slotId);
1339     TELEPHONY_LOGI("NAPI NativeSetDefaultVoiceSlotId %{public}d", errorCode);
1340     reVal->context.errorCode = errorCode;
1341     reVal->context.resolved = (errorCode == ERROR_NONE);
1342 }
1343 
SetDefaultVoiceSlotIdCallback(napi_env env,napi_status status,void * data)1344 void SetDefaultVoiceSlotIdCallback(napi_env env, napi_status status, void *data)
1345 {
1346     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1347     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
1348     NapiAsyncPermissionCompleteCallback(
1349         env, status, *context, true, { "SetDefaultVoiceSlotId", Permission::SET_TELEPHONY_STATE });
1350 }
1351 
SetDefaultVoiceSlotId(napi_env env,napi_callback_info info)1352 napi_value SetDefaultVoiceSlotId(napi_env env, napi_callback_info info)
1353 {
1354     return NapiCreateAsyncWork<bool, NativeSetDefaultVoiceSlotId, SetDefaultVoiceSlotIdCallback>(
1355         env, info, "SetDefaultVoiceSlotId");
1356 }
1357 
NativeUnlockPin(napi_env env,void * data)1358 void NativeUnlockPin(napi_env env, void *data)
1359 {
1360     if (data == nullptr) {
1361         return;
1362     }
1363     AsyncContextPIN *pinContext = static_cast<AsyncContextPIN *>(data);
1364     if (!IsValidSlotId(pinContext->asyncContext.slotId)) {
1365         TELEPHONY_LOGE("NativeUnlockPin slotId is invalid");
1366         pinContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1367         return;
1368     }
1369     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1370     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().UnlockPin(
1371         pinContext->asyncContext.slotId, NapiUtil::ToUtf16(pinContext->inStr1.data()), response);
1372     TELEPHONY_LOGI("NAPI NativeUnlockPin %{public}d", errorCode);
1373     if (errorCode == ERROR_NONE) {
1374         pinContext->result = response.result;
1375         pinContext->remain = response.remain;
1376         pinContext->asyncContext.context.resolved = true;
1377     } else {
1378         pinContext->asyncContext.context.resolved = false;
1379     }
1380     pinContext->asyncContext.context.errorCode = errorCode;
1381 }
1382 
UnlockPinCallback(napi_env env,napi_status status,void * data)1383 void UnlockPinCallback(napi_env env, napi_status status, void *data)
1384 {
1385     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1386     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1387     const LockStatusResponse res {context->result, context->remain};
1388     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1389     NapiAsyncPermissionCompleteCallback(
1390         env, status, context->asyncContext, false, { "UnlockPin", Permission::SET_TELEPHONY_STATE });
1391 }
1392 
UnlockPin(napi_env env,napi_callback_info info)1393 napi_value UnlockPin(napi_env env, napi_callback_info info)
1394 {
1395     auto pinContext = new AsyncContextPIN();
1396     BaseContext &context = pinContext->asyncContext.context;
1397     char tmpStr[ARRAY_SIZE] = {0};
1398 
1399     auto initPara = std::make_tuple(&pinContext->asyncContext.slotId, tmpStr, &context.callbackRef);
1400     AsyncPara para {
1401         .funcName = "UnlockPin",
1402         .env = env,
1403         .info = info,
1404         .execute = NativeUnlockPin,
1405         .complete = UnlockPinCallback,
1406     };
1407     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, pinContext, initPara);
1408     if (result) {
1409         pinContext->inStr1 = std::string(tmpStr);
1410         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1411     }
1412     return result;
1413 }
1414 
NativeUnlockPuk(napi_env env,void * data)1415 void NativeUnlockPuk(napi_env env, void *data)
1416 {
1417     if (data == nullptr) {
1418         return;
1419     }
1420     AsyncContextPIN *pukContext = static_cast<AsyncContextPIN *>(data);
1421     if (!IsValidSlotId(pukContext->asyncContext.slotId)) {
1422         TELEPHONY_LOGE("NativeUnlockPuk slotId is invalid");
1423         pukContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1424         return;
1425     }
1426     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1427     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().UnlockPuk(pukContext->asyncContext.slotId,
1428         NapiUtil::ToUtf16(pukContext->inStr1.data()), NapiUtil::ToUtf16(pukContext->inStr2.data()), response);
1429     TELEPHONY_LOGI("NAPI NativeUnlockPuk %{public}d", errorCode);
1430     if (errorCode == ERROR_NONE) {
1431         pukContext->result = response.result;
1432         pukContext->remain = response.remain;
1433         pukContext->asyncContext.context.resolved = true;
1434     } else {
1435         pukContext->asyncContext.context.resolved = false;
1436     }
1437     pukContext->asyncContext.context.errorCode = errorCode;
1438 }
1439 
UnlockPukCallback(napi_env env,napi_status status,void * data)1440 void UnlockPukCallback(napi_env env, napi_status status, void *data)
1441 {
1442     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1443     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1444     const LockStatusResponse res {context->result, context->remain};
1445     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1446     NapiAsyncPermissionCompleteCallback(
1447         env, status, context->asyncContext, false, { "UnlockPuk", Permission::SET_TELEPHONY_STATE });
1448 }
1449 
UnlockPuk(napi_env env,napi_callback_info info)1450 napi_value UnlockPuk(napi_env env, napi_callback_info info)
1451 {
1452     auto pukContext = new AsyncContextPIN();
1453     BaseContext &context = pukContext->asyncContext.context;
1454     char tmpStr1[ARRAY_SIZE] = {0};
1455     char tmpStr2[ARRAY_SIZE] = {0};
1456 
1457     auto initPara = std::make_tuple(&pukContext->asyncContext.slotId, tmpStr1, tmpStr2, &context.callbackRef);
1458     AsyncPara para {
1459         .funcName = "UnlockPuk",
1460         .env = env,
1461         .info = info,
1462         .execute = NativeUnlockPuk,
1463         .complete = UnlockPukCallback,
1464     };
1465     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, pukContext, initPara);
1466     if (result) {
1467         pukContext->inStr1 = std::string(tmpStr1);
1468         pukContext->inStr2 = std::string(tmpStr2);
1469         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1470     }
1471     return result;
1472 }
1473 
NativeAlterPin(napi_env env,void * data)1474 void NativeAlterPin(napi_env env, void *data)
1475 {
1476     if (data == nullptr) {
1477         return;
1478     }
1479 
1480     AsyncContextPIN *alterPinContext = static_cast<AsyncContextPIN *>(data);
1481     if (!IsValidSlotId(alterPinContext->asyncContext.slotId)) {
1482         TELEPHONY_LOGE("NativeAlterPin slotId is invalid");
1483         alterPinContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1484         return;
1485     }
1486     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1487     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().AlterPin(
1488         alterPinContext->asyncContext.slotId, NapiUtil::ToUtf16(alterPinContext->inStr1.data()),
1489         NapiUtil::ToUtf16(alterPinContext->inStr2.data()), response);
1490     TELEPHONY_LOGI("NAPI NativeAlterPin %{public}d", errorCode);
1491     if (errorCode == ERROR_NONE) {
1492         alterPinContext->result = response.result;
1493         alterPinContext->remain = response.remain;
1494         alterPinContext->asyncContext.context.resolved = true;
1495     } else {
1496         alterPinContext->asyncContext.context.resolved = false;
1497     }
1498     alterPinContext->asyncContext.context.errorCode = errorCode;
1499 }
1500 
AlterPinCallback(napi_env env,napi_status status,void * data)1501 void AlterPinCallback(napi_env env, napi_status status, void *data)
1502 {
1503     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1504     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1505     const LockStatusResponse res {context->result, context->remain};
1506     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1507     NapiAsyncPermissionCompleteCallback(
1508         env, status, context->asyncContext, false, { "AlterPin", Permission::SET_TELEPHONY_STATE });
1509 }
1510 
AlterPin(napi_env env,napi_callback_info info)1511 napi_value AlterPin(napi_env env, napi_callback_info info)
1512 {
1513     auto alterPinContext = new AsyncContextPIN();
1514     BaseContext &context = alterPinContext->asyncContext.context;
1515 
1516     char tmpStr1[ARRAY_SIZE] = {0};
1517     char tmpStr2[ARRAY_SIZE] = {0};
1518     auto initPara = std::make_tuple(&alterPinContext->asyncContext.slotId, tmpStr1, tmpStr2, &context.callbackRef);
1519     AsyncPara para {
1520         .funcName = "AlterPin",
1521         .env = env,
1522         .info = info,
1523         .execute = NativeAlterPin,
1524         .complete = AlterPinCallback,
1525     };
1526     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, alterPinContext, initPara);
1527     if (result) {
1528         alterPinContext->inStr1 = std::string(tmpStr1);
1529         alterPinContext->inStr2 = std::string(tmpStr2);
1530         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1531     }
1532     return result;
1533 }
1534 
NativeSetLockState(napi_env env,void * data)1535 void NativeSetLockState(napi_env env, void *data)
1536 {
1537     if (data == nullptr) {
1538         return;
1539     }
1540     AsyncContextPIN *lockContext = static_cast<AsyncContextPIN *>(data);
1541     if (!IsValidSlotId(lockContext->asyncContext.slotId)) {
1542         TELEPHONY_LOGE("NativeSetLockState slotId is invalid");
1543         lockContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1544         return;
1545     }
1546     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1547     TELEPHONY_LOGI("NativeSetLockState slotId = %{public}d, lockType = %{public}d, state = %{public}d",
1548         lockContext->asyncContext.slotId, lockContext->result, lockContext->remain);
1549     const LockInfo info { static_cast<LockType>(lockContext->result), NapiUtil::ToUtf16(lockContext->inStr1.data()),
1550         static_cast<LockState>(lockContext->remain) };
1551     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SetLockState(
1552         lockContext->asyncContext.slotId, info, response);
1553     TELEPHONY_LOGI("NAPI NativeSetLockState %{public}d", errorCode);
1554     if (errorCode == ERROR_NONE) {
1555         lockContext->result = response.result;
1556         lockContext->remain = response.remain;
1557         lockContext->asyncContext.context.resolved = true;
1558     } else {
1559         lockContext->asyncContext.context.resolved = false;
1560     }
1561     lockContext->asyncContext.context.errorCode = errorCode;
1562 }
1563 
SetLockStateCallback(napi_env env,napi_status status,void * data)1564 void SetLockStateCallback(napi_env env, napi_status status, void *data)
1565 {
1566     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1567     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1568     const LockStatusResponse res {context->result, context->remain};
1569     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1570     NapiAsyncPermissionCompleteCallback(
1571         env, status, context->asyncContext, false, { "SetLockState", Permission::SET_TELEPHONY_STATE });
1572 }
1573 
SetLockState(napi_env env,napi_callback_info info)1574 napi_value SetLockState(napi_env env, napi_callback_info info)
1575 {
1576     auto asyncContextPIN = new AsyncContextPIN;
1577     BaseContext &context = asyncContextPIN->asyncContext.context;
1578     napi_value object = NapiUtil::CreateUndefined(env);
1579     auto initPara = std::make_tuple(&asyncContextPIN->asyncContext.slotId, &object, &context.callbackRef);
1580     AsyncPara para {
1581         .funcName = "SetLockState",
1582         .env = env,
1583         .info = info,
1584         .execute = NativeSetLockState,
1585         .complete = SetLockStateCallback,
1586     };
1587     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, asyncContextPIN, initPara);
1588     if (result) {
1589         PinInfoParaAnalyze(env, object, *asyncContextPIN);
1590         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1591     }
1592     return result;
1593 }
1594 
NativeHasSimCard(napi_env env,void * data)1595 void NativeHasSimCard(napi_env env, void *data)
1596 {
1597     if (data == nullptr) {
1598         return;
1599     }
1600     AsyncContext<bool> *reVal = static_cast<AsyncContext<bool> *>(data);
1601     if (!IsValidSlotIdEx(reVal->slotId)) {
1602         TELEPHONY_LOGE("slotId is invalid");
1603         reVal->context.errorCode = ERROR_SLOT_ID_INVALID;
1604         return;
1605     }
1606     bool hasSimCard = false;
1607     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().HasSimCard(reVal->slotId, hasSimCard);
1608     if (errorCode == ERROR_NONE) {
1609         reVal->callbackVal = hasSimCard;
1610         reVal->context.resolved = true;
1611     } else {
1612         reVal->context.resolved = false;
1613     }
1614     TELEPHONY_LOGD("errorCode is %{public}d", errorCode);
1615     reVal->context.errorCode = errorCode;
1616 }
1617 
HasSimCardCallback(napi_env env,napi_status status,void * data)1618 void HasSimCardCallback(napi_env env, napi_status status, void *data)
1619 {
1620     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1621     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
1622     NapiAsyncCommomCompleteCallback(env, status, *context, false);
1623 }
1624 
HasSimCard(napi_env env,napi_callback_info info)1625 napi_value HasSimCard(napi_env env, napi_callback_info info)
1626 {
1627     return NapiCreateAsyncWork<bool, NativeHasSimCard, HasSimCardCallback>(env, info, "HasSimCard");
1628 }
1629 
HasSimCardSync(napi_env env,napi_callback_info info)1630 napi_value HasSimCardSync(napi_env env, napi_callback_info info)
1631 {
1632     size_t parameterCount = 1;
1633     napi_value parameters[] = { nullptr };
1634     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
1635     bool hasSimCard = false;
1636     napi_value value = nullptr;
1637     if (parameterCount != 1) {
1638         TELEPHONY_LOGE("parameter count is incorrect");
1639         NAPI_CALL(env, napi_create_int32(env, hasSimCard, &value));
1640         return value;
1641     }
1642     int32_t slotId = -1;
1643     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
1644         TELEPHONY_LOGE("convert parameter fail");
1645         NAPI_CALL(env, napi_create_int32(env, hasSimCard, &value));
1646         return value;
1647     }
1648     if (IsValidSlotId(slotId)) {
1649         DelayedRefSingleton<CoreServiceClient>::GetInstance().HasSimCard(slotId, hasSimCard);
1650     }
1651     NAPI_CALL(env, napi_get_boolean(env, hasSimCard, &value));
1652     return value;
1653 }
1654 
NativeGetIMSI(napi_env env,void * data)1655 void NativeGetIMSI(napi_env env, void *data)
1656 {
1657     if (data == nullptr) {
1658         return;
1659     }
1660     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1661     if (!IsValidSlotId(asyncContext->slotId)) {
1662         TELEPHONY_LOGE("NativeGetIMSI slotId is invalid");
1663         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1664         return;
1665     }
1666     std::u16string imsi;
1667     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetIMSI(asyncContext->slotId, imsi);
1668     if (errorCode == ERROR_NONE) {
1669         asyncContext->callbackVal = NapiUtil::ToUtf8(imsi);
1670         asyncContext->context.resolved = true;
1671     } else {
1672         asyncContext->context.resolved = false;
1673     }
1674     asyncContext->context.errorCode = errorCode;
1675 }
1676 
GetIMSICallback(napi_env env,napi_status status,void * data)1677 void GetIMSICallback(napi_env env, napi_status status, void *data)
1678 {
1679     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1680     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1681     NapiAsyncPermissionCompleteCallback(env, status, *context, false, { "GetIMSI", Permission::GET_TELEPHONY_STATE });
1682 }
1683 
GetIMSI(napi_env env,napi_callback_info info)1684 napi_value GetIMSI(napi_env env, napi_callback_info info)
1685 {
1686     return NapiCreateAsyncWork<std::string, NativeGetIMSI, GetIMSICallback>(env, info, "GetIMSI");
1687 }
1688 
IsOperatorSimCard(napi_env env,napi_callback_info info)1689 napi_value IsOperatorSimCard(napi_env env, napi_callback_info info)
1690 {
1691     size_t parameterCount = PARAMETER_COUNT_TWO;
1692     napi_value parameters[PARAMETER_COUNT_TWO] = { 0 };
1693     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
1694     if (parameterCount != PARAMETER_COUNT_TWO ||
1695         !NapiUtil::MatchParameters(env, parameters, { napi_number, napi_string })) {
1696         TELEPHONY_LOGE("parameter type is incorrect");
1697         NapiUtil::ThrowParameterError(env);
1698         return nullptr;
1699     }
1700     int32_t slotId = -1;
1701     napi_get_value_int32(env, parameters[0], &slotId);
1702     if (!IsValidSlotId(slotId)) {
1703         NapiUtil::ThrowError(env, JS_ERROR_TELEPHONY_ARGUMENT_ERROR, JS_ERROR_TELEPHONY_ARGUMENT_ERROR_STRING);
1704         return nullptr;
1705     }
1706     std::string operatorSimCard = NapiUtil::GetStringFromValue(env, parameters[1]);
1707     int32_t errorCode = TELEPHONY_SUCCESS;
1708     bool isOperatorSimCard = false;
1709     if (!operatorSimCard.compare(CHINA_TELECOM_CARD)) {
1710         errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().IsCTSimCard(slotId, isOperatorSimCard);
1711     } else {
1712         errorCode = TELEPHONY_ERR_ARGUMENT_MISMATCH;
1713     }
1714     if (errorCode != TELEPHONY_SUCCESS) {
1715         JsError error = NapiUtil::ConverErrorMessageForJs(errorCode);
1716         NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
1717         return nullptr;
1718     }
1719     napi_value value = nullptr;
1720     NAPI_CALL(env, napi_get_boolean(env, isOperatorSimCard, &value));
1721     return value;
1722 }
1723 
NativeSetShowName(napi_env env,void * data)1724 void NativeSetShowName(napi_env env, void *data)
1725 {
1726     if (data == nullptr) {
1727         return;
1728     }
1729     AsyncContext2 *context = static_cast<AsyncContext2 *>(data);
1730     if (!IsValidSlotId(context->asyncContext.slotId)) {
1731         TELEPHONY_LOGE("NativeSetShowName slotId is invalid");
1732         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1733         return;
1734     }
1735     std::u16string name = NapiUtil::ToUtf16(std::data(context->inputStr));
1736     int32_t errorCode =
1737         DelayedRefSingleton<CoreServiceClient>::GetInstance().SetShowName(context->asyncContext.slotId, name);
1738     TELEPHONY_LOGI("NAPI NativeSetShowName %{public}d", errorCode);
1739     context->asyncContext.context.errorCode = errorCode;
1740     context->asyncContext.context.resolved = (errorCode == ERROR_NONE);
1741 }
1742 
SetShowNameCallback(napi_env env,napi_status status,void * data)1743 void SetShowNameCallback(napi_env env, napi_status status, void *data)
1744 {
1745     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1746     std::unique_ptr<AsyncContext2> context(static_cast<AsyncContext2 *>(data));
1747     NapiAsyncPermissionCompleteCallback(
1748         env, status, context->asyncContext, true, { "SetShowName", Permission::SET_TELEPHONY_STATE });
1749 }
1750 
SetShowName(napi_env env,napi_callback_info info)1751 napi_value SetShowName(napi_env env, napi_callback_info info)
1752 {
1753     auto asyncContext = new AsyncContext2();
1754     BaseContext &context = asyncContext->asyncContext.context;
1755 
1756     auto initPara =
1757         std::make_tuple(&asyncContext->asyncContext.slotId, std::data(asyncContext->inputStr),
1758             &context.callbackRef);
1759     AsyncPara para {
1760         .funcName = "SetShowName",
1761         .env = env,
1762         .info = info,
1763         .execute = NativeSetShowName,
1764         .complete = SetShowNameCallback,
1765     };
1766     napi_value result = NapiCreateAsyncWork2<AsyncContext2>(para, asyncContext, initPara);
1767     if (result) {
1768         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1769     }
1770     return result;
1771 }
1772 
NativeGetShowName(napi_env env,void * data)1773 void NativeGetShowName(napi_env env, void *data)
1774 {
1775     if (data == nullptr) {
1776         return;
1777     }
1778     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1779     if (!IsValidSlotId(asyncContext->slotId)) {
1780         TELEPHONY_LOGE("NativeGetShowName slotId is invalid");
1781         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1782         return;
1783     }
1784     std::u16string showName;
1785     int32_t errorCode =
1786         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetShowName(asyncContext->slotId, showName);
1787     if (errorCode == ERROR_NONE) {
1788         asyncContext->callbackVal = NapiUtil::ToUtf8(showName);
1789         asyncContext->context.resolved = true;
1790     } else {
1791         asyncContext->context.resolved = false;
1792     }
1793     asyncContext->context.errorCode = errorCode;
1794 }
1795 
GetShowNameCallback(napi_env env,napi_status status,void * data)1796 void GetShowNameCallback(napi_env env, napi_status status, void *data)
1797 {
1798     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1799     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1800     NapiAsyncPermissionCompleteCallback(
1801         env, status, *context, false, { "GetShowName", Permission::GET_TELEPHONY_STATE });
1802 }
1803 
GetShowName(napi_env env,napi_callback_info info)1804 napi_value GetShowName(napi_env env, napi_callback_info info)
1805 {
1806     return NapiCreateAsyncWork<std::string, NativeGetShowName, GetShowNameCallback>(env, info, "GetShowName");
1807 }
1808 
NativeSetShowNumber(napi_env env,void * data)1809 void NativeSetShowNumber(napi_env env, void *data)
1810 {
1811     if (data == nullptr) {
1812         return;
1813     }
1814     AsyncContext2 *context = static_cast<AsyncContext2 *>(data);
1815     if (!IsValidSlotId(context->asyncContext.slotId)) {
1816         TELEPHONY_LOGE("NativeSetShowNumber slotId is invalid");
1817         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1818         return;
1819     }
1820     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SetShowNumber(
1821         context->asyncContext.slotId, NapiUtil::ToUtf16(std::data(context->inputStr)));
1822     TELEPHONY_LOGI("NAPI NativeSetShowNumber %{public}d", errorCode);
1823     context->asyncContext.context.errorCode = errorCode;
1824     context->asyncContext.context.resolved = (errorCode == ERROR_NONE);
1825 }
1826 
SetShowNumberCallback(napi_env env,napi_status status,void * data)1827 void SetShowNumberCallback(napi_env env, napi_status status, void *data)
1828 {
1829     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1830     std::unique_ptr<AsyncContext2> context(static_cast<AsyncContext2 *>(data));
1831     NapiAsyncPermissionCompleteCallback(
1832         env, status, context->asyncContext, true, { "SetShowNumber", Permission::SET_TELEPHONY_STATE });
1833 }
1834 
SetShowNumber(napi_env env,napi_callback_info info)1835 napi_value SetShowNumber(napi_env env, napi_callback_info info)
1836 {
1837     auto asyncContext = new AsyncContext2();
1838     BaseContext &context = asyncContext->asyncContext.context;
1839 
1840     auto initPara =
1841         std::make_tuple(&asyncContext->asyncContext.slotId, std::data(asyncContext->inputStr), &context.callbackRef);
1842     AsyncPara para {
1843         .funcName = "SetShowNumber",
1844         .env = env,
1845         .info = info,
1846         .execute = NativeSetShowNumber,
1847         .complete = SetShowNumberCallback,
1848     };
1849     napi_value result = NapiCreateAsyncWork2<AsyncContext2>(para, asyncContext, initPara);
1850     if (result) {
1851         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1852     }
1853     return result;
1854 }
1855 
NativeGetShowNumber(napi_env env,void * data)1856 void NativeGetShowNumber(napi_env env, void *data)
1857 {
1858     if (data == nullptr) {
1859         return;
1860     }
1861     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
1862     if (!IsValidSlotId(asyncContext->slotId)) {
1863         TELEPHONY_LOGE("NativeGetShowNumber slotId is invalid");
1864         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
1865         return;
1866     }
1867     std::u16string showNumber;
1868     int32_t errorCode =
1869         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetShowNumber(asyncContext->slotId, showNumber);
1870     if (errorCode == ERROR_NONE) {
1871         asyncContext->callbackVal = NapiUtil::ToUtf8(showNumber);
1872         asyncContext->context.resolved = true;
1873     } else {
1874         asyncContext->context.resolved = false;
1875     }
1876     asyncContext->context.errorCode = errorCode;
1877 }
1878 
GetShowNumberCallback(napi_env env,napi_status status,void * data)1879 void GetShowNumberCallback(napi_env env, napi_status status, void *data)
1880 {
1881     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1882     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
1883     NapiAsyncPermissionCompleteCallback(
1884         env, status, *context, false, { "GetShowNumber", Permission::GET_TELEPHONY_STATE });
1885 }
1886 
GetShowNumber(napi_env env,napi_callback_info info)1887 napi_value GetShowNumber(napi_env env, napi_callback_info info)
1888 {
1889     return NapiCreateAsyncWork<std::string, NativeGetShowNumber, GetShowNumberCallback>(env, info, "GetShowNumber");
1890 }
1891 
NativeUnlockPin2(napi_env env,void * data)1892 void NativeUnlockPin2(napi_env env, void *data)
1893 {
1894     if (data == nullptr) {
1895         return;
1896     }
1897     AsyncContextPIN *pinContext = static_cast<AsyncContextPIN *>(data);
1898     if (!IsValidSlotId(pinContext->asyncContext.slotId)) {
1899         TELEPHONY_LOGE("NativeUnlockPin2 slotId is invalid");
1900         pinContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1901         return;
1902     }
1903     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1904     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().UnlockPin2(
1905         pinContext->asyncContext.slotId, NapiUtil::ToUtf16(pinContext->inStr1.data()), response);
1906     TELEPHONY_LOGI("NAPI NativeUnlockPin2 %{public}d", errorCode);
1907     if (errorCode == ERROR_NONE) {
1908         pinContext->result = response.result;
1909         pinContext->remain = response.remain;
1910         pinContext->asyncContext.context.resolved = true;
1911     } else {
1912         pinContext->asyncContext.context.resolved = false;
1913     }
1914     pinContext->asyncContext.context.errorCode = errorCode;
1915 }
1916 
UnlockPinCallback2(napi_env env,napi_status status,void * data)1917 void UnlockPinCallback2(napi_env env, napi_status status, void *data)
1918 {
1919     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1920     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1921     const LockStatusResponse res {context->result, context->remain};
1922     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1923     NapiAsyncPermissionCompleteCallback(
1924         env, status, context->asyncContext, false, { "UnlockPin2", Permission::SET_TELEPHONY_STATE });
1925 }
1926 
UnlockPin2(napi_env env,napi_callback_info info)1927 napi_value UnlockPin2(napi_env env, napi_callback_info info)
1928 {
1929     auto pinContext = new AsyncContextPIN();
1930     BaseContext &context = pinContext->asyncContext.context;
1931 
1932     char tmpStr[ARRAY_SIZE] = {0};
1933     auto initPara = std::make_tuple(&pinContext->asyncContext.slotId, tmpStr, &context.callbackRef);
1934     AsyncPara para {
1935         .funcName = "UnlockPin2",
1936         .env = env,
1937         .info = info,
1938         .execute = NativeUnlockPin2,
1939         .complete = UnlockPinCallback2,
1940     };
1941     napi_value result = NapiCreateAsyncWork2(para, pinContext, initPara);
1942     if (result) {
1943         pinContext->inStr1 = std::string(tmpStr);
1944         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
1945     }
1946     return result;
1947 }
1948 
NativeUnlockPuk2(napi_env env,void * data)1949 void NativeUnlockPuk2(napi_env env, void *data)
1950 {
1951     if (data == nullptr) {
1952         return;
1953     }
1954     AsyncContextPIN *pukContext = static_cast<AsyncContextPIN *>(data);
1955     if (!IsValidSlotId(pukContext->asyncContext.slotId)) {
1956         TELEPHONY_LOGE("NativeUnlockPuk2 slotId is invalid");
1957         pukContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
1958         return;
1959     }
1960     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
1961     int32_t errorCode =
1962         DelayedRefSingleton<CoreServiceClient>::GetInstance().UnlockPuk2(pukContext->asyncContext.slotId,
1963             NapiUtil::ToUtf16(pukContext->inStr1.data()), NapiUtil::ToUtf16(pukContext->inStr2.data()), response);
1964     TELEPHONY_LOGI("NAPI NativeUnlockPuk2 %{public}d", errorCode);
1965     if (errorCode == ERROR_NONE) {
1966         pukContext->result = response.result;
1967         pukContext->remain = response.remain;
1968         pukContext->asyncContext.context.resolved = true;
1969     } else {
1970         pukContext->asyncContext.context.resolved = false;
1971     }
1972     pukContext->asyncContext.context.errorCode = errorCode;
1973 }
1974 
UnlockPukCallback2(napi_env env,napi_status status,void * data)1975 void UnlockPukCallback2(napi_env env, napi_status status, void *data)
1976 {
1977     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1978     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
1979     const LockStatusResponse res {context->result, context->remain};
1980     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
1981     NapiAsyncPermissionCompleteCallback(
1982         env, status, context->asyncContext, false, { "UnlockPuk2", Permission::SET_TELEPHONY_STATE });
1983 }
1984 
UnlockPuk2(napi_env env,napi_callback_info info)1985 napi_value UnlockPuk2(napi_env env, napi_callback_info info)
1986 {
1987     auto pinContext = new AsyncContextPIN();
1988     BaseContext &context = pinContext->asyncContext.context;
1989     char tmpStr1[ARRAY_SIZE] = {0};
1990     char tmpStr2[ARRAY_SIZE] = {0};
1991 
1992     auto initPara = std::make_tuple(&pinContext->asyncContext.slotId, tmpStr1,
1993         tmpStr2, &context.callbackRef);
1994     AsyncPara para {
1995         .funcName = "UnlockPuk2",
1996         .env = env,
1997         .info = info,
1998         .execute = NativeUnlockPuk2,
1999         .complete = UnlockPukCallback2,
2000     };
2001     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, pinContext, initPara);
2002     if (result) {
2003         pinContext->inStr1 = std::string(tmpStr1);
2004         pinContext->inStr2 = std::string(tmpStr2);
2005         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2006     }
2007     return result;
2008 }
2009 
NativeAlterPin2(napi_env env,void * data)2010 void NativeAlterPin2(napi_env env, void *data)
2011 {
2012     if (data == nullptr) {
2013         return;
2014     }
2015     AsyncContextPIN *pinContext = static_cast<AsyncContextPIN *>(data);
2016     if (!IsValidSlotId(pinContext->asyncContext.slotId)) {
2017         TELEPHONY_LOGE("NativeAlterPin2 slotId is invalid");
2018         pinContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2019         return;
2020     }
2021     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
2022     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().AlterPin2(pinContext->asyncContext.slotId,
2023         NapiUtil::ToUtf16(pinContext->inStr1.data()), NapiUtil::ToUtf16(pinContext->inStr2.data()), response);
2024     TELEPHONY_LOGI("NAPI NativeAlterPin2 %{public}d", errorCode);
2025     if (errorCode == ERROR_NONE) {
2026         pinContext->result = response.result;
2027         pinContext->remain = response.remain;
2028         pinContext->asyncContext.context.resolved = true;
2029     } else {
2030         pinContext->asyncContext.context.resolved = false;
2031     }
2032     pinContext->asyncContext.context.errorCode = errorCode;
2033 }
2034 
AlterPinCallback2(napi_env env,napi_status status,void * data)2035 void AlterPinCallback2(napi_env env, napi_status status, void *data)
2036 {
2037     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2038     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
2039     const LockStatusResponse res {context->result, context->remain};
2040     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
2041     NapiAsyncPermissionCompleteCallback(
2042         env, status, context->asyncContext, false, { "AlterPin2", Permission::SET_TELEPHONY_STATE });
2043 }
2044 
AlterPin2(napi_env env,napi_callback_info info)2045 napi_value AlterPin2(napi_env env, napi_callback_info info)
2046 {
2047     auto pinContext = new AsyncContextPIN();
2048     BaseContext &context = pinContext->asyncContext.context;
2049     char tmpStr1[ARRAY_SIZE] = {0};
2050     char tmpStr2[ARRAY_SIZE] = {0};
2051 
2052     auto initPara = std::make_tuple(&pinContext->asyncContext.slotId, tmpStr1, tmpStr2, &context.callbackRef);
2053     AsyncPara para {
2054         .funcName = "AlterPin2",
2055         .env = env,
2056         .info = info,
2057         .execute = NativeAlterPin2,
2058         .complete = AlterPinCallback2,
2059     };
2060     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, pinContext, initPara);
2061     if (result) {
2062         pinContext->inStr1 = std::string(tmpStr1);
2063         pinContext->inStr2 = std::string(tmpStr2);
2064         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2065     }
2066     return result;
2067 }
2068 
NativeGetOperatorConfigs(napi_env env,void * data)2069 void NativeGetOperatorConfigs(napi_env env, void *data)
2070 {
2071     if (data == nullptr) {
2072         return;
2073     }
2074     AsyncOperatorConfig *info = static_cast<AsyncOperatorConfig *>(data);
2075     if (!IsValidSlotId(info->asyncContext.slotId)) {
2076         TELEPHONY_LOGE("NativeGetOperatorConfigs slotId is invalid");
2077         info->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2078         return;
2079     }
2080     OperatorConfig config;
2081     int32_t errorCode =
2082         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetOperatorConfigs(info->asyncContext.slotId, config);
2083     TELEPHONY_LOGI("NAPI NativeGetOperatorConfigs %{public}d", errorCode);
2084     if (errorCode == ERROR_NONE) {
2085         for (const auto &val : config.configValue) {
2086             ConfigInfo &&config = {NapiUtil::ToUtf8(val.first), NapiUtil::ToUtf8(val.second)};
2087             info->configValue.push_back(config);
2088         }
2089         info->asyncContext.context.resolved = true;
2090     } else {
2091         info->asyncContext.context.resolved = false;
2092     }
2093     info->asyncContext.context.errorCode = errorCode;
2094 }
2095 
GetOperatorConfigsCallback(napi_env env,napi_status status,void * data)2096 void GetOperatorConfigsCallback(napi_env env, napi_status status, void *data)
2097 {
2098     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2099     std::unique_ptr<AsyncOperatorConfig> operatorConfig(static_cast<AsyncOperatorConfig *>(data));
2100     AsyncContext<napi_value> &aContext = operatorConfig->asyncContext;
2101     if (aContext.context.resolved) {
2102         aContext.callbackVal = nullptr;
2103         napi_create_array(env, &aContext.callbackVal);
2104         for (size_t i = 0; i < operatorConfig->configValue.size(); i++) {
2105             napi_value val = OperatorConfigAnalyze(env, operatorConfig->configValue.at(i));
2106             napi_set_element(env, aContext.callbackVal, i, val);
2107         }
2108     }
2109     NapiAsyncPermissionCompleteCallback(
2110         env, status, aContext, false, { "GetOperatorConfigs", Permission::GET_TELEPHONY_STATE });
2111 }
2112 
GetOperatorConfigs(napi_env env,napi_callback_info info)2113 napi_value GetOperatorConfigs(napi_env env, napi_callback_info info)
2114 {
2115     auto crrierConfig = new AsyncOperatorConfig();
2116     BaseContext &context = crrierConfig->asyncContext.context;
2117 
2118     auto initPara = std::make_tuple(&crrierConfig->asyncContext.slotId, &context.callbackRef);
2119     AsyncPara para {
2120         .funcName = "GetOperatorConfigs",
2121         .env = env,
2122         .info = info,
2123         .execute = NativeGetOperatorConfigs,
2124         .complete = GetOperatorConfigsCallback,
2125     };
2126     napi_value result = NapiCreateAsyncWork2<AsyncOperatorConfig>(para, crrierConfig, initPara);
2127     if (result) {
2128         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2129     }
2130     return result;
2131 }
2132 
NativeGetActiveSimAccountInfoList(napi_env env,void * data)2133 void NativeGetActiveSimAccountInfoList(napi_env env, void *data)
2134 {
2135     if (data == nullptr) {
2136         return;
2137     }
2138     AsyncIccAccountInfo *accountInfo = static_cast<AsyncIccAccountInfo *>(data);
2139     accountInfo->vecInfo.clear();
2140     std::vector<IccAccountInfo> activeInfo;
2141     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetActiveSimAccountInfoList(activeInfo);
2142     TELEPHONY_LOGI("NAPI NativeGetActiveSimAccountInfoList %{public}d", errorCode);
2143     if (errorCode == ERROR_NONE) {
2144         accountInfo->vecInfo.swap(activeInfo);
2145         accountInfo->asyncContext.context.resolved = true;
2146     } else {
2147         accountInfo->asyncContext.context.resolved = false;
2148     }
2149     accountInfo->asyncContext.context.errorCode = errorCode;
2150 }
2151 
GetActiveSimAccountInfoListCallback(napi_env env,napi_status status,void * data)2152 void GetActiveSimAccountInfoListCallback(napi_env env, napi_status status, void *data)
2153 {
2154     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2155     std::unique_ptr<AsyncIccAccountInfo> info(static_cast<AsyncIccAccountInfo *>(data));
2156     AsyncContext<napi_value> &asyncContext = info->asyncContext;
2157     asyncContext.callbackVal = nullptr;
2158     napi_create_array(env, &asyncContext.callbackVal);
2159     for (size_t i = 0; i < info->vecInfo.size(); i++) {
2160         napi_value val = IccAccountInfoConversion(env, info->vecInfo.at(i));
2161         napi_set_element(env, asyncContext.callbackVal, i, val);
2162     }
2163     NapiAsyncPermissionCompleteCallback(
2164         env, status, asyncContext, false, { "GetActiveSimAccountInfoList", Permission::GET_TELEPHONY_STATE });
2165 }
2166 
GetActiveSimAccountInfoList(napi_env env,napi_callback_info info)2167 napi_value GetActiveSimAccountInfoList(napi_env env, napi_callback_info info)
2168 {
2169     auto accountInfo = new AsyncIccAccountInfo();
2170     BaseContext &context = accountInfo->asyncContext.context;
2171 
2172     auto initPara = std::make_tuple(&context.callbackRef);
2173     AsyncPara para {
2174         .funcName = "GetActiveSimAccountInfoList",
2175         .env = env,
2176         .info = info,
2177         .execute = NativeGetActiveSimAccountInfoList,
2178         .complete = GetActiveSimAccountInfoListCallback,
2179     };
2180     napi_value result = NapiCreateAsyncWork2<AsyncIccAccountInfo>(para, accountInfo, initPara);
2181     if (result) {
2182         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2183     }
2184     return result;
2185 }
2186 
NativeQueryIccDiallingNumbers(napi_env env,void * data)2187 void NativeQueryIccDiallingNumbers(napi_env env, void *data)
2188 {
2189     if (data == nullptr) {
2190         return;
2191     }
2192     AsyncDiallingNumbers<napi_value> *diallingNumbers = static_cast<AsyncDiallingNumbers<napi_value> *>(data);
2193     if (!IsValidSlotId(diallingNumbers->asyncContext.slotId)) {
2194         TELEPHONY_LOGE("NativeQueryIccDiallingNumbers slotId is invalid");
2195         diallingNumbers->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2196         return;
2197     }
2198     std::vector<std::shared_ptr<DiallingNumbersInfo>> diallingNumbersResult;
2199     diallingNumbersResult.clear();
2200     std::lock_guard<std::mutex> mtxlock(mtx);
2201     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().QueryIccDiallingNumbers(
2202         diallingNumbers->asyncContext.slotId, diallingNumbers->type, diallingNumbersResult);
2203     TELEPHONY_LOGI("NAPI NativeQueryIccDiallingNumbers %{public}zu", diallingNumbersResult.size());
2204     if (!diallingNumbersResult.empty()) {
2205         std::vector<TelNumbersInfo> &dialNumbers = diallingNumbers->infoVec;
2206         for (const auto &dialNumber : diallingNumbersResult) {
2207             TelNumbersInfo info {};
2208             NapiUtil::ToUtf8(dialNumber->name_).copy(info.alphaTag.data(), ARRAY_SIZE);
2209             NapiUtil::ToUtf8(dialNumber->number_).copy(info.number.data(), ARRAY_SIZE);
2210             info.recordNumber = dialNumber->index_;
2211             dialNumbers.push_back(std::move(info));
2212         }
2213     }
2214     diallingNumbers->asyncContext.context.errorCode = errorCode;
2215     diallingNumbers->asyncContext.context.resolved = (errorCode == ERROR_NONE);
2216 }
2217 
QueryIccDiallingNumbersCallback(napi_env env,napi_status status,void * data)2218 void QueryIccDiallingNumbersCallback(napi_env env, napi_status status, void *data)
2219 {
2220     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2221     std::unique_ptr<AsyncDiallingNumbers<napi_value>> diallingNumbers(
2222         static_cast<AsyncDiallingNumbers<napi_value> *>(data));
2223     diallingNumbers->asyncContext.callbackVal = nullptr;
2224     napi_create_array(env, &diallingNumbers->asyncContext.callbackVal);
2225     for (size_t i = 0; i < diallingNumbers->infoVec.size(); i++) {
2226         napi_value val = DiallingNumbersConversion(env, diallingNumbers->infoVec.at(i));
2227         napi_set_element(env, diallingNumbers->asyncContext.callbackVal, i, val);
2228     }
2229     NapiAsyncPermissionCompleteCallback(
2230         env, status, diallingNumbers->asyncContext, false, { "QueryIccDiallingNumbers", Permission::READ_CONTACTS });
2231 }
2232 
QueryIccDiallingNumbers(napi_env env,napi_callback_info info)2233 napi_value QueryIccDiallingNumbers(napi_env env, napi_callback_info info)
2234 {
2235     auto diallingNumbers = new AsyncDiallingNumbers<napi_value>();
2236     BaseContext &context = diallingNumbers->asyncContext.context;
2237 
2238     auto initPara =
2239         std::make_tuple(&diallingNumbers->asyncContext.slotId, &diallingNumbers->type, &context.callbackRef);
2240     AsyncPara para {
2241         .funcName = "QueryIccDiallingNumbers",
2242         .env = env,
2243         .info = info,
2244         .execute = NativeQueryIccDiallingNumbers,
2245         .complete = QueryIccDiallingNumbersCallback,
2246     };
2247     napi_value result = NapiCreateAsyncWork2<AsyncDiallingNumbers<napi_value>>(para, diallingNumbers, initPara);
2248     if (result) {
2249         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2250     }
2251     return result;
2252 }
2253 
NativeAddIccDiallingNumbers(napi_env env,void * data)2254 void NativeAddIccDiallingNumbers(napi_env env, void *data)
2255 {
2256     if (data == nullptr) {
2257         return;
2258     }
2259     AsyncDiallingNumbers<int32_t> *diallingNumbersContext = static_cast<AsyncDiallingNumbers<int32_t> *>(data);
2260     AsyncContext<int32_t> &asyncContext = diallingNumbersContext->asyncContext;
2261     if (!IsValidSlotId(asyncContext.slotId)) {
2262         TELEPHONY_LOGE("NativeAddIccDiallingNumbers slotId is invalid");
2263         asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2264         return;
2265     }
2266     if (diallingNumbersContext->infoVec.size() > 0) {
2267         std::shared_ptr<DiallingNumbersInfo> telNumber = std::make_shared<DiallingNumbersInfo>();
2268         GetDiallingNumberInfo(telNumber, diallingNumbersContext->infoVec.at(0));
2269         int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().AddIccDiallingNumbers(
2270             asyncContext.slotId, diallingNumbersContext->type, telNumber);
2271         TELEPHONY_LOGI("NAPI NativeAddIccDiallingNumbers errorCode: %{public}d", errorCode);
2272         asyncContext.context.errorCode = errorCode;
2273         asyncContext.context.resolved = (errorCode == ERROR_NONE);
2274     }
2275 }
2276 
AddIccDiallingNumbersCallback(napi_env env,napi_status status,void * data)2277 void AddIccDiallingNumbersCallback(napi_env env, napi_status status, void *data)
2278 {
2279     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2280     std::unique_ptr<AsyncDiallingNumbers<int32_t>> context(static_cast<AsyncDiallingNumbers<int32_t> *>(data));
2281     NapiAsyncPermissionCompleteCallback(
2282         env, status, context->asyncContext, true, { "AddIccDiallingNumbers", Permission::WRITE_CONTACTS });
2283 }
2284 
AddIccDiallingNumbers(napi_env env,napi_callback_info info)2285 napi_value AddIccDiallingNumbers(napi_env env, napi_callback_info info)
2286 {
2287     auto diallingNumbers = new AsyncDiallingNumbers<int32_t>();
2288     BaseContext &context = diallingNumbers->asyncContext.context;
2289 
2290     napi_value object = NapiUtil::CreateUndefined(env);
2291     auto initPara =
2292         std::make_tuple(&diallingNumbers->asyncContext.slotId, &diallingNumbers->type, &object, &context.callbackRef);
2293 
2294     AsyncPara para {
2295         .funcName = "AddIccDiallingNumbers",
2296         .env = env,
2297         .info = info,
2298         .execute = NativeAddIccDiallingNumbers,
2299         .complete = AddIccDiallingNumbersCallback,
2300     };
2301     napi_value result = NapiCreateAsyncWork2<AsyncDiallingNumbers<int32_t>>(para, diallingNumbers, initPara);
2302     if (result) {
2303         TelNumbersInfo inputInfo;
2304         DiallingNumberParaAnalyze(env, object, inputInfo);
2305         diallingNumbers->infoVec.push_back(std::move(inputInfo));
2306         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2307     }
2308     return result;
2309 }
2310 
NativeDelIccDiallingNumbers(napi_env env,void * data)2311 void NativeDelIccDiallingNumbers(napi_env env, void *data)
2312 {
2313     if (data == nullptr) {
2314         return;
2315     }
2316     AsyncDiallingNumbers<int32_t> *diallingNumbers = static_cast<AsyncDiallingNumbers<int32_t> *>(data);
2317     if (!IsValidSlotId(diallingNumbers->asyncContext.slotId)) {
2318         TELEPHONY_LOGE("NativeDelIccDiallingNumbers slotId is invalid");
2319         diallingNumbers->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2320         return;
2321     }
2322     if (diallingNumbers->infoVec.size() > 0) {
2323         std::shared_ptr<DiallingNumbersInfo> telNumber = std::make_shared<DiallingNumbersInfo>();
2324         GetDiallingNumberInfo(telNumber, diallingNumbers->infoVec.at(0));
2325         int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().DelIccDiallingNumbers(
2326             diallingNumbers->asyncContext.slotId, diallingNumbers->type, telNumber);
2327         TELEPHONY_LOGI("NAPI NativeDelIccDiallingNumbers errorCode: %{public}d", errorCode);
2328         diallingNumbers->asyncContext.context.errorCode = errorCode;
2329         diallingNumbers->asyncContext.context.resolved = (errorCode == ERROR_NONE);
2330     }
2331 }
2332 
DelIccDiallingNumbersCallback(napi_env env,napi_status status,void * data)2333 void DelIccDiallingNumbersCallback(napi_env env, napi_status status, void *data)
2334 {
2335     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2336     std::unique_ptr<AsyncDiallingNumbers<int32_t>> diallingNumbers(static_cast<AsyncDiallingNumbers<int32_t> *>(data));
2337     NapiAsyncPermissionCompleteCallback(
2338         env, status, diallingNumbers->asyncContext, true, { "DelIccDiallingNumbers", Permission::WRITE_CONTACTS });
2339 }
2340 
DelIccDiallingNumbers(napi_env env,napi_callback_info info)2341 napi_value DelIccDiallingNumbers(napi_env env, napi_callback_info info)
2342 {
2343     auto diallingNumbers = new AsyncDiallingNumbers<int32_t>();
2344     BaseContext &context = diallingNumbers->asyncContext.context;
2345 
2346     napi_value object = NapiUtil::CreateUndefined(env);
2347     auto initPara =
2348         std::make_tuple(&diallingNumbers->asyncContext.slotId, &diallingNumbers->type, &object, &context.callbackRef);
2349     AsyncPara para {
2350         .funcName = "DelIccDiallingNumbers",
2351         .env = env,
2352         .info = info,
2353         .execute = NativeDelIccDiallingNumbers,
2354         .complete = DelIccDiallingNumbersCallback,
2355     };
2356     napi_value result = NapiCreateAsyncWork2(para, diallingNumbers, initPara);
2357     if (result) {
2358         TelNumbersInfo inputInfo;
2359         DiallingNumberParaAnalyze(env, object, inputInfo);
2360         diallingNumbers->infoVec.push_back(std::move(inputInfo));
2361         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2362     }
2363     return result;
2364 }
2365 
NativeUpdateIccDiallingNumbers(napi_env env,void * data)2366 void NativeUpdateIccDiallingNumbers(napi_env env, void *data)
2367 {
2368     if (data == nullptr) {
2369         return;
2370     }
2371     AsyncDiallingNumbers<int32_t> *diallingNumbers = static_cast<AsyncDiallingNumbers<int32_t> *>(data);
2372     AsyncContext<int32_t> &asyncContext = diallingNumbers->asyncContext;
2373     if (!IsValidSlotId(asyncContext.slotId)) {
2374         TELEPHONY_LOGE("NativeUpdateIccDiallingNumbers slotId is invalid");
2375         asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2376         return;
2377     }
2378     if (diallingNumbers->infoVec.size() > 0) {
2379         std::shared_ptr<DiallingNumbersInfo> telNumber = std::make_shared<DiallingNumbersInfo>();
2380         GetDiallingNumberInfo(telNumber, diallingNumbers->infoVec.at(0));
2381         int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().UpdateIccDiallingNumbers(
2382             asyncContext.slotId, diallingNumbers->type, telNumber);
2383         TELEPHONY_LOGI("NAPI NativeUpdateIccDiallingNumbers errorCode: %{public}d", errorCode);
2384         asyncContext.context.errorCode = errorCode;
2385         asyncContext.context.resolved = (errorCode == ERROR_NONE);
2386     }
2387 }
2388 
UpdateIccDiallingNumbersCallback(napi_env env,napi_status status,void * data)2389 void UpdateIccDiallingNumbersCallback(napi_env env, napi_status status, void *data)
2390 {
2391     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2392     std::unique_ptr<AsyncDiallingNumbers<int32_t>> context(static_cast<AsyncDiallingNumbers<int32_t> *>(data));
2393     NapiAsyncPermissionCompleteCallback(
2394         env, status, context->asyncContext, true, { "UpdateIccDiallingNumbers", Permission::WRITE_CONTACTS });
2395 }
2396 
UpdateIccDiallingNumbers(napi_env env,napi_callback_info info)2397 napi_value UpdateIccDiallingNumbers(napi_env env, napi_callback_info info)
2398 {
2399     auto diallingNumbers = new AsyncDiallingNumbers<int32_t>();
2400     BaseContext &context = diallingNumbers->asyncContext.context;
2401 
2402     napi_value object = NapiUtil::CreateUndefined(env);
2403     auto initPara =
2404         std::make_tuple(&diallingNumbers->asyncContext.slotId, &diallingNumbers->type, &object, &context.callbackRef);
2405 
2406     AsyncPara para {
2407         .funcName = "UpdateIccDiallingNumbers",
2408         .env = env,
2409         .info = info,
2410         .execute = NativeUpdateIccDiallingNumbers,
2411         .complete = UpdateIccDiallingNumbersCallback,
2412     };
2413     napi_value result = NapiCreateAsyncWork2<AsyncDiallingNumbers<int32_t>>(para, diallingNumbers, initPara);
2414     if (result) {
2415         TelNumbersInfo inputInfo;
2416         DiallingNumberParaAnalyze(env, object, inputInfo);
2417         diallingNumbers->infoVec.push_back(std::move(inputInfo));
2418         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2419     }
2420     return result;
2421 }
2422 
NativeSetVoiceMailInfo(napi_env env,void * data)2423 void NativeSetVoiceMailInfo(napi_env env, void *data)
2424 {
2425     if (data == nullptr) {
2426         return;
2427     }
2428     AsyncVoiceMail *mailContext = static_cast<AsyncVoiceMail *>(data);
2429     AsyncContext<bool> &asyncContext = mailContext->asyncContext;
2430     if (!IsValidSlotId(asyncContext.slotId)) {
2431         TELEPHONY_LOGE("NativeSetVoiceMailInfo slotId is invalid");
2432         asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2433         return;
2434     }
2435     std::u16string mailName = NapiUtil::ToUtf16(std::data(mailContext->mailName));
2436     std::u16string mailNumber = NapiUtil::ToUtf16(std::data(mailContext->mailNumber));
2437     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SetVoiceMailInfo(
2438         asyncContext.slotId, mailName, mailNumber);
2439     TELEPHONY_LOGI("NAPI NativeSetVoiceMailInfo %{public}d", errorCode);
2440     asyncContext.context.errorCode = errorCode;
2441     asyncContext.context.resolved = (errorCode == ERROR_NONE);
2442 }
2443 
SetVoiceMailInfoCallback(napi_env env,napi_status status,void * data)2444 void SetVoiceMailInfoCallback(napi_env env, napi_status status, void *data)
2445 {
2446     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2447     std::unique_ptr<AsyncVoiceMail> context(static_cast<AsyncVoiceMail *>(data));
2448     NapiAsyncPermissionCompleteCallback(
2449         env, status, context->asyncContext, true, { "SetVoiceMailInfo", Permission::SET_TELEPHONY_STATE });
2450 }
2451 
SetVoiceMailInfo(napi_env env,napi_callback_info info)2452 napi_value SetVoiceMailInfo(napi_env env, napi_callback_info info)
2453 {
2454     auto mailContext = new AsyncVoiceMail();
2455     BaseContext &context = mailContext->asyncContext.context;
2456 
2457     auto initPara = std::make_tuple(&mailContext->asyncContext.slotId, std::data(mailContext->mailName),
2458         std::data(mailContext->mailNumber), &context.callbackRef);
2459 
2460     AsyncPara para {
2461         .funcName = "SetVoiceMailNumber",
2462         .env = env,
2463         .info = info,
2464         .execute = NativeSetVoiceMailInfo,
2465         .complete = SetVoiceMailInfoCallback,
2466     };
2467     napi_value result = NapiCreateAsyncWork2<AsyncVoiceMail>(para, mailContext, initPara);
2468     if (result) {
2469         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2470     }
2471     return result;
2472 }
2473 
NativeSendEnvelopeCmd(napi_env env,void * data)2474 void NativeSendEnvelopeCmd(napi_env env, void *data)
2475 {
2476     if (data == nullptr) {
2477         return;
2478     }
2479     AsyncContext2 *context = static_cast<AsyncContext2 *>(data);
2480     if (!IsValidSlotId(context->asyncContext.slotId)) {
2481         TELEPHONY_LOGE("NativeSendEnvelopeCmd slotId is invalid");
2482         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2483         return;
2484     }
2485     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SendEnvelopeCmd(
2486         context->asyncContext.slotId, std::data(context->inputStr));
2487     TELEPHONY_LOGI("NAPI NativeSendEnvelopeCmd %{public}d", errorCode);
2488     context->asyncContext.context.errorCode = errorCode;
2489     context->asyncContext.context.resolved = (errorCode == ERROR_NONE);
2490 }
2491 
SendEnvelopeCmdCallback(napi_env env,napi_status status,void * data)2492 void SendEnvelopeCmdCallback(napi_env env, napi_status status, void *data)
2493 {
2494     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2495     std::unique_ptr<AsyncContext2> context(static_cast<AsyncContext2 *>(data));
2496     NapiAsyncPermissionCompleteCallback(
2497         env, status, context->asyncContext, true, { "SendEnvelopeCmd", Permission::SET_TELEPHONY_STATE });
2498 }
2499 
SendEnvelopeCmd(napi_env env,napi_callback_info info)2500 napi_value SendEnvelopeCmd(napi_env env, napi_callback_info info)
2501 {
2502     auto asyncContext = new AsyncContext2();
2503     BaseContext &context = asyncContext->asyncContext.context;
2504 
2505     auto initPara =
2506         std::make_tuple(&asyncContext->asyncContext.slotId, std::data(asyncContext->inputStr), &context.callbackRef);
2507     AsyncPara para {
2508         .funcName = "SendEnvelopeCmd",
2509         .env = env,
2510         .info = info,
2511         .execute = NativeSendEnvelopeCmd,
2512         .complete = SendEnvelopeCmdCallback,
2513     };
2514     napi_value result = NapiCreateAsyncWork2<AsyncContext2>(para, asyncContext, initPara);
2515     if (result) {
2516         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2517     }
2518     return result;
2519 }
2520 
NativeSendTerminalResponseCmd(napi_env env,void * data)2521 void NativeSendTerminalResponseCmd(napi_env env, void *data)
2522 {
2523     if (data == nullptr) {
2524         return;
2525     }
2526     AsyncContext2 *context = static_cast<AsyncContext2 *>(data);
2527     if (!IsValidSlotId(context->asyncContext.slotId)) {
2528         TELEPHONY_LOGE("NativeSendTerminalResponseCmd slotId is invalid");
2529         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2530         return;
2531     }
2532     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SendTerminalResponseCmd(
2533         context->asyncContext.slotId, std::data(context->inputStr));
2534     TELEPHONY_LOGI("NAPI NativeSendTerminalResponseCmd %{public}d", errorCode);
2535     context->asyncContext.context.errorCode = errorCode;
2536     context->asyncContext.context.resolved = (errorCode == ERROR_NONE);
2537 }
2538 
SendTerminalResponseCmdCallback(napi_env env,napi_status status,void * data)2539 void SendTerminalResponseCmdCallback(napi_env env, napi_status status, void *data)
2540 {
2541     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2542     std::unique_ptr<AsyncContext2> context(static_cast<AsyncContext2 *>(data));
2543     NapiAsyncPermissionCompleteCallback(
2544         env, status, context->asyncContext, true, { "SendTerminalResponseCmd", Permission::SET_TELEPHONY_STATE });
2545 }
2546 
SendTerminalResponseCmd(napi_env env,napi_callback_info info)2547 napi_value SendTerminalResponseCmd(napi_env env, napi_callback_info info)
2548 {
2549     auto asyncContext = new AsyncContext2();
2550     BaseContext &context = asyncContext->asyncContext.context;
2551 
2552     auto initPara =
2553         std::make_tuple(&asyncContext->asyncContext.slotId, std::data(asyncContext->inputStr), &context.callbackRef);
2554     AsyncPara para {
2555         .funcName = "SendTerminalResponseCmd",
2556         .env = env,
2557         .info = info,
2558         .execute = NativeSendTerminalResponseCmd,
2559         .complete = SendTerminalResponseCmdCallback,
2560     };
2561     napi_value result = NapiCreateAsyncWork2<AsyncContext2>(para, asyncContext, initPara);
2562     if (result) {
2563         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2564     }
2565     return result;
2566 }
2567 
NativeAcceptCallSetupRequest(napi_env env,void * data)2568 void NativeAcceptCallSetupRequest(napi_env env, void *data)
2569 {
2570     if (data == nullptr) {
2571         return;
2572     }
2573     AsyncStkCallSetupResult *context = static_cast<AsyncStkCallSetupResult *>(data);
2574     if (!IsValidSlotId(context->asyncContext.slotId)) {
2575         TELEPHONY_LOGE("NativeAcceptCallSetupRequest slotId is invalid");
2576         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2577         return;
2578     }
2579     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SendCallSetupRequestResult(
2580         context->asyncContext.slotId, true);
2581     TELEPHONY_LOGI("NAPI NativeAcceptCallSetupRequest %{public}d", errorCode);
2582     context->asyncContext.context.errorCode = errorCode;
2583     context->asyncContext.context.resolved = errorCode == ERROR_NONE;
2584 }
2585 
AcceptCallSetupRequestCallback(napi_env env,napi_status status,void * data)2586 void AcceptCallSetupRequestCallback(napi_env env, napi_status status, void *data)
2587 {
2588     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2589     std::unique_ptr<AsyncStkCallSetupResult> context(static_cast<AsyncStkCallSetupResult *>(data));
2590     NapiAsyncPermissionCompleteCallback(
2591         env, status, context->asyncContext, true, { "acceptCallSetup", Permission::SET_TELEPHONY_STATE });
2592 }
2593 
AcceptCallSetupRequest(napi_env env,napi_callback_info info)2594 napi_value AcceptCallSetupRequest(napi_env env, napi_callback_info info)
2595 {
2596     auto asyncContext = new AsyncStkCallSetupResult();
2597     BaseContext &context = asyncContext->asyncContext.context;
2598 
2599     auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, &context.callbackRef);
2600     AsyncPara para {
2601         .funcName = "AcceptCallSetupRequest",
2602         .env = env,
2603         .info = info,
2604         .execute = NativeAcceptCallSetupRequest,
2605         .complete = AcceptCallSetupRequestCallback,
2606     };
2607     napi_value result = NapiCreateAsyncWork2<AsyncStkCallSetupResult>(para, asyncContext, initPara);
2608     if (result) {
2609         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2610     }
2611     return result;
2612 }
2613 
NativeRejectCallSetupRequest(napi_env env,void * data)2614 void NativeRejectCallSetupRequest(napi_env env, void *data)
2615 {
2616     if (data == nullptr) {
2617         return;
2618     }
2619     AsyncStkCallSetupResult *context = static_cast<AsyncStkCallSetupResult *>(data);
2620     if (!IsValidSlotId(context->asyncContext.slotId)) {
2621         TELEPHONY_LOGE("NativeRejectCallSetupRequest slotId is invalid");
2622         context->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2623         return;
2624     }
2625     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().SendCallSetupRequestResult(
2626         context->asyncContext.slotId, false);
2627     TELEPHONY_LOGI("NAPI NativeRejectCallSetupRequest %{public}d", errorCode);
2628     context->asyncContext.context.errorCode = errorCode;
2629     context->asyncContext.context.resolved = errorCode == ERROR_NONE;
2630 }
2631 
RejectCallSetupRequestCallback(napi_env env,napi_status status,void * data)2632 void RejectCallSetupRequestCallback(napi_env env, napi_status status, void *data)
2633 {
2634     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2635     std::unique_ptr<AsyncStkCallSetupResult> context(static_cast<AsyncStkCallSetupResult *>(data));
2636     NapiAsyncPermissionCompleteCallback(
2637         env, status, context->asyncContext, true, { "rejectCallSetup", Permission::SET_TELEPHONY_STATE });
2638 }
2639 
RejectCallSetupRequest(napi_env env,napi_callback_info info)2640 napi_value RejectCallSetupRequest(napi_env env, napi_callback_info info)
2641 {
2642     auto asyncContext = new AsyncStkCallSetupResult();
2643     BaseContext &context = asyncContext->asyncContext.context;
2644 
2645     auto initPara = std::make_tuple(&asyncContext->asyncContext.slotId, &context.callbackRef);
2646     AsyncPara para {
2647         .funcName = "RejectCallSetupRequest",
2648         .env = env,
2649         .info = info,
2650         .execute = NativeRejectCallSetupRequest,
2651         .complete = RejectCallSetupRequestCallback,
2652     };
2653     napi_value result = NapiCreateAsyncWork2<AsyncStkCallSetupResult>(para, asyncContext, initPara);
2654     if (result) {
2655         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2656     }
2657     return result;
2658 }
2659 
GetMaxSimCount(napi_env env,napi_callback_info)2660 napi_value GetMaxSimCount(napi_env env, napi_callback_info)
2661 {
2662     return GetNapiValue(env, DelayedRefSingleton<CoreServiceClient>::GetInstance().GetMaxSimCount());
2663 }
2664 
NativeGetOpKey(napi_env env,void * data)2665 void NativeGetOpKey(napi_env env, void *data)
2666 {
2667     if (data == nullptr) {
2668         return;
2669     }
2670     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
2671     if (!IsValidSlotId(asyncContext->slotId)) {
2672         TELEPHONY_LOGE("NativeGetOpKey slotId is invalid");
2673         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
2674         return;
2675     }
2676     std::u16string opkey;
2677     int32_t code = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetOpKey(asyncContext->slotId, opkey);
2678     if (code == ERROR_NONE) {
2679         asyncContext->callbackVal = NapiUtil::ToUtf8(opkey);
2680         asyncContext->context.resolved = true;
2681         return;
2682     }
2683     asyncContext->context.errorCode = code;
2684     asyncContext->context.resolved = false;
2685 }
2686 
GetOpKeyCallback(napi_env env,napi_status status,void * data)2687 void GetOpKeyCallback(napi_env env, napi_status status, void *data)
2688 {
2689     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2690     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
2691     NapiAsyncCommomCompleteCallback(env, status, *context, false);
2692 }
2693 
GetOpKey(napi_env env,napi_callback_info info)2694 napi_value GetOpKey(napi_env env, napi_callback_info info)
2695 {
2696     return NapiCreateAsyncWork<std::string, NativeGetOpKey, GetOpKeyCallback>(env, info, "GetOpKey");
2697 }
2698 
GetOpKeySync(napi_env env,napi_callback_info info)2699 napi_value GetOpKeySync(napi_env env, napi_callback_info info)
2700 {
2701     size_t parameterCount = 1;
2702     napi_value parameters[] = { nullptr };
2703     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
2704     std::u16string opKey;
2705     napi_value value = nullptr;
2706     if (parameterCount != 1) {
2707         TELEPHONY_LOGE("parameter count is incorrect");
2708         std::string operatorKey = NapiUtil::ToUtf8(opKey);
2709         NAPI_CALL(env, napi_create_string_utf8(env, operatorKey.c_str(), operatorKey.length(), &value));
2710         return value;
2711     }
2712     int32_t slotId = -1;
2713     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
2714         TELEPHONY_LOGE("convert parameter fail");
2715         std::string operatorKey = NapiUtil::ToUtf8(opKey);
2716         NAPI_CALL(env, napi_create_string_utf8(env, operatorKey.c_str(), operatorKey.length(), &value));
2717         return value;
2718     }
2719     if (IsValidSlotId(slotId)) {
2720         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetOpKey(slotId, opKey);
2721     }
2722     std::string operatorKey = NapiUtil::ToUtf8(opKey);
2723     NAPI_CALL(env, napi_create_string_utf8(env, operatorKey.c_str(), operatorKey.length(), &value));
2724     return value;
2725 }
2726 
NativeGetOpName(napi_env env,void * data)2727 void NativeGetOpName(napi_env env, void *data)
2728 {
2729     if (data == nullptr) {
2730         return;
2731     }
2732     AsyncContext<std::string> *asyncContext = static_cast<AsyncContext<std::string> *>(data);
2733     if (!IsValidSlotId(asyncContext->slotId)) {
2734         TELEPHONY_LOGE("NativeGetOpName slotId is invalid");
2735         asyncContext->context.errorCode = ERROR_SLOT_ID_INVALID;
2736         return;
2737     }
2738     std::u16string opname;
2739     int32_t code = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetOpName(asyncContext->slotId, opname);
2740     if (code == ERROR_NONE) {
2741         asyncContext->callbackVal = NapiUtil::ToUtf8(opname);
2742         asyncContext->context.resolved = true;
2743         return;
2744     }
2745     asyncContext->context.errorCode = code;
2746     asyncContext->context.resolved = false;
2747 }
2748 
GetOpNameCallback(napi_env env,napi_status status,void * data)2749 void GetOpNameCallback(napi_env env, napi_status status, void *data)
2750 {
2751     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2752     std::unique_ptr<AsyncContext<std::string>> context(static_cast<AsyncContext<std::string> *>(data));
2753     NapiAsyncCommomCompleteCallback(env, status, *context, false);
2754 }
2755 
GetOpName(napi_env env,napi_callback_info info)2756 napi_value GetOpName(napi_env env, napi_callback_info info)
2757 {
2758     return NapiCreateAsyncWork<std::string, NativeGetOpName, GetOpNameCallback>(env, info, "GetOpName");
2759 }
2760 
GetOpNameSync(napi_env env,napi_callback_info info)2761 napi_value GetOpNameSync(napi_env env, napi_callback_info info)
2762 {
2763     size_t parameterCount = 1;
2764     napi_value parameters[] = { nullptr };
2765     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
2766     std::u16string opName;
2767     napi_value value = nullptr;
2768     if (parameterCount != 1) {
2769         TELEPHONY_LOGE("parameter count is incorrect");
2770         std::string operatorName = NapiUtil::ToUtf8(opName);
2771         NAPI_CALL(env, napi_create_string_utf8(env, operatorName.c_str(), operatorName.length(), &value));
2772         return value;
2773     }
2774     int32_t slotId = -1;
2775     if (napi_get_value_int32(env, parameters[0], &slotId) != napi_ok) {
2776         TELEPHONY_LOGE("convert parameter fail");
2777         std::string operatorName = NapiUtil::ToUtf8(opName);
2778         NAPI_CALL(env, napi_create_string_utf8(env, operatorName.c_str(), operatorName.length(), &value));
2779         return value;
2780     }
2781     if (IsValidSlotId(slotId)) {
2782         DelayedRefSingleton<CoreServiceClient>::GetInstance().GetOpName(slotId, opName);
2783     }
2784     std::string operatorName = NapiUtil::ToUtf8(opName);
2785     NAPI_CALL(env, napi_create_string_utf8(env, operatorName.c_str(), operatorName.length(), &value));
2786     return value;
2787 }
2788 
NativeGetLockState(napi_env env,void * data)2789 void NativeGetLockState(napi_env env, void *data)
2790 {
2791     if (data == nullptr) {
2792         return;
2793     }
2794     AsyncGetLockState *lockContext = static_cast<AsyncGetLockState *>(data);
2795     AsyncContext<int32_t> &asContext = lockContext->asyncContext;
2796     if (!IsValidSlotId(asContext.slotId)) {
2797         TELEPHONY_LOGE("NativeGetLockState slotId is invalid");
2798         asContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2799         return;
2800     }
2801     LockState lockState = LockState::LOCK_ERROR;
2802     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetLockState(
2803         asContext.slotId, static_cast<LockType>(lockContext->lockType), lockState);
2804     TELEPHONY_LOGI("NAPI NativeGetLockState %{public}d", errorCode);
2805     if (errorCode == ERROR_NONE) {
2806         asContext.context.resolved = true;
2807         asContext.callbackVal = static_cast<int32_t>(lockState);
2808     } else {
2809         asContext.context.resolved = false;
2810     }
2811     asContext.context.errorCode = errorCode;
2812 }
2813 
GetLockStateCallback(napi_env env,napi_status status,void * data)2814 void GetLockStateCallback(napi_env env, napi_status status, void *data)
2815 {
2816     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2817     std::unique_ptr<AsyncGetLockState> context(static_cast<AsyncGetLockState *>(data));
2818     TELEPHONY_LOGI("NAPI NativeGetLockState value:%{public}d", context->asyncContext.callbackVal);
2819     NapiAsyncPermissionCompleteCallback(
2820         env, status, context->asyncContext, false, { "GetLockState", Permission::GET_TELEPHONY_STATE });
2821 }
2822 
GetLockState(napi_env env,napi_callback_info info)2823 napi_value GetLockState(napi_env env, napi_callback_info info)
2824 {
2825     auto lockStateContext = new AsyncGetLockState();
2826     BaseContext &context = lockStateContext->asyncContext.context;
2827 
2828     auto initPara =
2829         std::make_tuple(&lockStateContext->asyncContext.slotId, &lockStateContext->lockType, &context.callbackRef);
2830     AsyncPara para {
2831         .funcName = "GetLockState",
2832         .env = env,
2833         .info = info,
2834         .execute = NativeGetLockState,
2835         .complete = GetLockStateCallback,
2836     };
2837     napi_value result = NapiCreateAsyncWork2<AsyncGetLockState>(para, lockStateContext, initPara);
2838     if (result) {
2839         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2840     }
2841     return result;
2842 }
2843 
NativeHasOperatorPrivileges(napi_env env,void * data)2844 void NativeHasOperatorPrivileges(napi_env env, void *data)
2845 {
2846     if (data == nullptr) {
2847         return;
2848     }
2849     AsyncContext<bool> *reVal = static_cast<AsyncContext<bool> *>(data);
2850     if (!IsValidSlotId(reVal->slotId)) {
2851         TELEPHONY_LOGE("NativeHasOperatorPrivileges slotId is invalid");
2852         reVal->context.errorCode = ERROR_SLOT_ID_INVALID;
2853         return;
2854     }
2855     bool hasOperatorPrivileges = false;
2856     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().HasOperatorPrivileges(
2857         reVal->slotId, hasOperatorPrivileges);
2858     TELEPHONY_LOGI("NAPI NativeHasOperatorPrivileges %{public}d", errorCode);
2859     if (errorCode == ERROR_NONE) {
2860         reVal->callbackVal = hasOperatorPrivileges;
2861         reVal->context.resolved = true;
2862     } else {
2863         reVal->context.resolved = false;
2864     }
2865     reVal->context.errorCode = errorCode;
2866 }
2867 
HasOperatorPrivilegesCallback(napi_env env,napi_status status,void * data)2868 void HasOperatorPrivilegesCallback(napi_env env, napi_status status, void *data)
2869 {
2870     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2871     std::unique_ptr<AsyncContext<bool>> context(static_cast<AsyncContext<bool> *>(data));
2872     NapiAsyncCommomCompleteCallback(env, status, *context, false);
2873 }
2874 
HasOperatorPrivileges(napi_env env,napi_callback_info info)2875 napi_value HasOperatorPrivileges(napi_env env, napi_callback_info info)
2876 {
2877     return NapiCreateAsyncWork<bool, NativeHasOperatorPrivileges, HasOperatorPrivilegesCallback>(
2878         env, info, "HasOperatorPrivileges");
2879 }
2880 
NativeUnlockSimLock(napi_env env,void * data)2881 void NativeUnlockSimLock(napi_env env, void *data)
2882 {
2883     if (data == nullptr) {
2884         return;
2885     }
2886     AsyncContextPIN *asyncContext = static_cast<AsyncContextPIN *>(data);
2887     if (!IsValidSlotId(asyncContext->asyncContext.slotId)) {
2888         TELEPHONY_LOGE("NativeUnlockSimLock slotId is invalid");
2889         asyncContext->asyncContext.context.errorCode = ERROR_SLOT_ID_INVALID;
2890         return;
2891     }
2892     LockStatusResponse response { UNLOCK_FAIL, ERROR_DEFAULT };
2893     PersoLockInfo lockInfo { static_cast<PersoLockType>(asyncContext->pinEnable),
2894         NapiUtil::ToUtf16(asyncContext->inStr1.data()) };
2895     int32_t errorCode = DelayedRefSingleton<CoreServiceClient>::GetInstance().UnlockSimLock(
2896         asyncContext->asyncContext.slotId, lockInfo, response);
2897     TELEPHONY_LOGI("NAPI NativeUnlockSimLock %{public}d", errorCode);
2898     if (errorCode == ERROR_NONE) {
2899         asyncContext->result = response.result;
2900         asyncContext->remain = response.remain;
2901         asyncContext->asyncContext.context.resolved = true;
2902     } else {
2903         asyncContext->asyncContext.context.resolved = false;
2904     }
2905     asyncContext->asyncContext.context.errorCode = errorCode;
2906 }
2907 
UnlockSimLockCallback(napi_env env,napi_status status,void * data)2908 void UnlockSimLockCallback(napi_env env, napi_status status, void *data)
2909 {
2910     NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
2911     std::unique_ptr<AsyncContextPIN> context(static_cast<AsyncContextPIN *>(data));
2912     const LockStatusResponse res {context->result, context->remain};
2913     context->asyncContext.callbackVal = PinOrPukUnlockConversion(env, res);
2914     NapiAsyncPermissionCompleteCallback(
2915         env, status, context->asyncContext, false, { "UnlockSimLock", Permission::SET_TELEPHONY_STATE });
2916 }
2917 
UnlockSimLock(napi_env env,napi_callback_info info)2918 napi_value UnlockSimLock(napi_env env, napi_callback_info info)
2919 {
2920     auto asyncContextPIN = new AsyncContextPIN();
2921     BaseContext &context = asyncContextPIN->asyncContext.context;
2922     napi_value object = NapiUtil::CreateUndefined(env);
2923     auto initPara = std::make_tuple(&asyncContextPIN->asyncContext.slotId, &object, &context.callbackRef);
2924 
2925     AsyncPara para {
2926         .funcName = "UnlockSimLock",
2927         .env = env,
2928         .info = info,
2929         .execute = NativeUnlockSimLock,
2930         .complete = UnlockSimLockCallback,
2931     };
2932     napi_value result = NapiCreateAsyncWork2<AsyncContextPIN>(para, asyncContextPIN, initPara);
2933     if (result) {
2934         PersoLockInfoAnalyze(env, object, *asyncContextPIN);
2935         NAPI_CALL(env, napi_queue_async_work_with_qos(env, context.work, napi_qos_default));
2936     }
2937     return result;
2938 }
2939 
InitEnumSimState(napi_env env,napi_value exports)2940 napi_status InitEnumSimState(napi_env env, napi_value exports)
2941 {
2942     napi_property_descriptor desc[] = {
2943         DECLARE_NAPI_STATIC_PROPERTY(
2944             "SIM_STATE_UNKNOWN", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_UNKNOWN))),
2945         DECLARE_NAPI_STATIC_PROPERTY(
2946             "SIM_STATE_NOT_PRESENT", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_NOT_PRESENT))),
2947         DECLARE_NAPI_STATIC_PROPERTY(
2948             "SIM_STATE_LOCKED", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_LOCKED))),
2949         DECLARE_NAPI_STATIC_PROPERTY(
2950             "SIM_STATE_NOT_READY", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_NOT_READY))),
2951         DECLARE_NAPI_STATIC_PROPERTY(
2952             "SIM_STATE_READY", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_READY))),
2953         DECLARE_NAPI_STATIC_PROPERTY(
2954             "SIM_STATE_LOADED", GetNapiValue(env, static_cast<int32_t>(SimState::SIM_STATE_LOADED))),
2955     };
2956     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
2957     NapiUtil::DefineEnumClassByName(env, exports, "SimState", arrSize, desc);
2958     return napi_define_properties(env, exports, arrSize, desc);
2959 }
2960 
InitEnumContactType(napi_env env,napi_value exports)2961 napi_status InitEnumContactType(napi_env env, napi_value exports)
2962 {
2963     napi_property_descriptor desc[] = {
2964         DECLARE_NAPI_STATIC_PROPERTY(
2965             "GENERAL_CONTACT", GetNapiValue(env, static_cast<int32_t>(ContactType::GENERAL_CONTACT))),
2966         DECLARE_NAPI_STATIC_PROPERTY(
2967             "FIXED_DIALING", GetNapiValue(env, static_cast<int32_t>(ContactType::FIXED_DIALING))),
2968     };
2969 
2970     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
2971     NapiUtil::DefineEnumClassByName(env, exports, "ContactType", arrSize, desc);
2972     return napi_define_properties(env, exports, arrSize, desc);
2973 }
2974 
InitEnumLockState(napi_env env,napi_value exports)2975 napi_status InitEnumLockState(napi_env env, napi_value exports)
2976 {
2977     napi_property_descriptor desc[] = {
2978         DECLARE_NAPI_STATIC_PROPERTY("LOCK_OFF", GetNapiValue(env, static_cast<int32_t>(LockState::LOCK_OFF))),
2979         DECLARE_NAPI_STATIC_PROPERTY("LOCK_ON", GetNapiValue(env, static_cast<int32_t>(LockState::LOCK_ON))),
2980     };
2981 
2982     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
2983     NapiUtil::DefineEnumClassByName(env, exports, "LockState", arrSize, desc);
2984     return napi_define_properties(env, exports, arrSize, desc);
2985 }
2986 
InitEnumLockType(napi_env env,napi_value exports)2987 napi_status InitEnumLockType(napi_env env, napi_value exports)
2988 {
2989     napi_property_descriptor desc[] = {
2990         DECLARE_NAPI_STATIC_PROPERTY("PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(LockType::PIN_LOCK))),
2991         DECLARE_NAPI_STATIC_PROPERTY("FDN_LOCK", GetNapiValue(env, static_cast<int32_t>(LockType::FDN_LOCK))),
2992     };
2993 
2994     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
2995     NapiUtil::DefineEnumClassByName(env, exports, "LockType", arrSize, desc);
2996     return napi_define_properties(env, exports, arrSize, desc);
2997 }
2998 
InitEnumCardType(napi_env env,napi_value exports)2999 napi_status InitEnumCardType(napi_env env, napi_value exports)
3000 {
3001     napi_property_descriptor desc[] = {
3002         DECLARE_NAPI_STATIC_PROPERTY("UNKNOWN_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::UNKNOWN_CARD))),
3003         DECLARE_NAPI_STATIC_PROPERTY(
3004             "SINGLE_MODE_SIM_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::SINGLE_MODE_SIM_CARD))),
3005         DECLARE_NAPI_STATIC_PROPERTY(
3006             "SINGLE_MODE_USIM_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::SINGLE_MODE_USIM_CARD))),
3007         DECLARE_NAPI_STATIC_PROPERTY(
3008             "SINGLE_MODE_RUIM_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::SINGLE_MODE_RUIM_CARD))),
3009         DECLARE_NAPI_STATIC_PROPERTY(
3010             "DUAL_MODE_CG_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::DUAL_MODE_CG_CARD))),
3011         DECLARE_NAPI_STATIC_PROPERTY(
3012             "CT_NATIONAL_ROAMING_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::CT_NATIONAL_ROAMING_CARD))),
3013         DECLARE_NAPI_STATIC_PROPERTY(
3014             "CU_DUAL_MODE_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::CU_DUAL_MODE_CARD))),
3015         DECLARE_NAPI_STATIC_PROPERTY("DUAL_MODE_TELECOM_LTE_CARD",
3016             GetNapiValue(env, static_cast<int32_t>(CardType::DUAL_MODE_TELECOM_LTE_CARD))),
3017         DECLARE_NAPI_STATIC_PROPERTY(
3018             "DUAL_MODE_UG_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::DUAL_MODE_UG_CARD))),
3019         DECLARE_NAPI_STATIC_PROPERTY(
3020             "SINGLE_MODE_ISIM_CARD", GetNapiValue(env, static_cast<int32_t>(CardType::SINGLE_MODE_ISIM_CARD))),
3021     };
3022 
3023     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
3024     NapiUtil::DefineEnumClassByName(env, exports, "CardType", arrSize, desc);
3025     return napi_define_properties(env, exports, arrSize, desc);
3026 }
3027 
InitEnumPersoLockType(napi_env env,napi_value exports)3028 napi_status InitEnumPersoLockType(napi_env env, napi_value exports)
3029 {
3030     napi_property_descriptor desc[] = {
3031         DECLARE_NAPI_STATIC_PROPERTY(
3032             "PN_PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PN_PIN_LOCK))),
3033         DECLARE_NAPI_STATIC_PROPERTY(
3034             "PN_PUK_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PN_PUK_LOCK))),
3035         DECLARE_NAPI_STATIC_PROPERTY(
3036             "PU_PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PU_PIN_LOCK))),
3037         DECLARE_NAPI_STATIC_PROPERTY(
3038             "PU_PUK_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PU_PUK_LOCK))),
3039         DECLARE_NAPI_STATIC_PROPERTY(
3040             "PP_PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PP_PIN_LOCK))),
3041         DECLARE_NAPI_STATIC_PROPERTY(
3042             "PP_PUK_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PP_PUK_LOCK))),
3043         DECLARE_NAPI_STATIC_PROPERTY(
3044             "PC_PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PC_PIN_LOCK))),
3045         DECLARE_NAPI_STATIC_PROPERTY(
3046             "PC_PUK_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::PC_PUK_LOCK))),
3047         DECLARE_NAPI_STATIC_PROPERTY(
3048             "SIM_PIN_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::SIM_PIN_LOCK))),
3049         DECLARE_NAPI_STATIC_PROPERTY(
3050             "SIM_PUK_LOCK", GetNapiValue(env, static_cast<int32_t>(PersoLockType::SIM_PUK_LOCK))),
3051     };
3052 
3053     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
3054     NapiUtil::DefineEnumClassByName(env, exports, "PersoLockType", arrSize, desc);
3055     return napi_define_properties(env, exports, arrSize, desc);
3056 }
3057 
InitEnumOperatorConfigKey(napi_env env,napi_value exports)3058 napi_status InitEnumOperatorConfigKey(napi_env env, napi_value exports)
3059 {
3060     napi_property_descriptor desc[] = {
3061         DECLARE_NAPI_STATIC_PROPERTY("KEY_VOICE_MAIL_NUMBER_STRING", GetNapiValue(env, "voice_mail_number_string")),
3062         DECLARE_NAPI_STATIC_PROPERTY("KEY_IMS_SWITCH_ON_BY_DEFAULT_BOOL",
3063             GetNapiValue(env, "ims_switch_on_by_default_bool")),
3064         DECLARE_NAPI_STATIC_PROPERTY("KEY_HIDE_IMS_SWITCH_BOOL", GetNapiValue(env, "hide_ims_switch_bool")),
3065         DECLARE_NAPI_STATIC_PROPERTY("KEY_VOLTE_SUPPORTED_BOOL", GetNapiValue(env, "volte_supported_bool")),
3066         DECLARE_NAPI_STATIC_PROPERTY("KEY_CARRIER_VT_AVAILABLE_BOOL", GetNapiValue(env, "carrier_vt_available_bool")),
3067         DECLARE_NAPI_STATIC_PROPERTY("KEY_NR_MODE_SUPPORTED_LIST_INT_ARRAY",
3068             GetNapiValue(env, "nr_mode_supported_list_int_array")),
3069         DECLARE_NAPI_STATIC_PROPERTY("KEY_VOLTE_PROVISIONING_SUPPORTED_BOOL",
3070             GetNapiValue(env, "volte_provisioning_supported_bool")),
3071         DECLARE_NAPI_STATIC_PROPERTY("KEY_SS_OVER_UT_SUPPORTED_BOOL", GetNapiValue(env, "ss_over_ut_supported_bool")),
3072         DECLARE_NAPI_STATIC_PROPERTY("KEY_IMS_GBA_REQUIRED_BOOL", GetNapiValue(env, "ims_gba_required_bool")),
3073         DECLARE_NAPI_STATIC_PROPERTY("KEY_UT_PROVISIONING_SUPPORTED_BOOL",
3074             GetNapiValue(env, "ut_provisioning_supported_bool")),
3075         DECLARE_NAPI_STATIC_PROPERTY("KEY_IMS_PREFER_FOR_EMERGENCY_BOOL",
3076             GetNapiValue(env, "ims_prefer_for_emergency_bool")),
3077         DECLARE_NAPI_STATIC_PROPERTY("KEY_CALL_WAITING_SERVICE_CLASS_INT",
3078             GetNapiValue(env, "call_waiting_service_class_int")),
3079         DECLARE_NAPI_STATIC_PROPERTY("KEY_CALL_TRANSFER_VISIBILITY_BOOL",
3080             GetNapiValue(env, "call_transfer_visibility_bool")),
3081         DECLARE_NAPI_STATIC_PROPERTY("KEY_IMS_CALL_DISCONNECT_REASON_INFO_MAPPING_STRING_ARRAY",
3082             GetNapiValue(env, "ims_call_disconnect_reason_info_mapping_string_array")),
3083         DECLARE_NAPI_STATIC_PROPERTY("KEY_FORCE_VOLTE_SWITCH_ON_BOOL", GetNapiValue(env, "force_volte_switch_on_bool")),
3084         DECLARE_NAPI_STATIC_PROPERTY("KEY_ENABLE_OPERATOR_NAME_CUST_BOOL",
3085             GetNapiValue(env, "enable_operator_name_cust_bool")),
3086         DECLARE_NAPI_STATIC_PROPERTY("KEY_OPERATOR_NAME_CUST_STRING",
3087             GetNapiValue(env, "operator_name_cust_string")),
3088         DECLARE_NAPI_STATIC_PROPERTY("KEY_SPN_DISPLAY_CONDITION_CUST_INT",
3089             GetNapiValue(env, "spn_display_condition_cust_int")),
3090         DECLARE_NAPI_STATIC_PROPERTY("KEY_PNN_CUST_STRING_ARRAY", GetNapiValue(env, "pnn_cust_string_array")),
3091         DECLARE_NAPI_STATIC_PROPERTY("KEY_OPL_CUST_STRING_ARRAY", GetNapiValue(env, "opl_cust_string_array")),
3092         DECLARE_NAPI_STATIC_PROPERTY("KEY_EMERGENCY_CALL_STRING_ARRAY",
3093             GetNapiValue(env, "emergency_call_string_array")),
3094         DECLARE_NAPI_STATIC_PROPERTY("KEY_VIDEO_CALL_WAITING_ON_BOOL",
3095             GetNapiValue(env, "video_call_waiting_on_bool")),
3096     };
3097 
3098     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
3099     NapiUtil::DefineEnumClassByName(env, exports, "OperatorConfigKey", arrSize, desc);
3100     return napi_define_properties(env, exports, arrSize, desc);
3101 }
3102 
InitEnumOperatorSimCard(napi_env env,napi_value exports)3103 napi_status InitEnumOperatorSimCard(napi_env env, napi_value exports)
3104 {
3105     napi_property_descriptor desc[] = {
3106         DECLARE_NAPI_STATIC_PROPERTY("CHINA_TELECOM_CARD", GetNapiValue(env, CHINA_TELECOM_CARD)),
3107     };
3108 
3109     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
3110     NapiUtil::DefineEnumClassByName(env, exports, "OperatorSimCard", arrSize, desc);
3111     return napi_define_properties(env, exports, arrSize, desc);
3112 }
3113 
InitEnumAuthType(napi_env env,napi_value exports)3114 napi_status InitEnumAuthType(napi_env env, napi_value exports)
3115 {
3116     napi_property_descriptor desc[] = {
3117         DECLARE_NAPI_STATIC_PROPERTY(
3118             "SIM_AUTH_EAP_SIM_TYPE", GetNapiValue(env, static_cast<int32_t>(AuthType::SIM_AUTH_EAP_SIM_TYPE))),
3119         DECLARE_NAPI_STATIC_PROPERTY(
3120             "SIM_AUTH_EAP_AKA_TYPE", GetNapiValue(env, static_cast<int32_t>(AuthType::SIM_AUTH_EAP_AKA_TYPE))),
3121     };
3122 
3123     constexpr size_t arrSize = sizeof(desc) / sizeof(desc[0]);
3124     NapiUtil::DefineEnumClassByName(env, exports, "AuthType", arrSize, desc);
3125     return napi_define_properties(env, exports, arrSize, desc);
3126 }
3127 
InitSimLockInterface(napi_env env,napi_value exports)3128 napi_status InitSimLockInterface(napi_env env, napi_value exports)
3129 {
3130     napi_property_descriptor desc[] = {
3131         DECLARE_NAPI_FUNCTION("unlockPin", UnlockPin),
3132         DECLARE_NAPI_FUNCTION("unlockPuk", UnlockPuk),
3133         DECLARE_NAPI_FUNCTION("alterPin", AlterPin),
3134         DECLARE_NAPI_FUNCTION("setLockState", SetLockState),
3135         DECLARE_NAPI_FUNCTION("unlockPin2", UnlockPin2),
3136         DECLARE_NAPI_FUNCTION("unlockPuk2", UnlockPuk2),
3137         DECLARE_NAPI_FUNCTION("alterPin2", AlterPin2),
3138         DECLARE_NAPI_FUNCTION("getLockState", GetLockState),
3139         DECLARE_NAPI_FUNCTION("unlockSimLock", UnlockSimLock),
3140     };
3141     return napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
3142 }
3143 
InitSimDiallingNumbersInterface(napi_env env,napi_value exports)3144 napi_status InitSimDiallingNumbersInterface(napi_env env, napi_value exports)
3145 {
3146     napi_property_descriptor desc[] = {
3147         DECLARE_NAPI_FUNCTION("queryIccDiallingNumbers", QueryIccDiallingNumbers),
3148         DECLARE_NAPI_FUNCTION("addIccDiallingNumbers", AddIccDiallingNumbers),
3149         DECLARE_NAPI_FUNCTION("delIccDiallingNumbers", DelIccDiallingNumbers),
3150         DECLARE_NAPI_FUNCTION("updateIccDiallingNumbers", UpdateIccDiallingNumbers),
3151     };
3152     return napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
3153 }
3154 
InitSimInterfaceAboutVoice(napi_env env,napi_value exports)3155 napi_status InitSimInterfaceAboutVoice(napi_env env, napi_value exports)
3156 {
3157     napi_property_descriptor desc[] = {
3158         DECLARE_NAPI_FUNCTION("setDefaultVoiceSlotId", SetDefaultVoiceSlotId),
3159         DECLARE_NAPI_FUNCTION("getDefaultVoiceSlotId", GetDefaultVoiceSlotId),
3160         DECLARE_NAPI_FUNCTION("getDefaultVoiceSimId", GetDefaultVoiceSimId),
3161         DECLARE_NAPI_FUNCTION("getVoiceMailIdentifier", GetVoiceMailIdentifier),
3162         DECLARE_NAPI_FUNCTION("getVoiceMailNumber", GetVoiceMailNumber),
3163         DECLARE_NAPI_FUNCTION("getVoiceMailCount", GetVoiceMailCount),
3164         DECLARE_NAPI_FUNCTION("setVoiceMailInfo", SetVoiceMailInfo),
3165     };
3166     return napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
3167 }
3168 
InitSimInterface(napi_env env,napi_value exports)3169 napi_status InitSimInterface(napi_env env, napi_value exports)
3170 {
3171     napi_property_descriptor desc[] = {
3172         DECLARE_NAPI_FUNCTION("getISOCountryCodeForSim", GetISOCountryCodeForSim),
3173         DECLARE_NAPI_FUNCTION("getISOCountryCodeForSimSync", GetISOCountryCodeForSimSync),
3174         DECLARE_NAPI_FUNCTION("getSimOperatorNumeric", GetSimOperatorNumeric),
3175         DECLARE_NAPI_FUNCTION("getSimOperatorNumericSync", GetSimOperatorNumericSync),
3176         DECLARE_NAPI_FUNCTION("getSimSpn", GetSimSpn),
3177         DECLARE_NAPI_FUNCTION("getSimSpnSync", GetSimSpnSync),
3178         DECLARE_NAPI_FUNCTION("getSimState", GetSimState),
3179         DECLARE_NAPI_FUNCTION("getSimStateSync", GetSimStateSync),
3180         DECLARE_NAPI_FUNCTION("getCardType", GetCardType),
3181         DECLARE_NAPI_FUNCTION("getCardTypeSync", GetCardTypeSync),
3182         DECLARE_NAPI_FUNCTION("getSimIccId", GetSimIccId),
3183         DECLARE_NAPI_FUNCTION("getIMSI", GetIMSI),
3184         DECLARE_NAPI_FUNCTION("isOperatorSimCard", IsOperatorSimCard),
3185         DECLARE_NAPI_FUNCTION("hasSimCard", HasSimCard),
3186         DECLARE_NAPI_FUNCTION("hasSimCardSync", HasSimCardSync),
3187         DECLARE_NAPI_FUNCTION("getSimGid1", GetSimGid1),
3188         DECLARE_NAPI_FUNCTION("getSimAccountInfo", GetSimAccountInfo),
3189         DECLARE_NAPI_FUNCTION("isSimActive", IsSimActive),
3190         DECLARE_NAPI_FUNCTION("isSimActiveSync", IsSimActiveSync),
3191         DECLARE_NAPI_FUNCTION("activateSim", ActivateSim),
3192         DECLARE_NAPI_FUNCTION("deactivateSim", DeactivateSim),
3193         DECLARE_NAPI_FUNCTION("setShowName", SetShowName),
3194         DECLARE_NAPI_FUNCTION("getShowName", GetShowName),
3195         DECLARE_NAPI_FUNCTION("setShowNumber", SetShowNumber),
3196         DECLARE_NAPI_FUNCTION("getShowNumber", GetShowNumber),
3197         DECLARE_NAPI_FUNCTION("getOperatorConfigs", GetOperatorConfigs),
3198         DECLARE_NAPI_FUNCTION("getActiveSimAccountInfoList", GetActiveSimAccountInfoList),
3199         DECLARE_NAPI_FUNCTION("getSimTelephoneNumber", GetSimTelephoneNumber),
3200         DECLARE_NAPI_FUNCTION("sendEnvelopeCmd", SendEnvelopeCmd),
3201         DECLARE_NAPI_FUNCTION("sendTerminalResponseCmd", SendTerminalResponseCmd),
3202         DECLARE_NAPI_FUNCTION("acceptCallSetupRequest", AcceptCallSetupRequest),
3203         DECLARE_NAPI_FUNCTION("rejectCallSetupRequest", RejectCallSetupRequest),
3204         DECLARE_NAPI_FUNCTION("getMaxSimCount", GetMaxSimCount),
3205         DECLARE_NAPI_FUNCTION("hasOperatorPrivileges", HasOperatorPrivileges),
3206         DECLARE_NAPI_FUNCTION("getOpKey", GetOpKey),
3207         DECLARE_NAPI_FUNCTION("getOpKeySync", GetOpKeySync),
3208         DECLARE_NAPI_FUNCTION("getOpName", GetOpName),
3209         DECLARE_NAPI_FUNCTION("getOpNameSync", GetOpNameSync),
3210         DECLARE_NAPI_FUNCTION("getDsdsMode", GetDsdsMode),
3211         DECLARE_NAPI_FUNCTION("getSimAuthentication", GetSimAuthentication),
3212     };
3213     return napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
3214 }
3215 } // namespace
3216 
3217 EXTERN_C_START
InitNapiSim(napi_env env,napi_value exports)3218 napi_value InitNapiSim(napi_env env, napi_value exports)
3219 {
3220     NAPI_CALL(env, InitSimInterface(env, exports));
3221     NAPI_CALL(env, InitSimLockInterface(env, exports));
3222     NAPI_CALL(env, InitSimDiallingNumbersInterface(env, exports));
3223     NAPI_CALL(env, InitSimInterfaceAboutVoice(env, exports));
3224     NAPI_CALL(env, InitEnumSimState(env, exports));
3225     NAPI_CALL(env, InitEnumContactType(env, exports));
3226     NAPI_CALL(env, InitEnumLockState(env, exports));
3227     NAPI_CALL(env, InitEnumLockType(env, exports));
3228     NAPI_CALL(env, InitEnumCardType(env, exports));
3229     NAPI_CALL(env, InitEnumPersoLockType(env, exports));
3230     NAPI_CALL(env, InitEnumOperatorConfigKey(env, exports));
3231     NAPI_CALL(env, InitEnumOperatorSimCard(env, exports));
3232     NAPI_CALL(env, InitEnumAuthType(env, exports));
3233     return exports;
3234 }
3235 EXTERN_C_END
3236 
3237 static napi_module _simModule = {
3238     .nm_version = 1,
3239     .nm_flags = 0,
3240     .nm_filename = nullptr,
3241     .nm_register_func = InitNapiSim,
3242     .nm_modname = "telephony.sim",
3243     .nm_priv = ((void *)0),
3244     .reserved = {0},
3245 };
3246 
RegisterSimCardModule(void)3247 extern "C" __attribute__((constructor)) void RegisterSimCardModule(void)
3248 {
3249     napi_module_register(&_simModule);
3250 }
3251 } // namespace Telephony
3252 } // namespace OHOS
3253