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_cellular_data.h"
17
18 #include <memory>
19
20 #include "cellular_data_client.h"
21 #include "cellular_data_types.h"
22 #include "cstddef"
23 #include "iosfwd"
24 #include "js_native_api.h"
25 #include "js_native_api_types.h"
26 #include "napi/native_common.h"
27 #include "napi_parameter_util.h"
28 #include "napi_util.h"
29 #include "node_api.h"
30 #include "string"
31 #include "telephony_log_wrapper.h"
32 #include "telephony_napi_common_error.h"
33
34 namespace OHOS {
35 namespace Telephony {
36 static constexpr int32_t DEFAULT_REF_COUNT = 1;
37 static constexpr const char *SET_TELEPHONY_STATE = "ohos.permission.SET_TELEPHONY_STATE";
38 static constexpr const char *GET_NETWORK_INFO = "ohos.permission.GET_NETWORK_INFO";
39 static constexpr const char *MANAGE_APN_SETTING = "ohos.permission.MANAGE_APN_SETTING";
40
41 struct AsyncPara {
42 std::string funcName = "";
43 napi_env env = nullptr;
44 napi_callback_info info = nullptr;
45 napi_async_execute_callback execute = nullptr;
46 napi_async_complete_callback complete = nullptr;
47 };
48
IsCellularDataManagerInited()49 static bool IsCellularDataManagerInited()
50 {
51 return CellularDataClient::GetInstance().IsConnect();
52 }
53
IsValidSlotId(int32_t slotId)54 static inline bool IsValidSlotId(int32_t slotId)
55 {
56 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
57 }
58
IsValidSlotIdEx(int32_t slotId)59 static inline bool IsValidSlotIdEx(int32_t slotId)
60 {
61 // One more slot for VSim.
62 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT + 1));
63 }
64
MatchCellularDataParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)65 static bool MatchCellularDataParameters(napi_env env, const napi_value parameters[], const size_t parameterCount)
66 {
67 switch (parameterCount) {
68 case 0:
69 return true;
70 case 1:
71 return NapiUtil::MatchParameters(env, parameters, {napi_function});
72 default:
73 return false;
74 }
75 }
76
MatchEnableCellularDataRoamingParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)77 static bool MatchEnableCellularDataRoamingParameters(
78 napi_env env, const napi_value parameters[], const size_t parameterCount)
79 {
80 const size_t paramLimitOne = 1;
81 const size_t paramLimitTwo = 2;
82 switch (parameterCount) {
83 case paramLimitOne:
84 return NapiUtil::MatchParameters(env, parameters, {napi_number});
85 case paramLimitTwo:
86 return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_function});
87 default:
88 return false;
89 }
90 }
91
WrapCellularDataType(const int32_t cellularDataType)92 static int32_t WrapCellularDataType(const int32_t cellularDataType)
93 {
94 switch (cellularDataType) {
95 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_DISCONNECTED): {
96 return static_cast<int32_t>(DataConnectState::DATA_STATE_DISCONNECTED);
97 }
98 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_CONNECTING): {
99 return static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTING);
100 }
101 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_CONNECTED): {
102 return static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTED);
103 }
104 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_SUSPENDED): {
105 return static_cast<int32_t>(DataConnectState::DATA_STATE_SUSPENDED);
106 }
107 default: {
108 return static_cast<int32_t>(DataConnectState::DATA_STATE_UNKNOWN);
109 }
110 }
111 }
112
WrapGetCellularDataFlowTypeType(const int32_t cellularDataType)113 static int32_t WrapGetCellularDataFlowTypeType(const int32_t cellularDataType)
114 {
115 switch (cellularDataType) {
116 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE): {
117 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE);
118 }
119 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DOWN): {
120 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DOWN);
121 }
122 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP): {
123 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP);
124 }
125 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN): {
126 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN);
127 }
128 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT): {
129 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
130 }
131 default: {
132 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE);
133 }
134 }
135 }
136
NativeGetCellularDataState(napi_env env,void * data)137 static void NativeGetCellularDataState(napi_env env, void *data)
138 {
139 auto asyncContext = static_cast<AsyncContext *>(data);
140 if (asyncContext == nullptr) {
141 return;
142 }
143 if (IsCellularDataManagerInited()) {
144 int32_t dataState = CellularDataClient::GetInstance().GetCellularDataState();
145 asyncContext->resolved = true;
146 asyncContext->result = WrapCellularDataType(dataState);
147 } else {
148 asyncContext->resolved = false;
149 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
150 }
151 }
152
GetCellularDataStateCallback(napi_env env,napi_status status,void * data)153 static void GetCellularDataStateCallback(napi_env env, napi_status status, void *data)
154 {
155 auto context = static_cast<AsyncContext *>(data);
156 if (context == nullptr) {
157 return;
158 }
159 std::unique_ptr<AsyncContext> asyncContext(context);
160 napi_value callbackValue = nullptr;
161 if (asyncContext->resolved) {
162 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->result, &callbackValue));
163 } else {
164 if (asyncContext->errorCode == ERROR_SERVICE_UNAVAILABLE) {
165 callbackValue =
166 NapiUtil::CreateErrorMessage(env, "cellular data service unavailable", ERROR_SERVICE_UNAVAILABLE);
167 } else {
168 callbackValue = NapiUtil::CreateErrorMessage(env, "unkonwn error");
169 }
170 }
171 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
172 }
173
GetCellularDataState(napi_env env,napi_callback_info info)174 static napi_value GetCellularDataState(napi_env env, napi_callback_info info)
175 {
176 size_t parameterCount = 1;
177 napi_value parameters[1];
178 napi_value thisVar = nullptr;
179 void *data = nullptr;
180 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
181 NAPI_ASSERT(env, MatchCellularDataParameters(env, parameters, parameterCount), "type mismatch");
182 auto asyncContext = std::make_unique<AsyncContext>();
183 if (asyncContext == nullptr) {
184 std::string errorCode = std::to_string(napi_generic_failure);
185 std::string errorMessage = "error at baseContext is nullptr";
186 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
187 return nullptr;
188 }
189 if (parameterCount == 1) {
190 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
191 }
192 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetCellularDataState",
193 NativeGetCellularDataState, GetCellularDataStateCallback);
194 }
195
NativeIsCellularDataEnabled(napi_env env,void * data)196 static void NativeIsCellularDataEnabled(napi_env env, void *data)
197 {
198 auto asyncContext = static_cast<AsyncContext *>(data);
199 if (asyncContext == nullptr) {
200 NapiUtil::ThrowParameterError(env);
201 return;
202 }
203 if (IsCellularDataManagerInited()) {
204 bool enabled = false;
205 asyncContext->errorCode = CellularDataClient::GetInstance().IsCellularDataEnabled(enabled);
206 if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
207 asyncContext->resolved = true;
208 }
209 asyncContext->result = enabled;
210 } else {
211 asyncContext->resolved = false;
212 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
213 }
214 }
215
IsCellularDataEnabledCallback(napi_env env,napi_status status,void * data)216 static void IsCellularDataEnabledCallback(napi_env env, napi_status status, void *data)
217 {
218 auto context = static_cast<AsyncContext *>(data);
219 if (context == nullptr) {
220 return;
221 }
222 std::unique_ptr<AsyncContext> asyncContext(context);
223 napi_value callbackValue = nullptr;
224 if (asyncContext->resolved) {
225 napi_status status = napi_get_boolean(env,
226 asyncContext->result == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED), &callbackValue);
227 NAPI_CALL_RETURN_VOID(env, status);
228 } else {
229 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
230 asyncContext->errorCode, "IsCellularDataEnabled", GET_NETWORK_INFO);
231 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
232 }
233 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
234 }
235
IsCellularDataEnabled(napi_env env,napi_callback_info info)236 static napi_value IsCellularDataEnabled(napi_env env, napi_callback_info info)
237 {
238 size_t parameterCount = 1;
239 napi_value parameters[1];
240 napi_value thisVar = nullptr;
241 void *data = nullptr;
242 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
243 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
244 TELEPHONY_LOGE("IsCellularDataEnabled MatchCellularDataParameters failed.");
245 NapiUtil::ThrowParameterError(env);
246 return nullptr;
247 }
248 auto asyncContext = std::make_unique<AsyncContext>();
249 if (asyncContext == nullptr) {
250 TELEPHONY_LOGE("IsCellularDataEnabled asyncContext is nullptr.");
251 NapiUtil::ThrowParameterError(env);
252 return nullptr;
253 }
254 if (parameterCount == 1) {
255 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
256 }
257 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "IsCellularDataEnabled",
258 NativeIsCellularDataEnabled, IsCellularDataEnabledCallback);
259 }
260
IsCellularDataEnabledSync(napi_env env,napi_callback_info info)261 static napi_value IsCellularDataEnabledSync(napi_env env, napi_callback_info info)
262 {
263 bool isEnabled = false;
264 napi_value value = nullptr;
265 if (IsCellularDataManagerInited()) {
266 auto errorCode = CellularDataClient::GetInstance().IsCellularDataEnabled(isEnabled);
267 if (errorCode != TELEPHONY_SUCCESS) {
268 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
269 errorCode, "isCellularDataEnabledSync", GET_NETWORK_INFO);
270 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
271 return value;
272 }
273 } else {
274 return value;
275 }
276 NAPI_CALL(env, napi_get_boolean(env, isEnabled, &value));
277 return value;
278 }
279
NativeEnableCellularData(napi_env env,void * data)280 static void NativeEnableCellularData(napi_env env, void *data)
281 {
282 auto asyncContext = static_cast<AsyncContext *>(data);
283 if (asyncContext == nullptr) {
284 NapiUtil::ThrowParameterError(env);
285 return;
286 }
287 if (IsCellularDataManagerInited()) {
288 asyncContext->result = CellularDataClient::GetInstance().EnableCellularData(true);
289 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
290 asyncContext->resolved = true;
291 } else {
292 asyncContext->resolved = false;
293 asyncContext->errorCode = asyncContext->result;
294 }
295 } else {
296 asyncContext->resolved = false;
297 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
298 }
299 }
300
EnableCellularDataCallback(napi_env env,napi_status status,void * data)301 static void EnableCellularDataCallback(napi_env env, napi_status status, void *data)
302 {
303 auto context = static_cast<AsyncContext *>(data);
304 if (context == nullptr) {
305 NapiUtil::ThrowParameterError(env);
306 return;
307 }
308 std::unique_ptr<AsyncContext> asyncContext(context);
309 napi_value callbackValue = nullptr;
310 if (asyncContext->resolved) {
311 callbackValue = NapiUtil::CreateUndefined(env);
312 } else {
313 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
314 asyncContext->errorCode, "enableCellularData", SET_TELEPHONY_STATE);
315 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
316 }
317 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
318 TELEPHONY_LOGI("EnableCellularDataCallback end");
319 }
320
DisableCellularDataCallback(napi_env env,napi_status status,void * data)321 static void DisableCellularDataCallback(napi_env env, napi_status status, void *data)
322 {
323 auto context = static_cast<AsyncContext *>(data);
324 if (context == nullptr) {
325 NapiUtil::ThrowParameterError(env);
326 return;
327 }
328 std::unique_ptr<AsyncContext> asyncContext(context);
329 napi_value callbackValue = nullptr;
330 if (asyncContext->resolved) {
331 callbackValue = NapiUtil::CreateUndefined(env);
332 } else {
333 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
334 asyncContext->errorCode, "disableCellularData", SET_TELEPHONY_STATE);
335 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
336 }
337 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
338 TELEPHONY_LOGI("DisableCellularDataCallback end");
339 }
340
EnableCellularDataRoamingCallback(napi_env env,napi_status status,void * data)341 static void EnableCellularDataRoamingCallback(napi_env env, napi_status status, void *data)
342 {
343 auto context = static_cast<AsyncContext *>(data);
344 if (context == nullptr) {
345 NapiUtil::ThrowParameterError(env);
346 return;
347 }
348 std::unique_ptr<AsyncContext> asyncContext(context);
349 napi_value callbackValue = nullptr;
350 if (asyncContext->resolved) {
351 callbackValue = NapiUtil::CreateUndefined(env);
352 } else {
353 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
354 asyncContext->errorCode, "enableCellularDataRoaming", SET_TELEPHONY_STATE);
355 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
356 }
357 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
358 TELEPHONY_LOGI("EnableCellularDataRoamingCallback end");
359 }
360
DisableCellularDataRoamingCallback(napi_env env,napi_status status,void * data)361 static void DisableCellularDataRoamingCallback(napi_env env, napi_status status, void *data)
362 {
363 auto context = static_cast<AsyncContext *>(data);
364 if (context == nullptr) {
365 NapiUtil::ThrowParameterError(env);
366 return;
367 }
368 std::unique_ptr<AsyncContext> asyncContext(context);
369 napi_value callbackValue = nullptr;
370 if (asyncContext->resolved) {
371 callbackValue = NapiUtil::CreateUndefined(env);
372 } else {
373 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
374 asyncContext->errorCode, "disableCellularDataRoaming", SET_TELEPHONY_STATE);
375 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
376 }
377 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
378 TELEPHONY_LOGI("DisableCellularDataRoamingCallback end");
379 }
380
EnableCellularData(napi_env env,napi_callback_info info)381 static napi_value EnableCellularData(napi_env env, napi_callback_info info)
382 {
383 size_t parameterCount = 1;
384 napi_value parameters[1];
385 napi_value thisVar = nullptr;
386 void *data = nullptr;
387 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
388 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
389 NapiUtil::ThrowParameterError(env);
390 return nullptr;
391 }
392 auto asyncContext = std::make_unique<AsyncContext>();
393 if (asyncContext == nullptr) {
394 NapiUtil::ThrowParameterError(env);
395 return nullptr;
396 }
397 if (parameterCount == 1) {
398 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
399 }
400 return NapiUtil::HandleAsyncWork(
401 env, asyncContext.release(), "EnableCellularData", NativeEnableCellularData, EnableCellularDataCallback);
402 }
403
NativeDisableCellularData(napi_env env,void * data)404 static void NativeDisableCellularData(napi_env env, void *data)
405 {
406 auto asyncContext = static_cast<AsyncContext *>(data);
407 if (asyncContext == nullptr) {
408 NapiUtil::ThrowParameterError(env);
409 return;
410 }
411 if (IsCellularDataManagerInited()) {
412 asyncContext->result = CellularDataClient::GetInstance().EnableCellularData(false);
413 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
414 asyncContext->resolved = true;
415 } else {
416 asyncContext->resolved = false;
417 asyncContext->errorCode = asyncContext->result;
418 }
419 } else {
420 asyncContext->resolved = false;
421 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
422 }
423 }
424
DisableCellularData(napi_env env,napi_callback_info info)425 static napi_value DisableCellularData(napi_env env, napi_callback_info info)
426 {
427 size_t parameterCount = 1;
428 napi_value parameters[1];
429 napi_value thisVar = nullptr;
430 void *data = nullptr;
431 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
432 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
433 NapiUtil::ThrowParameterError(env);
434 return nullptr;
435 }
436 auto asyncContext = std::make_unique<AsyncContext>();
437 if (asyncContext == nullptr) {
438 NapiUtil::ThrowParameterError(env);
439 return nullptr;
440 }
441 if (parameterCount == 1) {
442 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
443 }
444 return NapiUtil::HandleAsyncWork(
445 env, asyncContext.release(), "DisableCellularData", NativeDisableCellularData, DisableCellularDataCallback);
446 }
447
NativeEnableCellularDataRoaming(napi_env env,void * data)448 static void NativeEnableCellularDataRoaming(napi_env env, void *data)
449 {
450 auto asyncContext = static_cast<AsyncContext *>(data);
451 if (asyncContext == nullptr) {
452 NapiUtil::ThrowParameterError(env);
453 return;
454 }
455 if (!IsValidSlotId(asyncContext->slotId)) {
456 TELEPHONY_LOGE("NativeEnableCellularDataRoaming slotId is invalid");
457 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
458 return;
459 }
460 if (IsCellularDataManagerInited()) {
461 asyncContext->result = CellularDataClient::GetInstance().EnableCellularDataRoaming(asyncContext->slotId, true);
462 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
463 asyncContext->resolved = true;
464 } else {
465 asyncContext->resolved = false;
466 asyncContext->errorCode = asyncContext->result;
467 }
468 } else {
469 asyncContext->resolved = false;
470 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
471 }
472 TELEPHONY_LOGI("NativeEnableCellularDataRoaming end");
473 }
474
EnableCellularDataRoaming(napi_env env,napi_callback_info info)475 static napi_value EnableCellularDataRoaming(napi_env env, napi_callback_info info)
476 {
477 const size_t paramLimitTwo = 2;
478 size_t parameterCount = paramLimitTwo;
479 napi_value parameters[paramLimitTwo] = { 0 };
480 napi_value thisVar = nullptr;
481 void *data = nullptr;
482 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
483 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
484 NapiUtil::ThrowParameterError(env);
485 return nullptr;
486 }
487 auto asyncContext = std::make_unique<AsyncContext>();
488 if (asyncContext == nullptr) {
489 NapiUtil::ThrowParameterError(env);
490 return nullptr;
491 }
492 NAPI_CALL(env, napi_get_value_int32(env, parameters[0], &asyncContext->slotId));
493 if (parameterCount == paramLimitTwo) {
494 NAPI_CALL(env, napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
495 }
496 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "EnableCellularDataRoaming",
497 NativeEnableCellularDataRoaming, EnableCellularDataRoamingCallback);
498 }
499
NativeDisableCellularDataRoaming(napi_env env,void * data)500 static void NativeDisableCellularDataRoaming(napi_env env, void *data)
501 {
502 auto asyncContext = static_cast<AsyncContext *>(data);
503 if (asyncContext == nullptr) {
504 NapiUtil::ThrowParameterError(env);
505 return;
506 }
507 if (!IsValidSlotId(asyncContext->slotId)) {
508 TELEPHONY_LOGE("NativeDisableCellularDataRoaming slotId is invalid");
509 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
510 return;
511 }
512 if (IsCellularDataManagerInited()) {
513 asyncContext->result = CellularDataClient::GetInstance().EnableCellularDataRoaming(asyncContext->slotId, false);
514 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
515 asyncContext->resolved = true;
516 } else {
517 asyncContext->resolved = false;
518 asyncContext->errorCode = asyncContext->result;
519 }
520 } else {
521 asyncContext->resolved = false;
522 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
523 }
524 }
525
DisableCellularDataRoaming(napi_env env,napi_callback_info info)526 static napi_value DisableCellularDataRoaming(napi_env env, napi_callback_info info)
527 {
528 const size_t paramLimitTwo = 2;
529 size_t parameterCount = paramLimitTwo;
530 napi_value parameters[paramLimitTwo] = { 0 };
531 napi_value thisVar = nullptr;
532 void *data = nullptr;
533 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
534 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
535 NapiUtil::ThrowParameterError(env);
536 return nullptr;
537 }
538 auto asyncContext = std::make_unique<AsyncContext>();
539 if (asyncContext == nullptr) {
540 NapiUtil::ThrowParameterError(env);
541 return nullptr;
542 }
543 NAPI_CALL(env, napi_get_value_int32(env, parameters[0], &asyncContext->slotId));
544 if (parameterCount == paramLimitTwo) {
545 NAPI_CALL(env, napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
546 }
547 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "DisableCellularDataRoaming",
548 NativeDisableCellularDataRoaming, DisableCellularDataRoamingCallback);
549 }
550
NativeIsCellularDataRoamingEnabled(napi_env env,void * data)551 static void NativeIsCellularDataRoamingEnabled(napi_env env, void *data)
552 {
553 auto asyncContext = static_cast<AsyncContext *>(data);
554 if (asyncContext == nullptr) {
555 NapiUtil::ThrowParameterError(env);
556 return;
557 }
558 if (!IsValidSlotId(asyncContext->slotId)) {
559 TELEPHONY_LOGE("NativeIsCellularDataRoamingEnabled slotId is invalid");
560 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
561 return;
562 }
563 if (IsCellularDataManagerInited()) {
564 auto &dataManager = CellularDataClient::GetInstance();
565 bool enabled = false;
566 asyncContext->errorCode = dataManager.IsCellularDataRoamingEnabled(asyncContext->slotId, enabled);
567 if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
568 asyncContext->resolved = true;
569 }
570 asyncContext->result = enabled;
571 } else {
572 asyncContext->resolved = false;
573 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
574 }
575 }
576
IsCellularDataRoamingEnabledCallback(napi_env env,napi_status status,void * data)577 static void IsCellularDataRoamingEnabledCallback(napi_env env, napi_status status, void *data)
578 {
579 auto context = static_cast<AsyncContext *>(data);
580 if (context == nullptr) {
581 return;
582 }
583 std::unique_ptr<AsyncContext> asyncContext(context);
584 napi_value callbackValue = nullptr;
585 if (asyncContext->resolved) {
586 napi_status status = napi_get_boolean(env,
587 asyncContext->result == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED),
588 &callbackValue);
589 NAPI_CALL_RETURN_VOID(env, status);
590 } else {
591 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
592 asyncContext->errorCode, "isCellularDataRoamingEnabled", GET_NETWORK_INFO);
593 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
594 }
595 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
596 }
597
IsCellularDataRoamingEnabled(napi_env env,napi_callback_info info)598 static napi_value IsCellularDataRoamingEnabled(napi_env env, napi_callback_info info)
599 {
600 const size_t paramLimitTwo = 2;
601 size_t parameterCount = paramLimitTwo;
602 napi_value parameters[paramLimitTwo] = {0};
603 napi_value thisVar = nullptr;
604 void *data = nullptr;
605 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
606 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
607 TELEPHONY_LOGE("IsCellularDataRoamingEnabled MatchEnableCellularDataRoamingParameters failed.");
608 NapiUtil::ThrowParameterError(env);
609 return nullptr;
610 }
611 auto asyncContext = std::make_unique<AsyncContext>();
612 if (asyncContext == nullptr) {
613 TELEPHONY_LOGE("IsCellularDataRoamingEnabled asyncContext is nullptr.");
614 NapiUtil::ThrowParameterError(env);
615 return nullptr;
616 }
617 napi_get_value_int32(env, parameters[0], &asyncContext->slotId);
618 if (parameterCount == paramLimitTwo) {
619 napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
620 }
621 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "IsCellularDataRoamingEnabled",
622 NativeIsCellularDataRoamingEnabled, IsCellularDataRoamingEnabledCallback);
623 }
624
IsCellularDataRoamingEnabledSync(napi_env env,napi_callback_info info)625 static napi_value IsCellularDataRoamingEnabledSync(napi_env env, napi_callback_info info)
626 {
627 size_t parameterCount = 0;
628 napi_value parameters[] = { nullptr };
629 napi_value thisVar = nullptr;
630 void *data = nullptr;
631 int32_t slotId;
632 bool dataRoamingEnabled = false;
633 napi_value value = nullptr;
634 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
635 napi_get_value_int32(env, parameters[0], &slotId);
636 if (!IsValidSlotId(slotId)) {
637 TELEPHONY_LOGE("IsCellularDataRoamingEnabledSync slotId is invalid");
638 NapiUtil::ThrowParameterError(env);
639 return value;
640 }
641 if (IsCellularDataManagerInited()) {
642 auto &dataManager = CellularDataClient::GetInstance();
643 auto errorCode = dataManager.IsCellularDataRoamingEnabled(slotId, dataRoamingEnabled);
644 if (errorCode != TELEPHONY_SUCCESS) {
645 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
646 errorCode, "isCellularDataRoamingEnabledSync", GET_NETWORK_INFO);
647 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
648 return value;
649 }
650 } else {
651 return value;
652 }
653 NAPI_CALL(env, napi_get_boolean(env, dataRoamingEnabled, &value));
654 return value;
655 }
656
MatchGetDefaultCellularDataSlotIdParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)657 static bool MatchGetDefaultCellularDataSlotIdParameters(
658 napi_env env, const napi_value parameters[], const size_t parameterCount)
659 {
660 switch (parameterCount) {
661 case 0:
662 return true;
663 case 1:
664 return NapiUtil::MatchParameters(env, parameters, {napi_function});
665 default:
666 return false;
667 }
668 }
669
NativeGetDefaultCellularDataSlotId(napi_env env,void * data)670 static void NativeGetDefaultCellularDataSlotId(napi_env env, void *data)
671 {
672 auto context = static_cast<AsyncContext *>(data);
673 if (context == nullptr) {
674 return;
675 }
676 int32_t result = CellularDataClient::GetInstance().GetDefaultCellularDataSlotId();
677 if (IsValidSlotIdEx(result) || result == DEFAULT_SIM_SLOT_ID_REMOVE) {
678 context->slotId = result;
679 context->resolved = true;
680 } else {
681 context->resolved = false;
682 context->errorCode = ERROR_NATIVE_API_EXECUTE_FAIL;
683 }
684 }
685
GetDefaultCellularDataSlotIdCallback(napi_env env,napi_status status,void * data)686 static void GetDefaultCellularDataSlotIdCallback(napi_env env, napi_status status, void *data)
687 {
688 auto asyncContext = static_cast<AsyncContext *>(data);
689 if (asyncContext == nullptr) {
690 return;
691 }
692 napi_value callbackValue = nullptr;
693 if (asyncContext->resolved) {
694 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->slotId, &callbackValue));
695 } else {
696 if (asyncContext->errorCode == ERROR_NATIVE_API_EXECUTE_FAIL) {
697 callbackValue = NapiUtil::CreateErrorMessage(
698 env, "GetDefaultCellularDataSlotId api execute failed", ERROR_NATIVE_API_EXECUTE_FAIL);
699 } else {
700 callbackValue = NapiUtil::CreateErrorMessage(env, "get default cellular data slotId failed");
701 }
702 }
703 NapiUtil::Handle2ValueCallback(env, asyncContext, callbackValue);
704 }
705
GetDefaultCellularDataSlotId(napi_env env,napi_callback_info info)706 static napi_value GetDefaultCellularDataSlotId(napi_env env, napi_callback_info info)
707 {
708 size_t parameterCount = 1;
709 napi_value parameters[] = {nullptr};
710 napi_value thisVar = nullptr;
711 void *data = nullptr;
712 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
713 NAPI_ASSERT(env, MatchGetDefaultCellularDataSlotIdParameters(env, parameters, parameterCount), "type mismatch");
714 auto asyncContext = std::make_unique<AsyncContext>();
715 if (asyncContext == nullptr) {
716 std::string errorCode = std::to_string(napi_generic_failure);
717 std::string errorMessage = "error at baseContext is nullptr";
718 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
719 return nullptr;
720 }
721 if (parameterCount == 1) {
722 napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
723 }
724 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetDefaultCellularDataSlotId",
725 NativeGetDefaultCellularDataSlotId, GetDefaultCellularDataSlotIdCallback);
726 }
727
GetDefaultCellularDataSlotIdSync(napi_env env,napi_callback_info info)728 static napi_value GetDefaultCellularDataSlotIdSync(napi_env env, napi_callback_info info)
729 {
730 size_t parameterCount = 1;
731 napi_value parameters[] = { nullptr };
732 napi_value thisVar = nullptr;
733 void *data = nullptr;
734 int32_t slotId = -1;
735 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
736 if (parameterCount == 0) {
737 slotId = CellularDataClient::GetInstance().GetDefaultCellularDataSlotId();
738 }
739 napi_value value = nullptr;
740 NAPI_CALL(env, napi_create_int32(env, slotId, &value));
741 return value;
742 }
743
GetDefaultCellularDataSimId(napi_env env,napi_callback_info info)744 static napi_value GetDefaultCellularDataSimId(napi_env env, napi_callback_info info)
745 {
746 size_t parameterCount = 1;
747 napi_value parameters[] = { nullptr };
748 napi_value thisVar = nullptr;
749 void *data = nullptr;
750 int32_t simId = 0;
751 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
752 if (parameterCount == 0) {
753 CellularDataClient::GetInstance().GetDefaultCellularDataSimId(simId);
754 }
755 napi_value value = nullptr;
756 NAPI_CALL(env, napi_create_int32(env, simId, &value));
757 return value;
758 }
759
NativeSetDefaultCellularDataSlotId(napi_env env,void * data)760 static void NativeSetDefaultCellularDataSlotId(napi_env env, void *data)
761 {
762 auto asyncContext = static_cast<AsyncContext *>(data);
763 if (asyncContext == nullptr) {
764 NapiUtil::ThrowParameterError(env);
765 return;
766 }
767 if (!IsValidSlotId(asyncContext->slotId)) {
768 TELEPHONY_LOGE("NativeSetDefaultCellularDataSlotId slotId is invalid");
769 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
770 return;
771 }
772 if (IsCellularDataManagerInited()) {
773 asyncContext->errorCode = CellularDataClient::GetInstance().SetDefaultCellularDataSlotId(asyncContext->slotId);
774 if (asyncContext->errorCode == TELEPHONY_ERR_SUCCESS) {
775 asyncContext->resolved = true;
776 } else {
777 asyncContext->resolved = false;
778 }
779 } else {
780 asyncContext->resolved = false;
781 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
782 }
783 }
784
SetDefaultCellularDataSlotIdCallback(napi_env env,napi_status status,void * data)785 static void SetDefaultCellularDataSlotIdCallback(napi_env env, napi_status status, void *data)
786 {
787 auto asyncContext = static_cast<AsyncContext *>(data);
788 if (asyncContext == nullptr) {
789 NapiUtil::ThrowParameterError(env);
790 return;
791 }
792 napi_value callbackValue = nullptr;
793 if (asyncContext->resolved) {
794 callbackValue = NapiUtil::CreateUndefined(env);
795 } else {
796 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
797 asyncContext->errorCode, "setDefaultCellularDataSlotId", SET_TELEPHONY_STATE);
798 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
799 }
800 NapiUtil::Handle1ValueCallback(env, asyncContext, callbackValue);
801 }
802
SetDefaultCellularDataSlotId(napi_env env,napi_callback_info info)803 static napi_value SetDefaultCellularDataSlotId(napi_env env, napi_callback_info info)
804 {
805 const size_t paramLimitTwo = 2;
806 size_t parameterCount = paramLimitTwo;
807 napi_value parameters[] = { nullptr, nullptr };
808 napi_value thisVar = nullptr;
809 void *data = nullptr;
810 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
811 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
812 NapiUtil::ThrowParameterError(env);
813 return nullptr;
814 }
815 auto asyncContext = std::make_unique<AsyncContext>();
816 if (asyncContext == nullptr) {
817 NapiUtil::ThrowParameterError(env);
818 return nullptr;
819 }
820 napi_get_value_int32(env, parameters[0], &asyncContext->slotId);
821 if (parameterCount == paramLimitTwo) {
822 napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
823 }
824 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "SetDefaultCellularDataSlotId",
825 NativeSetDefaultCellularDataSlotId, SetDefaultCellularDataSlotIdCallback);
826 }
827
NativeGetCellularDataFlowType(napi_env env,void * data)828 void NativeGetCellularDataFlowType(napi_env env, void *data)
829 {
830 auto asyncContext = static_cast<AsyncContext *>(data);
831 if (asyncContext == nullptr) {
832 return;
833 }
834 if (IsCellularDataManagerInited()) {
835 int32_t dataState = CellularDataClient::GetInstance().GetCellularDataFlowType();
836 TELEPHONY_LOGI("dataState = %{public}d", dataState);
837 asyncContext->resolved = true;
838 asyncContext->result = WrapGetCellularDataFlowTypeType(dataState);
839 } else {
840 asyncContext->resolved = false;
841 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
842 }
843 }
844
GetCellularDataFlowTypeCallback(napi_env env,napi_status status,void * data)845 void GetCellularDataFlowTypeCallback(napi_env env, napi_status status, void *data)
846 {
847 auto context = static_cast<AsyncContext *>(data);
848 if (context == nullptr) {
849 return;
850 }
851 std::unique_ptr<AsyncContext> asyncContext(context);
852 napi_value callbackValue = nullptr;
853 if (asyncContext->resolved) {
854 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->result, &callbackValue));
855 } else {
856 if (asyncContext->errorCode == ERROR_SERVICE_UNAVAILABLE) {
857 callbackValue =
858 NapiUtil::CreateErrorMessage(env, "cellular data service unavailable", ERROR_SERVICE_UNAVAILABLE);
859 } else {
860 callbackValue = NapiUtil::CreateErrorMessage(env, "unkonwn error");
861 }
862 }
863 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
864 TELEPHONY_LOGI("GetCellularDataFlowTypeCallback end");
865 }
866
GetCellularDataFlowType(napi_env env,napi_callback_info info)867 static napi_value GetCellularDataFlowType(napi_env env, napi_callback_info info)
868 {
869 size_t parameterCount = 1;
870 napi_value parameters[] = {nullptr};
871 napi_value thisVar = nullptr;
872 void *data = nullptr;
873 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
874 NAPI_ASSERT(env, MatchGetDefaultCellularDataSlotIdParameters(env, parameters, parameterCount), "type mismatch");
875 auto asyncContext = std::make_unique<AsyncContext>();
876 if (asyncContext == nullptr) {
877 std::string errorCode = std::to_string(napi_generic_failure);
878 std::string errorMessage = "error at baseContext is nullptr";
879 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
880 return nullptr;
881 }
882 if (parameterCount == 1) {
883 napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
884 }
885 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetCellularDataFlowType",
886 NativeGetCellularDataFlowType, GetCellularDataFlowTypeCallback);
887 }
888
CreateEnumConstructor(napi_env env,napi_callback_info info)889 static napi_value CreateEnumConstructor(napi_env env, napi_callback_info info)
890 {
891 napi_value thisArg = nullptr;
892 void *data = nullptr;
893 napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data);
894 napi_value global = nullptr;
895 napi_get_global(env, &global);
896 return thisArg;
897 }
898
InitEnumDataConnectState(napi_env env,napi_value exports)899 static napi_value InitEnumDataConnectState(napi_env env, napi_value exports)
900 {
901 napi_property_descriptor desc[] = {
902 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_UNKNOWN",
903 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_UNKNOWN))),
904 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_DISCONNECTED",
905 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_DISCONNECTED))),
906 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_CONNECTING",
907 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTING))),
908 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_CONNECTED",
909 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTED))),
910 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_SUSPENDED",
911 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_SUSPENDED))),
912 };
913 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
914 return exports;
915 }
916
CreateDataConnectState(napi_env env,napi_value exports)917 static napi_value CreateDataConnectState(napi_env env, napi_value exports)
918 {
919 napi_property_descriptor desc[] = {
920 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_UNKNOWN",
921 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_UNKNOWN))),
922 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_DISCONNECTED",
923 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_DISCONNECTED))),
924 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_CONNECTING",
925 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTING))),
926 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_CONNECTED",
927 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_CONNECTED))),
928 DECLARE_NAPI_STATIC_PROPERTY("DATA_STATE_SUSPENDED",
929 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataConnectState::DATA_STATE_SUSPENDED))),
930
931 };
932 napi_value result = nullptr;
933 napi_define_class(env, "DataConnectState", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
934 sizeof(desc) / sizeof(*desc), desc, &result);
935 napi_set_named_property(env, exports, "DataConnectState", result);
936 return exports;
937 }
938
InitEnumDataFlowType(napi_env env,napi_value exports)939 static napi_value InitEnumDataFlowType(napi_env env, napi_value exports)
940 {
941 napi_property_descriptor desc[] = {
942 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_NONE",
943 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE))),
944 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DOWN",
945 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DOWN))),
946 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP",
947 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP))),
948 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP_DOWN",
949 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN))),
950 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DORMANT",
951 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT))),
952 };
953 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
954 return exports;
955 }
956
CreateDataFlowType(napi_env env,napi_value exports)957 static napi_value CreateDataFlowType(napi_env env, napi_value exports)
958 {
959 napi_property_descriptor desc[] = {
960 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_NONE",
961 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE))),
962 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DOWN",
963 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DOWN))),
964 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP",
965 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP))),
966 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP_DOWN",
967 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN))),
968 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DORMANT",
969 NapiUtil::ToInt32Value(env, static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT))),
970 };
971 napi_value result = nullptr;
972 napi_define_class(env, "DataFlowType", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
973 sizeof(desc) / sizeof(*desc), desc, &result);
974 napi_set_named_property(env, exports, "DataFlowType", result);
975 return exports;
976 }
977
EnableIntelligenceSwitch(napi_env env,napi_callback_info info)978 static napi_value EnableIntelligenceSwitch(napi_env env, napi_callback_info info)
979 {
980 size_t parameterCount = 1;
981 napi_value parameters[1];
982 napi_value thisVar = nullptr;
983 void *data = nullptr;
984 bool enable = false;
985 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
986 int32_t result = -1;
987 napi_get_value_bool(env, parameters[0], &enable);
988 if (parameterCount == 1) {
989 result = CellularDataClient::GetInstance().EnableIntelligenceSwitch(enable);
990 }
991 napi_value value = nullptr;
992 NAPI_CALL(env, napi_create_int32(env, result, &value));
993 return value;
994 }
995
GetIntelligenceSwitchState(napi_env env,napi_callback_info info)996 static napi_value GetIntelligenceSwitchState(napi_env env, napi_callback_info info)
997 {
998 size_t parameterCount = 1;
999 napi_value parameters[] = { nullptr };
1000 napi_value thisVar = nullptr;
1001 void *data = nullptr;
1002 bool switchState = false;
1003 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
1004 if (parameterCount == 0) {
1005 CellularDataClient::GetInstance().GetIntelligenceSwitchState(switchState);
1006 }
1007 napi_value value = nullptr;
1008 NAPI_CALL(env, napi_get_boolean(env, switchState, &value));
1009 return value;
1010 }
1011
1012 template<typename T>
NapiAsyncBaseCompleteCallback(napi_env env,const AsyncContext1<T> & asyncContext,JsError error,bool funcIgnoreReturnVal=false)1013 void NapiAsyncBaseCompleteCallback(
1014 napi_env env, const AsyncContext1<T> &asyncContext, JsError error, bool funcIgnoreReturnVal = false)
1015 {
1016 const BaseContext &context = asyncContext.context;
1017 if (context.deferred != nullptr && !context.resolved) {
1018 napi_value errorMessage = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1019 NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, context.deferred, errorMessage));
1020 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
1021 TELEPHONY_LOGE("NapiAsyncBaseCompleteCallback deferred error and resolved is false");
1022 return;
1023 }
1024
1025 if (context.deferred != nullptr && context.resolved) {
1026 napi_value res =
1027 (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
1028 NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, context.deferred, res));
1029 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
1030 TELEPHONY_LOGE("NapiAsyncBaseCompleteCallback deferred error and resolved is true");
1031 return;
1032 }
1033
1034 napi_value res =
1035 (funcIgnoreReturnVal ? NapiUtil::CreateUndefined(env) : GetNapiValue(env, asyncContext.callbackVal));
1036 napi_value callbackValue[] { NapiUtil::CreateUndefined(env), res };
1037 if (!context.resolved) {
1038 callbackValue[0] = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1039 callbackValue[1] = NapiUtil::CreateUndefined(env);
1040 }
1041 napi_value undefined = nullptr;
1042 napi_value callback = nullptr;
1043 napi_value result = nullptr;
1044 NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
1045 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, context.callbackRef, &callback));
1046 NAPI_CALL_RETURN_VOID(
1047 env, napi_call_function(env, undefined, callback, std::size(callbackValue), callbackValue, &result));
1048 NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, context.callbackRef));
1049 NAPI_CALL_RETURN_VOID(env, napi_delete_async_work(env, context.work));
1050 }
1051
1052 template<typename T>
NapiAsyncPermissionCompleteCallback(napi_env env,napi_status status,const AsyncContext1<T> & asyncContext,bool funcIgnoreReturnVal,PermissionPara permissionPara)1053 void NapiAsyncPermissionCompleteCallback(napi_env env, napi_status status, const AsyncContext1<T> &asyncContext,
1054 bool funcIgnoreReturnVal, PermissionPara permissionPara)
1055 {
1056 if (status != napi_ok) {
1057 napi_throw_type_error(env, nullptr, "excute failed");
1058 return;
1059 }
1060
1061 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1062 asyncContext.context.errorCode, permissionPara.func, permissionPara.permission);
1063 NapiAsyncBaseCompleteCallback(env, asyncContext, error, funcIgnoreReturnVal);
1064 }
1065
ApnInfoAnalyzeExt(napi_env env,napi_value arg,ApnInfo & queryApnPara)1066 void ApnInfoAnalyzeExt(napi_env env, napi_value arg, ApnInfo &queryApnPara)
1067 {
1068 napi_value proxy = NapiUtil::GetNamedProperty(env, arg, "proxy");
1069 if (proxy) {
1070 std::array<char, ARRAY_SIZE> proxyStr = {0};
1071 NapiValueToCppValue(env, proxy, napi_string, std::data(proxyStr));
1072 queryApnPara.proxy = NapiUtil::ToUtf16(proxyStr.data());
1073 } else {
1074 queryApnPara.proxy = NapiUtil::ToUtf16(NOT_FILLED_IN);
1075 }
1076 napi_value mmsproxy = NapiUtil::GetNamedProperty(env, arg, "mmsproxy");
1077 if (mmsproxy) {
1078 std::array<char, ARRAY_SIZE> mmsproxyStr = {0};
1079 NapiValueToCppValue(env, mmsproxy, napi_string, std::data(mmsproxyStr));
1080 queryApnPara.mmsproxy = NapiUtil::ToUtf16(mmsproxyStr.data());
1081 } else {
1082 queryApnPara.mmsproxy = NapiUtil::ToUtf16(NOT_FILLED_IN);
1083 }
1084 }
1085
ApnInfoAnalyze(napi_env env,napi_value arg,ApnInfo & queryApnPara)1086 void ApnInfoAnalyze(napi_env env, napi_value arg, ApnInfo &queryApnPara)
1087 {
1088 napi_value apnName = NapiUtil::GetNamedProperty(env, arg, "apnName");
1089 if (apnName) {
1090 std::array<char, ARRAY_SIZE> apnNameStr = {0};
1091 NapiValueToCppValue(env, apnName, napi_string, std::data(apnNameStr));
1092 queryApnPara.apnName = NapiUtil::ToUtf16(apnNameStr.data());
1093 }
1094 napi_value apn = NapiUtil::GetNamedProperty(env, arg, "apn");
1095 if (apn) {
1096 std::array<char, ARRAY_SIZE> apnStr = {0};
1097 NapiValueToCppValue(env, apn, napi_string, std::data(apnStr));
1098 queryApnPara.apn = NapiUtil::ToUtf16(apnStr.data());
1099 }
1100 napi_value mcc = NapiUtil::GetNamedProperty(env, arg, "mcc");
1101 if (mcc) {
1102 std::array<char, ARRAY_SIZE> mccStr = {0};
1103 NapiValueToCppValue(env, mcc, napi_string, std::data(mccStr));
1104 queryApnPara.mcc = NapiUtil::ToUtf16(mccStr.data());
1105 }
1106 napi_value mnc = NapiUtil::GetNamedProperty(env, arg, "mnc");
1107 if (mnc) {
1108 std::array<char, ARRAY_SIZE> mncStr = {0};
1109 NapiValueToCppValue(env, mnc, napi_string, std::data(mncStr));
1110 queryApnPara.mnc = NapiUtil::ToUtf16(mncStr.data());
1111 }
1112 napi_value user = NapiUtil::GetNamedProperty(env, arg, "user");
1113 if (user) {
1114 std::array<char, ARRAY_SIZE> userStr = {0};
1115 NapiValueToCppValue(env, user, napi_string, std::data(userStr));
1116 queryApnPara.user = NapiUtil::ToUtf16(userStr.data());
1117 } else {
1118 queryApnPara.user = NapiUtil::ToUtf16(NOT_FILLED_IN);
1119 }
1120 napi_value type = NapiUtil::GetNamedProperty(env, arg, "type");
1121 if (type) {
1122 std::array<char, ARRAY_SIZE> typeStr = {0};
1123 NapiValueToCppValue(env, type, napi_string, std::data(typeStr));
1124 queryApnPara.type = NapiUtil::ToUtf16(typeStr.data());
1125 } else {
1126 queryApnPara.type = NapiUtil::ToUtf16(NOT_FILLED_IN);
1127 }
1128 ApnInfoAnalyzeExt(env, arg, queryApnPara);
1129 }
1130
1131 template<typename AsyncContextType, typename... Ts>
NapiCreateAsyncWork2(const AsyncPara & para,AsyncContextType * asyncContext,std::tuple<Ts...> & theTuple)1132 napi_value NapiCreateAsyncWork2(const AsyncPara ¶, AsyncContextType *asyncContext, std::tuple<Ts...> &theTuple)
1133 {
1134 if (asyncContext == nullptr) {
1135 return nullptr;
1136 }
1137
1138 napi_env env = para.env;
1139 BaseContext &context = asyncContext->asyncContext.context;
1140
1141 size_t argc = sizeof...(Ts);
1142 napi_value argv[sizeof...(Ts)]{nullptr};
1143 NAPI_CALL(env, napi_get_cb_info(env, para.info, &argc, argv, nullptr, nullptr));
1144
1145 std::optional<NapiError> errCode = MatchParameters(env, argv, argc, theTuple);
1146 if (errCode.has_value()) {
1147 JsError error = NapiUtil::ConverErrorMessageForJs(errCode.value());
1148 NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
1149 delete asyncContext;
1150 asyncContext = nullptr;
1151 return nullptr;
1152 }
1153
1154 napi_value result = nullptr;
1155 if (context.callbackRef == nullptr) {
1156 NAPI_CALL(env, napi_create_promise(env, &context.deferred, &result));
1157 } else {
1158 NAPI_CALL(env, napi_get_undefined(env, &result));
1159 }
1160
1161 napi_value resourceName = nullptr;
1162 NAPI_CALL(env, napi_create_string_utf8(env, para.funcName.c_str(), para.funcName.length(), &resourceName));
1163 NAPI_CALL(env, napi_create_async_work(env, nullptr, resourceName, para.execute, para.complete,
1164 static_cast<void *>(asyncContext), &context.work));
1165 return result;
1166 }
1167
NativeQueryApnIds(napi_env env,void * data)1168 void NativeQueryApnIds(napi_env env, void *data)
1169 {
1170 if (data == nullptr) {
1171 return;
1172 }
1173 auto queryApnInfoContext = static_cast<AsyncQueryApnInfo *>(data);
1174 ApnInfo apnInfoStru;
1175 if (queryApnInfoContext->queryApnPara.apn.length() == 0) {
1176 TELEPHONY_LOGE("NativeQueryApnIds apn is null.");
1177 }
1178 apnInfoStru.apnName = queryApnInfoContext->queryApnPara.apnName;
1179 apnInfoStru.apn = queryApnInfoContext->queryApnPara.apn;
1180 apnInfoStru.mcc = queryApnInfoContext->queryApnPara.mcc;
1181 apnInfoStru.mnc = queryApnInfoContext->queryApnPara.mnc;
1182 apnInfoStru.user = queryApnInfoContext->queryApnPara.user;
1183 apnInfoStru.type = queryApnInfoContext->queryApnPara.type;
1184 apnInfoStru.proxy = queryApnInfoContext->queryApnPara.proxy;
1185 apnInfoStru.mmsproxy = queryApnInfoContext->queryApnPara.mmsproxy;
1186 std::vector<uint32_t> apnIdList;
1187 std::unique_lock<std::mutex> callbackLock(queryApnInfoContext->asyncContext.callbackMutex);
1188 int32_t errorCode = CellularDataClient::GetInstance().QueryApnIds(apnInfoStru, apnIdList);
1189 if (errorCode == TELEPHONY_SUCCESS) {
1190 queryApnInfoContext->apnIdList.swap(apnIdList);
1191 queryApnInfoContext->asyncContext.context.resolved = true;
1192 } else {
1193 TELEPHONY_LOGE("NAPI NativeQueryApnIds %{public}d", errorCode);
1194 queryApnInfoContext->asyncContext.context.resolved = false;
1195 }
1196 queryApnInfoContext->asyncContext.context.errorCode = errorCode;
1197 }
1198
QueryApnIdsCallback(napi_env env,napi_status status,void * data)1199 void QueryApnIdsCallback(napi_env env, napi_status status, void *data)
1200 {
1201 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1202 std::unique_ptr<AsyncQueryApnInfo> info(static_cast<AsyncQueryApnInfo *>(data));
1203 AsyncContext1<napi_value> &asyncContext = info->asyncContext;
1204 asyncContext.callbackVal = nullptr;
1205 napi_create_array(env, &asyncContext.callbackVal);
1206 TELEPHONY_LOGI("QueryApnCallback info->apnIdList.size = %{public}zu", info->apnIdList.size());
1207 for (size_t i = 0; i < info->apnIdList.size(); i++) {
1208 napi_value val;
1209 napi_create_int32(env, info->apnIdList.at(i), &val);
1210 TELEPHONY_LOGI("QueryApnCallback info->apnIdList.size = %{public}d", info->apnIdList.at(i));
1211 napi_set_element(env, asyncContext.callbackVal, i, val);
1212 }
1213 NapiAsyncPermissionCompleteCallback(
1214 env, status, asyncContext, false, { "QueryApnIds", MANAGE_APN_SETTING });
1215 }
1216
QueryApnIds(napi_env env,napi_callback_info info)1217 static napi_value QueryApnIds(napi_env env, napi_callback_info info)
1218 {
1219 TELEPHONY_LOGI("QueryApnIds enter!");
1220 auto queryApnInfo = std::make_unique<AsyncQueryApnInfo>();
1221 if (queryApnInfo == nullptr) {
1222 return nullptr;
1223 }
1224 BaseContext &context = queryApnInfo->asyncContext.context;
1225
1226 napi_value object = NapiUtil::CreateUndefined(env);
1227 auto initPara = std::make_tuple(&object, &context.callbackRef);
1228 AsyncPara para {
1229 .funcName = "QueryApnIds",
1230 .env = env,
1231 .info = info,
1232 .execute = NativeQueryApnIds,
1233 .complete = QueryApnIdsCallback,
1234 };
1235 napi_value result = NapiCreateAsyncWork2<AsyncQueryApnInfo>(para, queryApnInfo.get(), initPara);
1236 if (result == nullptr) {
1237 TELEPHONY_LOGE("creat asyncwork failed!");
1238 return nullptr;
1239 }
1240 ApnInfoAnalyze(env, object, queryApnInfo->queryApnPara);
1241 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1242 queryApnInfo.release();
1243 }
1244 return result;
1245 }
1246
NativeSetPreferApn(napi_env env,void * data)1247 static void NativeSetPreferApn(napi_env env, void *data)
1248 {
1249 auto asyncContext = static_cast<AsyncSetPreferApnContext *>(data);
1250 if (asyncContext == nullptr) {
1251 NapiUtil::ThrowParameterError(env);
1252 return;
1253 }
1254 int32_t errcode = CellularDataClient::GetInstance().SetPreferApn(asyncContext->apnId);
1255 TELEPHONY_LOGI("NAPI NativeSetPreferApn apnId:%{public}d, error::%{public}d", asyncContext->apnId, errcode);
1256 asyncContext->errorCode = errcode;
1257 if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
1258 asyncContext->resolved = true;
1259 asyncContext->result = true;
1260 } else if (asyncContext->errorCode == -1) {
1261 asyncContext->resolved = true;
1262 asyncContext->result = false;
1263 } else {
1264 asyncContext->resolved = false;
1265 asyncContext->result = false;
1266 }
1267 }
1268
SetPreferApnCallback(napi_env env,napi_status status,void * data)1269 static void SetPreferApnCallback(napi_env env, napi_status status, void *data)
1270 {
1271 auto context = static_cast<AsyncSetPreferApnContext *>(data);
1272 if (context == nullptr) {
1273 NapiUtil::ThrowParameterError(env);
1274 return;
1275 }
1276
1277 std::unique_ptr<AsyncSetPreferApnContext> asyncContext(context);
1278 napi_value callbackValue = nullptr;
1279 if (asyncContext->resolved) {
1280 napi_status status = napi_get_boolean(env, asyncContext->result, &callbackValue);
1281 NAPI_CALL_RETURN_VOID(env, status);
1282 } else {
1283 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1284 asyncContext->errorCode, "SetPreferredApn", MANAGE_APN_SETTING);
1285 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1286 }
1287 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
1288 }
1289
SetPreferredApn(napi_env env,napi_callback_info info)1290 static napi_value SetPreferredApn(napi_env env, napi_callback_info info)
1291 {
1292 TELEPHONY_LOGI("SetPreferredApn enter!");
1293 const size_t paramLimitTwo = 2;
1294 size_t parameterCount = paramLimitTwo;
1295 napi_value parameters[] = { nullptr, nullptr };
1296 napi_value thisVar = nullptr;
1297 void *data = nullptr;
1298 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
1299
1300 if (!NapiUtil::MatchParameters(env, parameters, {napi_number})) {
1301 NapiUtil::ThrowParameterError(env);
1302 return nullptr;
1303 }
1304 auto asyncContext = std::make_unique<AsyncSetPreferApnContext>();
1305 if (asyncContext == nullptr) {
1306 TELEPHONY_LOGE("SetPreferredApn asyncContext is nullptr.");
1307 NapiUtil::ThrowParameterError(env);
1308 return nullptr;
1309 }
1310 napi_get_value_int32(env, parameters[0], &asyncContext->apnId);
1311 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "SetPreferredApn",
1312 NativeSetPreferApn, SetPreferApnCallback);
1313 }
1314
ApnInfoConversion(napi_env env,const ApnInfo & asyncQueryApnPara)1315 napi_value ApnInfoConversion(napi_env env, const ApnInfo &asyncQueryApnPara)
1316 {
1317 napi_value val = nullptr;
1318 napi_create_object(env, &val);
1319 SetPropertyToNapiObject(env, val, "apnName", NapiUtil::ToUtf8(asyncQueryApnPara.apnName));
1320 SetPropertyToNapiObject(env, val, "apn", NapiUtil::ToUtf8(asyncQueryApnPara.apn));
1321 SetPropertyToNapiObject(env, val, "mcc", NapiUtil::ToUtf8(asyncQueryApnPara.mcc));
1322 SetPropertyToNapiObject(env, val, "mnc", NapiUtil::ToUtf8(asyncQueryApnPara.mnc));
1323 SetPropertyToNapiObject(env, val, "user", NapiUtil::ToUtf8(asyncQueryApnPara.user));
1324 SetPropertyToNapiObject(env, val, "type", NapiUtil::ToUtf8(asyncQueryApnPara.type));
1325 SetPropertyToNapiObject(env, val, "proxy", NapiUtil::ToUtf8(asyncQueryApnPara.proxy));
1326 SetPropertyToNapiObject(env, val, "mmsproxy", NapiUtil::ToUtf8(asyncQueryApnPara.mmsproxy));
1327 return val;
1328 }
1329
NativeQueryAllApn(napi_env env,void * data)1330 void NativeQueryAllApn(napi_env env, void *data)
1331 {
1332 if (data == nullptr) {
1333 return;
1334 }
1335 auto queryAllApnInfoContext = static_cast<AsyncQueryAllApnInfo *>(data);
1336
1337 std::vector<ApnInfo> allApnInfoList;
1338 std::unique_lock<std::mutex> callbackLock(queryAllApnInfoContext->asyncContext.callbackMutex);
1339 int32_t errorCode = CellularDataClient::GetInstance().QueryAllApnInfo(allApnInfoList);
1340 TELEPHONY_LOGI("NAPI NativeQueryAllApn %{public}d", errorCode);
1341 if (errorCode == TELEPHONY_SUCCESS) {
1342 queryAllApnInfoContext->allApnInfoList.swap(allApnInfoList);
1343 queryAllApnInfoContext->asyncContext.context.resolved = true;
1344 } else {
1345 queryAllApnInfoContext->asyncContext.context.resolved = false;
1346 }
1347 queryAllApnInfoContext->asyncContext.context.errorCode = errorCode;
1348 }
1349
QueryAllApnCallback(napi_env env,napi_status status,void * data)1350 void QueryAllApnCallback(napi_env env, napi_status status, void *data)
1351 {
1352 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1353 std::unique_ptr<AsyncQueryAllApnInfo> info(static_cast<AsyncQueryAllApnInfo *>(data));
1354 AsyncContext1<napi_value> &asyncContext = info->asyncContext;
1355 asyncContext.callbackVal = nullptr;
1356 napi_create_array(env, &asyncContext.callbackVal);
1357 TELEPHONY_LOGI("QueryAllApnCallback info->allApnInfoList.size = %{public}zu", info->allApnInfoList.size());
1358 for (size_t i = 0; i < info->allApnInfoList.size(); i++) {
1359 napi_value val = ApnInfoConversion(env, info->allApnInfoList.at(i));
1360 napi_set_element(env, asyncContext.callbackVal, i, val);
1361 }
1362 NapiAsyncPermissionCompleteCallback(
1363 env, status, asyncContext, false, { "QueryAllApns", MANAGE_APN_SETTING });
1364 }
1365
QueryAllApns(napi_env env,napi_callback_info info)1366 static napi_value QueryAllApns(napi_env env, napi_callback_info info)
1367 {
1368 TELEPHONY_LOGI("QueryAllApns enter!");
1369 size_t parameterCount = 1;
1370 napi_value parameters[] = { nullptr };
1371 napi_value thisVar = nullptr;
1372 void *data = nullptr;
1373 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
1374
1375 if (parameterCount != 0) {
1376 NapiUtil::ThrowParameterError(env);
1377 return nullptr;
1378 }
1379
1380 auto queryAllApnInfo = std::make_unique<AsyncQueryAllApnInfo>();
1381 if (queryAllApnInfo == nullptr) {
1382 return nullptr;
1383 }
1384 BaseContext &context = queryAllApnInfo->asyncContext.context;
1385
1386 auto initPara = std::make_tuple(&context.callbackRef);
1387 AsyncPara para {
1388 .funcName = "QueryAllApns",
1389 .env = env,
1390 .info = info,
1391 .execute = NativeQueryAllApn,
1392 .complete = QueryAllApnCallback,
1393 };
1394 napi_value result = NapiCreateAsyncWork2<AsyncQueryAllApnInfo>(para, queryAllApnInfo.get(), initPara);
1395 if (result == nullptr) {
1396 TELEPHONY_LOGE("creat asyncwork failed!");
1397 return nullptr;
1398 }
1399 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1400 queryAllApnInfo.release();
1401 }
1402 return result;
1403 }
1404
NativeGetActiveApnName(napi_env env,void * data)1405 void NativeGetActiveApnName(napi_env env, void *data)
1406 {
1407 if (data == nullptr) {
1408 return;
1409 }
1410 auto getActiveApnNameContext = static_cast<AsyncGetActiveApnName *>(data);
1411
1412 std::string apnName;
1413 std::unique_lock<std::mutex> callbackLock(getActiveApnNameContext->asyncContext.callbackMutex);
1414 int32_t errorCode = CellularDataClient::GetInstance().GetActiveApnName(apnName);
1415 TELEPHONY_LOGI("NAPI NativeGetActiveApnName %{public}d", errorCode);
1416 if (errorCode == TELEPHONY_SUCCESS) {
1417 getActiveApnNameContext->apnName = apnName;
1418 getActiveApnNameContext->asyncContext.context.resolved = true;
1419 } else {
1420 getActiveApnNameContext->asyncContext.context.resolved = false;
1421 }
1422 getActiveApnNameContext->asyncContext.context.errorCode = errorCode;
1423 }
1424
GetActiveApnNameCallback(napi_env env,napi_status status,void * data)1425 void GetActiveApnNameCallback(napi_env env, napi_status status, void *data)
1426 {
1427 NAPI_CALL_RETURN_VOID(env, (data == nullptr ? napi_invalid_arg : napi_ok));
1428 std::unique_ptr<AsyncGetActiveApnName> info(static_cast<AsyncGetActiveApnName *>(data));
1429 AsyncContext1<napi_value> &asyncContext = info->asyncContext;
1430 asyncContext.callbackVal = nullptr;
1431
1432 std::string apnName = info->apnName;
1433 napi_create_string_utf8(env, apnName.c_str(), apnName.length(), &asyncContext.callbackVal);
1434 TELEPHONY_LOGI("GetActiveApnNameCallback apnName = %{public}s", apnName.c_str());
1435 NapiAsyncPermissionCompleteCallback(
1436 env, status, asyncContext, false, { "GetActiveApnName", GET_NETWORK_INFO });
1437 }
1438
GetActiveApnName(napi_env env,napi_callback_info info)1439 static napi_value GetActiveApnName(napi_env env, napi_callback_info info)
1440 {
1441 TELEPHONY_LOGI("GetActiveApnName enter!");
1442 size_t parameterCount = 1;
1443 napi_value parameters[] = { nullptr };
1444 napi_value thisVar = nullptr;
1445 void *data = nullptr;
1446 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
1447
1448 if (parameterCount != 0) {
1449 NapiUtil::ThrowParameterError(env);
1450 return nullptr;
1451 }
1452
1453 auto asyncGetActiveApnName = std::make_unique<AsyncGetActiveApnName>();
1454 if (asyncGetActiveApnName == nullptr) {
1455 return nullptr;
1456 }
1457 BaseContext &context = asyncGetActiveApnName->asyncContext.context;
1458
1459 auto initPara = std::make_tuple(&context.callbackRef);
1460 AsyncPara para {
1461 .funcName = "GetActiveApnName",
1462 .env = env,
1463 .info = info,
1464 .execute = NativeGetActiveApnName,
1465 .complete = GetActiveApnNameCallback,
1466 };
1467 napi_value result = NapiCreateAsyncWork2<AsyncGetActiveApnName>(para, asyncGetActiveApnName.get(), initPara);
1468 if (result == nullptr) {
1469 TELEPHONY_LOGE("creat asyncwork failed!");
1470 return nullptr;
1471 }
1472 if (napi_queue_async_work_with_qos(env, context.work, napi_qos_default) == napi_ok) {
1473 asyncGetActiveApnName.release();
1474 }
1475 return result;
1476 }
1477
1478 EXTERN_C_START
RegistCellularData(napi_env env,napi_value exports)1479 napi_value RegistCellularData(napi_env env, napi_value exports)
1480 {
1481 auto cellularDataPoxy = CellularDataClient::GetInstance().GetProxy();
1482 napi_property_descriptor desc[] = {
1483 DECLARE_NAPI_FUNCTION("getCellularDataState", GetCellularDataState),
1484 DECLARE_NAPI_FUNCTION("isCellularDataEnabled", IsCellularDataEnabled),
1485 DECLARE_NAPI_FUNCTION("isCellularDataEnabledSync", IsCellularDataEnabledSync),
1486 DECLARE_NAPI_FUNCTION("enableCellularData", EnableCellularData),
1487 DECLARE_NAPI_FUNCTION("disableCellularData", DisableCellularData),
1488 DECLARE_NAPI_FUNCTION("enableCellularDataRoaming", EnableCellularDataRoaming),
1489 DECLARE_NAPI_FUNCTION("disableCellularDataRoaming", DisableCellularDataRoaming),
1490 DECLARE_NAPI_FUNCTION("isCellularDataRoamingEnabled", IsCellularDataRoamingEnabled),
1491 DECLARE_NAPI_FUNCTION("isCellularDataRoamingEnabledSync", IsCellularDataRoamingEnabledSync),
1492 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSlotId", GetDefaultCellularDataSlotId),
1493 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSimId", GetDefaultCellularDataSimId),
1494 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSlotIdSync", GetDefaultCellularDataSlotIdSync),
1495 DECLARE_NAPI_FUNCTION("setDefaultCellularDataSlotId", SetDefaultCellularDataSlotId),
1496 DECLARE_NAPI_FUNCTION("getCellularDataFlowType", GetCellularDataFlowType),
1497 DECLARE_NAPI_FUNCTION("enableIntelligenceSwitch", EnableIntelligenceSwitch),
1498 DECLARE_NAPI_FUNCTION("getIntelligenceSwitchState", GetIntelligenceSwitchState),
1499 DECLARE_NAPI_FUNCTION("queryApnIds", QueryApnIds),
1500 DECLARE_NAPI_FUNCTION("setPreferredApn", SetPreferredApn),
1501 DECLARE_NAPI_FUNCTION("queryAllApns", QueryAllApns),
1502 DECLARE_NAPI_FUNCTION("getActiveApnName", GetActiveApnName),
1503 };
1504 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1505 CreateDataConnectState(env, exports);
1506 InitEnumDataConnectState(env, exports);
1507 CreateDataFlowType(env, exports);
1508 InitEnumDataFlowType(env, exports);
1509 return exports;
1510 }
1511 EXTERN_C_END
1512
1513 static napi_module _cellularDataModule = {
1514 .nm_version = 1,
1515 .nm_flags = 0,
1516 .nm_filename = nullptr,
1517 .nm_register_func = RegistCellularData,
1518 .nm_modname = "telephony.data",
1519 .nm_priv = nullptr,
1520 .reserved = {nullptr},
1521 };
1522
RegisterCellularDataModule(void)1523 extern "C" __attribute__((constructor)) void RegisterCellularDataModule(void)
1524 {
1525 napi_module_register(&_cellularDataModule);
1526 }
1527 } // namespace Telephony
1528 } // namespace OHOS
1529