• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi_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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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 &para, 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, &parameterCount, 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, &parameterCount, 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, &parameterCount, 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