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_cellular_data_types.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
IsCellularDataManagerInited()40 static bool IsCellularDataManagerInited()
41 {
42 return CellularDataClient::GetInstance().IsConnect();
43 }
44
IsValidSlotId(int32_t slotId)45 static inline bool IsValidSlotId(int32_t slotId)
46 {
47 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
48 }
49
MatchCellularDataParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)50 static bool MatchCellularDataParameters(napi_env env, const napi_value parameters[], const size_t parameterCount)
51 {
52 switch (parameterCount) {
53 case 0:
54 return true;
55 case 1:
56 return NapiUtil::MatchParameters(env, parameters, {napi_function});
57 default:
58 return false;
59 }
60 }
61
MatchEnableCellularDataRoamingParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)62 static bool MatchEnableCellularDataRoamingParameters(
63 napi_env env, const napi_value parameters[], const size_t parameterCount)
64 {
65 const size_t paramLimitOne = 1;
66 const size_t paramLimitTwo = 2;
67 switch (parameterCount) {
68 case paramLimitOne:
69 return NapiUtil::MatchParameters(env, parameters, {napi_number});
70 case paramLimitTwo:
71 return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_function});
72 default:
73 return false;
74 }
75 }
76
WrapCellularDataType(const int32_t cellularDataType)77 static int32_t WrapCellularDataType(const int32_t cellularDataType)
78 {
79 switch (cellularDataType) {
80 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_DISCONNECTED): {
81 return static_cast<int32_t>(DataConnectionState::DATA_STATE_DISCONNECTED);
82 }
83 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_CONNECTING): {
84 return static_cast<int32_t>(DataConnectionState::DATA_STATE_CONNECTING);
85 }
86 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_CONNECTED): {
87 return static_cast<int32_t>(DataConnectionState::DATA_STATE_CONNECTED);
88 }
89 case static_cast<int32_t>(DataConnectionStatus::DATA_STATE_SUSPENDED): {
90 return static_cast<int32_t>(DataConnectionState::DATA_STATE_SUSPENDED);
91 }
92 default: {
93 return static_cast<int32_t>(DataConnectionState::DATA_STATE_UNKNOWN);
94 }
95 }
96 }
97
WrapGetCellularDataFlowTypeType(const int32_t cellularDataType)98 static int32_t WrapGetCellularDataFlowTypeType(const int32_t cellularDataType)
99 {
100 switch (cellularDataType) {
101 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_NONE): {
102 return static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_NONE);
103 }
104 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DOWN): {
105 return static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_DOWN);
106 }
107 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP): {
108 return static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP);
109 }
110 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_UP_DOWN): {
111 return static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP_DOWN);
112 }
113 case static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT): {
114 return static_cast<int32_t>(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
115 }
116 default: {
117 return static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_NONE);
118 }
119 }
120 }
121
NativeGetCellularDataState(napi_env env,void * data)122 static void NativeGetCellularDataState(napi_env env, void *data)
123 {
124 auto asyncContext = static_cast<AsyncContext *>(data);
125 if (asyncContext == nullptr) {
126 return;
127 }
128 if (IsCellularDataManagerInited()) {
129 int32_t dataState = CellularDataClient::GetInstance().GetCellularDataState();
130 asyncContext->resolved = true;
131 asyncContext->result = WrapCellularDataType(dataState);
132 } else {
133 asyncContext->resolved = false;
134 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
135 }
136 }
137
GetCellularDataStateCallback(napi_env env,napi_status status,void * data)138 static void GetCellularDataStateCallback(napi_env env, napi_status status, void *data)
139 {
140 auto context = static_cast<AsyncContext *>(data);
141 if (context == nullptr) {
142 return;
143 }
144 std::unique_ptr<AsyncContext> asyncContext(context);
145 napi_value callbackValue = nullptr;
146 if (asyncContext->resolved) {
147 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->result, &callbackValue));
148 } else {
149 if (asyncContext->errorCode == ERROR_SERVICE_UNAVAILABLE) {
150 callbackValue =
151 NapiUtil::CreateErrorMessage(env, "cellular data service unavailable", ERROR_SERVICE_UNAVAILABLE);
152 } else {
153 callbackValue = NapiUtil::CreateErrorMessage(env, "unkonwn error");
154 }
155 }
156 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
157 }
158
GetCellularDataState(napi_env env,napi_callback_info info)159 static napi_value GetCellularDataState(napi_env env, napi_callback_info info)
160 {
161 size_t parameterCount = 1;
162 napi_value parameters[1];
163 napi_value thisVar = nullptr;
164 void *data = nullptr;
165 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
166 NAPI_ASSERT(env, MatchCellularDataParameters(env, parameters, parameterCount), "type mismatch");
167 auto asyncContext = std::make_unique<AsyncContext>();
168 if (asyncContext == nullptr) {
169 std::string errorCode = std::to_string(napi_generic_failure);
170 std::string errorMessage = "error at baseContext is nullptr";
171 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
172 return nullptr;
173 }
174 if (parameterCount == 1) {
175 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
176 }
177 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetCellularDataState",
178 NativeGetCellularDataState, GetCellularDataStateCallback);
179 }
180
NativeIsCellularDataEnabled(napi_env env,void * data)181 static void NativeIsCellularDataEnabled(napi_env env, void *data)
182 {
183 auto asyncContext = static_cast<AsyncContext *>(data);
184 if (asyncContext == nullptr) {
185 NapiUtil::ThrowParameterError(env);
186 return;
187 }
188 if (IsCellularDataManagerInited()) {
189 bool enabled = false;
190 asyncContext->errorCode = CellularDataClient::GetInstance().IsCellularDataEnabled(enabled);
191 if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
192 asyncContext->resolved = true;
193 }
194 asyncContext->result = enabled;
195 } else {
196 asyncContext->resolved = false;
197 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
198 }
199 }
200
IsCellularDataEnabledCallback(napi_env env,napi_status status,void * data)201 static void IsCellularDataEnabledCallback(napi_env env, napi_status status, void *data)
202 {
203 auto context = static_cast<AsyncContext *>(data);
204 if (context == nullptr) {
205 return;
206 }
207 std::unique_ptr<AsyncContext> asyncContext(context);
208 napi_value callbackValue = nullptr;
209 if (asyncContext->resolved) {
210 napi_status status = napi_get_boolean(env,
211 asyncContext->result == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED), &callbackValue);
212 NAPI_CALL_RETURN_VOID(env, status);
213 } else {
214 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
215 asyncContext->errorCode, "IsCellularDataEnabled", GET_NETWORK_INFO);
216 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
217 }
218 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
219 }
220
IsCellularDataEnabled(napi_env env,napi_callback_info info)221 static napi_value IsCellularDataEnabled(napi_env env, napi_callback_info info)
222 {
223 size_t parameterCount = 1;
224 napi_value parameters[1];
225 napi_value thisVar = nullptr;
226 void *data = nullptr;
227 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
228 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
229 TELEPHONY_LOGE("IsCellularDataEnabled MatchCellularDataParameters failed.");
230 NapiUtil::ThrowParameterError(env);
231 return nullptr;
232 }
233 auto asyncContext = std::make_unique<AsyncContext>();
234 if (asyncContext == nullptr) {
235 TELEPHONY_LOGE("IsCellularDataEnabled asyncContext is nullptr.");
236 NapiUtil::ThrowParameterError(env);
237 return nullptr;
238 }
239 if (parameterCount == 1) {
240 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
241 }
242 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "IsCellularDataEnabled",
243 NativeIsCellularDataEnabled, IsCellularDataEnabledCallback);
244 }
245
NativeEnableCellularData(napi_env env,void * data)246 static void NativeEnableCellularData(napi_env env, void *data)
247 {
248 auto asyncContext = static_cast<AsyncContext *>(data);
249 if (asyncContext == nullptr) {
250 NapiUtil::ThrowParameterError(env);
251 return;
252 }
253 if (IsCellularDataManagerInited()) {
254 asyncContext->result = CellularDataClient::GetInstance().EnableCellularData(true);
255 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
256 asyncContext->resolved = true;
257 } else {
258 asyncContext->resolved = false;
259 asyncContext->errorCode = asyncContext->result;
260 }
261 } else {
262 asyncContext->resolved = false;
263 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
264 }
265 }
266
EnableCellularDataCallback(napi_env env,napi_status status,void * data)267 static void EnableCellularDataCallback(napi_env env, napi_status status, void *data)
268 {
269 auto context = static_cast<AsyncContext *>(data);
270 if (context == nullptr) {
271 NapiUtil::ThrowParameterError(env);
272 return;
273 }
274 std::unique_ptr<AsyncContext> asyncContext(context);
275 napi_value callbackValue = nullptr;
276 if (asyncContext->resolved) {
277 callbackValue = NapiUtil::CreateUndefined(env);
278 } else {
279 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
280 asyncContext->errorCode, "enableCellularData", SET_TELEPHONY_STATE);
281 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
282 }
283 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
284 TELEPHONY_LOGI("EnableCellularDataCallback end");
285 }
286
DisableCellularDataCallback(napi_env env,napi_status status,void * data)287 static void DisableCellularDataCallback(napi_env env, napi_status status, void *data)
288 {
289 auto context = static_cast<AsyncContext *>(data);
290 if (context == nullptr) {
291 NapiUtil::ThrowParameterError(env);
292 return;
293 }
294 std::unique_ptr<AsyncContext> asyncContext(context);
295 napi_value callbackValue = nullptr;
296 if (asyncContext->resolved) {
297 callbackValue = NapiUtil::CreateUndefined(env);
298 } else {
299 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
300 asyncContext->errorCode, "disableCellularData", SET_TELEPHONY_STATE);
301 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
302 }
303 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
304 TELEPHONY_LOGI("DisableCellularDataCallback end");
305 }
306
EnableCellularDataRoamingCallback(napi_env env,napi_status status,void * data)307 static void EnableCellularDataRoamingCallback(napi_env env, napi_status status, void *data)
308 {
309 auto context = static_cast<AsyncContext *>(data);
310 if (context == nullptr) {
311 NapiUtil::ThrowParameterError(env);
312 return;
313 }
314 std::unique_ptr<AsyncContext> asyncContext(context);
315 napi_value callbackValue = nullptr;
316 if (asyncContext->resolved) {
317 callbackValue = NapiUtil::CreateUndefined(env);
318 } else {
319 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
320 asyncContext->errorCode, "enableCellularDataRoaming", SET_TELEPHONY_STATE);
321 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
322 }
323 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
324 TELEPHONY_LOGI("EnableCellularDataRoamingCallback end");
325 }
326
DisableCellularDataRoamingCallback(napi_env env,napi_status status,void * data)327 static void DisableCellularDataRoamingCallback(napi_env env, napi_status status, void *data)
328 {
329 auto context = static_cast<AsyncContext *>(data);
330 if (context == nullptr) {
331 NapiUtil::ThrowParameterError(env);
332 return;
333 }
334 std::unique_ptr<AsyncContext> asyncContext(context);
335 napi_value callbackValue = nullptr;
336 if (asyncContext->resolved) {
337 callbackValue = NapiUtil::CreateUndefined(env);
338 } else {
339 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
340 asyncContext->errorCode, "disableCellularDataRoaming", SET_TELEPHONY_STATE);
341 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
342 }
343 NapiUtil::Handle1ValueCallback(env, asyncContext.release(), callbackValue);
344 TELEPHONY_LOGI("DisableCellularDataRoamingCallback end");
345 }
346
EnableCellularData(napi_env env,napi_callback_info info)347 static napi_value EnableCellularData(napi_env env, napi_callback_info info)
348 {
349 size_t parameterCount = 1;
350 napi_value parameters[1];
351 napi_value thisVar = nullptr;
352 void *data = nullptr;
353 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
354 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
355 NapiUtil::ThrowParameterError(env);
356 return nullptr;
357 }
358 auto asyncContext = std::make_unique<AsyncContext>();
359 if (asyncContext == nullptr) {
360 NapiUtil::ThrowParameterError(env);
361 return nullptr;
362 }
363 if (parameterCount == 1) {
364 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
365 }
366 return NapiUtil::HandleAsyncWork(
367 env, asyncContext.release(), "EnableCellularData", NativeEnableCellularData, EnableCellularDataCallback);
368 }
369
NativeDisableCellularData(napi_env env,void * data)370 static void NativeDisableCellularData(napi_env env, void *data)
371 {
372 auto asyncContext = static_cast<AsyncContext *>(data);
373 if (asyncContext == nullptr) {
374 NapiUtil::ThrowParameterError(env);
375 return;
376 }
377 if (IsCellularDataManagerInited()) {
378 asyncContext->result = CellularDataClient::GetInstance().EnableCellularData(false);
379 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
380 asyncContext->resolved = true;
381 } else {
382 asyncContext->resolved = false;
383 asyncContext->errorCode = asyncContext->result;
384 }
385 } else {
386 asyncContext->resolved = false;
387 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
388 }
389 }
390
DisableCellularData(napi_env env,napi_callback_info info)391 static napi_value DisableCellularData(napi_env env, napi_callback_info info)
392 {
393 size_t parameterCount = 1;
394 napi_value parameters[1];
395 napi_value thisVar = nullptr;
396 void *data = nullptr;
397 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
398 if (!MatchCellularDataParameters(env, parameters, parameterCount)) {
399 NapiUtil::ThrowParameterError(env);
400 return nullptr;
401 }
402 auto asyncContext = std::make_unique<AsyncContext>();
403 if (asyncContext == nullptr) {
404 NapiUtil::ThrowParameterError(env);
405 return nullptr;
406 }
407 if (parameterCount == 1) {
408 NAPI_CALL(env, napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &(asyncContext->callbackRef)));
409 }
410 return NapiUtil::HandleAsyncWork(
411 env, asyncContext.release(), "DisableCellularData", NativeDisableCellularData, DisableCellularDataCallback);
412 }
413
NativeEnableCellularDataRoaming(napi_env env,void * data)414 static void NativeEnableCellularDataRoaming(napi_env env, void *data)
415 {
416 auto asyncContext = static_cast<AsyncContext *>(data);
417 if (asyncContext == nullptr) {
418 NapiUtil::ThrowParameterError(env);
419 return;
420 }
421 if (!IsValidSlotId(asyncContext->slotId)) {
422 TELEPHONY_LOGE("NativeEnableCellularDataRoaming slotId is invalid");
423 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
424 return;
425 }
426 if (IsCellularDataManagerInited()) {
427 asyncContext->result = CellularDataClient::GetInstance().EnableCellularDataRoaming(asyncContext->slotId, true);
428 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
429 asyncContext->resolved = true;
430 } else {
431 asyncContext->resolved = false;
432 asyncContext->errorCode = asyncContext->result;
433 }
434 } else {
435 asyncContext->resolved = false;
436 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
437 }
438 TELEPHONY_LOGI("NativeEnableCellularDataRoaming end");
439 }
440
EnableCellularDataRoaming(napi_env env,napi_callback_info info)441 static napi_value EnableCellularDataRoaming(napi_env env, napi_callback_info info)
442 {
443 const size_t paramLimitTwo = 2;
444 size_t parameterCount = paramLimitTwo;
445 napi_value parameters[paramLimitTwo] = { 0 };
446 napi_value thisVar = nullptr;
447 void *data = nullptr;
448 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
449 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
450 NapiUtil::ThrowParameterError(env);
451 return nullptr;
452 }
453 auto asyncContext = std::make_unique<AsyncContext>();
454 if (asyncContext == nullptr) {
455 NapiUtil::ThrowParameterError(env);
456 return nullptr;
457 }
458 NAPI_CALL(env, napi_get_value_int32(env, parameters[0], &asyncContext->slotId));
459 if (parameterCount == paramLimitTwo) {
460 NAPI_CALL(env, napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
461 }
462 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "EnableCellularDataRoaming",
463 NativeEnableCellularDataRoaming, EnableCellularDataRoamingCallback);
464 }
465
NativeDisableCellularDataRoaming(napi_env env,void * data)466 static void NativeDisableCellularDataRoaming(napi_env env, void *data)
467 {
468 auto asyncContext = static_cast<AsyncContext *>(data);
469 if (asyncContext == nullptr) {
470 NapiUtil::ThrowParameterError(env);
471 return;
472 }
473 if (!IsValidSlotId(asyncContext->slotId)) {
474 TELEPHONY_LOGE("NativeDisableCellularDataRoaming slotId is invalid");
475 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
476 return;
477 }
478 if (IsCellularDataManagerInited()) {
479 asyncContext->result = CellularDataClient::GetInstance().EnableCellularDataRoaming(asyncContext->slotId, false);
480 if (asyncContext->result == TELEPHONY_ERR_SUCCESS) {
481 asyncContext->resolved = true;
482 } else {
483 asyncContext->resolved = false;
484 asyncContext->errorCode = asyncContext->result;
485 }
486 } else {
487 asyncContext->resolved = false;
488 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
489 }
490 }
491
DisableCellularDataRoaming(napi_env env,napi_callback_info info)492 static napi_value DisableCellularDataRoaming(napi_env env, napi_callback_info info)
493 {
494 const size_t paramLimitTwo = 2;
495 size_t parameterCount = paramLimitTwo;
496 napi_value parameters[paramLimitTwo] = { 0 };
497 napi_value thisVar = nullptr;
498 void *data = nullptr;
499 NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data));
500 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
501 NapiUtil::ThrowParameterError(env);
502 return nullptr;
503 }
504 auto asyncContext = std::make_unique<AsyncContext>();
505 if (asyncContext == nullptr) {
506 NapiUtil::ThrowParameterError(env);
507 return nullptr;
508 }
509 NAPI_CALL(env, napi_get_value_int32(env, parameters[0], &asyncContext->slotId));
510 if (parameterCount == paramLimitTwo) {
511 NAPI_CALL(env, napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef));
512 }
513 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "DisableCellularDataRoaming",
514 NativeDisableCellularDataRoaming, DisableCellularDataRoamingCallback);
515 }
516
NativeIsCellularDataRoamingEnabled(napi_env env,void * data)517 static void NativeIsCellularDataRoamingEnabled(napi_env env, void *data)
518 {
519 auto asyncContext = static_cast<AsyncContext *>(data);
520 if (asyncContext == nullptr) {
521 NapiUtil::ThrowParameterError(env);
522 return;
523 }
524 if (!IsValidSlotId(asyncContext->slotId)) {
525 TELEPHONY_LOGE("NativeIsCellularDataRoamingEnabled slotId is invalid");
526 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
527 return;
528 }
529 if (IsCellularDataManagerInited()) {
530 auto &dataManager = CellularDataClient::GetInstance();
531 bool enabled = false;
532 asyncContext->errorCode = dataManager.IsCellularDataRoamingEnabled(asyncContext->slotId, enabled);
533 if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
534 asyncContext->resolved = true;
535 }
536 asyncContext->result = enabled;
537 } else {
538 asyncContext->resolved = false;
539 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
540 }
541 }
542
IsCellularDataRoamingEnabledCallback(napi_env env,napi_status status,void * data)543 static void IsCellularDataRoamingEnabledCallback(napi_env env, napi_status status, void *data)
544 {
545 auto context = static_cast<AsyncContext *>(data);
546 if (context == nullptr) {
547 return;
548 }
549 std::unique_ptr<AsyncContext> asyncContext(context);
550 napi_value callbackValue = nullptr;
551 if (asyncContext->resolved) {
552 napi_status status = napi_get_boolean(env,
553 asyncContext->result == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED),
554 &callbackValue);
555 NAPI_CALL_RETURN_VOID(env, status);
556 } else {
557 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
558 asyncContext->errorCode, "isCellularDataRoamingEnabled", GET_NETWORK_INFO);
559 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
560 }
561 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
562 }
563
IsCellularDataRoamingEnabled(napi_env env,napi_callback_info info)564 static napi_value IsCellularDataRoamingEnabled(napi_env env, napi_callback_info info)
565 {
566 const size_t paramLimitTwo = 2;
567 size_t parameterCount = paramLimitTwo;
568 napi_value parameters[paramLimitTwo] = {0};
569 napi_value thisVar = nullptr;
570 void *data = nullptr;
571 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
572 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
573 TELEPHONY_LOGE("IsCellularDataRoamingEnabled MatchEnableCellularDataRoamingParameters failed.");
574 NapiUtil::ThrowParameterError(env);
575 return nullptr;
576 }
577 auto asyncContext = std::make_unique<AsyncContext>();
578 if (asyncContext == nullptr) {
579 TELEPHONY_LOGE("IsCellularDataRoamingEnabled asyncContext is nullptr.");
580 NapiUtil::ThrowParameterError(env);
581 return nullptr;
582 }
583 napi_get_value_int32(env, parameters[0], &asyncContext->slotId);
584 if (parameterCount == paramLimitTwo) {
585 napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
586 }
587 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "IsCellularDataRoamingEnabled",
588 NativeIsCellularDataRoamingEnabled, IsCellularDataRoamingEnabledCallback);
589 }
590
MatchGetDefaultCellularDataSlotIdParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)591 static bool MatchGetDefaultCellularDataSlotIdParameters(
592 napi_env env, const napi_value parameters[], const size_t parameterCount)
593 {
594 switch (parameterCount) {
595 case 0:
596 return true;
597 case 1:
598 return NapiUtil::MatchParameters(env, parameters, {napi_function});
599 default:
600 return false;
601 }
602 }
603
NativeGetDefaultCellularDataSlotId(napi_env env,void * data)604 static void NativeGetDefaultCellularDataSlotId(napi_env env, void *data)
605 {
606 auto context = static_cast<AsyncContext *>(data);
607 if (context == nullptr) {
608 return;
609 }
610 int32_t result = CellularDataClient::GetInstance().GetDefaultCellularDataSlotId();
611 if (IsValidSlotId(result) || result == DEFAULT_SIM_SLOT_ID_REMOVE) {
612 context->slotId = result;
613 context->resolved = true;
614 } else {
615 context->resolved = false;
616 context->errorCode = ERROR_NATIVE_API_EXECUTE_FAIL;
617 }
618 }
619
GetDefaultCellularDataSlotIdCallback(napi_env env,napi_status status,void * data)620 static void GetDefaultCellularDataSlotIdCallback(napi_env env, napi_status status, void *data)
621 {
622 auto asyncContext = static_cast<AsyncContext *>(data);
623 if (asyncContext == nullptr) {
624 return;
625 }
626 napi_value callbackValue = nullptr;
627 if (asyncContext->resolved) {
628 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->slotId, &callbackValue));
629 } else {
630 if (asyncContext->errorCode == ERROR_NATIVE_API_EXECUTE_FAIL) {
631 callbackValue = NapiUtil::CreateErrorMessage(
632 env, "GetDefaultCellularDataSlotId api execute failed", ERROR_NATIVE_API_EXECUTE_FAIL);
633 } else {
634 callbackValue = NapiUtil::CreateErrorMessage(env, "get default cellular data slotId failed");
635 }
636 }
637 NapiUtil::Handle2ValueCallback(env, asyncContext, callbackValue);
638 }
639
GetDefaultCellularDataSlotId(napi_env env,napi_callback_info info)640 static napi_value GetDefaultCellularDataSlotId(napi_env env, napi_callback_info info)
641 {
642 size_t parameterCount = 1;
643 napi_value parameters[] = {nullptr};
644 napi_value thisVar = nullptr;
645 void *data = nullptr;
646 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
647 NAPI_ASSERT(env, MatchGetDefaultCellularDataSlotIdParameters(env, parameters, parameterCount), "type mismatch");
648 auto asyncContext = std::make_unique<AsyncContext>();
649 if (asyncContext == nullptr) {
650 std::string errorCode = std::to_string(napi_generic_failure);
651 std::string errorMessage = "error at baseContext is nullptr";
652 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
653 return nullptr;
654 }
655 if (parameterCount == 1) {
656 napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
657 }
658 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetDefaultCellularDataSlotId",
659 NativeGetDefaultCellularDataSlotId, GetDefaultCellularDataSlotIdCallback);
660 }
661
GetDefaultCellularDataSlotIdSync(napi_env env,napi_callback_info info)662 static napi_value GetDefaultCellularDataSlotIdSync(napi_env env, napi_callback_info info)
663 {
664 size_t parameterCount = 1;
665 napi_value parameters[] = { nullptr };
666 napi_value thisVar = nullptr;
667 void *data = nullptr;
668 int32_t slotId = -1;
669 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
670 if (parameterCount == 0) {
671 slotId = CellularDataClient::GetInstance().GetDefaultCellularDataSlotId();
672 }
673 napi_value value = nullptr;
674 NAPI_CALL(env, napi_create_int32(env, slotId, &value));
675 return value;
676 }
677
GetDefaultCellularDataSimId(napi_env env,napi_callback_info info)678 static napi_value GetDefaultCellularDataSimId(napi_env env, napi_callback_info info)
679 {
680 size_t parameterCount = 1;
681 napi_value parameters[] = { nullptr };
682 napi_value thisVar = nullptr;
683 void *data = nullptr;
684 int32_t simId = 0;
685 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
686 if (parameterCount == 0) {
687 CellularDataClient::GetInstance().GetDefaultCellularDataSimId(simId);
688 }
689 napi_value value = nullptr;
690 NAPI_CALL(env, napi_create_int32(env, simId, &value));
691 return value;
692 }
693
NativeSetDefaultCellularDataSlotId(napi_env env,void * data)694 static void NativeSetDefaultCellularDataSlotId(napi_env env, void *data)
695 {
696 auto asyncContext = static_cast<AsyncContext *>(data);
697 if (asyncContext == nullptr) {
698 NapiUtil::ThrowParameterError(env);
699 return;
700 }
701 if (!IsValidSlotId(asyncContext->slotId) && (asyncContext->slotId != DEFAULT_SIM_SLOT_ID_REMOVE)) {
702 TELEPHONY_LOGE("NativeSetDefaultCellularDataSlotId slotId is invalid");
703 asyncContext->errorCode = ERROR_SLOT_ID_INVALID;
704 return;
705 }
706 if (IsCellularDataManagerInited()) {
707 asyncContext->errorCode = CellularDataClient::GetInstance().SetDefaultCellularDataSlotId(asyncContext->slotId);
708 if (asyncContext->errorCode == TELEPHONY_ERR_SUCCESS) {
709 asyncContext->resolved = true;
710 } else {
711 asyncContext->resolved = false;
712 }
713 } else {
714 asyncContext->resolved = false;
715 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
716 }
717 }
718
SetDefaultCellularDataSlotIdCallback(napi_env env,napi_status status,void * data)719 static void SetDefaultCellularDataSlotIdCallback(napi_env env, napi_status status, void *data)
720 {
721 auto asyncContext = static_cast<AsyncContext *>(data);
722 if (asyncContext == nullptr) {
723 NapiUtil::ThrowParameterError(env);
724 return;
725 }
726 napi_value callbackValue = nullptr;
727 if (asyncContext->resolved) {
728 callbackValue = NapiUtil::CreateUndefined(env);
729 } else {
730 JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
731 asyncContext->errorCode, "setDefaultCellularDataSlotId", SET_TELEPHONY_STATE);
732 callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
733 }
734 NapiUtil::Handle1ValueCallback(env, asyncContext, callbackValue);
735 }
736
SetDefaultCellularDataSlotId(napi_env env,napi_callback_info info)737 static napi_value SetDefaultCellularDataSlotId(napi_env env, napi_callback_info info)
738 {
739 const size_t paramLimitTwo = 2;
740 size_t parameterCount = paramLimitTwo;
741 napi_value parameters[] = { nullptr, nullptr };
742 napi_value thisVar = nullptr;
743 void *data = nullptr;
744 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
745 if (!MatchEnableCellularDataRoamingParameters(env, parameters, parameterCount)) {
746 NapiUtil::ThrowParameterError(env);
747 return nullptr;
748 }
749 auto asyncContext = std::make_unique<AsyncContext>();
750 if (asyncContext == nullptr) {
751 NapiUtil::ThrowParameterError(env);
752 return nullptr;
753 }
754 napi_get_value_int32(env, parameters[0], &asyncContext->slotId);
755 if (parameterCount == paramLimitTwo) {
756 napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
757 }
758 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "SetDefaultCellularDataSlotId",
759 NativeSetDefaultCellularDataSlotId, SetDefaultCellularDataSlotIdCallback);
760 }
761
NativeGetCellularDataFlowType(napi_env env,void * data)762 void NativeGetCellularDataFlowType(napi_env env, void *data)
763 {
764 auto asyncContext = static_cast<AsyncContext *>(data);
765 if (asyncContext == nullptr) {
766 return;
767 }
768 if (IsCellularDataManagerInited()) {
769 int32_t dataState = CellularDataClient::GetInstance().GetCellularDataFlowType();
770 TELEPHONY_LOGI("dataState = %{public}d", dataState);
771 asyncContext->resolved = true;
772 asyncContext->result = WrapGetCellularDataFlowTypeType(dataState);
773 } else {
774 asyncContext->resolved = false;
775 asyncContext->errorCode = ERROR_SERVICE_UNAVAILABLE;
776 }
777 }
778
GetCellularDataFlowTypeCallback(napi_env env,napi_status status,void * data)779 void GetCellularDataFlowTypeCallback(napi_env env, napi_status status, void *data)
780 {
781 auto context = static_cast<AsyncContext *>(data);
782 if (context == nullptr) {
783 return;
784 }
785 std::unique_ptr<AsyncContext> asyncContext(context);
786 napi_value callbackValue = nullptr;
787 if (asyncContext->resolved) {
788 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->result, &callbackValue));
789 } else {
790 if (asyncContext->errorCode == ERROR_SERVICE_UNAVAILABLE) {
791 callbackValue =
792 NapiUtil::CreateErrorMessage(env, "cellular data service unavailable", ERROR_SERVICE_UNAVAILABLE);
793 } else {
794 callbackValue = NapiUtil::CreateErrorMessage(env, "unkonwn error");
795 }
796 }
797 NapiUtil::Handle2ValueCallback(env, asyncContext.release(), callbackValue);
798 TELEPHONY_LOGI("GetCellularDataFlowTypeCallback end");
799 }
800
GetCellularDataFlowType(napi_env env,napi_callback_info info)801 static napi_value GetCellularDataFlowType(napi_env env, napi_callback_info info)
802 {
803 size_t parameterCount = 1;
804 napi_value parameters[] = {nullptr};
805 napi_value thisVar = nullptr;
806 void *data = nullptr;
807 napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data);
808 NAPI_ASSERT(env, MatchGetDefaultCellularDataSlotIdParameters(env, parameters, parameterCount), "type mismatch");
809 auto asyncContext = std::make_unique<AsyncContext>();
810 if (asyncContext == nullptr) {
811 std::string errorCode = std::to_string(napi_generic_failure);
812 std::string errorMessage = "error at baseContext is nullptr";
813 NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
814 return nullptr;
815 }
816 if (parameterCount == 1) {
817 napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
818 }
819 return NapiUtil::HandleAsyncWork(env, asyncContext.release(), "GetCellularDataFlowType",
820 NativeGetCellularDataFlowType, GetCellularDataFlowTypeCallback);
821 }
822
CreateEnumConstructor(napi_env env,napi_callback_info info)823 static napi_value CreateEnumConstructor(napi_env env, napi_callback_info info)
824 {
825 napi_value thisArg = nullptr;
826 void *data = nullptr;
827 napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data);
828 napi_value global = nullptr;
829 napi_get_global(env, &global);
830 return thisArg;
831 }
832
InitEnumDataConnectState(napi_env env,napi_value exports)833 static napi_value InitEnumDataConnectState(napi_env env, napi_value exports)
834 {
835 napi_property_descriptor desc[] = {
836 DECLARE_NAPI_STATIC_PROPERTY(
837 "DATA_STATE_UNKNOWN", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_UNKNOWN))),
838 DECLARE_NAPI_STATIC_PROPERTY(
839 "DATA_STATE_DISCONNECTED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_DISCONNECTED))),
840 DECLARE_NAPI_STATIC_PROPERTY(
841 "DATA_STATE_CONNECTING", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_CONNECTING))),
842 DECLARE_NAPI_STATIC_PROPERTY(
843 "DATA_STATE_CONNECTED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_CONNECTED))),
844 DECLARE_NAPI_STATIC_PROPERTY(
845 "DATA_STATE_SUSPENDED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_SUSPENDED))),
846 };
847 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
848 return exports;
849 }
850
CreateDataConnectState(napi_env env,napi_value exports)851 static napi_value CreateDataConnectState(napi_env env, napi_value exports)
852 {
853 napi_property_descriptor desc[] = {
854 DECLARE_NAPI_STATIC_PROPERTY(
855 "DATA_STATE_UNKNOWN", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_UNKNOWN))),
856 DECLARE_NAPI_STATIC_PROPERTY(
857 "DATA_STATE_DISCONNECTED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_DISCONNECTED))),
858 DECLARE_NAPI_STATIC_PROPERTY(
859 "DATA_STATE_CONNECTING", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_CONNECTING))),
860 DECLARE_NAPI_STATIC_PROPERTY(
861 "DATA_STATE_CONNECTED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_CONNECTED))),
862 DECLARE_NAPI_STATIC_PROPERTY(
863 "DATA_STATE_SUSPENDED", NapiUtil::ToInt32Value(env, static_cast<int32_t>(DATA_STATE_SUSPENDED))),
864
865 };
866 napi_value result = nullptr;
867 napi_define_class(env, "DataConnectState", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
868 sizeof(desc) / sizeof(*desc), desc, &result);
869 napi_set_named_property(env, exports, "DataConnectState", result);
870 return exports;
871 }
872
InitEnumDataFlowType(napi_env env,napi_value exports)873 static napi_value InitEnumDataFlowType(napi_env env, napi_value exports)
874 {
875 napi_property_descriptor desc[] = {
876 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_NONE",
877 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_NONE))),
878 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DOWN",
879 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_DOWN))),
880 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP",
881 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP))),
882 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP_DOWN",
883 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP_DOWN))),
884 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DORMANT",
885 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_DORMANT))),
886 };
887 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
888 return exports;
889 }
890
CreateDataFlowType(napi_env env,napi_value exports)891 static napi_value CreateDataFlowType(napi_env env, napi_value exports)
892 {
893 napi_property_descriptor desc[] = {
894 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_NONE",
895 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_NONE))),
896 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DOWN",
897 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_DOWN))),
898 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP",
899 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP))),
900 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_UP_DOWN",
901 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_UP_DOWN))),
902 DECLARE_NAPI_STATIC_PROPERTY("DATA_FLOW_TYPE_DORMANT",
903 NapiUtil::ToInt32Value(env, static_cast<int32_t>(DataFlowType::DATA_FLOW_TYPE_DORMANT))),
904 };
905 napi_value result = nullptr;
906 napi_define_class(env, "DataFlowType", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
907 sizeof(desc) / sizeof(*desc), desc, &result);
908 napi_set_named_property(env, exports, "DataFlowType", result);
909 return exports;
910 }
911
912 EXTERN_C_START
RegistCellularData(napi_env env,napi_value exports)913 napi_value RegistCellularData(napi_env env, napi_value exports)
914 {
915 auto cellularDataPoxy = CellularDataClient::GetInstance().GetProxy();
916 napi_property_descriptor desc[] = {
917 DECLARE_NAPI_FUNCTION("getCellularDataState", GetCellularDataState),
918 DECLARE_NAPI_FUNCTION("isCellularDataEnabled", IsCellularDataEnabled),
919 DECLARE_NAPI_FUNCTION("enableCellularData", EnableCellularData),
920 DECLARE_NAPI_FUNCTION("disableCellularData", DisableCellularData),
921 DECLARE_NAPI_FUNCTION("enableCellularDataRoaming", EnableCellularDataRoaming),
922 DECLARE_NAPI_FUNCTION("disableCellularDataRoaming", DisableCellularDataRoaming),
923 DECLARE_NAPI_FUNCTION("isCellularDataRoamingEnabled", IsCellularDataRoamingEnabled),
924 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSlotId", GetDefaultCellularDataSlotId),
925 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSimId", GetDefaultCellularDataSimId),
926 DECLARE_NAPI_FUNCTION("getDefaultCellularDataSlotIdSync", GetDefaultCellularDataSlotIdSync),
927 DECLARE_NAPI_FUNCTION("setDefaultCellularDataSlotId", SetDefaultCellularDataSlotId),
928 DECLARE_NAPI_FUNCTION("getCellularDataFlowType", GetCellularDataFlowType),
929 };
930 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
931 CreateDataConnectState(env, exports);
932 InitEnumDataConnectState(env, exports);
933 CreateDataFlowType(env, exports);
934 InitEnumDataFlowType(env, exports);
935 return exports;
936 }
937 EXTERN_C_END
938
939 static napi_module _cellularDataModule = {
940 .nm_version = 1,
941 .nm_flags = 0,
942 .nm_filename = nullptr,
943 .nm_register_func = RegistCellularData,
944 .nm_modname = "telephony.data",
945 .nm_priv = nullptr,
946 .reserved = {nullptr},
947 };
948
RegisterCellularDataModule(void)949 extern "C" __attribute__((constructor)) void RegisterCellularDataModule(void)
950 {
951 napi_module_register(&_cellularDataModule);
952 }
953 } // namespace Telephony
954 } // namespace OHOS
955