• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paras)
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], &paras.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, &paras.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, &paras.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 &paras)
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, &paras.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 &paras)
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], &paras.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], &paras.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, &paras.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