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