• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paras)
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, &paras.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 &paras)
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, &paras.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 &params)
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, &params.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 &paras)
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, &paras.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 &params)
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, &params.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 &params)
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, &params.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 &paras)
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, &paras.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 &params)
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], &params.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, &params.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 &params)
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, &params.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