1 /*
2 * Copyright (c) 2022 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 "distributed.h"
17
18 namespace OHOS {
19 namespace NotificationNapi {
20 const int ENABLED_MAX_PARA = 2;
21 const int ENABLED_MIN_PARA = 1;
22 const int ENABLED_BUNDLE_MAX_PARA = 3;
23 const int ENABLED_BUNDLE_MIN_PARA = 2;
24 const int IS_ENABLED_BUNDLE_MAX_PARA = 2;
25 const int IS_ENABLED_BUNDLE_MIN_PARA = 1;
26 const int ENABLED_SYNC_MAX_PARA = 3;
27 const int ENABLED_SYNC_MIN_PARA = 2;
28
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledParams & params)29 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledParams ¶ms)
30 {
31 ANS_LOGI("enter");
32
33 size_t argc = ENABLED_MAX_PARA;
34 napi_value argv[ENABLED_MAX_PARA] = {nullptr};
35 napi_value thisVar = nullptr;
36 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
37 if (argc < ENABLED_MIN_PARA) {
38 ANS_LOGE("Wrong number of arguments.");
39 return nullptr;
40 }
41 napi_valuetype valuetype = napi_undefined;
42
43 // argv[0]: enable
44 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
45 if (valuetype != napi_boolean) {
46 ANS_LOGE("Wrong argument type. Bool expected.");
47 return nullptr;
48 }
49 napi_get_value_bool(env, argv[PARAM0], ¶ms.enable);
50
51 // argv[1]:callback
52 if (argc >= ENABLED_MAX_PARA) {
53 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
54 if (valuetype != napi_function) {
55 ANS_LOGE("Wrong argument type. Function expected.");
56 return nullptr;
57 }
58 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
59 }
60
61 return Common::NapiGetNull(env);
62 }
63
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledByBundleParams & params)64 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledByBundleParams ¶ms)
65 {
66 ANS_LOGI("enter");
67
68 size_t argc = ENABLED_BUNDLE_MAX_PARA;
69 napi_value argv[ENABLED_BUNDLE_MAX_PARA] = {nullptr};
70 napi_value thisVar = nullptr;
71 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
72 if (argc < ENABLED_BUNDLE_MIN_PARA) {
73 ANS_LOGE("Wrong number of arguments.");
74 return nullptr;
75 }
76
77 // argv[0]: bundle
78 napi_valuetype valuetype = napi_undefined;
79 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
80 if (valuetype != napi_object) {
81 ANS_LOGE("Wrong argument type. Object expected.");
82 return nullptr;
83 }
84 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
85 if (retValue == nullptr) {
86 ANS_LOGE("GetBundleOption failed.");
87 return nullptr;
88 }
89
90 // argv[1]: enable
91 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
92 if (valuetype != napi_boolean) {
93 ANS_LOGE("Wrong argument type. Bool expected.");
94 return nullptr;
95 }
96 napi_get_value_bool(env, argv[PARAM1], ¶ms.enable);
97
98 // argv[2]:callback
99 if (argc >= ENABLED_BUNDLE_MAX_PARA) {
100 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
101 if (valuetype != napi_function) {
102 ANS_LOGE("Wrong argument type. Function expected.");
103 return nullptr;
104 }
105 napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback);
106 }
107
108 return Common::NapiGetNull(env);
109 }
110
ParseParameters(const napi_env & env,const napi_callback_info & info,IsEnabledByBundleParams & params)111 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, IsEnabledByBundleParams ¶ms)
112 {
113 ANS_LOGI("enter");
114
115 size_t argc = IS_ENABLED_BUNDLE_MAX_PARA;
116 napi_value argv[IS_ENABLED_BUNDLE_MAX_PARA] = {nullptr};
117 napi_value thisVar = nullptr;
118 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
119 if (argc < IS_ENABLED_BUNDLE_MIN_PARA) {
120 ANS_LOGE("Wrong number of arguments.");
121 return nullptr;
122 }
123
124 // argv[0]: bundle
125 napi_valuetype valuetype = napi_undefined;
126 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
127 if (valuetype != napi_object) {
128 ANS_LOGE("Wrong argument type. Object expected.");
129 return nullptr;
130 }
131 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
132 if (retValue == nullptr) {
133 ANS_LOGE("GetBundleOption failed.");
134 return nullptr;
135 }
136
137 // argv[1]:callback
138 if (argc >= IS_ENABLED_BUNDLE_MAX_PARA) {
139 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
140 if (valuetype != napi_function) {
141 ANS_LOGE("Wrong argument type. Function expected.");
142 return nullptr;
143 }
144 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
145 }
146
147 return Common::NapiGetNull(env);
148 }
149
AsyncCompleteCallbackIsDistributedEnabled(napi_env env,napi_status status,void * data)150 void AsyncCompleteCallbackIsDistributedEnabled(napi_env env, napi_status status, void *data)
151 {
152 ANS_LOGI("enter");
153 if (!data) {
154 ANS_LOGE("Invalid async callback data");
155 return;
156 }
157 ANS_LOGI("IsDistributedEnabled napi_create_async_work end");
158 AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabled *>(data);
159 if (asynccallbackinfo) {
160 napi_value result = nullptr;
161 if (asynccallbackinfo->info.errorCode != ERR_OK) {
162 result = Common::NapiGetNull(env);
163 } else {
164 napi_get_boolean(env, asynccallbackinfo->enable, &result);
165 }
166 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
167 if (asynccallbackinfo->info.callback != nullptr) {
168 napi_delete_reference(env, asynccallbackinfo->info.callback);
169 }
170 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
171 delete asynccallbackinfo;
172 asynccallbackinfo = nullptr;
173 }
174 }
175
IsDistributedEnabled(napi_env env,napi_callback_info info)176 napi_value IsDistributedEnabled(napi_env env, napi_callback_info info)
177 {
178 ANS_LOGI("enter");
179
180 napi_ref callback = nullptr;
181 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
182 return Common::NapiGetUndefined(env);
183 }
184
185 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoIsEnabled {.env = env, .asyncWork = nullptr};
186 if (!asynccallbackinfo) {
187 return Common::JSParaError(env, callback);
188 }
189 napi_value promise = nullptr;
190 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
191
192 napi_value resourceName = nullptr;
193 napi_create_string_latin1(env, "isDistributedEnabled", NAPI_AUTO_LENGTH, &resourceName);
194 // Asynchronous function call
195 napi_create_async_work(
196 env,
197 nullptr,
198 resourceName,
199 [](napi_env env, void *data) {
200 ANS_LOGI("IsDistributedEnabled napi_create_async_work start");
201 AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabled *>(data);
202
203 if (asynccallbackinfo) {
204 asynccallbackinfo->info.errorCode =
205 NotificationHelper::IsDistributedEnabled(asynccallbackinfo->enable);
206 ANS_LOGI("IsDistributedEnabled enable = %{public}d", asynccallbackinfo->enable);
207 }
208 },
209 AsyncCompleteCallbackIsDistributedEnabled,
210 (void *)asynccallbackinfo,
211 &asynccallbackinfo->asyncWork);
212
213 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
214
215 if (asynccallbackinfo->info.isCallback) {
216 return Common::NapiGetNull(env);
217 } else {
218 return promise;
219 }
220 }
221
EnableDistributed(napi_env env,napi_callback_info info)222 napi_value EnableDistributed(napi_env env, napi_callback_info info)
223 {
224 ANS_LOGI("enter");
225
226 EnabledParams params {};
227 if (ParseParameters(env, info, params) == nullptr) {
228 return Common::NapiGetUndefined(env);
229 }
230
231 AsyncCallbackInfoEnabled *asynccallbackinfo =
232 new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
233 if (!asynccallbackinfo) {
234 return Common::JSParaError(env, params.callback);
235 }
236 napi_value promise = nullptr;
237 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
238
239 napi_value resourceName = nullptr;
240 napi_create_string_latin1(env, "enableDistributed", NAPI_AUTO_LENGTH, &resourceName);
241 // Asynchronous function call
242 napi_create_async_work(
243 env,
244 nullptr,
245 resourceName,
246 [](napi_env env, void *data) {
247 ANS_LOGI("EnableDistributed napi_create_async_work start");
248 AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
249
250 if (asynccallbackinfo) {
251 asynccallbackinfo->info.errorCode =
252 NotificationHelper::EnableDistributed(asynccallbackinfo->params.enable);
253 }
254 },
255 [](napi_env env, napi_status status, void *data) {
256 ANS_LOGI("EnableDistributed napi_create_async_work end");
257 AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
258 if (asynccallbackinfo) {
259 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
260 if (asynccallbackinfo->info.callback != nullptr) {
261 napi_delete_reference(env, asynccallbackinfo->info.callback);
262 }
263 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
264 delete asynccallbackinfo;
265 asynccallbackinfo = nullptr;
266 }
267 },
268 (void *)asynccallbackinfo,
269 &asynccallbackinfo->asyncWork);
270
271 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
272
273 if (asynccallbackinfo->info.isCallback) {
274 return Common::NapiGetNull(env);
275 } else {
276 return promise;
277 }
278 }
279
EnableDistributedByBundle(napi_env env,napi_callback_info info)280 napi_value EnableDistributedByBundle(napi_env env, napi_callback_info info)
281 {
282 ANS_LOGI("enter");
283
284 EnabledByBundleParams params {};
285 if (ParseParameters(env, info, params) == nullptr) {
286 return Common::NapiGetUndefined(env);
287 }
288
289 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo =
290 new (std::nothrow) AsyncCallbackInfoEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
291 if (!asynccallbackinfo) {
292 return Common::JSParaError(env, params.callback);
293 }
294 napi_value promise = nullptr;
295 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
296
297 napi_value resourceName = nullptr;
298 napi_create_string_latin1(env, "enableDistributedByBundle", NAPI_AUTO_LENGTH, &resourceName);
299 // Asynchronous function call
300 napi_create_async_work(
301 env,
302 nullptr,
303 resourceName,
304 [](napi_env env, void *data) {
305 ANS_LOGI("EnableDistributedByBundle napi_create_async_work start");
306 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
307 if (asynccallbackinfo) {
308 asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedByBundle(
309 asynccallbackinfo->params.option, asynccallbackinfo->params.enable);
310 }
311 },
312 [](napi_env env, napi_status status, void *data) {
313 ANS_LOGI("EnableDistributedByBundle napi_create_async_work end");
314 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
315 if (asynccallbackinfo) {
316 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
317 if (asynccallbackinfo->info.callback != nullptr) {
318 napi_delete_reference(env, asynccallbackinfo->info.callback);
319 }
320 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
321 delete asynccallbackinfo;
322 asynccallbackinfo = nullptr;
323 }
324 },
325 (void *)asynccallbackinfo,
326 &asynccallbackinfo->asyncWork);
327
328 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
329
330 if (asynccallbackinfo->info.isCallback) {
331 return Common::NapiGetNull(env);
332 } else {
333 return promise;
334 }
335 }
336
EnableDistributedSelf(napi_env env,napi_callback_info info)337 napi_value EnableDistributedSelf(napi_env env, napi_callback_info info)
338 {
339 ANS_LOGI("enter");
340
341 EnabledParams params {};
342 if (ParseParameters(env, info, params) == nullptr) {
343 return Common::NapiGetUndefined(env);
344 }
345
346 AsyncCallbackInfoEnabled *asynccallbackinfo =
347 new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
348 if (!asynccallbackinfo) {
349 return Common::JSParaError(env, params.callback);
350 }
351 napi_value promise = nullptr;
352 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
353
354 napi_value resourceName = nullptr;
355 napi_create_string_latin1(env, "enableDistributedSelf", NAPI_AUTO_LENGTH, &resourceName);
356 // Asynchronous function call
357 napi_create_async_work(
358 env,
359 nullptr,
360 resourceName,
361 [](napi_env env, void *data) {
362 ANS_LOGI("EnableDistributedSelf napi_create_async_work start");
363 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
364 if (asynccallbackinfo) {
365 asynccallbackinfo->info.errorCode =
366 NotificationHelper::EnableDistributedSelf(asynccallbackinfo->params.enable);
367 ANS_LOGI("EnableDistributedSelf enable = %{public}d", asynccallbackinfo->params.enable);
368 }
369 },
370 [](napi_env env, napi_status status, void *data) {
371 ANS_LOGI("EnableDistributedSelf napi_create_async_work end");
372 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
373 if (asynccallbackinfo) {
374 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
375 if (asynccallbackinfo->info.callback != nullptr) {
376 napi_delete_reference(env, asynccallbackinfo->info.callback);
377 }
378 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
379 delete asynccallbackinfo;
380 asynccallbackinfo = nullptr;
381 }
382 },
383 (void *)asynccallbackinfo,
384 &asynccallbackinfo->asyncWork);
385
386 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
387
388 if (asynccallbackinfo->info.isCallback) {
389 return Common::NapiGetNull(env);
390 } else {
391 return promise;
392 }
393 }
394
AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env,napi_status status,void * data)395 void AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env, napi_status status, void *data)
396 {
397 ANS_LOGI("enter");
398 if (!data) {
399 ANS_LOGE("Invalid async callback data");
400 return;
401 }
402 ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work end");
403 AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
404 if (asynccallbackinfo) {
405 napi_value result = nullptr;
406 if (asynccallbackinfo->info.errorCode != ERR_OK) {
407 result = Common::NapiGetNull(env);
408 } else {
409 napi_get_boolean(env, asynccallbackinfo->enable, &result);
410 }
411 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
412 if (asynccallbackinfo->info.callback != nullptr) {
413 napi_delete_reference(env, asynccallbackinfo->info.callback);
414 }
415 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
416 delete asynccallbackinfo;
417 asynccallbackinfo = nullptr;
418 }
419 }
420
IsDistributedEnableByBundle(napi_env env,napi_callback_info info)421 napi_value IsDistributedEnableByBundle(napi_env env, napi_callback_info info)
422 {
423 ANS_LOGI("enter");
424
425 IsEnabledByBundleParams params {};
426 if (ParseParameters(env, info, params) == nullptr) {
427 return Common::NapiGetUndefined(env);
428 }
429
430 AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo =
431 new (std::nothrow) AsyncCallbackInfoIsEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
432 if (!asynccallbackinfo) {
433 return Common::JSParaError(env, params.callback);
434 }
435 napi_value promise = nullptr;
436 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
437
438 napi_value resourceName = nullptr;
439 napi_create_string_latin1(env, "isDistributedEnableByBundle", NAPI_AUTO_LENGTH, &resourceName);
440 // Asynchronous function call
441 napi_create_async_work(
442 env,
443 nullptr,
444 resourceName,
445 [](napi_env env, void *data) {
446 ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work start");
447 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
448 if (asynccallbackinfo) {
449 asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnableByBundle(
450 asynccallbackinfo->params.option, asynccallbackinfo->enable);
451 }
452 },
453 AsyncCompleteCallbackIsDistributedEnableByBundle,
454 (void *)asynccallbackinfo,
455 &asynccallbackinfo->asyncWork);
456
457 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
458
459 if (asynccallbackinfo->info.isCallback) {
460 return Common::NapiGetNull(env);
461 } else {
462 return promise;
463 }
464 }
465
AsyncCompleteCallbackGetDeviceRemindType(napi_env env,napi_status status,void * data)466 void AsyncCompleteCallbackGetDeviceRemindType(napi_env env, napi_status status, void *data)
467 {
468 ANS_LOGI("enter");
469 if (!data) {
470 ANS_LOGE("Invalid async callback data");
471 return;
472 }
473 ANS_LOGI("GetDeviceRemindType napi_create_async_work end");
474 AsyncCallbackInfoGetRemindType *asynccallbackinfo = static_cast<AsyncCallbackInfoGetRemindType *>(data);
475 if (asynccallbackinfo) {
476 napi_value result = nullptr;
477 if (asynccallbackinfo->info.errorCode != ERR_OK) {
478 result = Common::NapiGetNull(env);
479 } else {
480 DeviceRemindType outType = DeviceRemindType::IDLE_DONOT_REMIND;
481 if (!Common::DeviceRemindTypeCToJS(asynccallbackinfo->remindType, outType)) {
482 asynccallbackinfo->info.errorCode = ERROR;
483 result = Common::NapiGetNull(env);
484 }
485 napi_create_int32(env, (int32_t)outType, &result);
486 }
487 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
488 if (asynccallbackinfo->info.callback != nullptr) {
489 napi_delete_reference(env, asynccallbackinfo->info.callback);
490 }
491 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
492 delete asynccallbackinfo;
493 asynccallbackinfo = nullptr;
494 }
495 }
496
GetDeviceRemindType(napi_env env,napi_callback_info info)497 napi_value GetDeviceRemindType(napi_env env, napi_callback_info info)
498 {
499 ANS_LOGI("enter");
500
501 napi_ref callback = nullptr;
502 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
503 return Common::NapiGetUndefined(env);
504 }
505
506 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetRemindType {.env = env, .asyncWork = nullptr};
507 if (!asynccallbackinfo) {
508 return Common::JSParaError(env, callback);
509 }
510 napi_value promise = nullptr;
511 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
512
513 napi_value resourceName = nullptr;
514 napi_create_string_latin1(env, "getDeviceRemindType", NAPI_AUTO_LENGTH, &resourceName);
515 // Asynchronous function call
516 napi_create_async_work(
517 env,
518 nullptr,
519 resourceName,
520 [](napi_env env, void *data) {
521 ANS_LOGI("GetDeviceRemindType napi_create_async_work start");
522 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetRemindType *>(data);
523 if (asynccallbackinfo) {
524 asynccallbackinfo->info.errorCode =
525 NotificationHelper::GetDeviceRemindType(asynccallbackinfo->remindType);
526 }
527 },
528 AsyncCompleteCallbackGetDeviceRemindType,
529 (void *)asynccallbackinfo,
530 &asynccallbackinfo->asyncWork);
531
532 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
533
534 if (asynccallbackinfo->info.isCallback) {
535 return Common::NapiGetNull(env);
536 } else {
537 return promise;
538 }
539 }
540
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledWithoutAppParams & params)541 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledWithoutAppParams ¶ms)
542 {
543 ANS_LOGI("enter");
544
545 size_t argc = ENABLED_SYNC_MAX_PARA;
546 napi_value argv[ENABLED_SYNC_MAX_PARA] = {nullptr};
547 napi_value thisVar = nullptr;
548 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
549 if (argc < ENABLED_SYNC_MIN_PARA) {
550 ANS_LOGE("Wrong number of arguments.");
551 return nullptr;
552 }
553
554 // argv[0]: userId
555 napi_valuetype valuetype = napi_undefined;
556 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
557 if (valuetype != napi_number) {
558 ANS_LOGE("Wrong argument type. Number expected.");
559 return nullptr;
560 }
561 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId));
562 if (params.userId <= SUBSCRIBE_USER_INIT) {
563 ANS_LOGE("Wrong userId[%{public}d].", params.userId);
564 return nullptr;
565 }
566
567 // argv[1]: enable
568 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
569 if (valuetype != napi_boolean) {
570 ANS_LOGE("Wrong argument type. Bool expected.");
571 return nullptr;
572 }
573 napi_get_value_bool(env, argv[PARAM1], ¶ms.enable);
574
575 // argv[2]:callback
576 if (argc >= ENABLED_SYNC_MAX_PARA) {
577 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
578 if (valuetype != napi_function) {
579 ANS_LOGE("Wrong argument type. Function expected.");
580 return nullptr;
581 }
582 napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback);
583 }
584
585 return Common::NapiGetNull(env);
586 }
587
SetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)588 napi_value SetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
589 {
590 ANS_LOGI("enter");
591
592 EnabledWithoutAppParams params {};
593 if (ParseParameters(env, info, params) == nullptr) {
594 return Common::JSParaError(env, params.callback);
595 }
596
597 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
598 new (std::nothrow) AsyncCallbackInfoEnabledWithoutApp {.env = env, .asyncWork = nullptr, .params = params};
599 if (!asynccallbackinfo) {
600 return Common::JSParaError(env, params.callback);
601 }
602 napi_value promise = nullptr;
603 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
604
605 napi_value resourceName = nullptr;
606 napi_create_string_latin1(env, "SetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
607 // Asynchronous function call
608 napi_create_async_work(
609 env,
610 nullptr,
611 resourceName,
612 [](napi_env env, void *data) {
613 ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work start");
614 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
615 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
616 if (asynccallbackinfo) {
617 asynccallbackinfo->info.errorCode = NotificationHelper::SetSyncNotificationEnabledWithoutApp(
618 asynccallbackinfo->params.userId, asynccallbackinfo->params.enable);
619 }
620 },
621 [](napi_env env, napi_status status, void *data) {
622 ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work end");
623 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
624 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
625 if (asynccallbackinfo) {
626 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
627 if (asynccallbackinfo->info.callback != nullptr) {
628 napi_delete_reference(env, asynccallbackinfo->info.callback);
629 }
630 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
631 delete asynccallbackinfo;
632 asynccallbackinfo = nullptr;
633 }
634 },
635 (void *)asynccallbackinfo,
636 &asynccallbackinfo->asyncWork);
637
638 if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
639 napi_delete_reference(env, asynccallbackinfo->info.callback);
640 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
641 delete asynccallbackinfo;
642 asynccallbackinfo = nullptr;
643 return Common::JSParaError(env, params.callback);
644 }
645
646 if (asynccallbackinfo->info.isCallback) {
647 return Common::NapiGetNull(env);
648 }
649 return promise;
650 }
651
ParseParameters(const napi_env & env,const napi_callback_info & info,GetEnabledWithoutAppParams & params)652 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, GetEnabledWithoutAppParams ¶ms)
653 {
654 ANS_LOGI("enter");
655
656 size_t argc = ENABLED_SYNC_MIN_PARA;
657 napi_value argv[ENABLED_SYNC_MIN_PARA] = {nullptr};
658 napi_value thisVar = nullptr;
659 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
660 if (argc < ENABLED_SYNC_MIN_PARA - 1) {
661 ANS_LOGE("Wrong number of arguments.");
662 return nullptr;
663 }
664
665 // argv[0]: userId
666 napi_valuetype valuetype = napi_undefined;
667 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
668 if (valuetype != napi_number) {
669 ANS_LOGE("Wrong argument type. Number expected.");
670 return nullptr;
671 }
672 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId));
673 if (params.userId <= SUBSCRIBE_USER_INIT) {
674 ANS_LOGE("Wrong userId[%{public}d].", params.userId);
675 return nullptr;
676 }
677
678 // argv[1]:callback
679 if (argc >= ENABLED_SYNC_MIN_PARA) {
680 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
681 if (valuetype != napi_function) {
682 ANS_LOGE("Wrong argument type. Function expected.");
683 return nullptr;
684 }
685 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
686 }
687
688 return Common::NapiGetNull(env);
689 }
690
GetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)691 napi_value GetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
692 {
693 ANS_LOGI("enter");
694
695 GetEnabledWithoutAppParams params {};
696 if (ParseParameters(env, info, params) == nullptr) {
697 return Common::JSParaError(env, params.callback);
698 }
699
700 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
701 new (std::nothrow) AsyncCallbackInfoGetEnabledWithoutApp {
702 .env = env, .asyncWork = nullptr, .params = params};
703 if (!asynccallbackinfo) {
704 return Common::JSParaError(env, params.callback);
705 }
706 napi_value promise = nullptr;
707 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
708
709 napi_value resourceName = nullptr;
710 napi_create_string_latin1(env, "GetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
711 // Asynchronous function call
712 napi_create_async_work(
713 env,
714 nullptr,
715 resourceName,
716 [](napi_env env, void *data) {
717 ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work start");
718 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
719 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
720 if (asynccallbackinfo) {
721 asynccallbackinfo->info.errorCode = NotificationHelper::GetSyncNotificationEnabledWithoutApp(
722 asynccallbackinfo->params.userId, asynccallbackinfo->enable);
723 }
724 },
725 [](napi_env env, napi_status status, void *data) {
726 ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work end");
727 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
728 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
729 if (asynccallbackinfo) {
730 napi_value result = nullptr;
731 if (asynccallbackinfo->info.errorCode != ERR_OK) {
732 result = Common::NapiGetNull(env);
733 } else {
734 napi_get_boolean(env, asynccallbackinfo->enable, &result);
735 }
736 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
737 if (asynccallbackinfo->info.callback != nullptr) {
738 napi_delete_reference(env, asynccallbackinfo->info.callback);
739 }
740 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
741 delete asynccallbackinfo;
742 asynccallbackinfo = nullptr;
743 }
744 },
745 (void *)asynccallbackinfo,
746 &asynccallbackinfo->asyncWork);
747
748 if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
749 napi_delete_reference(env, asynccallbackinfo->info.callback);
750 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
751 delete asynccallbackinfo;
752 asynccallbackinfo = nullptr;
753 return Common::JSParaError(env, params.callback);
754 }
755
756 if (asynccallbackinfo->info.isCallback) {
757 return Common::NapiGetNull(env);
758 }
759 return promise;
760 }
761 } // namespace NotificationNapi
762 } // namespace OHOS