1 /*
2 * Copyright (c) 2022-2023 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_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
214 if (status != napi_ok) {
215 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
216 if (asynccallbackinfo->info.callback != nullptr) {
217 napi_delete_reference(env, asynccallbackinfo->info.callback);
218 }
219 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
220 delete asynccallbackinfo;
221 asynccallbackinfo = nullptr;
222 return Common::JSParaError(env, callback);
223 }
224
225 if (asynccallbackinfo->info.isCallback) {
226 return Common::NapiGetNull(env);
227 } else {
228 return promise;
229 }
230 }
231
EnableDistributed(napi_env env,napi_callback_info info)232 napi_value EnableDistributed(napi_env env, napi_callback_info info)
233 {
234 ANS_LOGI("enter");
235
236 EnabledParams params {};
237 if (ParseParameters(env, info, params) == nullptr) {
238 return Common::NapiGetUndefined(env);
239 }
240
241 AsyncCallbackInfoEnabled *asynccallbackinfo =
242 new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
243 if (!asynccallbackinfo) {
244 return Common::JSParaError(env, params.callback);
245 }
246 napi_value promise = nullptr;
247 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
248
249 napi_value resourceName = nullptr;
250 napi_create_string_latin1(env, "enableDistributed", NAPI_AUTO_LENGTH, &resourceName);
251 // Asynchronous function call
252 napi_create_async_work(
253 env,
254 nullptr,
255 resourceName,
256 [](napi_env env, void *data) {
257 ANS_LOGI("EnableDistributed napi_create_async_work start");
258 AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
259
260 if (asynccallbackinfo) {
261 asynccallbackinfo->info.errorCode =
262 NotificationHelper::EnableDistributed(asynccallbackinfo->params.enable);
263 }
264 },
265 [](napi_env env, napi_status status, void *data) {
266 ANS_LOGI("EnableDistributed napi_create_async_work end");
267 AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
268 if (asynccallbackinfo) {
269 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
270 if (asynccallbackinfo->info.callback != nullptr) {
271 napi_delete_reference(env, asynccallbackinfo->info.callback);
272 }
273 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
274 delete asynccallbackinfo;
275 asynccallbackinfo = nullptr;
276 }
277 },
278 (void *)asynccallbackinfo,
279 &asynccallbackinfo->asyncWork);
280
281 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
282 if (status != napi_ok) {
283 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
284 if (asynccallbackinfo->info.callback != nullptr) {
285 napi_delete_reference(env, asynccallbackinfo->info.callback);
286 }
287 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
288 delete asynccallbackinfo;
289 asynccallbackinfo = nullptr;
290 return Common::JSParaError(env, params.callback);
291 }
292
293 if (asynccallbackinfo->info.isCallback) {
294 return Common::NapiGetNull(env);
295 } else {
296 return promise;
297 }
298 }
299
EnableDistributedByBundle(napi_env env,napi_callback_info info)300 napi_value EnableDistributedByBundle(napi_env env, napi_callback_info info)
301 {
302 ANS_LOGI("enter");
303
304 EnabledByBundleParams params {};
305 if (ParseParameters(env, info, params) == nullptr) {
306 return Common::NapiGetUndefined(env);
307 }
308
309 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo =
310 new (std::nothrow) AsyncCallbackInfoEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
311 if (!asynccallbackinfo) {
312 return Common::JSParaError(env, params.callback);
313 }
314 napi_value promise = nullptr;
315 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
316
317 napi_value resourceName = nullptr;
318 napi_create_string_latin1(env, "enableDistributedByBundle", NAPI_AUTO_LENGTH, &resourceName);
319 // Asynchronous function call
320 napi_create_async_work(
321 env,
322 nullptr,
323 resourceName,
324 [](napi_env env, void *data) {
325 ANS_LOGI("EnableDistributedByBundle napi_create_async_work start");
326 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
327 if (asynccallbackinfo) {
328 asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedByBundle(
329 asynccallbackinfo->params.option, asynccallbackinfo->params.enable);
330 }
331 },
332 [](napi_env env, napi_status status, void *data) {
333 ANS_LOGI("EnableDistributedByBundle napi_create_async_work end");
334 AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
335 if (asynccallbackinfo) {
336 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
337 if (asynccallbackinfo->info.callback != nullptr) {
338 napi_delete_reference(env, asynccallbackinfo->info.callback);
339 }
340 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
341 delete asynccallbackinfo;
342 asynccallbackinfo = nullptr;
343 }
344 },
345 (void *)asynccallbackinfo,
346 &asynccallbackinfo->asyncWork);
347
348 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
349 if (status != napi_ok) {
350 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
351 if (asynccallbackinfo->info.callback != nullptr) {
352 napi_delete_reference(env, asynccallbackinfo->info.callback);
353 }
354 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
355 delete asynccallbackinfo;
356 asynccallbackinfo = nullptr;
357 return Common::JSParaError(env, params.callback);
358 }
359
360 if (asynccallbackinfo->info.isCallback) {
361 return Common::NapiGetNull(env);
362 } else {
363 return promise;
364 }
365 }
366
EnableDistributedSelf(napi_env env,napi_callback_info info)367 napi_value EnableDistributedSelf(napi_env env, napi_callback_info info)
368 {
369 ANS_LOGI("enter");
370
371 EnabledParams params {};
372 if (ParseParameters(env, info, params) == nullptr) {
373 return Common::NapiGetUndefined(env);
374 }
375
376 AsyncCallbackInfoEnabled *asynccallbackinfo =
377 new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
378 if (!asynccallbackinfo) {
379 return Common::JSParaError(env, params.callback);
380 }
381 napi_value promise = nullptr;
382 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
383
384 napi_value resourceName = nullptr;
385 napi_create_string_latin1(env, "enableDistributedSelf", NAPI_AUTO_LENGTH, &resourceName);
386 // Asynchronous function call
387 napi_create_async_work(
388 env,
389 nullptr,
390 resourceName,
391 [](napi_env env, void *data) {
392 ANS_LOGI("EnableDistributedSelf napi_create_async_work start");
393 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
394 if (asynccallbackinfo) {
395 asynccallbackinfo->info.errorCode =
396 NotificationHelper::EnableDistributedSelf(asynccallbackinfo->params.enable);
397 ANS_LOGI("EnableDistributedSelf enable = %{public}d", asynccallbackinfo->params.enable);
398 }
399 },
400 [](napi_env env, napi_status status, void *data) {
401 ANS_LOGI("EnableDistributedSelf napi_create_async_work end");
402 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
403 if (asynccallbackinfo) {
404 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
405 if (asynccallbackinfo->info.callback != nullptr) {
406 napi_delete_reference(env, asynccallbackinfo->info.callback);
407 }
408 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
409 delete asynccallbackinfo;
410 asynccallbackinfo = nullptr;
411 }
412 },
413 (void *)asynccallbackinfo,
414 &asynccallbackinfo->asyncWork);
415
416 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
417 if (status != napi_ok) {
418 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
419 if (asynccallbackinfo->info.callback != nullptr) {
420 napi_delete_reference(env, asynccallbackinfo->info.callback);
421 }
422 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
423 delete asynccallbackinfo;
424 asynccallbackinfo = nullptr;
425 return Common::JSParaError(env, params.callback);
426 }
427
428 if (asynccallbackinfo->info.isCallback) {
429 return Common::NapiGetNull(env);
430 } else {
431 return promise;
432 }
433 }
434
AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env,napi_status status,void * data)435 void AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env, napi_status status, void *data)
436 {
437 ANS_LOGI("enter");
438 if (!data) {
439 ANS_LOGE("Invalid async callback data");
440 return;
441 }
442 ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work end");
443 AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
444 if (asynccallbackinfo) {
445 napi_value result = nullptr;
446 if (asynccallbackinfo->info.errorCode != ERR_OK) {
447 result = Common::NapiGetNull(env);
448 } else {
449 napi_get_boolean(env, asynccallbackinfo->enable, &result);
450 }
451 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
452 if (asynccallbackinfo->info.callback != nullptr) {
453 napi_delete_reference(env, asynccallbackinfo->info.callback);
454 }
455 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
456 delete asynccallbackinfo;
457 asynccallbackinfo = nullptr;
458 }
459 }
460
IsDistributedEnableByBundle(napi_env env,napi_callback_info info)461 napi_value IsDistributedEnableByBundle(napi_env env, napi_callback_info info)
462 {
463 ANS_LOGI("enter");
464
465 IsEnabledByBundleParams params {};
466 if (ParseParameters(env, info, params) == nullptr) {
467 return Common::NapiGetUndefined(env);
468 }
469
470 AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo =
471 new (std::nothrow) AsyncCallbackInfoIsEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
472 if (!asynccallbackinfo) {
473 return Common::JSParaError(env, params.callback);
474 }
475 napi_value promise = nullptr;
476 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
477
478 napi_value resourceName = nullptr;
479 napi_create_string_latin1(env, "isDistributedEnableByBundle", NAPI_AUTO_LENGTH, &resourceName);
480 // Asynchronous function call
481 napi_create_async_work(
482 env,
483 nullptr,
484 resourceName,
485 [](napi_env env, void *data) {
486 ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work start");
487 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
488 if (asynccallbackinfo) {
489 asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnableByBundle(
490 asynccallbackinfo->params.option, asynccallbackinfo->enable);
491 }
492 },
493 AsyncCompleteCallbackIsDistributedEnableByBundle,
494 (void *)asynccallbackinfo,
495 &asynccallbackinfo->asyncWork);
496
497 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
498 if (status != napi_ok) {
499 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
500 if (asynccallbackinfo->info.callback != nullptr) {
501 napi_delete_reference(env, asynccallbackinfo->info.callback);
502 }
503 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
504 delete asynccallbackinfo;
505 asynccallbackinfo = nullptr;
506 return Common::JSParaError(env, params.callback);
507 }
508
509 if (asynccallbackinfo->info.isCallback) {
510 return Common::NapiGetNull(env);
511 } else {
512 return promise;
513 }
514 }
515
AsyncCompleteCallbackGetDeviceRemindType(napi_env env,napi_status status,void * data)516 void AsyncCompleteCallbackGetDeviceRemindType(napi_env env, napi_status status, void *data)
517 {
518 ANS_LOGI("enter");
519 if (!data) {
520 ANS_LOGE("Invalid async callback data");
521 return;
522 }
523 ANS_LOGI("GetDeviceRemindType napi_create_async_work end");
524 AsyncCallbackInfoGetRemindType *asynccallbackinfo = static_cast<AsyncCallbackInfoGetRemindType *>(data);
525 if (asynccallbackinfo) {
526 napi_value result = nullptr;
527 if (asynccallbackinfo->info.errorCode != ERR_OK) {
528 result = Common::NapiGetNull(env);
529 } else {
530 DeviceRemindType outType = DeviceRemindType::IDLE_DONOT_REMIND;
531 if (!Common::DeviceRemindTypeCToJS(asynccallbackinfo->remindType, outType)) {
532 asynccallbackinfo->info.errorCode = ERROR;
533 result = Common::NapiGetNull(env);
534 }
535 napi_create_int32(env, (int32_t)outType, &result);
536 }
537 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
538 if (asynccallbackinfo->info.callback != nullptr) {
539 napi_delete_reference(env, asynccallbackinfo->info.callback);
540 }
541 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
542 delete asynccallbackinfo;
543 asynccallbackinfo = nullptr;
544 }
545 }
546
GetDeviceRemindType(napi_env env,napi_callback_info info)547 napi_value GetDeviceRemindType(napi_env env, napi_callback_info info)
548 {
549 ANS_LOGI("enter");
550
551 napi_ref callback = nullptr;
552 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
553 return Common::NapiGetUndefined(env);
554 }
555
556 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetRemindType {.env = env, .asyncWork = nullptr};
557 if (!asynccallbackinfo) {
558 return Common::JSParaError(env, callback);
559 }
560 napi_value promise = nullptr;
561 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
562
563 napi_value resourceName = nullptr;
564 napi_create_string_latin1(env, "getDeviceRemindType", NAPI_AUTO_LENGTH, &resourceName);
565 // Asynchronous function call
566 napi_create_async_work(
567 env,
568 nullptr,
569 resourceName,
570 [](napi_env env, void *data) {
571 ANS_LOGI("GetDeviceRemindType napi_create_async_work start");
572 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetRemindType *>(data);
573 if (asynccallbackinfo) {
574 asynccallbackinfo->info.errorCode =
575 NotificationHelper::GetDeviceRemindType(asynccallbackinfo->remindType);
576 }
577 },
578 AsyncCompleteCallbackGetDeviceRemindType,
579 (void *)asynccallbackinfo,
580 &asynccallbackinfo->asyncWork);
581
582 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
583 if (status != napi_ok) {
584 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
585 if (asynccallbackinfo->info.callback != nullptr) {
586 napi_delete_reference(env, asynccallbackinfo->info.callback);
587 }
588 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
589 delete asynccallbackinfo;
590 asynccallbackinfo = nullptr;
591 return Common::JSParaError(env, callback);
592 }
593
594 if (asynccallbackinfo->info.isCallback) {
595 return Common::NapiGetNull(env);
596 } else {
597 return promise;
598 }
599 }
600
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledWithoutAppParams & params)601 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledWithoutAppParams ¶ms)
602 {
603 ANS_LOGI("enter");
604
605 size_t argc = ENABLED_SYNC_MAX_PARA;
606 napi_value argv[ENABLED_SYNC_MAX_PARA] = {nullptr};
607 napi_value thisVar = nullptr;
608 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
609 if (argc < ENABLED_SYNC_MIN_PARA) {
610 ANS_LOGE("Wrong number of arguments.");
611 return nullptr;
612 }
613
614 // argv[0]: userId
615 napi_valuetype valuetype = napi_undefined;
616 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
617 if (valuetype != napi_number) {
618 ANS_LOGE("Wrong argument type. Number expected.");
619 return nullptr;
620 }
621 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId));
622 if (params.userId <= SUBSCRIBE_USER_INIT) {
623 ANS_LOGE("Wrong userId[%{public}d].", params.userId);
624 return nullptr;
625 }
626
627 // argv[1]: enable
628 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
629 if (valuetype != napi_boolean) {
630 ANS_LOGE("Wrong argument type. Bool expected.");
631 return nullptr;
632 }
633 napi_get_value_bool(env, argv[PARAM1], ¶ms.enable);
634
635 // argv[2]:callback
636 if (argc >= ENABLED_SYNC_MAX_PARA) {
637 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
638 if (valuetype != napi_function) {
639 ANS_LOGE("Wrong argument type. Function expected.");
640 return nullptr;
641 }
642 napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback);
643 }
644
645 return Common::NapiGetNull(env);
646 }
647
SetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)648 napi_value SetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
649 {
650 ANS_LOGI("enter");
651
652 EnabledWithoutAppParams params {};
653 if (ParseParameters(env, info, params) == nullptr) {
654 return Common::JSParaError(env, params.callback);
655 }
656
657 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
658 new (std::nothrow) AsyncCallbackInfoEnabledWithoutApp {.env = env, .asyncWork = nullptr, .params = params};
659 if (!asynccallbackinfo) {
660 return Common::JSParaError(env, params.callback);
661 }
662 napi_value promise = nullptr;
663 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
664
665 napi_value resourceName = nullptr;
666 napi_create_string_latin1(env, "SetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
667 // Asynchronous function call
668 napi_create_async_work(
669 env,
670 nullptr,
671 resourceName,
672 [](napi_env env, void *data) {
673 ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work start");
674 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
675 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
676 if (asynccallbackinfo) {
677 asynccallbackinfo->info.errorCode = NotificationHelper::SetSyncNotificationEnabledWithoutApp(
678 asynccallbackinfo->params.userId, asynccallbackinfo->params.enable);
679 }
680 },
681 [](napi_env env, napi_status status, void *data) {
682 ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work end");
683 AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
684 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
685 if (asynccallbackinfo) {
686 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
687 if (asynccallbackinfo->info.callback != nullptr) {
688 napi_delete_reference(env, asynccallbackinfo->info.callback);
689 }
690 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
691 delete asynccallbackinfo;
692 asynccallbackinfo = nullptr;
693 }
694 },
695 (void *)asynccallbackinfo,
696 &asynccallbackinfo->asyncWork);
697
698 if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
699 if (asynccallbackinfo->info.callback != nullptr) {
700 napi_delete_reference(env, asynccallbackinfo->info.callback);
701 }
702 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
703 delete asynccallbackinfo;
704 asynccallbackinfo = nullptr;
705 return Common::JSParaError(env, params.callback);
706 }
707
708 if (asynccallbackinfo->info.isCallback) {
709 return Common::NapiGetNull(env);
710 }
711 return promise;
712 }
713
ParseParameters(const napi_env & env,const napi_callback_info & info,GetEnabledWithoutAppParams & params)714 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, GetEnabledWithoutAppParams ¶ms)
715 {
716 ANS_LOGI("enter");
717
718 size_t argc = ENABLED_SYNC_MIN_PARA;
719 napi_value argv[ENABLED_SYNC_MIN_PARA] = {nullptr};
720 napi_value thisVar = nullptr;
721 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
722 if (argc < ENABLED_SYNC_MIN_PARA - 1) {
723 ANS_LOGE("Wrong number of arguments.");
724 return nullptr;
725 }
726
727 // argv[0]: userId
728 napi_valuetype valuetype = napi_undefined;
729 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
730 if (valuetype != napi_number) {
731 ANS_LOGE("Wrong argument type. Number expected.");
732 return nullptr;
733 }
734 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId));
735 if (params.userId <= SUBSCRIBE_USER_INIT) {
736 ANS_LOGE("Wrong userId[%{public}d].", params.userId);
737 return nullptr;
738 }
739
740 // argv[1]:callback
741 if (argc >= ENABLED_SYNC_MIN_PARA) {
742 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
743 if (valuetype != napi_function) {
744 ANS_LOGE("Wrong argument type. Function expected.");
745 return nullptr;
746 }
747 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
748 }
749
750 return Common::NapiGetNull(env);
751 }
752
GetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)753 napi_value GetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
754 {
755 ANS_LOGI("enter");
756
757 GetEnabledWithoutAppParams params {};
758 if (ParseParameters(env, info, params) == nullptr) {
759 return Common::JSParaError(env, params.callback);
760 }
761
762 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
763 new (std::nothrow) AsyncCallbackInfoGetEnabledWithoutApp {
764 .env = env, .asyncWork = nullptr, .params = params};
765 if (!asynccallbackinfo) {
766 return Common::JSParaError(env, params.callback);
767 }
768 napi_value promise = nullptr;
769 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
770
771 napi_value resourceName = nullptr;
772 napi_create_string_latin1(env, "GetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
773 // Asynchronous function call
774 napi_create_async_work(
775 env,
776 nullptr,
777 resourceName,
778 [](napi_env env, void *data) {
779 ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work start");
780 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
781 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
782 if (asynccallbackinfo) {
783 asynccallbackinfo->info.errorCode = NotificationHelper::GetSyncNotificationEnabledWithoutApp(
784 asynccallbackinfo->params.userId, asynccallbackinfo->enable);
785 }
786 },
787 [](napi_env env, napi_status status, void *data) {
788 ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work end");
789 AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
790 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
791 if (asynccallbackinfo) {
792 napi_value result = nullptr;
793 if (asynccallbackinfo->info.errorCode != ERR_OK) {
794 result = Common::NapiGetNull(env);
795 } else {
796 napi_get_boolean(env, asynccallbackinfo->enable, &result);
797 }
798 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
799 if (asynccallbackinfo->info.callback != nullptr) {
800 napi_delete_reference(env, asynccallbackinfo->info.callback);
801 }
802 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
803 delete asynccallbackinfo;
804 asynccallbackinfo = nullptr;
805 }
806 },
807 (void *)asynccallbackinfo,
808 &asynccallbackinfo->asyncWork);
809
810 if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
811 if (asynccallbackinfo->info.callback != nullptr) {
812 napi_delete_reference(env, asynccallbackinfo->info.callback);
813 }
814 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
815 delete asynccallbackinfo;
816 asynccallbackinfo = nullptr;
817 return Common::JSParaError(env, params.callback);
818 }
819
820 if (asynccallbackinfo->info.isCallback) {
821 return Common::NapiGetNull(env);
822 }
823 return promise;
824 }
825 } // namespace NotificationNapi
826 } // namespace OHOS