• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "slot.h"
17 #include "common.h"
18 #include "napi_common_util.h"
19 
20 namespace OHOS {
21 namespace NotificationNapi {
22 const int32_t ADD_SLOT_MAX_PARA = 2;
23 const int32_t ADD_SLOTS_MAX_PARA = 2;
24 const int32_t SET_SLOT_AS_BUNDLE_MAX_PARA = 3;
25 const int32_t GET_SLOT_MAX_PARA = 2;
26 const int32_t GET_SLOT_NUM_AS_BUNDLE_MAX_PARA = 2;
27 const int32_t GET_SLOTS_AS_BUNDLE_MAX_PARA = 2;
28 const int32_t REMOVE_SLOT_MAX_PARA = 2;
29 const int32_t GET_ENABLE_SLOT_MAX_PARA = 3;
30 const int32_t SET_ENABLE_SLOT_MIN_PARA = 3;
31 const int32_t SET_ENABLE_SLOT_MAX_PARA = 5;
32 
33 struct ParametersInfoAddSlot {
34     NotificationSlot slot;
35     NotificationConstant::SlotType inType = NotificationConstant::SlotType::OTHER;
36     bool isAddSlotByType = false;
37     napi_ref callback = nullptr;
38 };
39 
40 struct AsyncCallbackInfoAddSlot {
41     napi_env env = nullptr;
42     napi_async_work asyncWork = nullptr;
43     NotificationSlot slot;
44     NotificationConstant::SlotType inType = NotificationConstant::SlotType::OTHER;
45     bool isAddSlotByType = false;
46     CallbackPromiseInfo info;
47 };
48 
49 struct ParametersInfoAddSlots {
50     std::vector<NotificationSlot> slots;
51     napi_ref callback = nullptr;
52 };
53 
54 struct AsyncCallbackInfoAddSlots {
55     napi_env env = nullptr;
56     napi_async_work asyncWork = nullptr;
57     std::vector<NotificationSlot> slots;
58     CallbackPromiseInfo info;
59 };
60 
61 struct ParametersInfoSetSlotByBundle {
62     NotificationBundleOption option;
63     std::vector<sptr<NotificationSlot>> slots;
64     napi_ref callback = nullptr;
65 };
66 
67 struct AsyncCallbackInfoSetSlotByBundle {
68     napi_env env = nullptr;
69     napi_async_work asyncWork = nullptr;
70     ParametersInfoSetSlotByBundle params;
71     CallbackPromiseInfo info;
72 };
73 
74 struct ParametersInfoGetSlot {
75     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
76     napi_ref callback = nullptr;
77 };
78 
79 struct AsyncCallbackInfoGetSlot {
80     napi_env env = nullptr;
81     napi_async_work asyncWork = nullptr;
82     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
83     CallbackPromiseInfo info;
84     sptr<NotificationSlot> slot = nullptr;
85 };
86 
87 struct ParametersInfoGetSlotNumByBundle {
88     NotificationBundleOption option;
89     napi_ref callback = nullptr;
90 };
91 
92 struct AsyncCallbackInfoGetSlotNumByBundle {
93     napi_env env = nullptr;
94     napi_async_work asyncWork = nullptr;
95     ParametersInfoGetSlotNumByBundle params;
96     CallbackPromiseInfo info;
97     uint64_t num = 0;
98 };
99 
100 struct AsyncCallbackInfoGetSlots {
101     napi_env env = nullptr;
102     napi_async_work asyncWork = nullptr;
103     CallbackPromiseInfo info;
104     std::vector<sptr<NotificationSlot>> slots;
105 };
106 
107 struct ParametersInfoGetSlotsByBundle {
108     NotificationBundleOption option;
109     napi_ref callback = nullptr;
110 };
111 
112 struct AsyncCallbackInfoGetSlotsByBundle {
113     napi_env env = nullptr;
114     napi_async_work asyncWork = nullptr;
115     ParametersInfoGetSlotsByBundle params;
116     CallbackPromiseInfo info;
117     std::vector<sptr<NotificationSlot>> slots;
118 };
119 
120 struct ParametersInfoRemoveSlot {
121     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
122     napi_ref callback = nullptr;
123 };
124 
125 struct AsyncCallbackInfoRemoveSlot {
126     napi_env env = nullptr;
127     napi_async_work asyncWork = nullptr;
128     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
129     CallbackPromiseInfo info;
130 };
131 
132 struct AsyncCallbackInfoRemoveAllSlots {
133     napi_env env = nullptr;
134     napi_async_work asyncWork = nullptr;
135     CallbackPromiseInfo info;
136 };
137 
138 struct ParametersInfoEnableSlot {
139     NotificationBundleOption option;
140     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
141     bool enable = false;
142     bool isForceControl = false;
143     napi_ref callback = nullptr;
144 };
145 
146 struct AsyncCallbackInfoInfoEnableSlot {
147     napi_env env = nullptr;
148     napi_async_work asyncWork = nullptr;
149     ParametersInfoEnableSlot params;
150     CallbackPromiseInfo info;
151 };
152 
153 struct ParametersInfoIsEnableSlot {
154     NotificationBundleOption option;
155     NotificationConstant::SlotType outType = NotificationConstant::SlotType::OTHER;
156     napi_ref callback = nullptr;
157 };
158 
159 struct AsyncCallbackInfoInfoIsEnableSlot {
160     napi_env env = nullptr;
161     napi_async_work asyncWork = nullptr;
162     ParametersInfoIsEnableSlot params;
163     bool isEnable = false;
164     CallbackPromiseInfo info;
165 };
166 
167 struct ParametersInfoSetSlotFlagsByBundle {
168     NotificationBundleOption option;
169     uint32_t slotFlags;
170     napi_ref callback = nullptr;
171 };
172 
173 struct ParametersInfoGetSlotFlagsByBundle {
174     NotificationBundleOption option;
175     napi_ref callback = nullptr;
176 };
177 
178 struct AsyncCallbackInfoSetSlotFlagsByBundle {
179     napi_env env = nullptr;
180     napi_async_work asyncWork = nullptr;
181     ParametersInfoSetSlotFlagsByBundle params;
182     CallbackPromiseInfo info;
183 };
184 
185 struct AsyncCallbackInfoGetSlotFlagsByBundle {
186     napi_env env = nullptr;
187     napi_async_work asyncWork = nullptr;
188     ParametersInfoGetSlotFlagsByBundle params;
189     CallbackPromiseInfo info;
190     uint32_t slotFlags = 0;
191 };
192 
ParseParametersByAddSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoAddSlot & paras)193 napi_value ParseParametersByAddSlot(const napi_env &env, const napi_callback_info &info, ParametersInfoAddSlot &paras)
194 {
195     ANS_LOGI("ParseParametersByAddSlot enter");
196     size_t argc = ADD_SLOT_MAX_PARA;
197     napi_value argv[ADD_SLOT_MAX_PARA] = {nullptr};
198     napi_value thisVar = nullptr;
199     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
200     if (argc < 1) {
201         ANS_LOGE("Wrong number of arguments");
202         return nullptr;
203     }
204 
205     napi_valuetype valuetype = napi_undefined;
206     // argv[0]: NotificationSlot
207     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
208     if (valuetype != napi_object && valuetype != napi_number) {
209         ANS_LOGE("Wrong argument type. Object or number expected.");
210         return nullptr;
211     }
212     if (valuetype == napi_number) {
213         paras.isAddSlotByType = true;
214         int32_t slotType = 0;
215         napi_get_value_int32(env, argv[PARAM0], &slotType);
216         if (!Common::SlotTypeJSToC(SlotType(slotType), paras.inType)) {
217             return nullptr;
218         }
219     } else {
220         paras.isAddSlotByType = false;
221         if (!Common::GetNotificationSlot(env, argv[PARAM0], paras.slot)) {
222             return nullptr;
223         }
224     }
225 
226     // argv[1]:callback
227     if (argc >= ADD_SLOT_MAX_PARA) {
228         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
229         if (valuetype != napi_function) {
230             ANS_LOGE("Callback is not function excute promise.");
231             return Common::NapiGetNull(env);
232         }
233         napi_create_reference(env, argv[PARAM1], 1, &paras.callback);
234     }
235 
236     ANS_LOGI("ParseParametersByAddSlot OUT");
237     return Common::NapiGetNull(env);
238 }
239 
ParseParametersByAddSlots(const napi_env & env,const napi_callback_info & info,ParametersInfoAddSlots & paras)240 napi_value ParseParametersByAddSlots(const napi_env &env, const napi_callback_info &info, ParametersInfoAddSlots &paras)
241 {
242     ANS_LOGI("ParseParametersByAddSlots enter");
243     size_t argc = ADD_SLOTS_MAX_PARA;
244     napi_value argv[ADD_SLOTS_MAX_PARA] = {nullptr};
245     napi_value thisVar = nullptr;
246     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
247     if (argc < 1) {
248         ANS_LOGE("Wrong number of arguments");
249         return nullptr;
250     }
251 
252     napi_valuetype valuetype = napi_undefined;
253     // argv[0]: Array<NotificationSlot>
254     bool isArray = false;
255     napi_is_array(env, argv[PARAM0], &isArray);
256     if (!isArray) {
257         ANS_LOGE("Wrong argument type. Array expected.");
258         return nullptr;
259     }
260     uint32_t length = 0;
261     napi_get_array_length(env, argv[PARAM0], &length);
262     if (length == 0) {
263         ANS_LOGE("The array is empty.");
264         return nullptr;
265     }
266     for (size_t i = 0; i < length; i++) {
267         napi_value nSlot = nullptr;
268         napi_get_element(env, argv[PARAM0], i, &nSlot);
269         NAPI_CALL(env, napi_typeof(env, nSlot, &valuetype));
270         if (valuetype != napi_object) {
271             ANS_LOGE("Wrong argument type. Object expected.");
272             return nullptr;
273         }
274         NotificationSlot slot;
275         if (!Common::GetNotificationSlot(env, nSlot, slot)) {
276             return nullptr;
277         }
278         paras.slots.emplace_back(slot);
279     }
280 
281     // argv[1]:callback
282     if (argc >= ADD_SLOTS_MAX_PARA) {
283         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
284         if (valuetype != napi_function) {
285             ANS_LOGE("Callback is not function excute promise.");
286             return Common::NapiGetNull(env);
287         }
288         napi_create_reference(env, argv[PARAM1], 1, &paras.callback);
289     }
290     ANS_LOGI("ParseParametersByAddSlots out");
291     return Common::NapiGetNull(env);
292 }
293 
ParseParametersSetSlotByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoSetSlotByBundle & params)294 napi_value ParseParametersSetSlotByBundle(
295     const napi_env &env, const napi_callback_info &info, ParametersInfoSetSlotByBundle &params)
296 {
297     ANS_LOGI("ParseParametersSetSlotByBundle enter");
298 
299     size_t argc = SET_SLOT_AS_BUNDLE_MAX_PARA;
300     napi_value argv[SET_SLOT_AS_BUNDLE_MAX_PARA] = {nullptr};
301     napi_value thisVar = nullptr;
302     napi_valuetype valuetype = napi_undefined;
303     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
304     if (argc < SET_SLOT_AS_BUNDLE_MAX_PARA - 1) {
305         ANS_LOGE("Wrong number of arguments.");
306         return nullptr;
307     }
308 
309     // argv[0]: bundle
310     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
311     if (valuetype != napi_object) {
312         ANS_LOGE("Argument type error. Object expected.");
313         return nullptr;
314     }
315     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
316     if (retValue == nullptr) {
317         ANS_LOGE("GetBundleOption failed.");
318         return nullptr;
319     }
320 
321     // argv[1]: slot
322     NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
323     if (valuetype != napi_object) {
324         ANS_LOGE("Wrong argument type. Object expected.");
325         return nullptr;
326     }
327     NotificationSlot slot;
328     if (!Common::GetNotificationSlot(env, argv[PARAM1], slot)) {
329         return nullptr;
330     }
331     std::vector<NotificationSlot> slots;
332     slots.emplace_back(slot);
333 
334     for (auto vec : slots) {
335         sptr<NotificationSlot> slotPtr = new (std::nothrow) NotificationSlot(vec);
336         if (slotPtr == nullptr) {
337             ANS_LOGE("Failed to create NotificationSlot ptr");
338             return nullptr;
339         }
340         params.slots.emplace_back(slotPtr);
341     }
342 
343     // argv[2]:callback
344     if (argc >= SET_SLOT_AS_BUNDLE_MAX_PARA) {
345         NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
346         if (valuetype != napi_function) {
347             ANS_LOGE("Callback is not function excute promise.");
348             return Common::NapiGetNull(env);
349         }
350         napi_create_reference(env, argv[PARAM2], 1, &params.callback);
351     }
352 
353     return Common::NapiGetNull(env);
354 }
355 
ParseParametersByGetSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlot & paras)356 napi_value ParseParametersByGetSlot(const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlot &paras)
357 {
358     ANS_LOGD("enter");
359     size_t argc = GET_SLOT_MAX_PARA;
360     napi_value argv[GET_SLOT_MAX_PARA] = {nullptr};
361     napi_value thisVar = nullptr;
362     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
363     if (argc < 1) {
364         ANS_LOGE("Error number of arguments");
365         return nullptr;
366     }
367 
368     napi_valuetype valuetype = napi_undefined;
369     // argv[0]: SlotType
370     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
371     if (valuetype != napi_number) {
372         ANS_LOGE("Error argument type. Number expected.");
373         return nullptr;
374     }
375     int32_t slotType = 0;
376     napi_get_value_int32(env, argv[PARAM0], &slotType);
377     if (!Common::SlotTypeJSToC(SlotType(slotType), paras.outType)) {
378         return nullptr;
379     }
380 
381     // argv[1]:callback
382     if (argc >= GET_SLOT_MAX_PARA) {
383         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
384         if (valuetype != napi_function) {
385             ANS_LOGE("Callback is not function excute promise.");
386             return Common::NapiGetNull(env);
387         }
388         napi_create_reference(env, argv[PARAM1], 1, &paras.callback);
389     }
390     return Common::NapiGetNull(env);
391 }
392 
ParseParametersGetSlotNumByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlotNumByBundle & params)393 napi_value ParseParametersGetSlotNumByBundle(
394     const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlotNumByBundle &params)
395 {
396     ANS_LOGD("enter");
397 
398     size_t argc = GET_SLOT_NUM_AS_BUNDLE_MAX_PARA;
399     napi_value argv[GET_SLOT_NUM_AS_BUNDLE_MAX_PARA] = {nullptr};
400     napi_value thisVar = nullptr;
401     napi_valuetype valuetype = napi_undefined;
402     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
403     if (argc < GET_SLOT_NUM_AS_BUNDLE_MAX_PARA - 1) {
404         ANS_LOGE("Error number of arguments");
405         return nullptr;
406     }
407 
408     // argv[0]: bundle
409     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
410     if (valuetype != napi_object) {
411         ANS_LOGE("Argument type is error. Object anticipate.");
412         return nullptr;
413     }
414     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
415     if (retValue == nullptr) {
416         ANS_LOGE("GetBundleOption failed.");
417         return nullptr;
418     }
419 
420     // argv[1]:callback
421     if (argc >= GET_SLOT_NUM_AS_BUNDLE_MAX_PARA) {
422         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
423         if (valuetype != napi_function) {
424             ANS_LOGE("Callback is not function excute promise.");
425             return Common::NapiGetNull(env);
426         }
427         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
428     }
429 
430     return Common::NapiGetNull(env);
431 }
432 
433 
ParseParametersSetSlotFlagsByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoSetSlotFlagsByBundle & params)434 napi_value ParseParametersSetSlotFlagsByBundle(
435     const napi_env &env, const napi_callback_info &info, ParametersInfoSetSlotFlagsByBundle &params)
436     {
437         ANS_LOGI("ParseParametersSetSlotByBundle enter");
438 
439         size_t argc = SET_SLOT_AS_BUNDLE_MAX_PARA;
440         napi_value argv[SET_SLOT_AS_BUNDLE_MAX_PARA] = {nullptr};
441         napi_value thisVar = nullptr;
442         napi_valuetype valuetype = napi_undefined;
443         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
444         if (argc < SET_SLOT_AS_BUNDLE_MAX_PARA - 1) {
445             ANS_LOGE("Wrong number of arguments.");
446             return nullptr;
447         }
448 
449         // argv[0]: bundle
450         NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
451         if (valuetype != napi_object) {
452             ANS_LOGE("Argument type error. Object expected.");
453             return nullptr;
454         }
455         auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
456         if (retValue == nullptr) {
457             ANS_LOGE("GetBundleOption failed.");
458             return nullptr;
459         }
460 
461         // argv[1]:slotFlags
462         ANS_LOGI("ParseParametersSetSlotByBundle enter1");
463         int32_t slotFlags = 0;
464         napi_get_value_int32(env, argv[PARAM1], &slotFlags);
465         params.slotFlags = slotFlags;
466         ANS_LOGI("enter2");
467 
468         // argv[2]:callback
469         if (argc >= SET_SLOT_AS_BUNDLE_MAX_PARA) {
470             NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
471             if (valuetype != napi_function) {
472                 ANS_LOGE("Callback is not function excute promise.");
473                 return Common::NapiGetNull(env);
474             }
475         ANS_LOGI("ParseParametersSetSlotByBundle enter3");
476             napi_create_reference(env, argv[PARAM2], 1, &params.callback);
477         }
478 
479         ANS_LOGI("ParseParametersSetSlotByBundle out!");
480         return Common::NapiGetNull(env);
481     }
482 
ParseParametersGetSlotFlagsByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlotFlagsByBundle & params)483 napi_value ParseParametersGetSlotFlagsByBundle(
484     const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlotFlagsByBundle &params)
485     {
486         ANS_LOGD("enter");
487 
488         size_t argc = GET_SLOTS_AS_BUNDLE_MAX_PARA;
489         napi_value argv[GET_SLOTS_AS_BUNDLE_MAX_PARA] = {nullptr};
490         napi_value thisVar = nullptr;
491         napi_valuetype valuetype = napi_undefined;
492         NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
493         if (argc < GET_SLOTS_AS_BUNDLE_MAX_PARA - 1) {
494             ANS_LOGE("Wrong number of arguments");
495             return nullptr;
496         }
497 
498         // argv[0]: bundle
499         NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
500         if (valuetype != napi_object) {
501             ANS_LOGE("Wrong argument type. Object expected.");
502             return nullptr;
503         }
504         auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
505         if (retValue == nullptr) {
506             ANS_LOGE("GetBundleOption failed.");
507             return nullptr;
508         }
509 
510         // argv[1]:callback
511         if (argc >= GET_SLOTS_AS_BUNDLE_MAX_PARA) {
512             NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
513             if (valuetype != napi_function) {
514                 ANS_LOGE("Callback is not function excute promise.");
515                 return Common::NapiGetNull(env);
516             }
517             napi_create_reference(env, argv[PARAM1], 1, &params.callback);
518         }
519 
520         return Common::NapiGetNull(env);
521     }
522 
ParseParametersGetSlotsByBundle(const napi_env & env,const napi_callback_info & info,ParametersInfoGetSlotsByBundle & params)523 napi_value ParseParametersGetSlotsByBundle(
524     const napi_env &env, const napi_callback_info &info, ParametersInfoGetSlotsByBundle &params)
525 {
526     ANS_LOGD("enter");
527 
528     size_t argc = GET_SLOTS_AS_BUNDLE_MAX_PARA;
529     napi_value argv[GET_SLOTS_AS_BUNDLE_MAX_PARA] = {nullptr};
530     napi_value thisVar = nullptr;
531     napi_valuetype valuetype = napi_undefined;
532     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
533     if (argc < GET_SLOTS_AS_BUNDLE_MAX_PARA - 1) {
534         ANS_LOGE("Wrong number of arguments");
535         return nullptr;
536     }
537 
538     // argv[0]: bundle
539     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
540     if (valuetype != napi_object) {
541         ANS_LOGE("Wrong argument type. Object expected.");
542         return nullptr;
543     }
544     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
545     if (retValue == nullptr) {
546         ANS_LOGE("GetBundleOption failed.");
547         return nullptr;
548     }
549 
550     // argv[1]:callback
551     if (argc >= GET_SLOTS_AS_BUNDLE_MAX_PARA) {
552         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
553         if (valuetype != napi_function) {
554             ANS_LOGE("Callback is not function excute promise.");
555             return Common::NapiGetNull(env);
556         }
557         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
558     }
559 
560     return Common::NapiGetNull(env);
561 }
562 
ParseParametersByRemoveSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoRemoveSlot & paras)563 napi_value ParseParametersByRemoveSlot(
564     const napi_env &env, const napi_callback_info &info, ParametersInfoRemoveSlot &paras)
565 {
566     ANS_LOGD("enter");
567     size_t argc = REMOVE_SLOT_MAX_PARA;
568     napi_value argv[REMOVE_SLOT_MAX_PARA] = {nullptr};
569     napi_value thisVar = nullptr;
570     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
571     if (argc < 1) {
572         ANS_LOGE("Wrong number of arguments");
573         return nullptr;
574     }
575 
576     napi_valuetype valuetype = napi_undefined;
577     // argv[0]: SlotType
578     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
579     if (valuetype != napi_number) {
580         ANS_LOGE("Wrong argument type. Number expected.");
581         return nullptr;
582     }
583     int32_t slotType = 0;
584     napi_get_value_int32(env, argv[PARAM0], &slotType);
585     if (!Common::SlotTypeJSToC(SlotType(slotType), paras.outType)) {
586         return nullptr;
587     }
588 
589     // argv[1]:callback
590     if (argc >= REMOVE_SLOT_MAX_PARA) {
591         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
592         if (valuetype != napi_function) {
593             ANS_LOGE("Callback is not function excute promise.");
594             return Common::NapiGetNull(env);
595         }
596         napi_create_reference(env, argv[PARAM1], 1, &paras.callback);
597     }
598     return Common::NapiGetNull(env);
599 }
600 
AddSlot(napi_env env,napi_callback_info info)601 napi_value AddSlot(napi_env env, napi_callback_info info)
602 {
603     ANS_LOGD("enter");
604 
605     ParametersInfoAddSlot paras;
606     if (ParseParametersByAddSlot(env, info, paras) == nullptr) {
607         return Common::NapiGetUndefined(env);
608     }
609 
610     AsyncCallbackInfoAddSlot *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoAddSlot {
611         .env = env,
612         .asyncWork = nullptr,
613         .slot = paras.slot,
614         .inType = paras.inType,
615         .isAddSlotByType = paras.isAddSlotByType
616     };
617     if (!asynccallbackinfo) {
618         return Common::JSParaError(env, paras.callback);
619     }
620     napi_value promise = nullptr;
621     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
622 
623     ANS_LOGD("Create addSlot string.");
624     napi_value resourceName = nullptr;
625     napi_create_string_latin1(env, "addSlot", NAPI_AUTO_LENGTH, &resourceName);
626     // Asynchronous function call
627     napi_create_async_work(env,
628         nullptr,
629         resourceName,
630         [](napi_env env, void *data) {
631             ANS_LOGI("AddSlot work excute.");
632             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
633             if (asynccallbackinfo) {
634                 ANS_LOGD("asynccallbackinfo is not nullptr.");
635                 if (asynccallbackinfo->isAddSlotByType) {
636                     asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
637                 } else {
638                     asynccallbackinfo->info.errorCode =
639                         NotificationHelper::AddNotificationSlot(asynccallbackinfo->slot);
640                 }
641             }
642         },
643         [](napi_env env, napi_status status, void *data) {
644             ANS_LOGI("AddSlot work complete.");
645             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
646             if (asynccallbackinfo) {
647                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
648                 if (asynccallbackinfo->info.callback != nullptr) {
649                     ANS_LOGD("Delete addSlot callback reference.");
650                     napi_delete_reference(env, asynccallbackinfo->info.callback);
651                 }
652                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
653                 delete asynccallbackinfo;
654                 asynccallbackinfo = nullptr;
655             }
656             ANS_LOGD("AddSlot work complete end.");
657         },
658         (void *)asynccallbackinfo,
659         &asynccallbackinfo->asyncWork);
660 
661     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
662 
663     if (asynccallbackinfo->info.isCallback) {
664         ANS_LOGD("addSlot callback is nullptr.");
665         return Common::NapiGetNull(env);
666     } else {
667         return promise;
668     }
669 }
670 
AddSlots(napi_env env,napi_callback_info info)671 napi_value AddSlots(napi_env env, napi_callback_info info)
672 {
673     ANS_LOGD("enter");
674 
675     ParametersInfoAddSlots paras;
676     if (ParseParametersByAddSlots(env, info, paras) == nullptr) {
677         return Common::NapiGetUndefined(env);
678     }
679 
680     AsyncCallbackInfoAddSlots *asynccallbackinfo =
681         new (std::nothrow) AsyncCallbackInfoAddSlots {.env = env, .asyncWork = nullptr, .slots = paras.slots};
682     if (!asynccallbackinfo) {
683         return Common::JSParaError(env, paras.callback);
684     }
685     napi_value promise = nullptr;
686     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
687 
688     ANS_LOGD("AddSlots work excute.");
689     napi_value resourceName = nullptr;
690     napi_create_string_latin1(env, "addSlots", NAPI_AUTO_LENGTH, &resourceName);
691     // Asynchronous function call
692     napi_create_async_work(env,
693         nullptr,
694         resourceName,
695         [](napi_env env, void *data) {
696             ANS_LOGI("AddSlots work excute.");
697             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
698             if (asynccallbackinfo) {
699                 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlots(asynccallbackinfo->slots);
700             }
701         },
702         [](napi_env env, napi_status status, void *data) {
703             ANS_LOGI("AddSlots work complete.");
704             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
705             if (asynccallbackinfo) {
706                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
707                 if (asynccallbackinfo->info.callback != nullptr) {
708                     ANS_LOGD("Delete addSlots callback reference.");
709                     napi_delete_reference(env, asynccallbackinfo->info.callback);
710                 }
711                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
712                 delete asynccallbackinfo;
713                 asynccallbackinfo = nullptr;
714             }
715             ANS_LOGD("AddSlots work complete end.");
716         },
717         (void *)asynccallbackinfo,
718         &asynccallbackinfo->asyncWork);
719 
720     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
721 
722     if (asynccallbackinfo->info.isCallback) {
723         ANS_LOGD("addSlots callback is nullptr.");
724         return Common::NapiGetNull(env);
725     } else {
726         return promise;
727     }
728 }
729 
SetSlotByBundle(napi_env env,napi_callback_info info)730 napi_value SetSlotByBundle(napi_env env, napi_callback_info info)
731 {
732     ANS_LOGD("enter");
733 
734     ParametersInfoSetSlotByBundle params {};
735     if (ParseParametersSetSlotByBundle(env, info, params) == nullptr) {
736         return Common::NapiGetUndefined(env);
737     }
738 
739     AsyncCallbackInfoSetSlotByBundle *asynccallbackinfo =
740         new (std::nothrow) AsyncCallbackInfoSetSlotByBundle {.env = env, .asyncWork = nullptr, .params = params};
741     if (!asynccallbackinfo) {
742         ANS_LOGD("Asynccallbackinfo is nullptr.");
743         return Common::JSParaError(env, params.callback);
744     }
745     napi_value promise = nullptr;
746     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
747 
748     ANS_LOGD("Create setSlotByBundle string.");
749     napi_value resourceName = nullptr;
750     napi_create_string_latin1(env, "setSlotByBundle", NAPI_AUTO_LENGTH, &resourceName);
751     // Asynchronous function call
752     napi_create_async_work(env,
753         nullptr,
754         resourceName,
755         [](napi_env env, void *data) {
756             ANS_LOGI("SetSlotByBundle napi_create_async_work start");
757             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
758             if (asynccallbackinfo) {
759                 asynccallbackinfo->info.errorCode = NotificationHelper::UpdateNotificationSlots(
760                     asynccallbackinfo->params.option, asynccallbackinfo->params.slots);
761             }
762         },
763         [](napi_env env, napi_status status, void *data) {
764             ANS_LOGI("SetSlotByBundle napi_create_async_work end");
765             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
766             if (asynccallbackinfo) {
767                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
768                 if (asynccallbackinfo->info.callback != nullptr) {
769                     ANS_LOGD("Delete setSlotByBundle callback reference.");
770                     napi_delete_reference(env, asynccallbackinfo->info.callback);
771                 }
772                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
773                 delete asynccallbackinfo;
774                 asynccallbackinfo = nullptr;
775             }
776             ANS_LOGD("SetSlotByBundle work complete end.");
777         },
778         (void *)asynccallbackinfo,
779         &asynccallbackinfo->asyncWork);
780 
781     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
782 
783     if (asynccallbackinfo->info.isCallback) {
784         ANS_LOGD("setSlotByBundle callback is nullptr.");
785         return Common::NapiGetNull(env);
786     } else {
787         return promise;
788     }
789 }
790 
791 
AsyncCompleteCallbackGetSlot(napi_env env,napi_status status,void * data)792 void AsyncCompleteCallbackGetSlot(napi_env env, napi_status status, void *data)
793 {
794     ANS_LOGI("GetSlot work complete.");
795 
796     if (!data) {
797         ANS_LOGE("Invalid async callback data");
798         return;
799     }
800 
801     auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
802     if (asynccallbackinfo) {
803         ANS_LOGD("Asynccallbackinfo is not nullptr.");
804         napi_value result = Common::NapiGetNull(env);
805         if (asynccallbackinfo->info.errorCode == ERR_OK) {
806             if (asynccallbackinfo->slot != nullptr) {
807                 ANS_LOGD("slot is not nullptr.");
808                 napi_create_object(env, &result);
809                 if (!Common::SetNotificationSlot(env, *asynccallbackinfo->slot, result)) {
810                     asynccallbackinfo->info.errorCode = ERROR;
811                     result = Common::NapiGetNull(env);
812                 }
813             }
814         }
815         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
816         if (asynccallbackinfo->info.callback != nullptr) {
817             ANS_LOGD("Delete getSlot callback reference.");
818             napi_delete_reference(env, asynccallbackinfo->info.callback);
819         }
820         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
821         delete asynccallbackinfo;
822         asynccallbackinfo = nullptr;
823     }
824 }
825 
GetSlot(napi_env env,napi_callback_info info)826 napi_value GetSlot(napi_env env, napi_callback_info info)
827 {
828     ANS_LOGD("enter");
829 
830     ParametersInfoGetSlot paras;
831     if (ParseParametersByGetSlot(env, info, paras) == nullptr) {
832         return Common::NapiGetUndefined(env);
833     }
834 
835     AsyncCallbackInfoGetSlot *asynccallbackinfo =
836         new (std::nothrow) AsyncCallbackInfoGetSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
837     if (!asynccallbackinfo) {
838         ANS_LOGD("Asynccallbackinfo is nullptr.");
839         return Common::JSParaError(env, paras.callback);
840     }
841     napi_value promise = nullptr;
842     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
843 
844     ANS_LOGD("Create getSlot string.");
845     napi_value resourceName = nullptr;
846     napi_create_string_latin1(env, "getSlot", NAPI_AUTO_LENGTH, &resourceName);
847     // Asynchronous function call
848     napi_create_async_work(env,
849         nullptr,
850         resourceName,
851         [](napi_env env, void *data) {
852             ANS_LOGI("GetSlot napi_create_async_work start");
853             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
854             if (asynccallbackinfo) {
855                 asynccallbackinfo->info.errorCode =
856                     NotificationHelper::GetNotificationSlot(asynccallbackinfo->outType, asynccallbackinfo->slot);
857             }
858         },
859         AsyncCompleteCallbackGetSlot,
860         (void *)asynccallbackinfo,
861         &asynccallbackinfo->asyncWork);
862 
863     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
864 
865     if (asynccallbackinfo->info.isCallback) {
866         ANS_LOGD("GetSlot callback is nullptr.");
867         return Common::NapiGetNull(env);
868     } else {
869         return promise;
870     }
871 }
872 
GetSlotNumByBundle(napi_env env,napi_callback_info info)873 napi_value GetSlotNumByBundle(napi_env env, napi_callback_info info)
874 {
875     ANS_LOGD("enter");
876 
877     ParametersInfoGetSlotNumByBundle params {};
878     if (ParseParametersGetSlotNumByBundle(env, info, params) == nullptr) {
879         return Common::NapiGetUndefined(env);
880     }
881 
882     AsyncCallbackInfoGetSlotNumByBundle *asynccallbackinfo =
883         new (std::nothrow) AsyncCallbackInfoGetSlotNumByBundle {.env = env, .asyncWork = nullptr, .params = params};
884     if (!asynccallbackinfo) {
885         ANS_LOGD("Asynccallbackinfo is nullptr.");
886         return Common::JSParaError(env, params.callback);
887     }
888     napi_value promise = nullptr;
889     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
890 
891     ANS_LOGD("create getSlotNumByBundle string.");
892     napi_value resourceName = nullptr;
893     napi_create_string_latin1(env, "getSlotNumByBundle", NAPI_AUTO_LENGTH, &resourceName);
894     // Asynchronous function call
895     napi_create_async_work(env,
896         nullptr,
897         resourceName,
898         [](napi_env env, void *data) {
899             ANS_LOGI("GetSlotNumByBundle napi_create_async_work start");
900             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
901             if (asynccallbackinfo) {
902                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotNumAsBundle(
903                     asynccallbackinfo->params.option, asynccallbackinfo->num);
904             }
905         },
906         [](napi_env env, napi_status status, void *data) {
907             ANS_LOGI("GetSlotNumByBundle napi_create_async_work end");
908             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
909             if (asynccallbackinfo) {
910                 napi_value result = nullptr;
911                 napi_create_uint32(env, asynccallbackinfo->num, &result);
912                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
913                 if (asynccallbackinfo->info.callback != nullptr) {
914                     ANS_LOGD("Delete getSlotNumByBundle callback reference.");
915                     napi_delete_reference(env, asynccallbackinfo->info.callback);
916                 }
917                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
918                 delete asynccallbackinfo;
919                 asynccallbackinfo = nullptr;
920             }
921             ANS_LOGD("GetSlotNumByBundle work complete end.");
922         },
923         (void *)asynccallbackinfo,
924         &asynccallbackinfo->asyncWork);
925 
926     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
927 
928     if (asynccallbackinfo->info.isCallback) {
929         ANS_LOGD("getSlotNumByBundle callback is nullptr.");
930         return Common::NapiGetNull(env);
931     } else {
932         return promise;
933     }
934 }
935 
AsyncCompleteCallbackGetSlots(napi_env env,napi_status status,void * data)936 void AsyncCompleteCallbackGetSlots(napi_env env, napi_status status, void *data)
937 {
938     ANS_LOGD("enter");
939     if (!data) {
940         ANS_LOGE("Invalid async callback data.");
941         return;
942     }
943     napi_value result = nullptr;
944     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
945     if (asynccallbackinfo) {
946         ANS_LOGD("Asynccallbackinfo is not nullptr.");
947         if (asynccallbackinfo->info.errorCode != ERR_OK) {
948             result = Common::NapiGetNull(env);
949         } else {
950             napi_value arr = nullptr;
951             napi_create_array(env, &arr);
952             size_t count = 0;
953             for (auto vec : asynccallbackinfo->slots) {
954                 if (!vec) {
955                     ANS_LOGW("Invalidity NotificationSlot object ptr.");
956                     continue;
957                 }
958                 napi_value nSlot = nullptr;
959                 napi_create_object(env, &nSlot);
960                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
961                     ANS_LOGD("SetNotificationSlot is null.");
962                     continue;
963                 }
964                 napi_set_element(env, arr, count, nSlot);
965                 count++;
966             }
967             ANS_LOGI("getSlots count : %{public}zu", count);
968             result = arr;
969             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
970                 asynccallbackinfo->info.errorCode = ERROR;
971                 result = Common::NapiGetNull(env);
972             }
973         }
974         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
975         if (asynccallbackinfo->info.callback != nullptr) {
976             ANS_LOGD("Delete getSlots callback reference.");
977             napi_delete_reference(env, asynccallbackinfo->info.callback);
978         }
979         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
980         delete asynccallbackinfo;
981         asynccallbackinfo = nullptr;
982     }
983 }
984 
GetSlots(napi_env env,napi_callback_info info)985 napi_value GetSlots(napi_env env, napi_callback_info info)
986 {
987     ANS_LOGD("enter");
988 
989     napi_ref callback = nullptr;
990     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
991         return Common::NapiGetUndefined(env);
992     }
993 
994     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetSlots {.env = env, .asyncWork = nullptr};
995     if (!asynccallbackinfo) {
996         ANS_LOGD("Create asynccallbackinfo failed.");
997         return Common::JSParaError(env, callback);
998     }
999     napi_value promise = nullptr;
1000     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
1001 
1002     ANS_LOGD("Create getSlots string.");
1003     napi_value resourceName = nullptr;
1004     napi_create_string_latin1(env, "getSlots", NAPI_AUTO_LENGTH, &resourceName);
1005     // Asynchronous function call
1006     napi_create_async_work(env,
1007         nullptr,
1008         resourceName,
1009         [](napi_env env, void *data) {
1010             ANS_LOGI("GetSlots napi_create_async_work start");
1011             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
1012             if (asynccallbackinfo) {
1013                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlots(asynccallbackinfo->slots);
1014             }
1015         },
1016         AsyncCompleteCallbackGetSlots,
1017         (void *)asynccallbackinfo,
1018         &asynccallbackinfo->asyncWork);
1019 
1020     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1021 
1022     if (asynccallbackinfo->info.isCallback) {
1023         ANS_LOGD("getSlots callback is nullptr.");
1024         return Common::NapiGetNull(env);
1025     } else {
1026         return promise;
1027     }
1028 }
1029 
AsyncCompleteCallbackGetSlotsByBundle(napi_env env,napi_status status,void * data)1030 void AsyncCompleteCallbackGetSlotsByBundle(napi_env env, napi_status status, void *data)
1031 {
1032     ANS_LOGD("enter");
1033     if (!data) {
1034         ANS_LOGE("Invalidated async callback data.");
1035         return;
1036     }
1037     napi_value result = nullptr;
1038     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
1039     if (asynccallbackinfo) {
1040         ANS_LOGE("asynccallbackinfo is not nullptr.");
1041         if (asynccallbackinfo->info.errorCode != ERR_OK) {
1042             result = Common::NapiGetNull(env);
1043         } else {
1044             napi_value arr = nullptr;
1045             napi_create_array(env, &arr);
1046             size_t count = 0;
1047             for (auto vec : asynccallbackinfo->slots) {
1048                 if (!vec) {
1049                     ANS_LOGW("Invalidity NotificationSlot object ptr");
1050                     continue;
1051                 }
1052                 napi_value nSlot = nullptr;
1053                 napi_create_object(env, &nSlot);
1054                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
1055                     ANS_LOGD("Set notification slot is nullptr.");
1056                     continue;
1057                 }
1058                 napi_set_element(env, arr, count, nSlot);
1059                 count++;
1060             }
1061             ANS_LOGI("GetSlotsByBundle count = %{public}zu", count);
1062             result = arr;
1063             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
1064                 asynccallbackinfo->info.errorCode = ERROR;
1065                 result = Common::NapiGetNull(env);
1066             }
1067         }
1068         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
1069         if (asynccallbackinfo->info.callback != nullptr) {
1070             ANS_LOGD("Delete getSlotsByBundle callback reference.");
1071             napi_delete_reference(env, asynccallbackinfo->info.callback);
1072         }
1073         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1074         delete asynccallbackinfo;
1075         asynccallbackinfo = nullptr;
1076     }
1077 }
1078 
GetSlotsByBundle(napi_env env,napi_callback_info info)1079 napi_value GetSlotsByBundle(napi_env env, napi_callback_info info)
1080 {
1081     ANS_LOGD("enter");
1082 
1083     ParametersInfoGetSlotsByBundle params {};
1084     if (ParseParametersGetSlotsByBundle(env, info, params) == nullptr) {
1085         return Common::NapiGetUndefined(env);
1086     }
1087 
1088     AsyncCallbackInfoGetSlotsByBundle *asynccallbackinfo =
1089         new (std::nothrow) AsyncCallbackInfoGetSlotsByBundle {.env = env, .asyncWork = nullptr, .params = params};
1090     if (!asynccallbackinfo) {
1091         ANS_LOGD("Create asynccallbackinfo failed.");
1092         return Common::JSParaError(env, params.callback);
1093     }
1094     napi_value promise = nullptr;
1095     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1096 
1097     ANS_LOGD("Create getSlotsByBundle string.");
1098     napi_value resourceName = nullptr;
1099     napi_create_string_latin1(env, "getSlotsByBundle", NAPI_AUTO_LENGTH, &resourceName);
1100     // Asynchronous function call
1101     napi_create_async_work(env,
1102         nullptr,
1103         resourceName,
1104         [](napi_env env, void *data) {
1105             ANS_LOGI("GetSlotsByBundle napi_create_async_work start");
1106             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
1107             if (asynccallbackinfo) {
1108             asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotsForBundle(
1109                 asynccallbackinfo->params.option, asynccallbackinfo->slots);
1110             }
1111         },
1112         AsyncCompleteCallbackGetSlotsByBundle,
1113         (void *)asynccallbackinfo,
1114         &asynccallbackinfo->asyncWork);
1115 
1116     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1117 
1118     if (asynccallbackinfo->info.isCallback) {
1119         ANS_LOGD("getSlotsByBundle callback is nullptr.");
1120         return Common::NapiGetNull(env);
1121     } else {
1122         return promise;
1123     }
1124 }
1125 
RemoveSlot(napi_env env,napi_callback_info info)1126 napi_value RemoveSlot(napi_env env, napi_callback_info info)
1127 {
1128     ANS_LOGD("enter");
1129 
1130     ParametersInfoRemoveSlot paras;
1131     if (ParseParametersByRemoveSlot(env, info, paras) == nullptr) {
1132         return Common::NapiGetUndefined(env);
1133     }
1134 
1135     AsyncCallbackInfoRemoveSlot *asynccallbackinfo =
1136         new (std::nothrow) AsyncCallbackInfoRemoveSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
1137     if (!asynccallbackinfo) {
1138         return Common::JSParaError(env, paras.callback);
1139     }
1140     napi_value promise = nullptr;
1141     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
1142 
1143     ANS_LOGD("Create removeSlot string.");
1144     napi_value resourceName = nullptr;
1145     napi_create_string_latin1(env, "removeSlot", NAPI_AUTO_LENGTH, &resourceName);
1146     // Asynchronous function call
1147     napi_create_async_work(env,
1148         nullptr,
1149         resourceName,
1150         [](napi_env env, void *data) {
1151             ANS_LOGI("removeSlot napi_create_async_work start");
1152             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
1153             if (asynccallbackinfo) {
1154                 asynccallbackinfo->info.errorCode =
1155                     NotificationHelper::RemoveNotificationSlot(asynccallbackinfo->outType);
1156             }
1157         },
1158         [](napi_env env, napi_status status, void *data) {
1159             ANS_LOGI("removeSlot napi_create_async_work end");
1160             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
1161             if (asynccallbackinfo) {
1162                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1163                 if (asynccallbackinfo->info.callback != nullptr) {
1164                     ANS_LOGD("Delete removeSlot callback reference.");
1165                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1166                 }
1167                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1168                 delete asynccallbackinfo;
1169                 asynccallbackinfo = nullptr;
1170             }
1171             ANS_LOGD("removeSlot work complete end.");
1172         },
1173         (void *)asynccallbackinfo,
1174         &asynccallbackinfo->asyncWork);
1175 
1176     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1177 
1178     if (asynccallbackinfo->info.isCallback) {
1179         ANS_LOGD("removeSlot callback is nullptr.");
1180         return Common::NapiGetNull(env);
1181     } else {
1182         return promise;
1183     }
1184 }
1185 
RemoveAllSlots(napi_env env,napi_callback_info info)1186 napi_value RemoveAllSlots(napi_env env, napi_callback_info info)
1187 {
1188     ANS_LOGD("enter");
1189 
1190     napi_ref callback = nullptr;
1191     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
1192         return Common::NapiGetUndefined(env);
1193     }
1194 
1195     auto *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoRemoveAllSlots {.env = env, .asyncWork = nullptr};
1196     if (!asynccallbackinfo) {
1197         ANS_LOGD("Create asynccallbackinfo failed.");
1198         return Common::JSParaError(env, callback);
1199     }
1200     napi_value promise = nullptr;
1201     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
1202 
1203     ANS_LOGD("Create removeAll string.");
1204     napi_value resourceName = nullptr;
1205     napi_create_string_latin1(env, "removeAll", NAPI_AUTO_LENGTH, &resourceName);
1206     // Asynchronous function call
1207     napi_create_async_work(env,
1208         nullptr,
1209         resourceName,
1210         [](napi_env env, void *data) {
1211             ANS_LOGI("RemoveAllSlots napi_create_async_work start");
1212             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
1213             if (asynccallbackinfo) {
1214                 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveAllSlots();
1215             }
1216         },
1217         [](napi_env env, napi_status status, void *data) {
1218             ANS_LOGI("RemoveAllSlots napi_create_async_work end");
1219             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
1220             if (asynccallbackinfo) {
1221                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1222                 if (asynccallbackinfo->info.callback != nullptr) {
1223                     ANS_LOGD("RemoveAllSlots napi_delete_reference start");
1224                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1225                 }
1226                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1227                 delete asynccallbackinfo;
1228                 asynccallbackinfo = nullptr;
1229             }
1230             ANS_LOGD("RemoveAllSlots work complete end.");
1231         },
1232         (void *)asynccallbackinfo,
1233         &asynccallbackinfo->asyncWork);
1234 
1235     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1236 
1237     if (asynccallbackinfo->info.isCallback) {
1238         ANS_LOGD("RemoveAllSlots callback is nullptr.");
1239         return Common::NapiGetNull(env);
1240     } else {
1241         return promise;
1242     }
1243 }
1244 
ParseEnableSlotCallBackParam(const napi_env & env,size_t argc,napi_value * argv,ParametersInfoEnableSlot & params)1245 static napi_value ParseEnableSlotCallBackParam(
1246     const napi_env &env, size_t argc, napi_value *argv, ParametersInfoEnableSlot &params)
1247 {
1248     // argv[4]: callback
1249     if (argc < SET_ENABLE_SLOT_MAX_PARA) {
1250         return Common::NapiGetNull(env);
1251     }
1252     napi_valuetype valuetype = napi_undefined;
1253     NAPI_CALL(env, napi_typeof(env, argv[PARAM4], &valuetype));
1254     if (valuetype != napi_function) {
1255         ANS_LOGW("Callback is not function excute promise.");
1256         return Common::NapiGetNull(env);
1257     }
1258     napi_create_reference(env, argv[PARAM4], 1, &params.callback);
1259     return Common::NapiGetNull(env);
1260 }
1261 
ParseParametersEnableSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoEnableSlot & params)1262 napi_value ParseParametersEnableSlot(
1263     const napi_env &env, const napi_callback_info &info, ParametersInfoEnableSlot &params)
1264 {
1265     ANS_LOGD("enter");
1266 
1267     size_t argc = SET_ENABLE_SLOT_MAX_PARA;
1268     napi_value argv[SET_ENABLE_SLOT_MAX_PARA] = {nullptr};
1269 
1270     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, NULL, NULL));
1271     if (argc < SET_ENABLE_SLOT_MIN_PARA) {
1272         ANS_LOGW("Wrong number of arguments.");
1273         return nullptr;
1274     }
1275 
1276     // argv[0]: bundle
1277     if (!OHOS::AppExecFwk::IsTypeForNapiValue(env, argv[PARAM0], napi_object)) {
1278         ANS_LOGE("Parameter type is error. Object expected.");
1279         return nullptr;
1280     }
1281     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
1282     if (retValue == nullptr) {
1283         ANS_LOGE("GetBundleOption failed.");
1284         return nullptr;
1285     }
1286 
1287     // argv[1]: SlotType
1288     if (!OHOS::AppExecFwk::IsTypeForNapiValue(env, argv[PARAM1], napi_number)) {
1289         ANS_LOGE("Parameter type error. Number expected.");
1290         return nullptr;
1291     }
1292     int slotType = 0;
1293     napi_get_value_int32(env, argv[PARAM1], &slotType);
1294     if (!Common::SlotTypeJSToC(SlotType(slotType), params.outType)) {
1295         return nullptr;
1296     }
1297 
1298     // argv[2]: enable
1299     if (!OHOS::AppExecFwk::IsTypeForNapiValue(env, argv[PARAM2], napi_boolean)) {
1300         ANS_LOGE("Wrong argument type. Bool expected.");
1301         return nullptr;
1302     }
1303     napi_get_value_bool(env, argv[PARAM2], &params.enable);
1304 
1305     if (argc < SET_ENABLE_SLOT_MAX_PARA - 1) {
1306         return Common::NapiGetNull(env);
1307     }
1308 
1309     // argv[3]: maybe isForceControl or callback
1310     napi_valuetype valuetype = napi_undefined;
1311     NAPI_CALL(env, napi_typeof(env, argv[PARAM3], &valuetype));
1312     if (valuetype == napi_boolean) {
1313         napi_get_value_bool(env, argv[PARAM3], &params.isForceControl);
1314     } else if (valuetype == napi_function) {
1315         napi_create_reference(env, argv[PARAM3], 1, &params.callback);
1316         return Common::NapiGetNull(env);
1317     } else {
1318         ANS_LOGI("Callback is not function excute promise.");
1319         return Common::NapiGetNull(env);
1320     }
1321 
1322     return ParseEnableSlotCallBackParam(env, argc, argv, params);
1323 }
1324 
EnableNotificationSlot(napi_env env,napi_callback_info info)1325 napi_value EnableNotificationSlot(napi_env env, napi_callback_info info)
1326 {
1327     ANS_LOGD("enter");
1328 
1329     ParametersInfoEnableSlot params {};
1330     if (ParseParametersEnableSlot(env, info, params) == nullptr) {
1331         return Common::NapiGetUndefined(env);
1332     }
1333 
1334     AsyncCallbackInfoInfoEnableSlot *asynccallbackinfo =
1335         new (std::nothrow) AsyncCallbackInfoInfoEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
1336     if (!asynccallbackinfo) {
1337         return Common::JSParaError(env, params.callback);
1338     }
1339     napi_value promise = nullptr;
1340     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1341 
1342     ANS_LOGD("Create EnableNotificationSlot string.");
1343     napi_value resourceName = nullptr;
1344     napi_create_string_latin1(env, "EnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
1345     // Asynchronous function call
1346     napi_create_async_work(env,
1347         nullptr,
1348         resourceName,
1349         [](napi_env env, void *data) {
1350             ANS_LOGI("EnableNotificationSlot napi_create_async_work start");
1351             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
1352             if (asynccallbackinfo) {
1353                 asynccallbackinfo->info.errorCode = NotificationHelper::SetEnabledForBundleSlot(
1354                     asynccallbackinfo->params.option,
1355                     asynccallbackinfo->params.outType,
1356                     asynccallbackinfo->params.enable,
1357                     asynccallbackinfo->params.isForceControl);
1358             }
1359         },
1360         [](napi_env env, napi_status status, void *data) {
1361             ANS_LOGI("EnableNotificationSlot napi_create_async_work end");
1362             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
1363             if (asynccallbackinfo) {
1364                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1365                 if (asynccallbackinfo->info.callback != nullptr) {
1366                     ANS_LOGD("Delete enableNotificationSlot callback reference.");
1367                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1368                 }
1369                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1370                 delete asynccallbackinfo;
1371                 asynccallbackinfo = nullptr;
1372             }
1373             ANS_LOGD("EnableNotificationSlot work complete end.");
1374         },
1375         (void *)asynccallbackinfo,
1376         &asynccallbackinfo->asyncWork);
1377 
1378     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1379 
1380     if (asynccallbackinfo->info.isCallback) {
1381         ANS_LOGD("enableNotificationSlot callback is nullptr.");
1382         return Common::NapiGetNull(env);
1383     } else {
1384         return promise;
1385     }
1386 }
1387 
ParseParametersIsEnableSlot(const napi_env & env,const napi_callback_info & info,ParametersInfoIsEnableSlot & params)1388 napi_value ParseParametersIsEnableSlot(
1389     const napi_env &env, const napi_callback_info &info, ParametersInfoIsEnableSlot &params)
1390 {
1391     ANS_LOGD("enter");
1392 
1393     size_t argc = GET_ENABLE_SLOT_MAX_PARA;
1394     napi_value argv[GET_ENABLE_SLOT_MAX_PARA] = {nullptr};
1395     napi_value thisVar = nullptr;
1396     napi_valuetype valuetype = napi_undefined;
1397     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1398     if (argc < GET_ENABLE_SLOT_MAX_PARA - 1) {
1399         ANS_LOGW("Wrong number of arguments.");
1400         return nullptr;
1401     }
1402 
1403     // argv[0]: bundle
1404     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
1405     if (valuetype != napi_object) {
1406         ANS_LOGW("Wrong argument type. Object expected.");
1407         return nullptr;
1408     }
1409     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
1410     if (retValue == nullptr) {
1411         ANS_LOGE("GetBundleOption failed.");
1412         return nullptr;
1413     }
1414 
1415     // argv[1]: SlotType
1416     NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
1417     if (valuetype != napi_number) {
1418         ANS_LOGW("Wrong argument type. Number expected.");
1419         return nullptr;
1420     }
1421     int slotType = 0;
1422     napi_get_value_int32(env, argv[PARAM1], &slotType);
1423     if (!Common::SlotTypeJSToC(SlotType(slotType), params.outType)) {
1424         return nullptr;
1425     }
1426 
1427     // argv[2]:callback
1428     if (argc >= GET_ENABLE_SLOT_MAX_PARA) {
1429         NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
1430         if (valuetype != napi_function) {
1431             ANS_LOGW("Callback is not function excute promise.");
1432             return Common::NapiGetNull(env);
1433         }
1434         napi_create_reference(env, argv[PARAM2], 1, &params.callback);
1435     }
1436 
1437     return Common::NapiGetNull(env);
1438 }
1439 
IsEnableNotificationSlot(napi_env env,napi_callback_info info)1440 napi_value IsEnableNotificationSlot(napi_env env, napi_callback_info info)
1441 {
1442     ANS_LOGD("enter");
1443 
1444     ParametersInfoIsEnableSlot params {};
1445     if (ParseParametersIsEnableSlot(env, info, params) == nullptr) {
1446         return Common::NapiGetUndefined(env);
1447     }
1448 
1449     AsyncCallbackInfoInfoIsEnableSlot *asynccallbackinfo =
1450         new (std::nothrow) AsyncCallbackInfoInfoIsEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
1451     if (!asynccallbackinfo) {
1452         return Common::JSParaError(env, params.callback);
1453     }
1454     napi_value promise = nullptr;
1455     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1456 
1457     ANS_LOGD("Create IsEnableNotificationSlot string.");
1458     napi_value resourceName = nullptr;
1459     napi_create_string_latin1(env, "IsEnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
1460     // Asynchronous function call
1461     napi_create_async_work(env,
1462         nullptr,
1463         resourceName,
1464         [](napi_env env, void *data) {
1465             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work start");
1466             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
1467             if (asynccallbackinfo) {
1468                 asynccallbackinfo->info.errorCode = NotificationHelper::GetEnabledForBundleSlot(
1469                     asynccallbackinfo->params.option, asynccallbackinfo->params.outType, asynccallbackinfo->isEnable);
1470             }
1471         },
1472         [](napi_env env, napi_status status, void *data) {
1473             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work end");
1474             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
1475             if (asynccallbackinfo) {
1476                 napi_value result = nullptr;
1477                 napi_get_boolean(env, asynccallbackinfo->isEnable, &result);
1478                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
1479                 if (asynccallbackinfo->info.callback != nullptr) {
1480                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1481                 }
1482                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1483                 delete asynccallbackinfo;
1484                 asynccallbackinfo = nullptr;
1485             }
1486         },
1487         (void *)asynccallbackinfo,
1488         &asynccallbackinfo->asyncWork);
1489 
1490     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1491 
1492     if (asynccallbackinfo->info.isCallback) {
1493         ANS_LOGD("isEnableNotificationSlot callback is nullptr.");
1494         return Common::NapiGetNull(env);
1495     } else {
1496         return promise;
1497     }
1498 }
1499 
GetSlotFlagsByBundle(napi_env env,napi_callback_info info)1500 napi_value GetSlotFlagsByBundle(napi_env env, napi_callback_info info)
1501 {
1502     ANS_LOGD("enter");
1503 
1504     ParametersInfoGetSlotFlagsByBundle params {};
1505     if (ParseParametersGetSlotFlagsByBundle(env, info, params) == nullptr) {
1506         return Common::NapiGetUndefined(env);
1507     }
1508 
1509     AsyncCallbackInfoGetSlotFlagsByBundle *asynccallbackinfo =
1510         new (std::nothrow) AsyncCallbackInfoGetSlotFlagsByBundle {.env = env, .asyncWork = nullptr, .params = params};
1511     if (!asynccallbackinfo) {
1512         ANS_LOGD("Asynccallbackinfo is nullptr.");
1513         return Common::JSParaError(env, params.callback);
1514     }
1515     napi_value promise = nullptr;
1516     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1517 
1518     ANS_LOGD("create getSlotFlagsByBundle string.");
1519     napi_value resourceName = nullptr;
1520     napi_create_string_latin1(env, "getSlotFlagsByBundle", NAPI_AUTO_LENGTH, &resourceName);
1521 
1522     // Asynchronous function call
1523     napi_create_async_work(env,
1524         nullptr,
1525         resourceName,
1526         [](napi_env env, void *data) {
1527             ANS_LOGI("GetSlotFlagsByBundle napi_create_async_work start");
1528             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotFlagsByBundle *>(data);
1529             if (asynccallbackinfo) {
1530                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotFlagsAsBundle(
1531                     asynccallbackinfo->params.option, asynccallbackinfo->slotFlags);
1532             }
1533         },
1534         [](napi_env env, napi_status status, void *data) {
1535             ANS_LOGI("GetSlotFlagsByBundle napi_create_async_work end");
1536             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotFlagsByBundle *>(data);
1537             if (asynccallbackinfo) {
1538                 napi_value result = nullptr;
1539                 napi_create_uint32(env, asynccallbackinfo->slotFlags, &result);
1540                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
1541                 if (asynccallbackinfo->info.callback != nullptr) {
1542                     ANS_LOGD("Delete getSlotFlagsByBundle callback reference.");
1543                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1544                 }
1545                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1546                 delete asynccallbackinfo;
1547                 asynccallbackinfo = nullptr;
1548             }
1549             ANS_LOGD("GetSlotFlagsByBundle work complete end.");
1550         },
1551         (void *)asynccallbackinfo,
1552         &asynccallbackinfo->asyncWork);
1553 
1554     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1555 
1556     if (asynccallbackinfo->info.isCallback) {
1557         ANS_LOGD("getSlotFlagsByBundle callback is nullptr.");
1558         return Common::NapiGetNull(env);
1559     } else {
1560         return promise;
1561     }
1562 }
1563 
SetSlotFlagsByBundle(napi_env env,napi_callback_info info)1564 napi_value SetSlotFlagsByBundle(napi_env env, napi_callback_info info)
1565 {
1566     ANS_LOGI("SetSlotFlagsByBundle enter");
1567 
1568     ParametersInfoSetSlotFlagsByBundle params {};
1569     if (ParseParametersSetSlotFlagsByBundle(env, info, params) == nullptr) {
1570         ANS_LOGI("Call ParseParametersSetSlotFlagsByBundle return nullptr");
1571         return Common::NapiGetUndefined(env);
1572     }
1573 
1574     AsyncCallbackInfoSetSlotFlagsByBundle *asynccallbackinfo =
1575         new (std::nothrow) AsyncCallbackInfoSetSlotFlagsByBundle {.env = env, .asyncWork = nullptr, .params = params};
1576     if (!asynccallbackinfo) {
1577         ANS_LOGD("Asynccallbackinfo is nullptr.");
1578         return Common::JSParaError(env, params.callback);
1579     }
1580     napi_value promise = nullptr;
1581     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
1582 
1583     ANS_LOGD("Create setSlotFlagsByBundle string.");
1584     napi_value resourceName = nullptr;
1585     napi_create_string_latin1(env, "setSlotFlagsByBundle", NAPI_AUTO_LENGTH, &resourceName);
1586 
1587     // Asynchronous function call
1588     napi_create_async_work(env,
1589         nullptr,
1590         resourceName,
1591         [](napi_env env, void *data) {
1592             ANS_LOGI("SetSlotFlagsByBundle napi_create_async_work start");
1593             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotFlagsByBundle *>(data);
1594             if (asynccallbackinfo) {
1595                 asynccallbackinfo->info.errorCode = NotificationHelper::SetNotificationSlotFlagsAsBundle(
1596                     asynccallbackinfo->params.option, asynccallbackinfo->params.slotFlags);
1597             }
1598         },
1599         [](napi_env env, napi_status status, void *data) {
1600             ANS_LOGI("SetSlotFlagsByBundle napi_create_async_work end");
1601             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotFlagsByBundle *>(data);
1602             if (asynccallbackinfo) {
1603                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
1604                 if (asynccallbackinfo->info.callback != nullptr) {
1605                     ANS_LOGD("Delete setSlotFlagsByBundle callback reference.");
1606                     napi_delete_reference(env, asynccallbackinfo->info.callback);
1607                 }
1608                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
1609                 delete asynccallbackinfo;
1610                 asynccallbackinfo = nullptr;
1611             }
1612             ANS_LOGD("SetSlotFlagsByBundle work complete end.");
1613         },
1614         (void *)asynccallbackinfo,
1615         &asynccallbackinfo->asyncWork);
1616 
1617     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
1618 
1619     if (asynccallbackinfo->info.isCallback) {
1620         ANS_LOGD("setSlotFlagsByBundle callback is nullptr.");
1621         return Common::NapiGetNull(env);
1622     } else {
1623         return promise;
1624     }
1625     ANS_LOGI("SetSlotFlagsByBundle out");
1626 }
1627 
1628 }  // namespace NotificationNapi
1629 }  // namespace OHOS
1630