1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "cancel.h"
17
18 namespace OHOS {
19 namespace NotificationNapi {
20 constexpr int8_t CANCEL_MAX_PARA = 3;
21 constexpr int8_t CANCEL_GROUP_MAX_PARA = 2;
22 constexpr int8_t CANCEL_GROUP_MIN_PARA = 1;
23 constexpr int8_t CANCEL_AS_BUNDLE_MAX_PARA = 4;
24
ParseParameters(const napi_env & env,const napi_callback_info & info,ParametersInfoCancel & paras)25 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, ParametersInfoCancel ¶s)
26 {
27 ANS_LOGI("enter");
28
29 size_t argc = CANCEL_MAX_PARA;
30 napi_value argv[CANCEL_MAX_PARA] = {nullptr};
31 napi_value thisVar = nullptr;
32 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
33 if (argc < 1) {
34 ANS_LOGW("Wrong number of arguments");
35 return nullptr;
36 }
37
38 napi_valuetype valuetype = napi_undefined;
39 // argv[0]: id: number
40 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
41 if (valuetype != napi_number) {
42 ANS_LOGW("Wrong argument type. Number expected.");
43 return nullptr;
44 }
45 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶s.id));
46
47 // argv[1]: label: string / callback
48 if (argc >= CANCEL_MAX_PARA - 1) {
49 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
50 if (valuetype != napi_string && valuetype != napi_function) {
51 ANS_LOGW("Wrong argument type. String or function expected.");
52 return nullptr;
53 }
54 if (valuetype == napi_string) {
55 char str[STR_MAX_SIZE] = {0};
56 size_t strLen = 0;
57 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[PARAM1], str, STR_MAX_SIZE - 1, &strLen));
58 paras.label = str;
59 } else {
60 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
61 }
62 }
63
64 // argv[2]: callback
65 if (argc >= CANCEL_MAX_PARA) {
66 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
67 if (valuetype != napi_function) {
68 ANS_LOGW("Wrong argument type. Function expected.");
69 return nullptr;
70 }
71 napi_create_reference(env, argv[PARAM2], 1, ¶s.callback);
72 }
73
74 return Common::NapiGetNull(env);
75 }
76
ParseParameters(const napi_env & env,const napi_callback_info & info,ParametersInfoCancelGroup & paras)77 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, ParametersInfoCancelGroup ¶s)
78 {
79 ANS_LOGI("enter");
80
81 size_t argc = CANCEL_GROUP_MAX_PARA;
82 napi_value argv[CANCEL_GROUP_MAX_PARA] = {nullptr};
83 napi_value thisVar = nullptr;
84 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
85 if (argc < CANCEL_GROUP_MIN_PARA) {
86 ANS_LOGW("Wrong number of arguments");
87 return nullptr;
88 }
89
90 napi_valuetype valuetype = napi_undefined;
91 // argv[0]: groupName: string
92 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
93 if (valuetype != napi_string) {
94 ANS_LOGW("Wrong argument type. String expected.");
95 return nullptr;
96 }
97 char str[STR_MAX_SIZE] = {0};
98 size_t strLen = 0;
99 NAPI_CALL(env, napi_get_value_string_utf8(env, argv[PARAM0], str, STR_MAX_SIZE - 1, &strLen));
100 paras.groupName = str;
101
102 // argv[1]: callback
103 if (argc >= CANCEL_GROUP_MAX_PARA) {
104 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
105 if (valuetype != napi_function) {
106 ANS_LOGW("Wrong argument type. Function expected.");
107 return nullptr;
108 }
109 napi_create_reference(env, argv[PARAM1], 1, ¶s.callback);
110 }
111
112 return Common::NapiGetNull(env);
113 }
114
Cancel(napi_env env,napi_callback_info info)115 napi_value Cancel(napi_env env, napi_callback_info info)
116 {
117 ANS_LOGI("enter");
118
119 ParametersInfoCancel paras;
120 if (ParseParameters(env, info, paras) == nullptr) {
121 return Common::NapiGetUndefined(env);
122 }
123
124 AsyncCallbackInfoCancel *asynccallbackinfo = new (std::nothrow)
125 AsyncCallbackInfoCancel {.env = env, .asyncWork = nullptr, .id = paras.id, .label = paras.label};
126 if (!asynccallbackinfo) {
127 return Common::JSParaError(env, paras.callback);
128 }
129 napi_value promise = nullptr;
130 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
131
132 napi_value resourceName = nullptr;
133 napi_create_string_latin1(env, "cancel", NAPI_AUTO_LENGTH, &resourceName);
134 // Asynchronous function call
135 napi_create_async_work(env,
136 nullptr,
137 resourceName,
138 [](napi_env env, void *data) {
139 ANS_LOGI("Cancel napi_create_async_work start");
140 AsyncCallbackInfoCancel *asynccallbackinfo = static_cast<AsyncCallbackInfoCancel *>(data);
141
142 if (asynccallbackinfo) {
143 asynccallbackinfo->info.errorCode =
144 NotificationHelper::CancelNotification(asynccallbackinfo->label, asynccallbackinfo->id);
145 }
146 },
147 [](napi_env env, napi_status status, void *data) {
148 ANS_LOGI("Cancel napi_create_async_work end");
149 AsyncCallbackInfoCancel *asynccallbackinfo = static_cast<AsyncCallbackInfoCancel *>(data);
150 if (asynccallbackinfo) {
151 Common::ReturnCallbackPromise(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 (void *)asynccallbackinfo,
161 &asynccallbackinfo->asyncWork);
162
163 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
164 if (status != napi_ok) {
165 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
166 if (asynccallbackinfo->info.callback != nullptr) {
167 napi_delete_reference(env, asynccallbackinfo->info.callback);
168 }
169 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
170 delete asynccallbackinfo;
171 asynccallbackinfo = nullptr;
172 return Common::JSParaError(env, paras.callback);
173 }
174
175 if (asynccallbackinfo->info.isCallback) {
176 return Common::NapiGetNull(env);
177 } else {
178 return promise;
179 }
180 }
181
CancelAll(napi_env env,napi_callback_info info)182 napi_value CancelAll(napi_env env, napi_callback_info info)
183 {
184 ANS_LOGI("enter");
185
186 napi_ref callback = nullptr;
187 if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
188 return Common::NapiGetUndefined(env);
189 }
190
191 auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoCancel {.env = env, .asyncWork = nullptr};
192 if (!asynccallbackinfo) {
193 return Common::JSParaError(env, callback);
194 }
195 napi_value promise = nullptr;
196 Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
197
198 napi_value resourceName = nullptr;
199 napi_create_string_latin1(env, "cancelAll", NAPI_AUTO_LENGTH, &resourceName);
200 // Asynchronous function call
201 napi_create_async_work(env,
202 nullptr,
203 resourceName,
204 [](napi_env env, void *data) {
205 ANS_LOGI("CancelAll napi_create_async_work start");
206 AsyncCallbackInfoCancel *asynccallbackinfo = static_cast<AsyncCallbackInfoCancel *>(data);
207 if (asynccallbackinfo) {
208 asynccallbackinfo->info.errorCode = NotificationHelper::CancelAllNotifications();
209 }
210 },
211 [](napi_env env, napi_status status, void *data) {
212 ANS_LOGI("CancelAll napi_create_async_work end");
213 AsyncCallbackInfoCancel *asynccallbackinfo = static_cast<AsyncCallbackInfoCancel *>(data);
214 if (asynccallbackinfo) {
215 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
216 if (asynccallbackinfo->info.callback != nullptr) {
217 napi_delete_reference(env, asynccallbackinfo->info.callback);
218 }
219 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
220 delete asynccallbackinfo;
221 asynccallbackinfo = nullptr;
222 }
223 },
224 (void *)asynccallbackinfo,
225 &asynccallbackinfo->asyncWork);
226
227 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
228 if (status != napi_ok) {
229 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
230 if (asynccallbackinfo->info.callback != nullptr) {
231 napi_delete_reference(env, asynccallbackinfo->info.callback);
232 }
233 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
234 delete asynccallbackinfo;
235 asynccallbackinfo = nullptr;
236 return Common::JSParaError(env, callback);
237 }
238
239 if (asynccallbackinfo->info.isCallback) {
240 return Common::NapiGetNull(env);
241 } else {
242 return promise;
243 }
244 }
245
CancelGroup(napi_env env,napi_callback_info info)246 napi_value CancelGroup(napi_env env, napi_callback_info info)
247 {
248 ANS_LOGI("enter");
249
250 ParametersInfoCancelGroup params {};
251 if (ParseParameters(env, info, params) == nullptr) {
252 return Common::NapiGetUndefined(env);
253 }
254
255 AsyncCallbackInfoCancelGroup *asynccallbackinfo = new (std::nothrow)
256 AsyncCallbackInfoCancelGroup {.env = env, .asyncWork = nullptr, .params = params};
257 if (!asynccallbackinfo) {
258 return Common::JSParaError(env, params.callback);
259 }
260 napi_value promise = nullptr;
261 Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
262
263 napi_value resourceName = nullptr;
264 napi_create_string_latin1(env, "cancelGroup", NAPI_AUTO_LENGTH, &resourceName);
265 // Asynchronous function call
266 napi_create_async_work(env,
267 nullptr,
268 resourceName,
269 [](napi_env env, void *data) {
270 ANS_LOGI("CancelGroup napi_create_async_work start");
271 AsyncCallbackInfoCancelGroup *asynccallbackinfo = static_cast<AsyncCallbackInfoCancelGroup *>(data);
272 if (asynccallbackinfo) {
273 ANS_LOGI("asynccallbackinfo->params.groupName = %{public}s",
274 asynccallbackinfo->params.groupName.c_str());
275 asynccallbackinfo->info.errorCode =
276 NotificationHelper::CancelGroup(asynccallbackinfo->params.groupName);
277 }
278 },
279 [](napi_env env, napi_status status, void *data) {
280 ANS_LOGI("CancelGroup napi_create_async_work end");
281 AsyncCallbackInfoCancelGroup *asynccallbackinfo = static_cast<AsyncCallbackInfoCancelGroup *>(data);
282 if (asynccallbackinfo) {
283 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
284 if (asynccallbackinfo->info.callback != nullptr) {
285 napi_delete_reference(env, asynccallbackinfo->info.callback);
286 }
287 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
288 delete asynccallbackinfo;
289 asynccallbackinfo = nullptr;
290 }
291 },
292 (void *)asynccallbackinfo,
293 &asynccallbackinfo->asyncWork);
294
295 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
296 if (status != napi_ok) {
297 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
298 if (asynccallbackinfo->info.callback != nullptr) {
299 napi_delete_reference(env, asynccallbackinfo->info.callback);
300 }
301 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
302 delete asynccallbackinfo;
303 asynccallbackinfo = nullptr;
304 return Common::JSParaError(env, params.callback);
305 }
306
307 if (asynccallbackinfo->info.isCallback) {
308 return Common::NapiGetNull(env);
309 } else {
310 return promise;
311 }
312 }
313
ParseParameters(const napi_env & env,const napi_callback_info & info,ParametersInfoCancelAsBundle & paras)314 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, ParametersInfoCancelAsBundle ¶s)
315 {
316 ANS_LOGI("enter");
317
318 size_t argc = CANCEL_AS_BUNDLE_MAX_PARA;
319 napi_value argv[CANCEL_AS_BUNDLE_MAX_PARA] = {nullptr};
320 napi_value thisVar = nullptr;
321 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
322 if (argc < 1) {
323 ANS_LOGW("Wrong number of arguments");
324 return nullptr;
325 }
326
327 napi_valuetype valuetype = napi_undefined;
328 // argv[0]: id: number
329 NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
330 if (valuetype != napi_number) {
331 ANS_LOGW("Wrong argument type. Number expected.");
332 return nullptr;
333 }
334 NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶s.id));
335
336 // argv[1]: representativeBundle: string
337 NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
338 if (valuetype != napi_string) {
339 ANS_LOGW("Wrong argument type. String expected.");
340 return nullptr;
341 }
342
343 char str[STR_MAX_SIZE] = {0};
344 size_t strLen = 0;
345 napi_get_value_string_utf8(env, argv[PARAM1], str, STR_MAX_SIZE - 1, &strLen);
346 paras.representativeBundle = str;
347
348 // argv[2] : userId
349 NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
350 if (valuetype != napi_number) {
351 ANS_LOGW("Wrong argument type. Number expected.");
352 return nullptr;
353 }
354 napi_get_value_int32(env, argv[PARAM2], ¶s.userId);
355
356 // argv[3]: callback
357 if (argc >= CANCEL_AS_BUNDLE_MAX_PARA) {
358 NAPI_CALL(env, napi_typeof(env, argv[PARAM3], &valuetype));
359 if (valuetype != napi_function) {
360 ANS_LOGW("Wrong argument type. Function expected.");
361 return nullptr;
362 }
363 napi_create_reference(env, argv[PARAM3], 1, ¶s.callback);
364 }
365
366 return Common::NapiGetNull(env);
367 }
368
CancelAsBundle(napi_env env,napi_callback_info info)369 napi_value CancelAsBundle(napi_env env, napi_callback_info info)
370 {
371 ANS_LOGI("enter");
372
373 ParametersInfoCancelAsBundle paras;
374 if (ParseParameters(env, info, paras) == nullptr) {
375 return Common::NapiGetUndefined(env);
376 }
377
378 AsyncCallbackInfoCancelAsBundle *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoCancelAsBundle {
379 .env = env, .asyncWork = nullptr,
380 .id = paras.id,
381 .representativeBundle = paras.representativeBundle,
382 .userId = paras.userId
383 };
384 if (!asynccallbackinfo) {
385 return Common::JSParaError(env, paras.callback);
386 }
387 napi_value promise = nullptr;
388 Common::PaddingCallbackPromiseInfo(env, paras.callback, asynccallbackinfo->info, promise);
389
390 napi_value resourceName = nullptr;
391 napi_create_string_latin1(env, "cancelasbundle", NAPI_AUTO_LENGTH, &resourceName);
392 // Asynchronous function call
393 napi_create_async_work(env,
394 nullptr,
395 resourceName,
396 [](napi_env env, void *data) {
397 ANS_LOGI("Cancel napi_create_async_work start");
398 AsyncCallbackInfoCancelAsBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoCancelAsBundle *>(data);
399
400 if (asynccallbackinfo) {
401 asynccallbackinfo->info.errorCode = NotificationHelper::CancelAsBundle(
402 asynccallbackinfo->id, asynccallbackinfo->representativeBundle, asynccallbackinfo->userId);
403 }
404 },
405 [](napi_env env, napi_status status, void *data) {
406 ANS_LOGI("Cancel napi_create_async_work end");
407 AsyncCallbackInfoCancelAsBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoCancelAsBundle *>(data);
408 if (asynccallbackinfo) {
409 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
410 if (asynccallbackinfo->info.callback != nullptr) {
411 napi_delete_reference(env, asynccallbackinfo->info.callback);
412 }
413 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
414 delete asynccallbackinfo;
415 asynccallbackinfo = nullptr;
416 }
417 },
418 (void *)asynccallbackinfo,
419 &asynccallbackinfo->asyncWork);
420
421 napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
422 if (status != napi_ok) {
423 ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
424 if (asynccallbackinfo->info.callback != nullptr) {
425 napi_delete_reference(env, asynccallbackinfo->info.callback);
426 }
427 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
428 delete asynccallbackinfo;
429 asynccallbackinfo = nullptr;
430 return Common::JSParaError(env, paras.callback);
431 }
432
433 if (asynccallbackinfo->info.isCallback) {
434 return Common::NapiGetNull(env);
435 } else {
436 return promise;
437 }
438 }
439 } // namespace NotificationNapi
440 } // namespace OHOS