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