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