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