• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
80     if (asynccallbackinfo->info.isCallback) {
81         return Common::NapiGetNull(env);
82     } else {
83         return promise;
84     }
85 }
86 
NapiAddSlots(napi_env env,napi_callback_info info)87 napi_value NapiAddSlots(napi_env env, napi_callback_info info)
88 {
89     ANS_LOGI("enter");
90     ParametersInfoAddSlots paras;
91     if (ParseParametersByAddSlots(env, info, paras) == nullptr) {
92         Common::NapiThrow(env, ERROR_PARAM_INVALID);
93         return Common::NapiGetUndefined(env);
94     }
95 
96     AsyncCallbackInfoAddSlots *asynccallbackinfo =
97         new (std::nothrow) AsyncCallbackInfoAddSlots {.env = env, .asyncWork = nullptr, .slots = paras.slots};
98     if (!asynccallbackinfo) {
99         return Common::JSParaError(env, paras.callback);
100     }
101     napi_value promise = nullptr;
102     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
103 
104     napi_value resourceName = nullptr;
105     napi_create_string_latin1(env, "addSlots", NAPI_AUTO_LENGTH, &resourceName);
106     // Asynchronous function call
107     napi_create_async_work(env,
108         nullptr,
109         resourceName,
110         [](napi_env env, void *data) {
111             ANS_LOGI("AddSlots napi_create_async_work start");
112             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
113             if (asynccallbackinfo) {
114                 asynccallbackinfo->info.errorCode = NotificationHelper::AddNotificationSlots(asynccallbackinfo->slots);
115             }
116         },
117         [](napi_env env, napi_status status, void *data) {
118             ANS_LOGI("AddSlots napi_create_async_work end");
119             auto asynccallbackinfo = static_cast<AsyncCallbackInfoAddSlots *>(data);
120             if (asynccallbackinfo) {
121                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
122                 if (asynccallbackinfo->info.callback != nullptr) {
123                     napi_delete_reference(env, asynccallbackinfo->info.callback);
124                 }
125                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
126                 delete asynccallbackinfo;
127                 asynccallbackinfo = nullptr;
128             }
129         },
130         (void *)asynccallbackinfo,
131         &asynccallbackinfo->asyncWork);
132 
133     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
134     if (asynccallbackinfo->info.isCallback) {
135         return Common::NapiGetNull(env);
136     } else {
137         return promise;
138     }
139 }
140 
NapiSetSlotByBundle(napi_env env,napi_callback_info info)141 napi_value NapiSetSlotByBundle(napi_env env, napi_callback_info info)
142 {
143     ANS_LOGI("enter");
144     ParametersInfoSetSlotByBundle params {};
145     if (ParseParametersSetSlotByBundle(env, info, params) == nullptr) {
146         Common::NapiThrow(env, ERROR_PARAM_INVALID);
147         return Common::NapiGetUndefined(env);
148     }
149 
150     AsyncCallbackInfoSetSlotByBundle *asynccallbackinfo =
151         new (std::nothrow) AsyncCallbackInfoSetSlotByBundle {.env = env, .asyncWork = nullptr, .params = params};
152     if (!asynccallbackinfo) {
153         return Common::JSParaError(env, params.callback);
154     }
155     napi_value promise = nullptr;
156     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
157 
158     napi_value resourceName = nullptr;
159     napi_create_string_latin1(env, "setSlotByBundle", NAPI_AUTO_LENGTH, &resourceName);
160     // Asynchronous function call
161     napi_create_async_work(env,
162         nullptr,
163         resourceName,
164         [](napi_env env, void *data) {
165             ANS_LOGI("SetSlotByBundle napi_create_async_work start");
166             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
167             if (asynccallbackinfo) {
168                 asynccallbackinfo->info.errorCode = NotificationHelper::UpdateNotificationSlots(
169                     asynccallbackinfo->params.option, asynccallbackinfo->params.slots);
170             }
171         },
172         [](napi_env env, napi_status status, void *data) {
173             ANS_LOGI("SetSlotByBundle napi_create_async_work end");
174             auto asynccallbackinfo = static_cast<AsyncCallbackInfoSetSlotByBundle *>(data);
175             if (asynccallbackinfo) {
176                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
177                 if (asynccallbackinfo->info.callback != nullptr) {
178                     napi_delete_reference(env, asynccallbackinfo->info.callback);
179                 }
180                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
181                 delete asynccallbackinfo;
182                 asynccallbackinfo = nullptr;
183             }
184         },
185         (void *)asynccallbackinfo,
186         &asynccallbackinfo->asyncWork);
187 
188     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
189     if (asynccallbackinfo->info.isCallback) {
190         return Common::NapiGetNull(env);
191     } else {
192         return promise;
193     }
194 }
195 
196 
AsyncCompleteCallbackNapiGetSlot(napi_env env,napi_status status,void * data)197 void AsyncCompleteCallbackNapiGetSlot(napi_env env, napi_status status, void *data)
198 {
199     ANS_LOGI("GetSlot napi_create_async_work end");
200     if (!data) {
201         ANS_LOGE("Invalid async callback data");
202         return;
203     }
204 
205     auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
206     if (asynccallbackinfo) {
207         napi_value result = Common::NapiGetNull(env);
208         if (asynccallbackinfo->info.errorCode == ERR_OK) {
209             if (asynccallbackinfo->slot != nullptr) {
210                 napi_create_object(env, &result);
211                 if (!Common::SetNotificationSlot(env, *asynccallbackinfo->slot, result)) {
212                     asynccallbackinfo->info.errorCode = ERROR;
213                     result = Common::NapiGetNull(env);
214                 }
215             }
216         }
217         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
218         if (asynccallbackinfo->info.callback != nullptr) {
219             napi_delete_reference(env, asynccallbackinfo->info.callback);
220         }
221         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
222         delete asynccallbackinfo;
223         asynccallbackinfo = nullptr;
224     }
225 }
226 
NapiGetSlot(napi_env env,napi_callback_info info)227 napi_value NapiGetSlot(napi_env env, napi_callback_info info)
228 {
229     ANS_LOGI("enter");
230     ParametersInfoGetSlot paras;
231     if (ParseParametersByGetSlot(env, info, paras) == nullptr) {
232         Common::NapiThrow(env, ERROR_PARAM_INVALID);
233         return Common::NapiGetUndefined(env);
234     }
235 
236     AsyncCallbackInfoGetSlot *asynccallbackinfo =
237         new (std::nothrow) AsyncCallbackInfoGetSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
238     if (!asynccallbackinfo) {
239         return Common::JSParaError(env, paras.callback);
240     }
241     napi_value promise = nullptr;
242     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
243 
244     napi_value resourceName = nullptr;
245     napi_create_string_latin1(env, "getSlot", NAPI_AUTO_LENGTH, &resourceName);
246     // Asynchronous function call
247     napi_create_async_work(env,
248         nullptr,
249         resourceName,
250         [](napi_env env, void *data) {
251             ANS_LOGI("GetSlot napi_create_async_work start");
252             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlot *>(data);
253             if (asynccallbackinfo) {
254                 asynccallbackinfo->info.errorCode =
255                     NotificationHelper::GetNotificationSlot(asynccallbackinfo->outType, asynccallbackinfo->slot);
256             }
257         },
258         AsyncCompleteCallbackNapiGetSlot,
259         (void *)asynccallbackinfo,
260         &asynccallbackinfo->asyncWork);
261 
262     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
263     if (asynccallbackinfo->info.isCallback) {
264         return Common::NapiGetNull(env);
265     } else {
266         return promise;
267     }
268 }
269 
NapiGetSlotNumByBundle(napi_env env,napi_callback_info info)270 napi_value NapiGetSlotNumByBundle(napi_env env, napi_callback_info info)
271 {
272     ANS_LOGI("enter");
273     ParametersInfoGetSlotNumByBundle params {};
274     if (ParseParametersGetSlotNumByBundle(env, info, params) == nullptr) {
275         Common::NapiThrow(env, ERROR_PARAM_INVALID);
276         return Common::NapiGetUndefined(env);
277     }
278 
279     AsyncCallbackInfoGetSlotNumByBundle *asynccallbackinfo =
280         new (std::nothrow) AsyncCallbackInfoGetSlotNumByBundle {.env = env, .asyncWork = nullptr, .params = params};
281     if (!asynccallbackinfo) {
282         return Common::JSParaError(env, params.callback);
283     }
284     napi_value promise = nullptr;
285     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
286 
287     napi_value resourceName = nullptr;
288     napi_create_string_latin1(env, "getSlotNumByBundle", NAPI_AUTO_LENGTH, &resourceName);
289     // Asynchronous function call
290     napi_create_async_work(env,
291         nullptr,
292         resourceName,
293         [](napi_env env, void *data) {
294             ANS_LOGI("GetSlotNumByBundle napi_create_async_work start");
295             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
296             if (asynccallbackinfo) {
297                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotNumAsBundle(
298                     asynccallbackinfo->params.option, asynccallbackinfo->num);
299             }
300         },
301         [](napi_env env, napi_status status, void *data) {
302             ANS_LOGI("GetSlotNumByBundle napi_create_async_work end");
303             auto asynccallbackinfo = static_cast<AsyncCallbackInfoGetSlotNumByBundle *>(data);
304             if (asynccallbackinfo) {
305                 napi_value result = nullptr;
306                 napi_create_uint32(env, asynccallbackinfo->num, &result);
307                 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
308                 if (asynccallbackinfo->info.callback != nullptr) {
309                     napi_delete_reference(env, asynccallbackinfo->info.callback);
310                 }
311                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
312                 delete asynccallbackinfo;
313                 asynccallbackinfo = nullptr;
314             }
315         },
316         (void *)asynccallbackinfo,
317         &asynccallbackinfo->asyncWork);
318 
319     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
320     if (asynccallbackinfo->info.isCallback) {
321         return Common::NapiGetNull(env);
322     } else {
323         return promise;
324     }
325 }
326 
AsyncCompleteCallbackNapiGetSlots(napi_env env,napi_status status,void * data)327 void AsyncCompleteCallbackNapiGetSlots(napi_env env, napi_status status, void *data)
328 {
329     ANS_LOGI("enter");
330     if (!data) {
331         ANS_LOGE("Invalid async callback data");
332         return;
333     }
334     napi_value result = nullptr;
335     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
336     if (asynccallbackinfo) {
337         if (asynccallbackinfo->info.errorCode != ERR_OK) {
338             result = Common::NapiGetNull(env);
339         } else {
340             napi_value arr = nullptr;
341             napi_create_array(env, &arr);
342             size_t count = 0;
343             for (auto vec : asynccallbackinfo->slots) {
344                 if (!vec) {
345                     ANS_LOGW("Invalid NotificationSlot object ptr");
346                     continue;
347                 }
348                 napi_value nSlot = nullptr;
349                 napi_create_object(env, &nSlot);
350                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
351                     continue;
352                 }
353                 napi_set_element(env, arr, count, nSlot);
354                 count++;
355             }
356             ANS_LOGI("getSlots count = %{public}zu", count);
357             result = arr;
358             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
359                 asynccallbackinfo->info.errorCode = ERROR;
360                 result = Common::NapiGetNull(env);
361             }
362         }
363         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
364         if (asynccallbackinfo->info.callback != nullptr) {
365             napi_delete_reference(env, asynccallbackinfo->info.callback);
366         }
367         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
368         delete asynccallbackinfo;
369         asynccallbackinfo = nullptr;
370     }
371 }
372 
NapiGetSlots(napi_env env,napi_callback_info info)373 napi_value NapiGetSlots(napi_env env, napi_callback_info info)
374 {
375     ANS_LOGI("enter");
376     napi_ref callback = nullptr;
377     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
378         Common::NapiThrow(env, ERROR_PARAM_INVALID);
379         return Common::NapiGetUndefined(env);
380     }
381 
382     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetSlots {.env = env, .asyncWork = nullptr};
383     if (!asynccallbackinfo) {
384         return Common::JSParaError(env, callback);
385     }
386     napi_value promise = nullptr;
387     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
388 
389     napi_value resourceName = nullptr;
390     napi_create_string_latin1(env, "getSlots", NAPI_AUTO_LENGTH, &resourceName);
391     // Asynchronous function call
392     napi_create_async_work(env,
393         nullptr,
394         resourceName,
395         [](napi_env env, void *data) {
396             ANS_LOGI("GetSlots napi_create_async_work start");
397             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlots *>(data);
398             if (asynccallbackinfo) {
399                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlots(asynccallbackinfo->slots);
400             }
401         },
402         AsyncCompleteCallbackNapiGetSlots,
403         (void *)asynccallbackinfo,
404         &asynccallbackinfo->asyncWork);
405 
406     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
407 
408     if (asynccallbackinfo->info.isCallback) {
409         return Common::NapiGetNull(env);
410     } else {
411         return promise;
412     }
413 }
414 
AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env,napi_status status,void * data)415 void AsyncCompleteCallbackNapiGetSlotsByBundle(napi_env env, napi_status status, void *data)
416 {
417     ANS_LOGI("enter");
418     if (!data) {
419         ANS_LOGE("Invalid async callback data");
420         return;
421     }
422     napi_value result = nullptr;
423     auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
424     if (asynccallbackinfo) {
425         if (asynccallbackinfo->info.errorCode != ERR_OK) {
426             result = Common::NapiGetNull(env);
427         } else {
428             napi_value arr = nullptr;
429             napi_create_array(env, &arr);
430             size_t count = 0;
431             for (auto vec : asynccallbackinfo->slots) {
432                 if (!vec) {
433                     ANS_LOGW("Invalid NotificationSlot object ptr");
434                     continue;
435                 }
436                 napi_value nSlot = nullptr;
437                 napi_create_object(env, &nSlot);
438                 if (!Common::SetNotificationSlot(env, *vec, nSlot)) {
439                     continue;
440                 }
441                 napi_set_element(env, arr, count, nSlot);
442                 count++;
443             }
444             ANS_LOGI("getSlots count = %{public}zu", count);
445             result = arr;
446             if ((count == 0) && (asynccallbackinfo->slots.size() > 0)) {
447                 asynccallbackinfo->info.errorCode = ERROR;
448                 result = Common::NapiGetNull(env);
449             }
450         }
451         Common::CreateReturnValue(env, asynccallbackinfo->info, result);
452         if (asynccallbackinfo->info.callback != nullptr) {
453             napi_delete_reference(env, asynccallbackinfo->info.callback);
454         }
455         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
456         delete asynccallbackinfo;
457         asynccallbackinfo = nullptr;
458     }
459 }
460 
NapiGetSlotsByBundle(napi_env env,napi_callback_info info)461 napi_value NapiGetSlotsByBundle(napi_env env, napi_callback_info info)
462 {
463     ANS_LOGI("enter");
464     ParametersInfoGetSlotsByBundle params {};
465     if (ParseParametersGetSlotsByBundle(env, info, params) == nullptr) {
466         Common::NapiThrow(env, ERROR_PARAM_INVALID);
467         return Common::NapiGetUndefined(env);
468     }
469 
470     AsyncCallbackInfoGetSlotsByBundle *asynccallbackinfo =
471         new (std::nothrow) AsyncCallbackInfoGetSlotsByBundle {.env = env, .asyncWork = nullptr, .params = params};
472     if (!asynccallbackinfo) {
473         return Common::JSParaError(env, params.callback);
474     }
475     napi_value promise = nullptr;
476     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
477 
478     napi_value resourceName = nullptr;
479     napi_create_string_latin1(env, "getSlotsByBundle", NAPI_AUTO_LENGTH, &resourceName);
480     // Asynchronous function call
481     napi_create_async_work(env,
482         nullptr,
483         resourceName,
484         [](napi_env env, void *data) {
485             ANS_LOGI("GetSlotsByBundle napi_create_async_work start");
486             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetSlotsByBundle *>(data);
487             if (asynccallbackinfo) {
488                 asynccallbackinfo->info.errorCode = NotificationHelper::GetNotificationSlotsForBundle(
489                     asynccallbackinfo->params.option, asynccallbackinfo->slots);
490             }
491         },
492         AsyncCompleteCallbackNapiGetSlotsByBundle,
493         (void *)asynccallbackinfo,
494         &asynccallbackinfo->asyncWork);
495 
496     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
497     if (asynccallbackinfo->info.isCallback) {
498         return Common::NapiGetNull(env);
499     } else {
500         return promise;
501     }
502 }
503 
NapiRemoveSlot(napi_env env,napi_callback_info info)504 napi_value NapiRemoveSlot(napi_env env, napi_callback_info info)
505 {
506     ANS_LOGI("enter");
507     ParametersInfoRemoveSlot paras;
508     if (ParseParametersByRemoveSlot(env, info, paras) == nullptr) {
509         Common::NapiThrow(env, ERROR_PARAM_INVALID);
510         return Common::NapiGetUndefined(env);
511     }
512 
513     AsyncCallbackInfoRemoveSlot *asynccallbackinfo =
514         new (std::nothrow) AsyncCallbackInfoRemoveSlot {.env = env, .asyncWork = nullptr, .outType = paras.outType};
515     if (!asynccallbackinfo) {
516         return Common::JSParaError(env, paras.callback);
517     }
518     napi_value promise = nullptr;
519     Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
520 
521     napi_value resourceName = nullptr;
522     napi_create_string_latin1(env, "removeSlot", NAPI_AUTO_LENGTH, &resourceName);
523     // Asynchronous function call
524     napi_create_async_work(env,
525         nullptr,
526         resourceName,
527         [](napi_env env, void *data) {
528             ANS_LOGI("removeSlot napi_create_async_work start");
529             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
530             if (asynccallbackinfo) {
531                 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveNotificationSlot(
532                     asynccallbackinfo->outType);
533             }
534         },
535         [](napi_env env, napi_status status, void *data) {
536             ANS_LOGI("removeSlot napi_create_async_work end");
537             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveSlot *>(data);
538             if (asynccallbackinfo) {
539                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
540                 if (asynccallbackinfo->info.callback != nullptr) {
541                     napi_delete_reference(env, asynccallbackinfo->info.callback);
542                 }
543                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
544                 delete asynccallbackinfo;
545                 asynccallbackinfo = nullptr;
546             }
547         },
548         (void *)asynccallbackinfo,
549         &asynccallbackinfo->asyncWork);
550 
551     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
552     if (asynccallbackinfo->info.isCallback) {
553         return Common::NapiGetNull(env);
554     } else {
555         return promise;
556     }
557 }
558 
NapiRemoveAllSlots(napi_env env,napi_callback_info info)559 napi_value NapiRemoveAllSlots(napi_env env, napi_callback_info info)
560 {
561     ANS_LOGI("enter");
562     napi_ref callback = nullptr;
563     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
564         Common::NapiThrow(env, ERROR_PARAM_INVALID);
565         return Common::NapiGetUndefined(env);
566     }
567 
568     auto *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoRemoveAllSlots {.env = env, .asyncWork = nullptr};
569     if (!asynccallbackinfo) {
570         return Common::JSParaError(env, callback);
571     }
572     napi_value promise = nullptr;
573     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
574 
575     napi_value resourceName = nullptr;
576     napi_create_string_latin1(env, "removeAll", NAPI_AUTO_LENGTH, &resourceName);
577     // Asynchronous function call
578     napi_create_async_work(env,
579         nullptr,
580         resourceName,
581         [](napi_env env, void *data) {
582             ANS_LOGI("RemoveAllSlots napi_create_async_work start");
583             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
584             if (asynccallbackinfo) {
585                 asynccallbackinfo->info.errorCode = NotificationHelper::RemoveAllSlots();
586             }
587         },
588         [](napi_env env, napi_status status, void *data) {
589             ANS_LOGI("RemoveAllSlots napi_create_async_work end");
590             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoRemoveAllSlots *>(data);
591             if (asynccallbackinfo) {
592                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
593                 if (asynccallbackinfo->info.callback != nullptr) {
594                     napi_delete_reference(env, asynccallbackinfo->info.callback);
595                 }
596                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
597                 delete asynccallbackinfo;
598                 asynccallbackinfo = nullptr;
599             }
600         },
601         (void *)asynccallbackinfo,
602         &asynccallbackinfo->asyncWork);
603 
604     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
605     if (asynccallbackinfo->info.isCallback) {
606         return Common::NapiGetNull(env);
607     } else {
608         return promise;
609     }
610 }
611 
NapiEnableNotificationSlot(napi_env env,napi_callback_info info)612 napi_value NapiEnableNotificationSlot(napi_env env, napi_callback_info info)
613 {
614     ANS_LOGI("enter");
615     ParametersInfoEnableSlot params {};
616     if (ParseParametersEnableSlot(env, info, params) == nullptr) {
617         Common::NapiThrow(env, ERROR_PARAM_INVALID);
618         return Common::NapiGetUndefined(env);
619     }
620 
621     AsyncCallbackInfoInfoEnableSlot *asynccallbackinfo =
622         new (std::nothrow) AsyncCallbackInfoInfoEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
623     if (!asynccallbackinfo) {
624         return Common::JSParaError(env, params.callback);
625     }
626     napi_value promise = nullptr;
627     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
628 
629     napi_value resourceName = nullptr;
630     napi_create_string_latin1(env, "EnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
631     // Asynchronous function call
632     napi_create_async_work(env,
633         nullptr,
634         resourceName,
635         [](napi_env env, void *data) {
636             ANS_LOGI("EnableNotificationSlot napi_create_async_work start");
637             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
638             if (asynccallbackinfo) {
639                 asynccallbackinfo->info.errorCode = NotificationHelper::SetEnabledForBundleSlot(
640                     asynccallbackinfo->params.option, asynccallbackinfo->params.outType,
641                     asynccallbackinfo->params.enable);
642             }
643         },
644         [](napi_env env, napi_status status, void *data) {
645             ANS_LOGI("EnableNotificationSlot napi_create_async_work end");
646             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoEnableSlot *>(data);
647             if (asynccallbackinfo) {
648                 Common::CreateReturnValue(env, asynccallbackinfo->info, Common::NapiGetNull(env));
649                 if (asynccallbackinfo->info.callback != nullptr) {
650                     napi_delete_reference(env, asynccallbackinfo->info.callback);
651                 }
652                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
653                 delete asynccallbackinfo;
654                 asynccallbackinfo = nullptr;
655             }
656         },
657         (void *)asynccallbackinfo,
658         &asynccallbackinfo->asyncWork);
659 
660     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
661     if (asynccallbackinfo->info.isCallback) {
662         return Common::NapiGetNull(env);
663     } else {
664         return promise;
665     }
666 }
667 
NapiIsEnableNotificationSlot(napi_env env,napi_callback_info info)668 napi_value NapiIsEnableNotificationSlot(napi_env env, napi_callback_info info)
669 {
670     ANS_LOGI("enter");
671     ParametersInfoIsEnableSlot params {};
672     if (ParseParametersIsEnableSlot(env, info, params) == nullptr) {
673         Common::NapiThrow(env, ERROR_PARAM_INVALID);
674         return Common::NapiGetUndefined(env);
675     }
676 
677     AsyncCallbackInfoInfoIsEnableSlot *asynccallbackinfo =
678         new (std::nothrow) AsyncCallbackInfoInfoIsEnableSlot {.env = env, .asyncWork = nullptr, .params = params};
679     if (!asynccallbackinfo) {
680         return Common::JSParaError(env, params.callback);
681     }
682     napi_value promise = nullptr;
683     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
684 
685     napi_value resourceName = nullptr;
686     napi_create_string_latin1(env, "IsEnableNotificationSlot", NAPI_AUTO_LENGTH, &resourceName);
687     // Asynchronous function call
688     napi_create_async_work(env,
689         nullptr,
690         resourceName,
691         [](napi_env env, void *data) {
692             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work start");
693             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
694             if (asynccallbackinfo) {
695                 asynccallbackinfo->info.errorCode = NotificationHelper::GetEnabledForBundleSlot(
696                     asynccallbackinfo->params.option, asynccallbackinfo->params.outType, asynccallbackinfo->isEnable);
697             }
698         },
699         [](napi_env env, napi_status status, void *data) {
700             ANS_LOGI("IsEnableNotificationSlot napi_create_async_work end");
701             auto asynccallbackinfo = static_cast<AsyncCallbackInfoInfoIsEnableSlot *>(data);
702             if (asynccallbackinfo) {
703                 napi_value result = nullptr;
704                 napi_get_boolean(env, asynccallbackinfo->isEnable, &result);
705                 Common::CreateReturnValue(env, asynccallbackinfo->info, result);
706                 if (asynccallbackinfo->info.callback != nullptr) {
707                     napi_delete_reference(env, asynccallbackinfo->info.callback);
708                 }
709                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
710                 delete asynccallbackinfo;
711                 asynccallbackinfo = nullptr;
712             }
713         },
714         (void *)asynccallbackinfo,
715         &asynccallbackinfo->asyncWork);
716 
717     NAPI_CALL(env, napi_queue_async_work(env, asynccallbackinfo->asyncWork));
718     if (asynccallbackinfo->info.isCallback) {
719         return Common::NapiGetNull(env);
720     } else {
721         return promise;
722     }
723 }
724 }  // namespace NotificationNapi
725 }  // namespace OHOS