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