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 ¶s)
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, ¶s.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 ¶s)
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, ¶s.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 ¶ms)
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, ¶ms.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 ¶s)
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, ¶s.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶s)
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, ¶s.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 ¶ms)
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, ¶ms.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 ¶ms)
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], ¶ms.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], ¶ms.isForceControl);
1436 } else if (valuetype == napi_function) {
1437 napi_create_reference(env, argv[PARAM3], 1, ¶ms.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 ¶ms)
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, ¶ms.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