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 "napi_slot.h"
17
18 #include "ans_inner_errors.h"
19 #include "slot.h"
20
21 namespace OHOS {
22 namespace NotificationNapi {
NapiAddSlot(napi_env env,napi_callback_info info)23 napi_value NapiAddSlot(napi_env env, napi_callback_info info)
24 {
25 ANS_LOGI("enter");
26 ParametersInfoAddSlot paras;
27 if (ParseParametersByAddSlot(env, info, paras) == nullptr) {
28 Common::NapiThrow(env, ERROR_PARAM_INVALID);
29 return Common::NapiGetUndefined(env);
30 }
31
32 AsyncCallbackInfoAddSlot *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoAddSlot {
33 .env = env,
34 .asyncWork = nullptr,
35 .slot = paras.slot,
36 .inType = paras.inType,
37 .isAddSlotByType = paras.isAddSlotByType
38 };
39 if (!asynccallbackinfo) {
40 return Common::JSParaError(env, paras.callback);
41 }
42 napi_value promise = nullptr;
43 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
44
45 napi_value resourceName = nullptr;
46 napi_create_string_latin1(env, "addSlot", NAPI_AUTO_LENGTH, &resourceName);
47 // Asynchronous function call
48 napi_create_async_work(env,
49 nullptr,
50 resourceName,
51 [](napi_env env, void *data) {
52 ANS_LOGI("AddSlot napi_create_async_work start");
53 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
54 if (asynccallbackinfo) {
55 if (asynccallbackinfo->isAddSlotByType) {
56 asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
57 } else {
58 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlot(
59 asynccallbackinfo->slot);
60 }
61 }
62 },
63 [](napi_env env, napi_status status, void *data) {
64 ANS_LOGI("AddSlot napi_create_async_work end");
65 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
66 if (asynccallbackinfo) {
67 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
68 if (asynccallbackinfo->info.callback != nullptr) {
69 napi_delete_reference(env, asynccallbackinfo->info.callback);
70 }
71 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
72 delete asynccallbackinfo;
73 asynccallbackinfo = nullptr;
74 }
75 },
76 (void *)asynccallbackinfo,
77 &asynccallbackinfo->asyncWork);
78
79 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
80 if (asynccallbackinfo->info.isCallback) {
81 return Common::NapiGetNull(env);
82 } else {
83 return promise;
84 }
85 }
86
NapiAddSlots(napi_env env,napi_callback_info info)87 napi_value NapiAddSlots(napi_env env, napi_callback_info info)
88 {
89 ANS_LOGI("enter");
90 ParametersInfoAddSlots paras;
91 if (ParseParametersByAddSlots(env, info, paras) == nullptr) {
92 Common::NapiThrow(env, ERROR_PARAM_INVALID);
93 return Common::NapiGetUndefined(env);
94 }
95
96 AsyncCallbackInfoAddSlots *asynccallbackinfo =
97 new (std::nothrow) AsyncCallbackInfoAddSlots {.env = env, .asyncWork = nullptr, .slots = paras.slots};
98 if (!asynccallbackinfo) {
99 return Common::JSParaError(env, paras.callback);
100 }
101 napi_value promise = nullptr;
102 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
103
104 napi_value resourceName = nullptr;
105 napi_create_string_latin1(env, "addSlots", NAPI_AUTO_LENGTH, &resourceName);
106 // Asynchronous function call
107 napi_create_async_work(env,
108 nullptr,
109 resourceName,
110 [](napi_env env, void *data) {
111 ANS_LOGI("AddSlots napi_create_async_work start");
112 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
113 if (asynccallbackinfo) {
114 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlots(asynccallbackinfo->slots);
115 }
116 },
117 [](napi_env env, napi_status status, void *data) {
118 ANS_LOGI("AddSlots napi_create_async_work end");
119 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
120 if (asynccallbackinfo) {
121 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
122 if (asynccallbackinfo->info.callback != nullptr) {
123 napi_delete_reference(env, asynccallbackinfo->info.callback);
124 }
125 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
126 delete asynccallbackinfo;
127 asynccallbackinfo = nullptr;
128 }
129 },
130 (void *)asynccallbackinfo,
131 &asynccallbackinfo->asyncWork);
132
133 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
134 if (asynccallbackinfo->info.isCallback) {
135 return Common::NapiGetNull(env);
136 } else {
137 return promise;
138 }
139 }
140
NapiSetSlotByBundle(napi_env env,napi_callback_info info)141 napi_value NapiSetSlotByBundle(napi_env env, napi_callback_info info)
142 {
143 ANS_LOGI("enter");
144 ParametersInfoSetSlotByBundle params {};
145 if (ParseParametersSetSlotByBundle(env, info, params) == nullptr) {
146 Common::NapiThrow(env, ERROR_PARAM_INVALID);
147 return Common::NapiGetUndefined(env);
148 }
149
150 AsyncCallbackInfoSetSlotByBundle *asynccallbackinfo =
151 new (std::nothrow) AsyncCallbackInfoSetSlotByBundle {.env = env, .asyncWork = nullptr, .params = params};
152 if (!asynccallbackinfo) {
153 return Common::JSParaError(env, params.callback);
154 }
155 napi_value promise = nullptr;
156 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
157
158 napi_value resourceName = nullptr;
159 napi_create_string_latin1(env, "setSlotByBundle", NAPI_AUTO_LENGTH, &resourceName);
160 // Asynchronous function call
161 napi_create_async_work(env,
162 nullptr,
163 resourceName,
164 [](napi_env env, void *data) {
165 ANS_LOGI("SetSlotByBundle napi_create_async_work start");
166 auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
167 if (asynccallbackinfo) {
168 asynccallbackinfo->info.errorCode = NotificationHelper::UpdateNotificationSlots(
169 asynccallbackinfo->params.option, asynccallbackinfo->params.slots);
170 }
171 },
172 [](napi_env env, napi_status status, void *data) {
173 ANS_LOGI("SetSlotByBundle napi_create_async_work end");
174 auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
175 if (asynccallbackinfo) {
176 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
177 if (asynccallbackinfo->info.callback != nullptr) {
178 napi_delete_reference(env, asynccallbackinfo->info.callback);
179 }
180 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
181 delete asynccallbackinfo;
182 asynccallbackinfo = nullptr;
183 }
184 },
185 (void *)asynccallbackinfo,
186 &asynccallbackinfo->asyncWork);
187
188 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
189 if (asynccallbackinfo->info.isCallback) {
190 return Common::NapiGetNull(env);
191 } else {
192 return promise;
193 }
194 }
195
196
AsyncCompleteCallbackNapiGetSlot(napi_env env,napi_status status,void * data)197 void AsyncCompleteCallbackNapiGetSlot(napi_env env, napi_status status, void *data)
198 {
199 ANS_LOGI("GetSlot napi_create_async_work end");
200 if (!data) {
201 ANS_LOGE("Invalid async callback data");
202 return;
203 }
204
205 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
206 if (asynccallbackinfo) {
207 napi_value result = Common::NapiGetNull(env);
208 if (asynccallbackinfo->info.errorCode == ERR_OK) {
209 if (asynccallbackinfo->slot != nullptr) {
210 napi_create_object(env, &result);
211 if (!Common::SetNotificationSlot(env, *asynccallbackinfo->slot, result)) {
212 asynccallbackinfo->info.errorCode = ERROR;
213 result = Common::NapiGetNull(env);
214 }
215 }
216 }
217 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
218 if (asynccallbackinfo->info.callback != nullptr) {
219 napi_delete_reference(env, asynccallbackinfo->info.callback);
220 }
221 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
222 delete asynccallbackinfo;
223 asynccallbackinfo = nullptr;
224 }
225 }
226
NapiGetSlot(napi_env env,napi_callback_info info)227 napi_value NapiGetSlot(napi_env env, napi_callback_info info)
228 {
229 ANS_LOGI("enter");
230 ParametersInfoGetSlot paras;
231 if (ParseParametersByGetSlot(env, info, paras) == nullptr) {
232 Common::NapiThrow(env, ERROR_PARAM_INVALID);
233 return Common::NapiGetUndefined(env);
234 }
235
236 AsyncCallbackInfoGetSlot *asynccallbackinfo =
237 new (std::nothrow) AsyncCallbackInfoGetSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
238 if (!asynccallbackinfo) {
239 return Common::JSParaError(env, paras.callback);
240 }
241 napi_value promise = nullptr;
242 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
243
244 napi_value resourceName = nullptr;
245 napi_create_string_latin1(env, "getSlot", NAPI_AUTO_LENGTH, &resourceName);
246 // Asynchronous function call
247 napi_create_async_work(env,
248 nullptr,
249 resourceName,
250 [](napi_env env, void *data) {
251 ANS_LOGI("GetSlot napi_create_async_work start");
252 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
253 if (asynccallbackinfo) {
254 asynccallbackinfo->info.errorCode =
255 NotificationHelper::GetNotificationSlot(asynccallbackinfo->outType, asynccallbackinfo->slot);
256 }
257 },
258 AsyncCompleteCallbackNapiGetSlot,
259 (void *)asynccallbackinfo,
260 &asynccallbackinfo->asyncWork);
261
262 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
263 if (asynccallbackinfo->info.isCallback) {
264 return Common::NapiGetNull(env);
265 } else {
266 return promise;
267 }
268 }
269
NapiGetSlotNumByBundle(napi_env env,napi_callback_info info)270 napi_value NapiGetSlotNumByBundle(napi_env env, napi_callback_info info)
271 {
272 ANS_LOGI("enter");
273 ParametersInfoGetSlotNumByBundle params {};
274 if (ParseParametersGetSlotNumByBundle(env, info, params) == nullptr) {
275 Common::NapiThrow(env, ERROR_PARAM_INVALID);
276 return Common::NapiGetUndefined(env);
277 }
278
279 AsyncCallbackInfoGetSlotNumByBundle *asynccallbackinfo =
280 new (std::nothrow) AsyncCallbackInfoGetSlotNumByBundle {.env = env, .asyncWork = nullptr, .params = params};
281 if (!asynccallbackinfo) {
282 return Common::JSParaError(env, params.callback);
283 }
284 napi_value promise = nullptr;
285 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
286
287 napi_value resourceName = nullptr;
288 napi_create_string_latin1(env, "getSlotNumByBundle", NAPI_AUTO_LENGTH, &resourceName);
289 // Asynchronous function call
290 napi_create_async_work(env,
291 nullptr,
292 resourceName,
293 [](napi_env env, void *data) {
294 ANS_LOGI("GetSlotNumByBundle napi_create_async_work start");
295 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
296 if (asynccallbackinfo) {
297 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotNumAsBundle(
298 asynccallbackinfo->params.option, asynccallbackinfo->num);
299 }
300 },
301 [](napi_env env, napi_status status, void *data) {
302 ANS_LOGI("GetSlotNumByBundle napi_create_async_work end");
303 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
304 if (asynccallbackinfo) {
305 napi_value result = nullptr;
306 napi_create_uint32(env, asynccallbackinfo->num, &result);
307 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
308 if (asynccallbackinfo->info.callback != nullptr) {
309 napi_delete_reference(env, asynccallbackinfo->info.callback);
310 }
311 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
312 delete asynccallbackinfo;
313 asynccallbackinfo = nullptr;
314 }
315 },
316 (void *)asynccallbackinfo,
317 &asynccallbackinfo->asyncWork);
318
319 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
320 if (asynccallbackinfo->info.isCallback) {
321 return Common::NapiGetNull(env);
322 } else {
323 return promise;
324 }
325 }
326
AsyncCompleteCallbackNapiGetSlots(napi_env env,napi_status status,void * data)327 void AsyncCompleteCallbackNapiGetSlots(napi_env env, napi_status status, void *data)
328 {
329 ANS_LOGI("enter");
330 if (!data) {
331 ANS_LOGE("Invalid async callback data");
332 return;
333 }
334 napi_value result = nullptr;
335 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
336 if (asynccallbackinfo) {
337 if (asynccallbackinfo->info.errorCode != ERR_OK) {
338 result = Common::NapiGetNull(env);
339 } else {
340 napi_value arr = nullptr;
341 napi_create_array(env, &arr);
342 size_t count = 0;
343 for (auto vec : asynccallbackinfo->slots) {
344 if (!vec) {
345 ANS_LOGW("Invalid NotificationSlot object ptr");
346 continue;
347 }
348 napi_value nSlot = nullptr;
349 napi_create_object(env, &nSlot);
350 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
351 continue;
352 }
353 napi_set_element(env, arr, count, nSlot);
354 count++;
355 }
356 ANS_LOGI("getSlots count = %{public}zu", count);
357 result = arr;
358 if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
359 asynccallbackinfo->info.errorCode = ERROR;
360 result = Common::NapiGetNull(env);
361 }
362 }
363 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
364 if (asynccallbackinfo->info.callback != nullptr) {
365 napi_delete_reference(env, asynccallbackinfo->info.callback);
366 }
367 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
368 delete asynccallbackinfo;
369 asynccallbackinfo = nullptr;
370 }
371 }
372
NapiGetSlots(napi_env env,napi_callback_info info)373 napi_value NapiGetSlots(napi_env env, napi_callback_info info)
374 {
375 ANS_LOGI("enter");
376 napi_ref callback = nullptr;
377 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
378 Common::NapiThrow(env, ERROR_PARAM_INVALID);
379 return Common::NapiGetUndefined(env);
380 }
381
382 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetSlots {.env = env, .asyncWork = nullptr};
383 if (!asynccallbackinfo) {
384 return Common::JSParaError(env, callback);
385 }
386 napi_value promise = nullptr;
387 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
388
389 napi_value resourceName = nullptr;
390 napi_create_string_latin1(env, "getSlots", NAPI_AUTO_LENGTH, &resourceName);
391 // Asynchronous function call
392 napi_create_async_work(env,
393 nullptr,
394 resourceName,
395 [](napi_env env, void *data) {
396 ANS_LOGI("GetSlots napi_create_async_work start");
397 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
398 if (asynccallbackinfo) {
399 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlots(asynccallbackinfo->slots);
400 }
401 },
402 AsyncCompleteCallbackNapiGetSlots,
403 (void *)asynccallbackinfo,
404 &asynccallbackinfo->asyncWork);
405
406 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
407
408 if (asynccallbackinfo->info.isCallback) {
409 return Common::NapiGetNull(env);
410 } else {
411 return promise;
412 }
413 }
414
AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env,napi_status status,void * data)415 void AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env, napi_status status, void *data)
416 {
417 ANS_LOGI("enter");
418 if (!data) {
419 ANS_LOGE("Invalid async callback data");
420 return;
421 }
422 napi_value result = nullptr;
423 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
424 if (asynccallbackinfo) {
425 if (asynccallbackinfo->info.errorCode != ERR_OK) {
426 result = Common::NapiGetNull(env);
427 } else {
428 napi_value arr = nullptr;
429 napi_create_array(env, &arr);
430 size_t count = 0;
431 for (auto vec : asynccallbackinfo->slots) {
432 if (!vec) {
433 ANS_LOGW("Invalid NotificationSlot object ptr");
434 continue;
435 }
436 napi_value nSlot = nullptr;
437 napi_create_object(env, &nSlot);
438 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
439 continue;
440 }
441 napi_set_element(env, arr, count, nSlot);
442 count++;
443 }
444 ANS_LOGI("getSlots count = %{public}zu", count);
445 result = arr;
446 if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
447 asynccallbackinfo->info.errorCode = ERROR;
448 result = Common::NapiGetNull(env);
449 }
450 }
451 Common::CreateReturnValue(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
NapiGetSlotsByBundle(napi_env env,napi_callback_info info)461 napi_value NapiGetSlotsByBundle(napi_env env, napi_callback_info info)
462 {
463 ANS_LOGI("enter");
464 ParametersInfoGetSlotsByBundle params {};
465 if (ParseParametersGetSlotsByBundle(env, info, params) == nullptr) {
466 Common::NapiThrow(env, ERROR_PARAM_INVALID);
467 return Common::NapiGetUndefined(env);
468 }
469
470 AsyncCallbackInfoGetSlotsByBundle *asynccallbackinfo =
471 new (std::nothrow) AsyncCallbackInfoGetSlotsByBundle {.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, "getSlotsByBundle", NAPI_AUTO_LENGTH, &resourceName);
480 // Asynchronous function call
481 napi_create_async_work(env,
482 nullptr,
483 resourceName,
484 [](napi_env env, void *data) {
485 ANS_LOGI("GetSlotsByBundle napi_create_async_work start");
486 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
487 if (asynccallbackinfo) {
488 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotsForBundle(
489 asynccallbackinfo->params.option, asynccallbackinfo->slots);
490 }
491 },
492 AsyncCompleteCallbackNapiGetSlotsByBundle,
493 (void *)asynccallbackinfo,
494 &asynccallbackinfo->asyncWork);
495
496 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
497 if (asynccallbackinfo->info.isCallback) {
498 return Common::NapiGetNull(env);
499 } else {
500 return promise;
501 }
502 }
503
NapiRemoveSlot(napi_env env,napi_callback_info info)504 napi_value NapiRemoveSlot(napi_env env, napi_callback_info info)
505 {
506 ANS_LOGI("enter");
507 ParametersInfoRemoveSlot paras;
508 if (ParseParametersByRemoveSlot(env, info, paras) == nullptr) {
509 Common::NapiThrow(env, ERROR_PARAM_INVALID);
510 return Common::NapiGetUndefined(env);
511 }
512
513 AsyncCallbackInfoRemoveSlot *asynccallbackinfo =
514 new (std::nothrow) AsyncCallbackInfoRemoveSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
515 if (!asynccallbackinfo) {
516 return Common::JSParaError(env, paras.callback);
517 }
518 napi_value promise = nullptr;
519 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
520
521 napi_value resourceName = nullptr;
522 napi_create_string_latin1(env, "removeSlot", NAPI_AUTO_LENGTH, &resourceName);
523 // Asynchronous function call
524 napi_create_async_work(env,
525 nullptr,
526 resourceName,
527 [](napi_env env, void *data) {
528 ANS_LOGI("removeSlot napi_create_async_work start");
529 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
530 if (asynccallbackinfo) {
531 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveNotificationSlot(
532 asynccallbackinfo->outType);
533 }
534 },
535 [](napi_env env, napi_status status, void *data) {
536 ANS_LOGI("removeSlot napi_create_async_work end");
537 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
538 if (asynccallbackinfo) {
539 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
540 if (asynccallbackinfo->info.callback != nullptr) {
541 napi_delete_reference(env, asynccallbackinfo->info.callback);
542 }
543 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
544 delete asynccallbackinfo;
545 asynccallbackinfo = nullptr;
546 }
547 },
548 (void *)asynccallbackinfo,
549 &asynccallbackinfo->asyncWork);
550
551 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
552 if (asynccallbackinfo->info.isCallback) {
553 return Common::NapiGetNull(env);
554 } else {
555 return promise;
556 }
557 }
558
NapiRemoveAllSlots(napi_env env,napi_callback_info info)559 napi_value NapiRemoveAllSlots(napi_env env, napi_callback_info info)
560 {
561 ANS_LOGI("enter");
562 napi_ref callback = nullptr;
563 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
564 Common::NapiThrow(env, ERROR_PARAM_INVALID);
565 return Common::NapiGetUndefined(env);
566 }
567
568 auto *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoRemoveAllSlots {.env = env, .asyncWork = nullptr};
569 if (!asynccallbackinfo) {
570 return Common::JSParaError(env, callback);
571 }
572 napi_value promise = nullptr;
573 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
574
575 napi_value resourceName = nullptr;
576 napi_create_string_latin1(env, "removeAll", NAPI_AUTO_LENGTH, &resourceName);
577 // Asynchronous function call
578 napi_create_async_work(env,
579 nullptr,
580 resourceName,
581 [](napi_env env, void *data) {
582 ANS_LOGI("RemoveAllSlots napi_create_async_work start");
583 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
584 if (asynccallbackinfo) {
585 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveAllSlots();
586 }
587 },
588 [](napi_env env, napi_status status, void *data) {
589 ANS_LOGI("RemoveAllSlots napi_create_async_work end");
590 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
591 if (asynccallbackinfo) {
592 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
593 if (asynccallbackinfo->info.callback != nullptr) {
594 napi_delete_reference(env, asynccallbackinfo->info.callback);
595 }
596 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
597 delete asynccallbackinfo;
598 asynccallbackinfo = nullptr;
599 }
600 },
601 (void *)asynccallbackinfo,
602 &asynccallbackinfo->asyncWork);
603
604 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
605 if (asynccallbackinfo->info.isCallback) {
606 return Common::NapiGetNull(env);
607 } else {
608 return promise;
609 }
610 }
611
NapiEnableNotificationSlot(napi_env env,napi_callback_info info)612 napi_value NapiEnableNotificationSlot(napi_env env, napi_callback_info info)
613 {
614 ANS_LOGI("enter");
615 ParametersInfoEnableSlot params {};
616 if (ParseParametersEnableSlot(env, info, params) == nullptr) {
617 Common::NapiThrow(env, ERROR_PARAM_INVALID);
618 return Common::NapiGetUndefined(env);
619 }
620
621 AsyncCallbackInfoInfoEnableSlot *asynccallbackinfo =
622 new (std::nothrow) AsyncCallbackInfoInfoEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
623 if (!asynccallbackinfo) {
624 return Common::JSParaError(env, params.callback);
625 }
626 napi_value promise = nullptr;
627 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
628
629 napi_value resourceName = nullptr;
630 napi_create_string_latin1(env, "EnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
631 // Asynchronous function call
632 napi_create_async_work(env,
633 nullptr,
634 resourceName,
635 [](napi_env env, void *data) {
636 ANS_LOGI("EnableNotificationSlot napi_create_async_work start");
637 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
638 if (asynccallbackinfo) {
639 asynccallbackinfo->info.errorCode = NotificationHelper::SetEnabledForBundleSlot(
640 asynccallbackinfo->params.option, asynccallbackinfo->params.outType,
641 asynccallbackinfo->params.enable);
642 }
643 },
644 [](napi_env env, napi_status status, void *data) {
645 ANS_LOGI("EnableNotificationSlot napi_create_async_work end");
646 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
647 if (asynccallbackinfo) {
648 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
649 if (asynccallbackinfo->info.callback != nullptr) {
650 napi_delete_reference(env, asynccallbackinfo->info.callback);
651 }
652 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
653 delete asynccallbackinfo;
654 asynccallbackinfo = nullptr;
655 }
656 },
657 (void *)asynccallbackinfo,
658 &asynccallbackinfo->asyncWork);
659
660 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
661 if (asynccallbackinfo->info.isCallback) {
662 return Common::NapiGetNull(env);
663 } else {
664 return promise;
665 }
666 }
667
NapiIsEnableNotificationSlot(napi_env env,napi_callback_info info)668 napi_value NapiIsEnableNotificationSlot(napi_env env, napi_callback_info info)
669 {
670 ANS_LOGI("enter");
671 ParametersInfoIsEnableSlot params {};
672 if (ParseParametersIsEnableSlot(env, info, params) == nullptr) {
673 Common::NapiThrow(env, ERROR_PARAM_INVALID);
674 return Common::NapiGetUndefined(env);
675 }
676
677 AsyncCallbackInfoInfoIsEnableSlot *asynccallbackinfo =
678 new (std::nothrow) AsyncCallbackInfoInfoIsEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
679 if (!asynccallbackinfo) {
680 return Common::JSParaError(env, params.callback);
681 }
682 napi_value promise = nullptr;
683 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
684
685 napi_value resourceName = nullptr;
686 napi_create_string_latin1(env, "IsEnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
687 // Asynchronous function call
688 napi_create_async_work(env,
689 nullptr,
690 resourceName,
691 [](napi_env env, void *data) {
692 ANS_LOGI("IsEnableNotificationSlot napi_create_async_work start");
693 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
694 if (asynccallbackinfo) {
695 asynccallbackinfo->info.errorCode = NotificationHelper::GetEnabledForBundleSlot(
696 asynccallbackinfo->params.option, asynccallbackinfo->params.outType, asynccallbackinfo->isEnable);
697 }
698 },
699 [](napi_env env, napi_status status, void *data) {
700 ANS_LOGI("IsEnableNotificationSlot napi_create_async_work end");
701 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
702 if (asynccallbackinfo) {
703 napi_value result = nullptr;
704 napi_get_boolean(env, asynccallbackinfo->isEnable, &result);
705 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
706 if (asynccallbackinfo->info.callback != nullptr) {
707 napi_delete_reference(env, asynccallbackinfo->info.callback);
708 }
709 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
710 delete asynccallbackinfo;
711 asynccallbackinfo = nullptr;
712 }
713 },
714 (void *)asynccallbackinfo,
715 &asynccallbackinfo->asyncWork);
716
717 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
718 if (asynccallbackinfo->info.isCallback) {
719 return Common::NapiGetNull(env);
720 } else {
721 return promise;
722 }
723 }
724 } // namespace NotificationNapi
725 } // namespace OHOS