• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 "napi_slot.h"
17 
18 #include "ans_inner_errors.h"
19 #include "slot.h"
20 
21 namespace OHOS {
22 namespace NotificationNapi {
NapiAddSlot(napi_env env,napi_callback_info info)23 napi_value NapiAddSlot(napi_env env, napi_callback_info info)
24 {
25     ANS_LOGI("enter");
26     ParametersInfoAddSlot paras;
27     if (ParseParametersByAddSlot(env, info, paras) == nullptr) {
28         Common::NapiThrow(env, ERROR_PARAM_INVALID);
29         return Common::NapiGetUndefined(env);
30     }
31 
32     AsyncCallbackInfoAddSlot *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoAddSlot {
33         .env = env,
34         .asyncWork = nullptr,
35         .slot = paras.slot,
36         .inType = paras.inType,
37         .isAddSlotByType = paras.isAddSlotByType
38     };
39     if (!asynccallbackinfo) {
40         return Common::JSParaError(env, paras.callback);
41     }
42     napi_value promise = nullptr;
43     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
44 
45     napi_value resourceName = nullptr;
46     napi_create_string_latin1(env, "addSlot", NAPI_AUTO_LENGTH, &resourceName);
47     // Asynchronous function call
48     napi_create_async_work(env,
49         nullptr,
50         resourceName,
51         [](napi_env env, void *data) {
52             ANS_LOGI("AddSlot napi_create_async_work start");
53             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
54             if (asynccallbackinfo) {
55                 if (asynccallbackinfo->isAddSlotByType) {
56                     asynccallbackinfo->info.errorCode = NotificationHelper::AddSlotByType(asynccallbackinfo->inType);
57                 } else {
58                     asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlot(
59                         asynccallbackinfo->slot);
60                 }
61             }
62         },
63         [](napi_env env, napi_status status, void *data) {
64             ANS_LOGI("AddSlot napi_create_async_work end");
65             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlot *>(data);
66             if (asynccallbackinfo) {
67                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
68                 if (asynccallbackinfo->info.callback != nullptr) {
69                     napi_delete_reference(env, asynccallbackinfo->info.callback);
70                 }
71                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
72                 delete asynccallbackinfo;
73                 asynccallbackinfo = nullptr;
74             }
75         },
76         (void *)asynccallbackinfo,
77         &asynccallbackinfo->asyncWork);
78 
79     bool isCallback = asynccallbackinfo->info.isCallback;
80     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
81     if (status != napi_ok) {
82         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
83         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
84         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
85         if (asynccallbackinfo->info.callback != nullptr) {
86             napi_delete_reference(env, asynccallbackinfo->info.callback);
87         }
88         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
89         delete asynccallbackinfo;
90         asynccallbackinfo = nullptr;
91     }
92 
93     if (isCallback) {
94         return Common::NapiGetNull(env);
95     } else {
96         return promise;
97     }
98 }
99 
NapiAddSlots(napi_env env,napi_callback_info info)100 napi_value NapiAddSlots(napi_env env, napi_callback_info info)
101 {
102     ANS_LOGI("enter");
103     ParametersInfoAddSlots paras;
104     if (ParseParametersByAddSlots(env, info, paras) == nullptr) {
105         Common::NapiThrow(env, ERROR_PARAM_INVALID);
106         return Common::NapiGetUndefined(env);
107     }
108 
109     AsyncCallbackInfoAddSlots *asynccallbackinfo =
110         new (std::nothrow) AsyncCallbackInfoAddSlots {.env = env, .asyncWork = nullptr, .slots = paras.slots};
111     if (!asynccallbackinfo) {
112         return Common::JSParaError(env, paras.callback);
113     }
114     napi_value promise = nullptr;
115     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
116 
117     napi_value resourceName = nullptr;
118     napi_create_string_latin1(env, "addSlots", NAPI_AUTO_LENGTH, &resourceName);
119     // Asynchronous function call
120     napi_create_async_work(env,
121         nullptr,
122         resourceName,
123         [](napi_env env, void *data) {
124             ANS_LOGI("AddSlots napi_create_async_work start");
125             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
126             if (asynccallbackinfo) {
127                 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlots(asynccallbackinfo->slots);
128             }
129         },
130         [](napi_env env, napi_status status, void *data) {
131             ANS_LOGI("AddSlots napi_create_async_work end");
132             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
133             if (asynccallbackinfo) {
134                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
135                 if (asynccallbackinfo->info.callback != nullptr) {
136                     napi_delete_reference(env, asynccallbackinfo->info.callback);
137                 }
138                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
139                 delete asynccallbackinfo;
140                 asynccallbackinfo = nullptr;
141             }
142         },
143         (void *)asynccallbackinfo,
144         &asynccallbackinfo->asyncWork);
145 
146     bool isCallback = asynccallbackinfo->info.isCallback;
147     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
148     if (status != napi_ok) {
149         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
150         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
151         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
152         if (asynccallbackinfo->info.callback != nullptr) {
153             napi_delete_reference(env, asynccallbackinfo->info.callback);
154         }
155         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
156         delete asynccallbackinfo;
157         asynccallbackinfo = nullptr;
158     }
159 
160     if (isCallback) {
161         return Common::NapiGetNull(env);
162     } else {
163         return promise;
164     }
165 }
166 
NapiSetSlotByBundle(napi_env env,napi_callback_info info)167 napi_value NapiSetSlotByBundle(napi_env env, napi_callback_info info)
168 {
169     ANS_LOGI("enter");
170     ParametersInfoSetSlotByBundle params {};
171     if (ParseParametersSetSlotByBundle(env, info, params) == nullptr) {
172         Common::NapiThrow(env, ERROR_PARAM_INVALID);
173         return Common::NapiGetUndefined(env);
174     }
175 
176     AsyncCallbackInfoSetSlotByBundle *asynccallbackinfo =
177         new (std::nothrow) AsyncCallbackInfoSetSlotByBundle {.env = env, .asyncWork = nullptr, .params = params};
178     if (!asynccallbackinfo) {
179         return Common::JSParaError(env, params.callback);
180     }
181     napi_value promise = nullptr;
182     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
183 
184     napi_value resourceName = nullptr;
185     napi_create_string_latin1(env, "setSlotByBundle", NAPI_AUTO_LENGTH, &resourceName);
186     // Asynchronous function call
187     napi_create_async_work(env,
188         nullptr,
189         resourceName,
190         [](napi_env env, void *data) {
191             ANS_LOGI("SetSlotByBundle napi_create_async_work start");
192             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
193             if (asynccallbackinfo) {
194                 asynccallbackinfo->info.errorCode = NotificationHelper::UpdateNotificationSlots(
195                     asynccallbackinfo->params.option, asynccallbackinfo->params.slots);
196             }
197         },
198         [](napi_env env, napi_status status, void *data) {
199             ANS_LOGI("SetSlotByBundle napi_create_async_work end");
200             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
201             if (asynccallbackinfo) {
202                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
203                 if (asynccallbackinfo->info.callback != nullptr) {
204                     napi_delete_reference(env, asynccallbackinfo->info.callback);
205                 }
206                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
207                 delete asynccallbackinfo;
208                 asynccallbackinfo = nullptr;
209             }
210         },
211         (void *)asynccallbackinfo,
212         &asynccallbackinfo->asyncWork);
213 
214     bool isCallback = asynccallbackinfo->info.isCallback;
215     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
216     if (status != napi_ok) {
217         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
218         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
219         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
220         if (asynccallbackinfo->info.callback != nullptr) {
221             napi_delete_reference(env, asynccallbackinfo->info.callback);
222         }
223         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
224         delete asynccallbackinfo;
225         asynccallbackinfo = nullptr;
226     }
227 
228     if (isCallback) {
229         return Common::NapiGetNull(env);
230     } else {
231         return promise;
232     }
233 }
234 
235 
AsyncCompleteCallbackNapiGetSlot(napi_env env,napi_status status,void * data)236 void AsyncCompleteCallbackNapiGetSlot(napi_env env, napi_status status, void *data)
237 {
238     ANS_LOGI("GetSlot napi_create_async_work end");
239     if (!data) {
240         ANS_LOGE("Invalid async callback data");
241         return;
242     }
243 
244     auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
245     if (asynccallbackinfo) {
246         napi_value result = Common::NapiGetNull(env);
247         if (asynccallbackinfo->info.errorCode == ERR_OK) {
248             if (asynccallbackinfo->slot != nullptr) {
249                 napi_create_object(env, &result);
250                 if (!Common::SetNotificationSlot(env, *asynccallbackinfo->slot, result)) {
251                     asynccallbackinfo->info.errorCode = ERROR;
252                     result = Common::NapiGetNull(env);
253                 }
254             }
255         }
256         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
257         if (asynccallbackinfo->info.callback != nullptr) {
258             napi_delete_reference(env, asynccallbackinfo->info.callback);
259         }
260         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
261         delete asynccallbackinfo;
262         asynccallbackinfo = nullptr;
263     }
264 }
265 
NapiGetSlot(napi_env env,napi_callback_info info)266 napi_value NapiGetSlot(napi_env env, napi_callback_info info)
267 {
268     ANS_LOGI("enter");
269     ParametersInfoGetSlot paras;
270     if (ParseParametersByGetSlot(env, info, paras) == nullptr) {
271         Common::NapiThrow(env, ERROR_PARAM_INVALID);
272         return Common::NapiGetUndefined(env);
273     }
274 
275     AsyncCallbackInfoGetSlot *asynccallbackinfo =
276         new (std::nothrow) AsyncCallbackInfoGetSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
277     if (!asynccallbackinfo) {
278         return Common::JSParaError(env, paras.callback);
279     }
280     napi_value promise = nullptr;
281     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
282 
283     napi_value resourceName = nullptr;
284     napi_create_string_latin1(env, "getSlot", NAPI_AUTO_LENGTH, &resourceName);
285     // Asynchronous function call
286     napi_create_async_work(env,
287         nullptr,
288         resourceName,
289         [](napi_env env, void *data) {
290             ANS_LOGI("GetSlot napi_create_async_work start");
291             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
292             if (asynccallbackinfo) {
293                 asynccallbackinfo->info.errorCode =
294                     NotificationHelper::GetNotificationSlot(asynccallbackinfo->outType, asynccallbackinfo->slot);
295             }
296         },
297         AsyncCompleteCallbackNapiGetSlot,
298         (void *)asynccallbackinfo,
299         &asynccallbackinfo->asyncWork);
300 
301     bool isCallback = asynccallbackinfo->info.isCallback;
302     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
303     if (status != napi_ok) {
304         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
305         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
306         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
307         if (asynccallbackinfo->info.callback != nullptr) {
308             napi_delete_reference(env, asynccallbackinfo->info.callback);
309         }
310         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
311         delete asynccallbackinfo;
312         asynccallbackinfo = nullptr;
313     }
314 
315     if (isCallback) {
316         return Common::NapiGetNull(env);
317     } else {
318         return promise;
319     }
320 }
321 
NapiGetSlotNumByBundle(napi_env env,napi_callback_info info)322 napi_value NapiGetSlotNumByBundle(napi_env env, napi_callback_info info)
323 {
324     ANS_LOGI("enter");
325     ParametersInfoGetSlotNumByBundle params {};
326     if (ParseParametersGetSlotNumByBundle(env, info, params) == nullptr) {
327         Common::NapiThrow(env, ERROR_PARAM_INVALID);
328         return Common::NapiGetUndefined(env);
329     }
330 
331     AsyncCallbackInfoGetSlotNumByBundle *asynccallbackinfo =
332         new (std::nothrow) AsyncCallbackInfoGetSlotNumByBundle {.env = env, .asyncWork = nullptr, .params = params};
333     if (!asynccallbackinfo) {
334         return Common::JSParaError(env, params.callback);
335     }
336     napi_value promise = nullptr;
337     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
338 
339     napi_value resourceName = nullptr;
340     napi_create_string_latin1(env, "getSlotNumByBundle", NAPI_AUTO_LENGTH, &resourceName);
341     // Asynchronous function call
342     napi_create_async_work(env,
343         nullptr,
344         resourceName,
345         [](napi_env env, void *data) {
346             ANS_LOGI("GetSlotNumByBundle napi_create_async_work start");
347             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
348             if (asynccallbackinfo) {
349                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotNumAsBundle(
350                     asynccallbackinfo->params.option, asynccallbackinfo->num);
351             }
352         },
353         [](napi_env env, napi_status status, void *data) {
354             ANS_LOGI("GetSlotNumByBundle napi_create_async_work end");
355             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
356             if (asynccallbackinfo) {
357                 napi_value result = nullptr;
358                 napi_create_uint32(env, asynccallbackinfo->num, &result);
359                 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
360                 if (asynccallbackinfo->info.callback != nullptr) {
361                     napi_delete_reference(env, asynccallbackinfo->info.callback);
362                 }
363                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
364                 delete asynccallbackinfo;
365                 asynccallbackinfo = nullptr;
366             }
367         },
368         (void *)asynccallbackinfo,
369         &asynccallbackinfo->asyncWork);
370 
371     bool isCallback = asynccallbackinfo->info.isCallback;
372     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
373     if (status != napi_ok) {
374         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
375         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
376         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
377         if (asynccallbackinfo->info.callback != nullptr) {
378             napi_delete_reference(env, asynccallbackinfo->info.callback);
379         }
380         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
381         delete asynccallbackinfo;
382         asynccallbackinfo = nullptr;
383     }
384 
385     if (isCallback) {
386         return Common::NapiGetNull(env);
387     } else {
388         return promise;
389     }
390 }
391 
AsyncCompleteCallbackNapiGetSlots(napi_env env,napi_status status,void * data)392 void AsyncCompleteCallbackNapiGetSlots(napi_env env, napi_status status, void *data)
393 {
394     ANS_LOGI("enter");
395     if (!data) {
396         ANS_LOGE("Invalid async callback data");
397         return;
398     }
399     napi_value result = nullptr;
400     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
401     if (asynccallbackinfo) {
402         if (asynccallbackinfo->info.errorCode != ERR_OK) {
403             result = Common::NapiGetNull(env);
404         } else {
405             napi_value arr = nullptr;
406             napi_create_array(env, &arr);
407             size_t count = 0;
408             for (auto vec : asynccallbackinfo->slots) {
409                 if (!vec) {
410                     ANS_LOGW("Invalid NotificationSlot object ptr");
411                     continue;
412                 }
413                 napi_value nSlot = nullptr;
414                 napi_create_object(env, &nSlot);
415                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
416                     continue;
417                 }
418                 napi_set_element(env, arr, count, nSlot);
419                 count++;
420             }
421             ANS_LOGI("getSlots count = %{public}zu", count);
422             result = arr;
423             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
424                 asynccallbackinfo->info.errorCode = ERROR;
425                 result = Common::NapiGetNull(env);
426             }
427         }
428         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
429         if (asynccallbackinfo->info.callback != nullptr) {
430             napi_delete_reference(env, asynccallbackinfo->info.callback);
431         }
432         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
433         delete asynccallbackinfo;
434         asynccallbackinfo = nullptr;
435     }
436 }
437 
NapiGetSlots(napi_env env,napi_callback_info info)438 napi_value NapiGetSlots(napi_env env, napi_callback_info info)
439 {
440     ANS_LOGI("enter");
441     napi_ref callback = nullptr;
442     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
443         Common::NapiThrow(env, ERROR_PARAM_INVALID);
444         return Common::NapiGetUndefined(env);
445     }
446 
447     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetSlots {.env = env, .asyncWork = nullptr};
448     if (!asynccallbackinfo) {
449         return Common::JSParaError(env, callback);
450     }
451     napi_value promise = nullptr;
452     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
453 
454     napi_value resourceName = nullptr;
455     napi_create_string_latin1(env, "getSlots", NAPI_AUTO_LENGTH, &resourceName);
456     // Asynchronous function call
457     napi_create_async_work(env,
458         nullptr,
459         resourceName,
460         [](napi_env env, void *data) {
461             ANS_LOGI("GetSlots napi_create_async_work start");
462             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
463             if (asynccallbackinfo) {
464                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlots(asynccallbackinfo->slots);
465             }
466         },
467         AsyncCompleteCallbackNapiGetSlots,
468         (void *)asynccallbackinfo,
469         &asynccallbackinfo->asyncWork);
470 
471     bool isCallback = asynccallbackinfo->info.isCallback;
472     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
473     if (status != napi_ok) {
474         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
475         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
476         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
477         if (asynccallbackinfo->info.callback != nullptr) {
478             napi_delete_reference(env, asynccallbackinfo->info.callback);
479         }
480         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
481         delete asynccallbackinfo;
482         asynccallbackinfo = nullptr;
483     }
484 
485     if (isCallback) {
486         return Common::NapiGetNull(env);
487     } else {
488         return promise;
489     }
490 }
491 
AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env,napi_status status,void * data)492 void AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env, napi_status status, void *data)
493 {
494     ANS_LOGI("enter");
495     if (!data) {
496         ANS_LOGE("Invalid async callback data");
497         return;
498     }
499     napi_value result = nullptr;
500     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
501     if (asynccallbackinfo) {
502         if (asynccallbackinfo->info.errorCode != ERR_OK) {
503             result = Common::NapiGetNull(env);
504         } else {
505             napi_value arr = nullptr;
506             napi_create_array(env, &arr);
507             size_t count = 0;
508             for (auto vec : asynccallbackinfo->slots) {
509                 if (!vec) {
510                     ANS_LOGW("Invalid NotificationSlot object ptr");
511                     continue;
512                 }
513                 napi_value nSlot = nullptr;
514                 napi_create_object(env, &nSlot);
515                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
516                     continue;
517                 }
518                 napi_set_element(env, arr, count, nSlot);
519                 count++;
520             }
521             ANS_LOGI("getSlots count = %{public}zu", count);
522             result = arr;
523             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
524                 asynccallbackinfo->info.errorCode = ERROR;
525                 result = Common::NapiGetNull(env);
526             }
527         }
528         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
529         if (asynccallbackinfo->info.callback != nullptr) {
530             napi_delete_reference(env, asynccallbackinfo->info.callback);
531         }
532         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
533         delete asynccallbackinfo;
534         asynccallbackinfo = nullptr;
535     }
536 }
537 
NapiGetSlotsByBundle(napi_env env,napi_callback_info info)538 napi_value NapiGetSlotsByBundle(napi_env env, napi_callback_info info)
539 {
540     ANS_LOGI("enter");
541     ParametersInfoGetSlotsByBundle params {};
542     if (ParseParametersGetSlotsByBundle(env, info, params) == nullptr) {
543         Common::NapiThrow(env, ERROR_PARAM_INVALID);
544         return Common::NapiGetUndefined(env);
545     }
546 
547     AsyncCallbackInfoGetSlotsByBundle *asynccallbackinfo =
548         new (std::nothrow) AsyncCallbackInfoGetSlotsByBundle {.env = env, .asyncWork = nullptr, .params = params};
549     if (!asynccallbackinfo) {
550         return Common::JSParaError(env, params.callback);
551     }
552     napi_value promise = nullptr;
553     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
554 
555     napi_value resourceName = nullptr;
556     napi_create_string_latin1(env, "getSlotsByBundle", NAPI_AUTO_LENGTH, &resourceName);
557     // Asynchronous function call
558     napi_create_async_work(env,
559         nullptr,
560         resourceName,
561         [](napi_env env, void *data) {
562             ANS_LOGI("GetSlotsByBundle napi_create_async_work start");
563             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
564             if (asynccallbackinfo) {
565                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotsForBundle(
566                     asynccallbackinfo->params.option, asynccallbackinfo->slots);
567             }
568         },
569         AsyncCompleteCallbackNapiGetSlotsByBundle,
570         (void *)asynccallbackinfo,
571         &asynccallbackinfo->asyncWork);
572 
573     bool isCallback = asynccallbackinfo->info.isCallback;
574     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
575     if (status != napi_ok) {
576         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
577         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
578         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
579         if (asynccallbackinfo->info.callback != nullptr) {
580             napi_delete_reference(env, asynccallbackinfo->info.callback);
581         }
582         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
583         delete asynccallbackinfo;
584         asynccallbackinfo = nullptr;
585     }
586 
587     if (isCallback) {
588         return Common::NapiGetNull(env);
589     } else {
590         return promise;
591     }
592 }
593 
NapiRemoveSlot(napi_env env,napi_callback_info info)594 napi_value NapiRemoveSlot(napi_env env, napi_callback_info info)
595 {
596     ANS_LOGI("enter");
597     ParametersInfoRemoveSlot paras;
598     if (ParseParametersByRemoveSlot(env, info, paras) == nullptr) {
599         Common::NapiThrow(env, ERROR_PARAM_INVALID);
600         return Common::NapiGetUndefined(env);
601     }
602 
603     AsyncCallbackInfoRemoveSlot *asynccallbackinfo =
604         new (std::nothrow) AsyncCallbackInfoRemoveSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
605     if (!asynccallbackinfo) {
606         return Common::JSParaError(env, paras.callback);
607     }
608     napi_value promise = nullptr;
609     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
610 
611     napi_value resourceName = nullptr;
612     napi_create_string_latin1(env, "removeSlot", NAPI_AUTO_LENGTH, &resourceName);
613     // Asynchronous function call
614     napi_create_async_work(env,
615         nullptr,
616         resourceName,
617         [](napi_env env, void *data) {
618             ANS_LOGI("removeSlot napi_create_async_work start");
619             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
620             if (asynccallbackinfo) {
621                 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveNotificationSlot(
622                     asynccallbackinfo->outType);
623             }
624         },
625         [](napi_env env, napi_status status, void *data) {
626             ANS_LOGI("removeSlot napi_create_async_work end");
627             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
628             if (asynccallbackinfo) {
629                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
630                 if (asynccallbackinfo->info.callback != nullptr) {
631                     napi_delete_reference(env, asynccallbackinfo->info.callback);
632                 }
633                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
634                 delete asynccallbackinfo;
635                 asynccallbackinfo = nullptr;
636             }
637         },
638         (void *)asynccallbackinfo,
639         &asynccallbackinfo->asyncWork);
640 
641     bool isCallback = asynccallbackinfo->info.isCallback;
642     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
643     if (status != napi_ok) {
644         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
645         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
646         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
647         if (asynccallbackinfo->info.callback != nullptr) {
648             napi_delete_reference(env, asynccallbackinfo->info.callback);
649         }
650         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
651         delete asynccallbackinfo;
652         asynccallbackinfo = nullptr;
653     }
654 
655     if (isCallback) {
656         return Common::NapiGetNull(env);
657     } else {
658         return promise;
659     }
660 }
661 
NapiRemoveAllSlots(napi_env env,napi_callback_info info)662 napi_value NapiRemoveAllSlots(napi_env env, napi_callback_info info)
663 {
664     ANS_LOGI("enter");
665     napi_ref callback = nullptr;
666     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
667         Common::NapiThrow(env, ERROR_PARAM_INVALID);
668         return Common::NapiGetUndefined(env);
669     }
670 
671     auto *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoRemoveAllSlots {.env = env, .asyncWork = nullptr};
672     if (!asynccallbackinfo) {
673         return Common::JSParaError(env, callback);
674     }
675     napi_value promise = nullptr;
676     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
677 
678     napi_value resourceName = nullptr;
679     napi_create_string_latin1(env, "removeAll", NAPI_AUTO_LENGTH, &resourceName);
680     // Asynchronous function call
681     napi_create_async_work(env,
682         nullptr,
683         resourceName,
684         [](napi_env env, void *data) {
685             ANS_LOGI("RemoveAllSlots napi_create_async_work start");
686             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
687             if (asynccallbackinfo) {
688                 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveAllSlots();
689             }
690         },
691         [](napi_env env, napi_status status, void *data) {
692             ANS_LOGI("RemoveAllSlots napi_create_async_work end");
693             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
694             if (asynccallbackinfo) {
695                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
696                 if (asynccallbackinfo->info.callback != nullptr) {
697                     napi_delete_reference(env, asynccallbackinfo->info.callback);
698                 }
699                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
700                 delete asynccallbackinfo;
701                 asynccallbackinfo = nullptr;
702             }
703         },
704         (void *)asynccallbackinfo,
705         &asynccallbackinfo->asyncWork);
706 
707     bool isCallback = asynccallbackinfo->info.isCallback;
708     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
709     if (status != napi_ok) {
710         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
711         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
712         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
713         if (asynccallbackinfo->info.callback != nullptr) {
714             napi_delete_reference(env, asynccallbackinfo->info.callback);
715         }
716         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
717         delete asynccallbackinfo;
718         asynccallbackinfo = nullptr;
719     }
720 
721     if (isCallback) {
722         return Common::NapiGetNull(env);
723     } else {
724         return promise;
725     }
726 }
727 
NapiEnableNotificationSlot(napi_env env,napi_callback_info info)728 napi_value NapiEnableNotificationSlot(napi_env env, napi_callback_info info)
729 {
730     ANS_LOGI("enter");
731     ParametersInfoEnableSlot params {};
732     if (ParseParametersEnableSlot(env, info, params) == nullptr) {
733         Common::NapiThrow(env, ERROR_PARAM_INVALID);
734         return Common::NapiGetUndefined(env);
735     }
736 
737     AsyncCallbackInfoInfoEnableSlot *asynccallbackinfo =
738         new (std::nothrow) AsyncCallbackInfoInfoEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
739     if (!asynccallbackinfo) {
740         return Common::JSParaError(env, params.callback);
741     }
742     napi_value promise = nullptr;
743     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
744 
745     napi_value resourceName = nullptr;
746     napi_create_string_latin1(env, "EnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
747     // Asynchronous function call
748     napi_create_async_work(env,
749         nullptr,
750         resourceName,
751         [](napi_env env, void *data) {
752             ANS_LOGI("EnableNotificationSlot napi_create_async_work start");
753             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
754             if (asynccallbackinfo) {
755                 asynccallbackinfo->info.errorCode = NotificationHelper::SetEnabledForBundleSlot(
756                     asynccallbackinfo->params.option, asynccallbackinfo->params.outType,
757                     asynccallbackinfo->params.enable);
758             }
759         },
760         [](napi_env env, napi_status status, void *data) {
761             ANS_LOGI("EnableNotificationSlot napi_create_async_work end");
762             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
763             if (asynccallbackinfo) {
764                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
765                 if (asynccallbackinfo->info.callback != nullptr) {
766                     napi_delete_reference(env, asynccallbackinfo->info.callback);
767                 }
768                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
769                 delete asynccallbackinfo;
770                 asynccallbackinfo = nullptr;
771             }
772         },
773         (void *)asynccallbackinfo,
774         &asynccallbackinfo->asyncWork);
775 
776     bool isCallback = asynccallbackinfo->info.isCallback;
777     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
778     if (status != napi_ok) {
779         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
780         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
781         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
782         if (asynccallbackinfo->info.callback != nullptr) {
783             napi_delete_reference(env, asynccallbackinfo->info.callback);
784         }
785         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
786         delete asynccallbackinfo;
787         asynccallbackinfo = nullptr;
788     }
789 
790     if (isCallback) {
791         return Common::NapiGetNull(env);
792     } else {
793         return promise;
794     }
795 }
796 
NapiIsEnableNotificationSlot(napi_env env,napi_callback_info info)797 napi_value NapiIsEnableNotificationSlot(napi_env env, napi_callback_info info)
798 {
799     ANS_LOGI("enter");
800     ParametersInfoIsEnableSlot params {};
801     if (ParseParametersIsEnableSlot(env, info, params) == nullptr) {
802         Common::NapiThrow(env, ERROR_PARAM_INVALID);
803         return Common::NapiGetUndefined(env);
804     }
805 
806     AsyncCallbackInfoInfoIsEnableSlot *asynccallbackinfo =
807         new (std::nothrow) AsyncCallbackInfoInfoIsEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
808     if (!asynccallbackinfo) {
809         return Common::JSParaError(env, params.callback);
810     }
811     napi_value promise = nullptr;
812     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
813 
814     napi_value resourceName = nullptr;
815     napi_create_string_latin1(env, "IsEnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
816     // Asynchronous function call
817     napi_create_async_work(env,
818         nullptr,
819         resourceName,
820         [](napi_env env, void *data) {
821             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work start");
822             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
823             if (asynccallbackinfo) {
824                 asynccallbackinfo->info.errorCode = NotificationHelper::GetEnabledForBundleSlot(
825                     asynccallbackinfo->params.option, asynccallbackinfo->params.outType, asynccallbackinfo->isEnable);
826             }
827         },
828         [](napi_env env, napi_status status, void *data) {
829             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work end");
830             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
831             if (asynccallbackinfo) {
832                 napi_value result = nullptr;
833                 napi_get_boolean(env, asynccallbackinfo->isEnable, &result);
834                 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
835                 if (asynccallbackinfo->info.callback != nullptr) {
836                     napi_delete_reference(env, asynccallbackinfo->info.callback);
837                 }
838                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
839                 delete asynccallbackinfo;
840                 asynccallbackinfo = nullptr;
841             }
842         },
843         (void *)asynccallbackinfo,
844         &asynccallbackinfo->asyncWork);
845 
846     bool isCallback = asynccallbackinfo->info.isCallback;
847     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
848     if (status != napi_ok) {
849         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
850         asynccallbackinfo->info.errorCode = ERROR_INTERNAL_ERROR;
851         Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
852         if (asynccallbackinfo->info.callback != nullptr) {
853             napi_delete_reference(env, asynccallbackinfo->info.callback);
854         }
855         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
856         delete asynccallbackinfo;
857         asynccallbackinfo = nullptr;
858     }
859 
860     if (isCallback) {
861         return Common::NapiGetNull(env);
862     } else {
863         return promise;
864     }
865 }
866 }  // namespace NotificationNapi
867 }  // namespace OHOS