1 /*
2 * Copyright (c) 2021-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 "slot.h"
17
18 namespace OHOS {
19 namespace NotificationNapi {
20 const int32_t ADD_SLOT_MAX_PARA = 2;
21 const int32_t ADD_SLOTS_MAX_PARA = 2;
22 const int32_t SET_SLOT_AS_BUNDLE_MAX_PARA = 3;
23 const int32_t GET_SLOT_MAX_PARA = 2;
24 const int32_t GET_SLOT_NUM_AS_BUNDLE_MAX_PARA = 2;
25 const int32_t GET_SLOTS_AS_BUNDLE_MAX_PARA = 2;
26 const int32_t REMOVE_SLOT_MAX_PARA = 2;
27 const int32_t GET_ENABLE_SLOT_MAX_PARA = 3;
28 const int32_t SET_ENABLE_SLOT_MAX_PARA = 4;
29
30 struct ParametersInfoAddSlot {
31 NotificationSlot slot;
32 NotificationConstant::SlotType inType = NotificationConstant::SlotType::OTHER;
33 bool isAddSlotByType = false;
34 napi_ref callback = nullptr;
35 };
36
37 struct AsyncCallbackInfoAddSlot {
38 napi_env env = nullptr;
39 napi_async_work asyncWork = nullptr;
40 NotificationSlot slot;
41 NotificationConstant::SlotType inType = NotificationConstant::SlotType::OTHER;
42 bool isAddSlotByType = false;
43 CallbackPromiseInfo info;
44 };
45
46 struct ParametersInfoAddSlots {
47 std::vector<NotificationSlot> slots;
48 napi_ref callback = nullptr;
49 };
50
51 struct AsyncCallbackInfoAddSlots {
52 napi_env env = nullptr;
53 napi_async_work asyncWork = nullptr;
54 std::vector<NotificationSlot> slots;
55 CallbackPromiseInfo info;
56 };
57
58 struct ParametersInfoSetSlotByBundle {
59 NotificationBundleOption option;
60 std::vector<sptr<NotificationSlot>> slots;
61 napi_ref callback = nullptr;
62 };
63
64 struct AsyncCallbackInfoSetSlotByBundle {
65 napi_env env = nullptr;
66 napi_async_work asyncWork = nullptr;
67 ParametersInfoSetSlotByBundle params;
68 CallbackPromiseInfo info;
69 };
70
71 struct ParametersInfoGetSlot {
72 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
73 napi_ref callback = nullptr;
74 };
75
76 struct AsyncCallbackInfoGetSlot {
77 napi_env env = nullptr;
78 napi_async_work asyncWork = nullptr;
79 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
80 CallbackPromiseInfo info;
81 sptr<NotificationSlot> slot = nullptr;
82 };
83
84 struct ParametersInfoGetSlotNumByBundle {
85 NotificationBundleOption option;
86 napi_ref callback = nullptr;
87 };
88
89 struct AsyncCallbackInfoGetSlotNumByBundle {
90 napi_env env = nullptr;
91 napi_async_work asyncWork = nullptr;
92 ParametersInfoGetSlotNumByBundle params;
93 CallbackPromiseInfo info;
94 uint64_t num = 0;
95 };
96
97 struct AsyncCallbackInfoGetSlots {
98 napi_env env = nullptr;
99 napi_async_work asyncWork = nullptr;
100 CallbackPromiseInfo info;
101 std::vector<sptr<NotificationSlot>> slots;
102 };
103
104 struct ParametersInfoGetSlotsByBundle {
105 NotificationBundleOption option;
106 napi_ref callback = nullptr;
107 };
108
109 struct AsyncCallbackInfoGetSlotsByBundle {
110 napi_env env = nullptr;
111 napi_async_work asyncWork = nullptr;
112 ParametersInfoGetSlotsByBundle params;
113 CallbackPromiseInfo info;
114 std::vector<sptr<NotificationSlot>> slots;
115 };
116
117 struct ParametersInfoRemoveSlot {
118 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
119 napi_ref callback = nullptr;
120 };
121
122 struct AsyncCallbackInfoRemoveSlot {
123 napi_env env = nullptr;
124 napi_async_work asyncWork = nullptr;
125 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
126 CallbackPromiseInfo info;
127 };
128
129 struct AsyncCallbackInfoRemoveAllSlots {
130 napi_env env = nullptr;
131 napi_async_work asyncWork = nullptr;
132 CallbackPromiseInfo info;
133 };
134
135 struct ParametersInfoEnableSlot {
136 NotificationBundleOption option;
137 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
138 bool enable = false;
139 napi_ref callback = nullptr;
140 };
141
142 struct AsyncCallbackInfoInfoEnableSlot {
143 napi_env env = nullptr;
144 napi_async_work asyncWork = nullptr;
145 ParametersInfoEnableSlot params;
146 CallbackPromiseInfo info;
147 };
148
149 struct ParametersInfoIsEnableSlot {
150 NotificationBundleOption option;
151 NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
152 napi_ref callback = nullptr;
153 };
154
155 struct AsyncCallbackInfoInfoIsEnableSlot {
156 napi_env env = nullptr;
157 napi_async_work asyncWork = nullptr;
158 ParametersInfoIsEnableSlot params;
159 bool isEnable = false;
160 CallbackPromiseInfo info;
161 };
162
ParseParametersByAddSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoAddSlot & paras)163 napi_value ParseParametersByAddSlot(const napi_env &env, const napi_callback_info &info, ParametersInfoAddSlot ¶s)
164 {
165 ANS_LOGI("enter");
166 size_t argc = ADD_SLOT_MAX_PARA;
167 napi_value argv[ADD_SLOT_MAX_PARA] = {nullptr};
168 napi_value thisVar = nullptr;
169 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
170 if (argc < 1) {
171 ANS_LOGE("Wrong number of arguments");
172 return nullptr;
173 }
174
175 napi_valuetype valuetype = napi_undefined;
176 // argv[0]: NotificationSlot
177 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
178 if (valuetype != napi_object && valuetype != napi_number) {
179 ANS_LOGE("Wrong argument type. Object or number expected.");
180 return nullptr;
181 }
182 if (valuetype == napi_number) {
183 paras.isAddSlotByType = true;
184 int32_t slotType = 0;
185 napi_get_value_int32(env, argv[PARAM0], &slotType);
186 if (!Common::SlotTypeJSToC(SlotType(slotType), paras.inType)) {
187 return nullptr;
188 }
189 } else {
190 paras.isAddSlotByType = false;
191 if (!Common::GetNotificationSlot(env, argv[PARAM0], paras.slot)) {
192 return nullptr;
193 }
194 }
195
196 // argv[1]:callback
197 if (argc >= ADD_SLOT_MAX_PARA) {
198 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
199 if (valuetype != napi_function) {
200 ANS_LOGE("Wrong argument type. Function expected.");
201 return nullptr;
202 }
203 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
204 }
205 return Common::NapiGetNull(env);
206 }
207
ParseParametersByAddSlots(const napi_env & env,const napi_callback_info & info,ParametersInfoAddSlots & paras)208 napi_value ParseParametersByAddSlots(const napi_env &env, const napi_callback_info &info, ParametersInfoAddSlots ¶s)
209 {
210 ANS_LOGI("enter");
211 size_t argc = ADD_SLOTS_MAX_PARA;
212 napi_value argv[ADD_SLOTS_MAX_PARA] = {nullptr};
213 napi_value thisVar = nullptr;
214 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
215 if (argc < 1) {
216 ANS_LOGE("Wrong number of arguments");
217 return nullptr;
218 }
219
220 napi_valuetype valuetype = napi_undefined;
221 // argv[0]: Array<NotificationSlot>
222 bool isArray = false;
223 napi_is_array(env, argv[PARAM0], &isArray);
224 if (!isArray) {
225 ANS_LOGE("Wrong argument type. Array expected.");
226 return nullptr;
227 }
228 uint32_t length = 0;
229 napi_get_array_length(env, argv[PARAM0], &length);
230 if (length == 0) {
231 ANS_LOGE("The array is empty.");
232 return nullptr;
233 }
234 for (size_t i = 0; i < length; i++) {
235 napi_value nSlot = nullptr;
236 napi_get_element(env, argv[PARAM0], i, &nSlot);
237 NAPI_CALL(env, napi_typeof(env, nSlot, &valuetype));
238 if (valuetype != napi_object) {
239 ANS_LOGE("Wrong argument type. Object expected.");
240 return nullptr;
241 }
242 NotificationSlot slot;
243 if (!Common::GetNotificationSlot(env, nSlot, slot)) {
244 return nullptr;
245 }
246 paras.slots.emplace_back(slot);
247 }
248
249 // argv[1]:callback
250 if (argc >= ADD_SLOTS_MAX_PARA) {
251 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
252 if (valuetype != napi_function) {
253 ANS_LOGE("Wrong argument type. Function expected.");
254 return nullptr;
255 }
256 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
257 }
258 return Common::NapiGetNull(env);
259 }
260
ParseParametersSetSlotByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoSetSlotByBundle & params)261 napi_value ParseParametersSetSlotByBundle(
262 const napi_env &env, const napi_callback_info &info, ParametersInfoSetSlotByBundle ¶ms)
263 {
264 ANS_LOGI("enter");
265
266 size_t argc = SET_SLOT_AS_BUNDLE_MAX_PARA;
267 napi_value argv[SET_SLOT_AS_BUNDLE_MAX_PARA] = {nullptr};
268 napi_value thisVar = nullptr;
269 napi_valuetype valuetype = napi_undefined;
270 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
271 if (argc < SET_SLOT_AS_BUNDLE_MAX_PARA - 1) {
272 ANS_LOGE("Wrong number of arguments");
273 return nullptr;
274 }
275
276 // argv[0]: bundle
277 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
278 if (valuetype != napi_object) {
279 ANS_LOGE("Wrong argument type. Object expected.");
280 return nullptr;
281 }
282 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
283 if (retValue == nullptr) {
284 ANS_LOGE("GetBundleOption failed.");
285 return nullptr;
286 }
287
288 // argv[1]: slot
289 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
290 if (valuetype != napi_object) {
291 ANS_LOGE("Wrong argument type. Object expected.");
292 return nullptr;
293 }
294 NotificationSlot slot;
295 if (!Common::GetNotificationSlot(env, argv[PARAM1], slot)) {
296 return nullptr;
297 }
298 std::vector<NotificationSlot> slots;
299 slots.emplace_back(slot);
300
301 for (auto vec : slots) {
302 sptr<NotificationSlot> slotPtr = new (std::nothrow) NotificationSlot(vec);
303 if (slotPtr == nullptr) {
304 ANS_LOGE("Failed to create NotificationSlot ptr");
305 return nullptr;
306 }
307 params.slots.emplace_back(slotPtr);
308 }
309
310 // argv[2]:callback
311 if (argc >= SET_SLOT_AS_BUNDLE_MAX_PARA) {
312 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
313 if (valuetype != napi_function) {
314 ANS_LOGE("Wrong argument type. Function expected.");
315 return nullptr;
316 }
317 napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback);
318 }
319
320 return Common::NapiGetNull(env);
321 }
322
ParseParametersByGetSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlot & paras)323 napi_value ParseParametersByGetSlot(const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlot ¶s)
324 {
325 ANS_LOGI("enter");
326 size_t argc = GET_SLOT_MAX_PARA;
327 napi_value argv[GET_SLOT_MAX_PARA] = {nullptr};
328 napi_value thisVar = nullptr;
329 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
330 if (argc < 1) {
331 ANS_LOGE("Wrong number of arguments");
332 return nullptr;
333 }
334
335 napi_valuetype valuetype = napi_undefined;
336 // argv[0]: SlotType
337 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
338 if (valuetype != napi_number) {
339 ANS_LOGE("Wrong argument type. Number expected.");
340 return nullptr;
341 }
342 int32_t slotType = 0;
343 napi_get_value_int32(env, argv[PARAM0], &slotType);
344 if (!Common::SlotTypeJSToC(SlotType(slotType), paras.outType)) {
345 return nullptr;
346 }
347
348 // argv[1]:callback
349 if (argc >= GET_SLOT_MAX_PARA) {
350 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
351 if (valuetype != napi_function) {
352 ANS_LOGE("Wrong argument type. Function expected.");
353 return nullptr;
354 }
355 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
356 }
357 return Common::NapiGetNull(env);
358 }
359
ParseParametersGetSlotNumByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlotNumByBundle & params)360 napi_value ParseParametersGetSlotNumByBundle(
361 const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlotNumByBundle ¶ms)
362 {
363 ANS_LOGI("enter");
364
365 size_t argc = GET_SLOT_NUM_AS_BUNDLE_MAX_PARA;
366 napi_value argv[GET_SLOT_NUM_AS_BUNDLE_MAX_PARA] = {nullptr};
367 napi_value thisVar = nullptr;
368 napi_valuetype valuetype = napi_undefined;
369 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
370 if (argc < GET_SLOT_NUM_AS_BUNDLE_MAX_PARA - 1) {
371 ANS_LOGE("Wrong number of arguments");
372 return nullptr;
373 }
374
375 // argv[0]: bundle
376 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
377 if (valuetype != napi_object) {
378 ANS_LOGE("Wrong argument type. Object expected.");
379 return nullptr;
380 }
381 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
382 if (retValue == nullptr) {
383 ANS_LOGE("GetBundleOption failed.");
384 return nullptr;
385 }
386
387 // argv[1]:callback
388 if (argc >= GET_SLOT_NUM_AS_BUNDLE_MAX_PARA) {
389 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
390 if (valuetype != napi_function) {
391 ANS_LOGE("Wrong argument type. Function expected.");
392 return nullptr;
393 }
394 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
395 }
396
397 return Common::NapiGetNull(env);
398 }
399
ParseParametersGetSlotsByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlotsByBundle & params)400 napi_value ParseParametersGetSlotsByBundle(
401 const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlotsByBundle ¶ms)
402 {
403 ANS_LOGI("enter");
404
405 size_t argc = GET_SLOTS_AS_BUNDLE_MAX_PARA;
406 napi_value argv[GET_SLOTS_AS_BUNDLE_MAX_PARA] = {nullptr};
407 napi_value thisVar = nullptr;
408 napi_valuetype valuetype = napi_undefined;
409 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
410 if (argc < GET_SLOTS_AS_BUNDLE_MAX_PARA - 1) {
411 ANS_LOGE("Wrong number of arguments");
412 return nullptr;
413 }
414
415 // argv[0]: bundle
416 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
417 if (valuetype != napi_object) {
418 ANS_LOGE("Wrong argument type. Object expected.");
419 return nullptr;
420 }
421 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
422 if (retValue == nullptr) {
423 ANS_LOGE("GetBundleOption failed.");
424 return nullptr;
425 }
426
427 // argv[1]:callback
428 if (argc >= GET_SLOTS_AS_BUNDLE_MAX_PARA) {
429 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
430 if (valuetype != napi_function) {
431 ANS_LOGE("Wrong argument type. Function expected.");
432 return nullptr;
433 }
434 napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback);
435 }
436
437 return Common::NapiGetNull(env);
438 }
439
ParseParametersByRemoveSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoRemoveSlot & paras)440 napi_value ParseParametersByRemoveSlot(
441 const napi_env &env, const napi_callback_info &info, ParametersInfoRemoveSlot ¶s)
442 {
443 ANS_LOGI("enter");
444 size_t argc = REMOVE_SLOT_MAX_PARA;
445 napi_value argv[REMOVE_SLOT_MAX_PARA] = {nullptr};
446 napi_value thisVar = nullptr;
447 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
448 if (argc < 1) {
449 ANS_LOGE("Wrong number of arguments");
450 return nullptr;
451 }
452
453 napi_valuetype valuetype = napi_undefined;
454 // argv[0]: SlotType
455 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
456 if (valuetype != napi_number) {
457 ANS_LOGE("Wrong argument type. Number expected.");
458 return nullptr;
459 }
460 int32_t slotType = 0;
461 napi_get_value_int32(env, argv[PARAM0], &slotType);
462 if (!Common::SlotTypeJSToC(SlotType(slotType), paras.outType)) {
463 return nullptr;
464 }
465
466 // argv[1]:callback
467 if (argc >= REMOVE_SLOT_MAX_PARA) {
468 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
469 if (valuetype != napi_function) {
470 ANS_LOGE("Wrong argument type. Function expected.");
471 return nullptr;
472 }
473 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
474 }
475 return Common::NapiGetNull(env);
476 }
477
AddSlot(napi_env env,napi_callback_info info)478 napi_value AddSlot(napi_env env, napi_callback_info info)
479 {
480 ANS_LOGI("enter");
481
482 ParametersInfoAddSlot paras;
483 if (ParseParametersByAddSlot(env, info, paras) == nullptr) {
484 return Common::NapiGetUndefined(env);
485 }
486
487 AsyncCallbackInfoAddSlot *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoAddSlot {
488 .env = env,
489 .asyncWork = nullptr,
490 .slot = paras.slot,
491 .inType = paras.inType,
492 .isAddSlotByType = paras.isAddSlotByType
493 };
494 if (!asynccallbackinfo) {
495 return Common::JSParaError(env, paras.callback);
496 }
497 napi_value promise = nullptr;
498 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
499
500 napi_value resourceName = nullptr;
501 napi_create_string_latin1(env, "addSlot", NAPI_AUTO_LENGTH, &resourceName);
502 // Asynchronous function call
503 napi_create_async_work(env,
504 nullptr,
505 resourceName,
506 [](napi_env env, void *data) {
507 ANS_LOGI("AddSlot napi_create_async_work start");
508 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
509 if (asynccallbackinfo) {
510 if (asynccallbackinfo->isAddSlotByType) {
511 asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
512 } else {
513 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlot(
514 asynccallbackinfo->slot);
515 }
516 }
517 },
518 [](napi_env env, napi_status status, void *data) {
519 ANS_LOGI("AddSlot napi_create_async_work end");
520 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
521 if (asynccallbackinfo) {
522 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
523 if (asynccallbackinfo->info.callback != nullptr) {
524 napi_delete_reference(env, asynccallbackinfo->info.callback);
525 }
526 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
527 delete asynccallbackinfo;
528 asynccallbackinfo = nullptr;
529 }
530 },
531 (void *)asynccallbackinfo,
532 &asynccallbackinfo->asyncWork);
533
534 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
535
536 if (asynccallbackinfo->info.isCallback) {
537 return Common::NapiGetNull(env);
538 } else {
539 return promise;
540 }
541 }
542
AddSlots(napi_env env,napi_callback_info info)543 napi_value AddSlots(napi_env env, napi_callback_info info)
544 {
545 ANS_LOGI("enter");
546
547 ParametersInfoAddSlots paras;
548 if (ParseParametersByAddSlots(env, info, paras) == nullptr) {
549 return Common::NapiGetUndefined(env);
550 }
551
552 AsyncCallbackInfoAddSlots *asynccallbackinfo =
553 new (std::nothrow) AsyncCallbackInfoAddSlots {.env = env, .asyncWork = nullptr, .slots = paras.slots};
554 if (!asynccallbackinfo) {
555 return Common::JSParaError(env, paras.callback);
556 }
557 napi_value promise = nullptr;
558 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
559
560 napi_value resourceName = nullptr;
561 napi_create_string_latin1(env, "addSlots", NAPI_AUTO_LENGTH, &resourceName);
562 // Asynchronous function call
563 napi_create_async_work(env,
564 nullptr,
565 resourceName,
566 [](napi_env env, void *data) {
567 ANS_LOGI("AddSlots napi_create_async_work start");
568 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
569 if (asynccallbackinfo) {
570 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlots(asynccallbackinfo->slots);
571 }
572 },
573 [](napi_env env, napi_status status, void *data) {
574 ANS_LOGI("AddSlots napi_create_async_work end");
575 auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
576 if (asynccallbackinfo) {
577 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
578 if (asynccallbackinfo->info.callback != nullptr) {
579 napi_delete_reference(env, asynccallbackinfo->info.callback);
580 }
581 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
582 delete asynccallbackinfo;
583 asynccallbackinfo = nullptr;
584 }
585 },
586 (void *)asynccallbackinfo,
587 &asynccallbackinfo->asyncWork);
588
589 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
590
591 if (asynccallbackinfo->info.isCallback) {
592 return Common::NapiGetNull(env);
593 } else {
594 return promise;
595 }
596 }
597
SetSlotByBundle(napi_env env,napi_callback_info info)598 napi_value SetSlotByBundle(napi_env env, napi_callback_info info)
599 {
600 ANS_LOGI("enter");
601
602 ParametersInfoSetSlotByBundle params {};
603 if (ParseParametersSetSlotByBundle(env, info, params) == nullptr) {
604 return Common::NapiGetUndefined(env);
605 }
606
607 AsyncCallbackInfoSetSlotByBundle *asynccallbackinfo =
608 new (std::nothrow) AsyncCallbackInfoSetSlotByBundle {.env = env, .asyncWork = nullptr, .params = params};
609 if (!asynccallbackinfo) {
610 return Common::JSParaError(env, params.callback);
611 }
612 napi_value promise = nullptr;
613 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
614
615 napi_value resourceName = nullptr;
616 napi_create_string_latin1(env, "setSlotByBundle", NAPI_AUTO_LENGTH, &resourceName);
617 // Asynchronous function call
618 napi_create_async_work(env,
619 nullptr,
620 resourceName,
621 [](napi_env env, void *data) {
622 ANS_LOGI("SetSlotByBundle napi_create_async_work start");
623 auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
624 if (asynccallbackinfo) {
625 asynccallbackinfo->info.errorCode = NotificationHelper::UpdateNotificationSlots(
626 asynccallbackinfo->params.option, asynccallbackinfo->params.slots);
627 }
628 },
629 [](napi_env env, napi_status status, void *data) {
630 ANS_LOGI("SetSlotByBundle napi_create_async_work end");
631 auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
632 if (asynccallbackinfo) {
633 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
634 if (asynccallbackinfo->info.callback != nullptr) {
635 napi_delete_reference(env, asynccallbackinfo->info.callback);
636 }
637 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
638 delete asynccallbackinfo;
639 asynccallbackinfo = nullptr;
640 }
641 },
642 (void *)asynccallbackinfo,
643 &asynccallbackinfo->asyncWork);
644
645 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
646
647 if (asynccallbackinfo->info.isCallback) {
648 return Common::NapiGetNull(env);
649 } else {
650 return promise;
651 }
652 }
653
654
AsyncCompleteCallbackGetSlot(napi_env env,napi_status status,void * data)655 void AsyncCompleteCallbackGetSlot(napi_env env, napi_status status, void *data)
656 {
657 ANS_LOGI("GetSlot napi_create_async_work end");
658
659 if (!data) {
660 ANS_LOGE("Invalid async callback data");
661 return;
662 }
663
664 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
665 if (asynccallbackinfo) {
666 napi_value result = Common::NapiGetNull(env);
667 if (asynccallbackinfo->info.errorCode == ERR_OK) {
668 if (asynccallbackinfo->slot != nullptr) {
669 napi_create_object(env, &result);
670 if (!Common::SetNotificationSlot(env, *asynccallbackinfo->slot, result)) {
671 asynccallbackinfo->info.errorCode = ERROR;
672 result = Common::NapiGetNull(env);
673 }
674 }
675 }
676 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
677 if (asynccallbackinfo->info.callback != nullptr) {
678 napi_delete_reference(env, asynccallbackinfo->info.callback);
679 }
680 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
681 delete asynccallbackinfo;
682 asynccallbackinfo = nullptr;
683 }
684 }
685
GetSlot(napi_env env,napi_callback_info info)686 napi_value GetSlot(napi_env env, napi_callback_info info)
687 {
688 ANS_LOGI("enter");
689
690 ParametersInfoGetSlot paras;
691 if (ParseParametersByGetSlot(env, info, paras) == nullptr) {
692 return Common::NapiGetUndefined(env);
693 }
694
695 AsyncCallbackInfoGetSlot *asynccallbackinfo =
696 new (std::nothrow) AsyncCallbackInfoGetSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
697 if (!asynccallbackinfo) {
698 return Common::JSParaError(env, paras.callback);
699 }
700 napi_value promise = nullptr;
701 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
702
703 napi_value resourceName = nullptr;
704 napi_create_string_latin1(env, "getSlot", NAPI_AUTO_LENGTH, &resourceName);
705 // Asynchronous function call
706 napi_create_async_work(env,
707 nullptr,
708 resourceName,
709 [](napi_env env, void *data) {
710 ANS_LOGI("GetSlot napi_create_async_work start");
711 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
712 if (asynccallbackinfo) {
713 asynccallbackinfo->info.errorCode =
714 NotificationHelper::GetNotificationSlot(asynccallbackinfo->outType, asynccallbackinfo->slot);
715 }
716 },
717 AsyncCompleteCallbackGetSlot,
718 (void *)asynccallbackinfo,
719 &asynccallbackinfo->asyncWork);
720
721 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
722
723 if (asynccallbackinfo->info.isCallback) {
724 return Common::NapiGetNull(env);
725 } else {
726 return promise;
727 }
728 }
729
GetSlotNumByBundle(napi_env env,napi_callback_info info)730 napi_value GetSlotNumByBundle(napi_env env, napi_callback_info info)
731 {
732 ANS_LOGI("enter");
733
734 ParametersInfoGetSlotNumByBundle params {};
735 if (ParseParametersGetSlotNumByBundle(env, info, params) == nullptr) {
736 return Common::NapiGetUndefined(env);
737 }
738
739 AsyncCallbackInfoGetSlotNumByBundle *asynccallbackinfo =
740 new (std::nothrow) AsyncCallbackInfoGetSlotNumByBundle {.env = env, .asyncWork = nullptr, .params = params};
741 if (!asynccallbackinfo) {
742 return Common::JSParaError(env, params.callback);
743 }
744 napi_value promise = nullptr;
745 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
746
747 napi_value resourceName = nullptr;
748 napi_create_string_latin1(env, "getSlotNumByBundle", NAPI_AUTO_LENGTH, &resourceName);
749 // Asynchronous function call
750 napi_create_async_work(env,
751 nullptr,
752 resourceName,
753 [](napi_env env, void *data) {
754 ANS_LOGI("GetSlotNumByBundle napi_create_async_work start");
755 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
756 if (asynccallbackinfo) {
757 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotNumAsBundle(
758 asynccallbackinfo->params.option, asynccallbackinfo->num);
759 }
760 },
761 [](napi_env env, napi_status status, void *data) {
762 ANS_LOGI("GetSlotNumByBundle napi_create_async_work end");
763 auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
764 if (asynccallbackinfo) {
765 napi_value result = nullptr;
766 napi_create_uint32(env, asynccallbackinfo->num, &result);
767 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
768 if (asynccallbackinfo->info.callback != nullptr) {
769 napi_delete_reference(env, asynccallbackinfo->info.callback);
770 }
771 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
772 delete asynccallbackinfo;
773 asynccallbackinfo = nullptr;
774 }
775 },
776 (void *)asynccallbackinfo,
777 &asynccallbackinfo->asyncWork);
778
779 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
780
781 if (asynccallbackinfo->info.isCallback) {
782 return Common::NapiGetNull(env);
783 } else {
784 return promise;
785 }
786 }
787
AsyncCompleteCallbackGetSlots(napi_env env,napi_status status,void * data)788 void AsyncCompleteCallbackGetSlots(napi_env env, napi_status status, void *data)
789 {
790 ANS_LOGI("enter");
791 if (!data) {
792 ANS_LOGE("Invalid async callback data");
793 return;
794 }
795 napi_value result = nullptr;
796 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
797 if (asynccallbackinfo) {
798 if (asynccallbackinfo->info.errorCode != ERR_OK) {
799 result = Common::NapiGetNull(env);
800 } else {
801 napi_value arr = nullptr;
802 napi_create_array(env, &arr);
803 size_t count = 0;
804 for (auto vec : asynccallbackinfo->slots) {
805 if (!vec) {
806 ANS_LOGW("Invalid NotificationSlot object ptr");
807 continue;
808 }
809 napi_value nSlot = nullptr;
810 napi_create_object(env, &nSlot);
811 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
812 continue;
813 }
814 napi_set_element(env, arr, count, nSlot);
815 count++;
816 }
817 ANS_LOGI("getSlots count = %{public}zu", count);
818 result = arr;
819 if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
820 asynccallbackinfo->info.errorCode = ERROR;
821 result = Common::NapiGetNull(env);
822 }
823 }
824 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
825 if (asynccallbackinfo->info.callback != nullptr) {
826 napi_delete_reference(env, asynccallbackinfo->info.callback);
827 }
828 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
829 delete asynccallbackinfo;
830 asynccallbackinfo = nullptr;
831 }
832 }
833
GetSlots(napi_env env,napi_callback_info info)834 napi_value GetSlots(napi_env env, napi_callback_info info)
835 {
836 ANS_LOGI("enter");
837
838 napi_ref callback = nullptr;
839 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
840 return Common::NapiGetUndefined(env);
841 }
842
843 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetSlots {.env = env, .asyncWork = nullptr};
844 if (!asynccallbackinfo) {
845 return Common::JSParaError(env, callback);
846 }
847 napi_value promise = nullptr;
848 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
849
850 napi_value resourceName = nullptr;
851 napi_create_string_latin1(env, "getSlots", NAPI_AUTO_LENGTH, &resourceName);
852 // Asynchronous function call
853 napi_create_async_work(env,
854 nullptr,
855 resourceName,
856 [](napi_env env, void *data) {
857 ANS_LOGI("GetSlots napi_create_async_work start");
858 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
859 if (asynccallbackinfo) {
860 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlots(asynccallbackinfo->slots);
861 }
862 },
863 AsyncCompleteCallbackGetSlots,
864 (void *)asynccallbackinfo,
865 &asynccallbackinfo->asyncWork);
866
867 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
868
869 if (asynccallbackinfo->info.isCallback) {
870 return Common::NapiGetNull(env);
871 } else {
872 return promise;
873 }
874 }
875
AsyncCompleteCallbackGetSlotsByBundle(napi_env env,napi_status status,void * data)876 void AsyncCompleteCallbackGetSlotsByBundle(napi_env env, napi_status status, void *data)
877 {
878 ANS_LOGI("enter");
879 if (!data) {
880 ANS_LOGE("Invalid async callback data");
881 return;
882 }
883 napi_value result = nullptr;
884 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
885 if (asynccallbackinfo) {
886 if (asynccallbackinfo->info.errorCode != ERR_OK) {
887 result = Common::NapiGetNull(env);
888 } else {
889 napi_value arr = nullptr;
890 napi_create_array(env, &arr);
891 size_t count = 0;
892 for (auto vec : asynccallbackinfo->slots) {
893 if (!vec) {
894 ANS_LOGW("Invalid NotificationSlot object ptr");
895 continue;
896 }
897 napi_value nSlot = nullptr;
898 napi_create_object(env, &nSlot);
899 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
900 continue;
901 }
902 napi_set_element(env, arr, count, nSlot);
903 count++;
904 }
905 ANS_LOGI("getSlots count = %{public}zu", count);
906 result = arr;
907 if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
908 asynccallbackinfo->info.errorCode = ERROR;
909 result = Common::NapiGetNull(env);
910 }
911 }
912 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
913 if (asynccallbackinfo->info.callback != nullptr) {
914 napi_delete_reference(env, asynccallbackinfo->info.callback);
915 }
916 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
917 delete asynccallbackinfo;
918 asynccallbackinfo = nullptr;
919 }
920 }
921
GetSlotsByBundle(napi_env env,napi_callback_info info)922 napi_value GetSlotsByBundle(napi_env env, napi_callback_info info)
923 {
924 ANS_LOGI("enter");
925
926 ParametersInfoGetSlotsByBundle params {};
927 if (ParseParametersGetSlotsByBundle(env, info, params) == nullptr) {
928 return Common::NapiGetUndefined(env);
929 }
930
931 AsyncCallbackInfoGetSlotsByBundle *asynccallbackinfo =
932 new (std::nothrow) AsyncCallbackInfoGetSlotsByBundle {.env = env, .asyncWork = nullptr, .params = params};
933 if (!asynccallbackinfo) {
934 return Common::JSParaError(env, params.callback);
935 }
936 napi_value promise = nullptr;
937 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
938
939 napi_value resourceName = nullptr;
940 napi_create_string_latin1(env, "getSlotsByBundle", NAPI_AUTO_LENGTH, &resourceName);
941 // Asynchronous function call
942 napi_create_async_work(env,
943 nullptr,
944 resourceName,
945 [](napi_env env, void *data) {
946 ANS_LOGI("GetSlotsByBundle napi_create_async_work start");
947 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
948 if (asynccallbackinfo) {
949 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotsForBundle(
950 asynccallbackinfo->params.option, asynccallbackinfo->slots);
951 }
952 },
953 AsyncCompleteCallbackGetSlotsByBundle,
954 (void *)asynccallbackinfo,
955 &asynccallbackinfo->asyncWork);
956
957 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
958
959 if (asynccallbackinfo->info.isCallback) {
960 return Common::NapiGetNull(env);
961 } else {
962 return promise;
963 }
964 }
965
RemoveSlot(napi_env env,napi_callback_info info)966 napi_value RemoveSlot(napi_env env, napi_callback_info info)
967 {
968 ANS_LOGI("enter");
969
970 ParametersInfoRemoveSlot paras;
971 if (ParseParametersByRemoveSlot(env, info, paras) == nullptr) {
972 return Common::NapiGetUndefined(env);
973 }
974
975 AsyncCallbackInfoRemoveSlot *asynccallbackinfo =
976 new (std::nothrow) AsyncCallbackInfoRemoveSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
977 if (!asynccallbackinfo) {
978 return Common::JSParaError(env, paras.callback);
979 }
980 napi_value promise = nullptr;
981 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
982
983 napi_value resourceName = nullptr;
984 napi_create_string_latin1(env, "removeSlot", NAPI_AUTO_LENGTH, &resourceName);
985 // Asynchronous function call
986 napi_create_async_work(env,
987 nullptr,
988 resourceName,
989 [](napi_env env, void *data) {
990 ANS_LOGI("removeSlot napi_create_async_work start");
991 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
992 if (asynccallbackinfo) {
993 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveNotificationSlot(
994 asynccallbackinfo->outType);
995 }
996 },
997 [](napi_env env, napi_status status, void *data) {
998 ANS_LOGI("removeSlot napi_create_async_work end");
999 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
1000 if (asynccallbackinfo) {
1001 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1002 if (asynccallbackinfo->info.callback != nullptr) {
1003 napi_delete_reference(env, asynccallbackinfo->info.callback);
1004 }
1005 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1006 delete asynccallbackinfo;
1007 asynccallbackinfo = nullptr;
1008 }
1009 },
1010 (void *)asynccallbackinfo,
1011 &asynccallbackinfo->asyncWork);
1012
1013 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1014
1015 if (asynccallbackinfo->info.isCallback) {
1016 return Common::NapiGetNull(env);
1017 } else {
1018 return promise;
1019 }
1020 }
1021
RemoveAllSlots(napi_env env,napi_callback_info info)1022 napi_value RemoveAllSlots(napi_env env, napi_callback_info info)
1023 {
1024 ANS_LOGI("enter");
1025
1026 napi_ref callback = nullptr;
1027 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
1028 return Common::NapiGetUndefined(env);
1029 }
1030
1031 auto *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoRemoveAllSlots {.env = env, .asyncWork = nullptr};
1032 if (!asynccallbackinfo) {
1033 return Common::JSParaError(env, callback);
1034 }
1035 napi_value promise = nullptr;
1036 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
1037
1038 napi_value resourceName = nullptr;
1039 napi_create_string_latin1(env, "removeAll", NAPI_AUTO_LENGTH, &resourceName);
1040 // Asynchronous function call
1041 napi_create_async_work(env,
1042 nullptr,
1043 resourceName,
1044 [](napi_env env, void *data) {
1045 ANS_LOGI("RemoveAllSlots napi_create_async_work start");
1046 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
1047 if (asynccallbackinfo) {
1048 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveAllSlots();
1049 }
1050 },
1051 [](napi_env env, napi_status status, void *data) {
1052 ANS_LOGI("RemoveAllSlots napi_create_async_work end");
1053 auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
1054 if (asynccallbackinfo) {
1055 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1056 if (asynccallbackinfo->info.callback != nullptr) {
1057 napi_delete_reference(env, asynccallbackinfo->info.callback);
1058 }
1059 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1060 delete asynccallbackinfo;
1061 asynccallbackinfo = nullptr;
1062 }
1063 },
1064 (void *)asynccallbackinfo,
1065 &asynccallbackinfo->asyncWork);
1066
1067 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1068
1069 if (asynccallbackinfo->info.isCallback) {
1070 return Common::NapiGetNull(env);
1071 } else {
1072 return promise;
1073 }
1074 }
1075
ParseParametersEnableSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoEnableSlot & params)1076 napi_value ParseParametersEnableSlot(
1077 const napi_env &env, const napi_callback_info &info, ParametersInfoEnableSlot ¶ms)
1078 {
1079 ANS_LOGI("enter");
1080
1081 size_t argc = SET_ENABLE_SLOT_MAX_PARA;
1082 napi_value argv[SET_ENABLE_SLOT_MAX_PARA] = {nullptr};
1083 napi_value thisVar = nullptr;
1084 napi_valuetype valuetype = napi_undefined;
1085 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1086 if (argc < SET_ENABLE_SLOT_MAX_PARA - 1) {
1087 ANS_LOGW("Wrong number of arguments.");
1088 return nullptr;
1089 }
1090
1091 // argv[0]: bundle
1092 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
1093 if (valuetype != napi_object) {
1094 ANS_LOGW("Wrong argument type. Object expected.");
1095 return nullptr;
1096 }
1097 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
1098 if (retValue == nullptr) {
1099 ANS_LOGE("GetBundleOption failed.");
1100 return nullptr;
1101 }
1102
1103 // argv[1]: SlotType
1104 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
1105 if (valuetype != napi_number) {
1106 ANS_LOGW("Wrong argument type. Number expected.");
1107 return nullptr;
1108 }
1109 int slotType = 0;
1110 napi_get_value_int32(env, argv[PARAM1], &slotType);
1111 if (!Common::SlotTypeJSToC(SlotType(slotType), params.outType)) {
1112 return nullptr;
1113 }
1114
1115 // argv[2]: enable
1116 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
1117 if (valuetype != napi_boolean) {
1118 ANS_LOGW("Wrong argument type. Bool expected.");
1119 return nullptr;
1120 }
1121 napi_get_value_bool(env, argv[PARAM2], ¶ms.enable);
1122
1123 // argv[3]:callback
1124 if (argc >= SET_ENABLE_SLOT_MAX_PARA) {
1125 NAPI_CALL(env, napi_typeof(env, argv[PARAM3], &valuetype));
1126 if (valuetype != napi_function) {
1127 ANS_LOGW("Wrong argument type. Function expected.");
1128 return nullptr;
1129 }
1130 napi_create_reference(env, argv[PARAM3], 1, ¶ms.callback);
1131 }
1132
1133 return Common::NapiGetNull(env);
1134 }
1135
EnableNotificationSlot(napi_env env,napi_callback_info info)1136 napi_value EnableNotificationSlot(napi_env env, napi_callback_info info)
1137 {
1138 ANS_LOGI("enter");
1139
1140 ParametersInfoEnableSlot params {};
1141 if (ParseParametersEnableSlot(env, info, params) == nullptr) {
1142 return Common::NapiGetUndefined(env);
1143 }
1144
1145 AsyncCallbackInfoInfoEnableSlot *asynccallbackinfo =
1146 new (std::nothrow) AsyncCallbackInfoInfoEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
1147 if (!asynccallbackinfo) {
1148 return Common::JSParaError(env, params.callback);
1149 }
1150 napi_value promise = nullptr;
1151 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1152
1153 napi_value resourceName = nullptr;
1154 napi_create_string_latin1(env, "EnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
1155 // Asynchronous function call
1156 napi_create_async_work(env,
1157 nullptr,
1158 resourceName,
1159 [](napi_env env, void *data) {
1160 ANS_LOGI("EnableNotificationSlot napi_create_async_work start");
1161 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
1162 if (asynccallbackinfo) {
1163 asynccallbackinfo->info.errorCode = NotificationHelper::SetEnabledForBundleSlot(
1164 asynccallbackinfo->params.option, asynccallbackinfo->params.outType,
1165 asynccallbackinfo->params.enable);
1166 }
1167 },
1168 [](napi_env env, napi_status status, void *data) {
1169 ANS_LOGI("EnableNotificationSlot napi_create_async_work end");
1170 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
1171 if (asynccallbackinfo) {
1172 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1173 if (asynccallbackinfo->info.callback != nullptr) {
1174 napi_delete_reference(env, asynccallbackinfo->info.callback);
1175 }
1176 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1177 delete asynccallbackinfo;
1178 asynccallbackinfo = nullptr;
1179 }
1180 },
1181 (void *)asynccallbackinfo,
1182 &asynccallbackinfo->asyncWork);
1183
1184 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1185
1186 if (asynccallbackinfo->info.isCallback) {
1187 return Common::NapiGetNull(env);
1188 } else {
1189 return promise;
1190 }
1191 }
1192
ParseParametersIsEnableSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoIsEnableSlot & params)1193 napi_value ParseParametersIsEnableSlot(
1194 const napi_env &env, const napi_callback_info &info, ParametersInfoIsEnableSlot ¶ms)
1195 {
1196 ANS_LOGI("enter");
1197
1198 size_t argc = GET_ENABLE_SLOT_MAX_PARA;
1199 napi_value argv[GET_ENABLE_SLOT_MAX_PARA] = {nullptr};
1200 napi_value thisVar = nullptr;
1201 napi_valuetype valuetype = napi_undefined;
1202 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1203 if (argc < GET_ENABLE_SLOT_MAX_PARA - 1) {
1204 ANS_LOGW("Wrong number of arguments.");
1205 return nullptr;
1206 }
1207
1208 // argv[0]: bundle
1209 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
1210 if (valuetype != napi_object) {
1211 ANS_LOGW("Wrong argument type. Object expected.");
1212 return nullptr;
1213 }
1214 auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
1215 if (retValue == nullptr) {
1216 ANS_LOGE("GetBundleOption failed.");
1217 return nullptr;
1218 }
1219
1220 // argv[1]: SlotType
1221 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
1222 if (valuetype != napi_number) {
1223 ANS_LOGW("Wrong argument type. Number expected.");
1224 return nullptr;
1225 }
1226 int slotType = 0;
1227 napi_get_value_int32(env, argv[PARAM1], &slotType);
1228 if (!Common::SlotTypeJSToC(SlotType(slotType), params.outType)) {
1229 return nullptr;
1230 }
1231
1232 // argv[2]:callback
1233 if (argc >= GET_ENABLE_SLOT_MAX_PARA) {
1234 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
1235 if (valuetype != napi_function) {
1236 ANS_LOGW("Wrong argument type. Function expected.");
1237 return nullptr;
1238 }
1239 napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback);
1240 }
1241
1242 return Common::NapiGetNull(env);
1243 }
1244
IsEnableNotificationSlot(napi_env env,napi_callback_info info)1245 napi_value IsEnableNotificationSlot(napi_env env, napi_callback_info info)
1246 {
1247 ANS_LOGI("enter");
1248
1249 ParametersInfoIsEnableSlot params {};
1250 if (ParseParametersIsEnableSlot(env, info, params) == nullptr) {
1251 return Common::NapiGetUndefined(env);
1252 }
1253
1254 AsyncCallbackInfoInfoIsEnableSlot *asynccallbackinfo =
1255 new (std::nothrow) AsyncCallbackInfoInfoIsEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
1256 if (!asynccallbackinfo) {
1257 return Common::JSParaError(env, params.callback);
1258 }
1259 napi_value promise = nullptr;
1260 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1261
1262 napi_value resourceName = nullptr;
1263 napi_create_string_latin1(env, "IsEnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
1264 // Asynchronous function call
1265 napi_create_async_work(env,
1266 nullptr,
1267 resourceName,
1268 [](napi_env env, void *data) {
1269 ANS_LOGI("IsEnableNotificationSlot napi_create_async_work start");
1270 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
1271 if (asynccallbackinfo) {
1272 asynccallbackinfo->info.errorCode = NotificationHelper::GetEnabledForBundleSlot(
1273 asynccallbackinfo->params.option, asynccallbackinfo->params.outType, asynccallbackinfo->isEnable);
1274 }
1275 },
1276 [](napi_env env, napi_status status, void *data) {
1277 ANS_LOGI("IsEnableNotificationSlot napi_create_async_work end");
1278 auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
1279 if (asynccallbackinfo) {
1280 napi_value result = nullptr;
1281 napi_get_boolean(env, asynccallbackinfo->isEnable, &result);
1282 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
1283 if (asynccallbackinfo->info.callback != nullptr) {
1284 napi_delete_reference(env, asynccallbackinfo->info.callback);
1285 }
1286 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1287 delete asynccallbackinfo;
1288 asynccallbackinfo = nullptr;
1289 }
1290 },
1291 (void *)asynccallbackinfo,
1292 &asynccallbackinfo->asyncWork);
1293
1294 NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
1295
1296 if (asynccallbackinfo->info.isCallback) {
1297 return Common::NapiGetNull(env);
1298 } else {
1299 return promise;
1300 }
1301 }
1302 } // namespace NotificationNapi
1303 } // namespace OHOS