• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "distributed.h"
17 
18 namespace OHOS {
19 namespace NotificationNapi {
20 const int ENABLED_MAX_PARA = 2;
21 const int ENABLED_MIN_PARA = 1;
22 const int ENABLED_BUNDLE_MAX_PARA = 3;
23 const int ENABLED_BUNDLE_MIN_PARA = 2;
24 const int IS_ENABLED_BUNDLE_MAX_PARA = 2;
25 const int IS_ENABLED_BUNDLE_MIN_PARA = 1;
26 const int ENABLED_SYNC_MAX_PARA = 3;
27 const int ENABLED_SYNC_MIN_PARA = 2;
28 
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledParams & params)29 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledParams &params)
30 {
31     ANS_LOGI("enter");
32 
33     size_t argc = ENABLED_MAX_PARA;
34     napi_value argv[ENABLED_MAX_PARA] = {nullptr};
35     napi_value thisVar = nullptr;
36     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
37     if (argc < ENABLED_MIN_PARA) {
38         ANS_LOGE("Wrong number of arguments.");
39         return nullptr;
40     }
41     napi_valuetype valuetype = napi_undefined;
42 
43     // argv[0]: enable
44     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
45     if (valuetype != napi_boolean) {
46         ANS_LOGE("Wrong argument type. Bool expected.");
47         return nullptr;
48     }
49     napi_get_value_bool(env, argv[PARAM0], &params.enable);
50 
51     // argv[1]:callback
52     if (argc >= ENABLED_MAX_PARA) {
53         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
54         if (valuetype != napi_function) {
55             ANS_LOGE("Wrong argument type. Function expected.");
56             return nullptr;
57         }
58         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
59     }
60 
61     return Common::NapiGetNull(env);
62 }
63 
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledByBundleParams & params)64 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledByBundleParams &params)
65 {
66     ANS_LOGI("enter");
67 
68     size_t argc = ENABLED_BUNDLE_MAX_PARA;
69     napi_value argv[ENABLED_BUNDLE_MAX_PARA] = {nullptr};
70     napi_value thisVar = nullptr;
71     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
72     if (argc < ENABLED_BUNDLE_MIN_PARA) {
73         ANS_LOGE("Wrong number of arguments.");
74         return nullptr;
75     }
76 
77     // argv[0]: bundle
78     napi_valuetype valuetype = napi_undefined;
79     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
80     if (valuetype != napi_object) {
81         ANS_LOGE("Wrong argument type. Object expected.");
82         return nullptr;
83     }
84     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
85     if (retValue == nullptr) {
86         ANS_LOGE("GetBundleOption failed.");
87         return nullptr;
88     }
89 
90     // argv[1]: enable
91     NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
92     if (valuetype != napi_boolean) {
93         ANS_LOGE("Wrong argument type. Bool expected.");
94         return nullptr;
95     }
96     napi_get_value_bool(env, argv[PARAM1], &params.enable);
97 
98     // argv[2]:callback
99     if (argc >= ENABLED_BUNDLE_MAX_PARA) {
100         NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
101         if (valuetype != napi_function) {
102             ANS_LOGE("Wrong argument type. Function expected.");
103             return nullptr;
104         }
105         napi_create_reference(env, argv[PARAM2], 1, &params.callback);
106     }
107 
108     return Common::NapiGetNull(env);
109 }
110 
ParseParameters(const napi_env & env,const napi_callback_info & info,IsEnabledByBundleParams & params)111 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, IsEnabledByBundleParams &params)
112 {
113     ANS_LOGI("enter");
114 
115     size_t argc = IS_ENABLED_BUNDLE_MAX_PARA;
116     napi_value argv[IS_ENABLED_BUNDLE_MAX_PARA] = {nullptr};
117     napi_value thisVar = nullptr;
118     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
119     if (argc < IS_ENABLED_BUNDLE_MIN_PARA) {
120         ANS_LOGE("Wrong number of arguments.");
121         return nullptr;
122     }
123 
124     // argv[0]: bundle
125     napi_valuetype valuetype = napi_undefined;
126     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
127     if (valuetype != napi_object) {
128         ANS_LOGE("Wrong argument type. Object expected.");
129         return nullptr;
130     }
131     auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option);
132     if (retValue == nullptr) {
133         ANS_LOGE("GetBundleOption failed.");
134         return nullptr;
135     }
136 
137     // argv[1]:callback
138     if (argc >= IS_ENABLED_BUNDLE_MAX_PARA) {
139         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
140         if (valuetype != napi_function) {
141             ANS_LOGE("Wrong argument type. Function expected.");
142             return nullptr;
143         }
144         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
145     }
146 
147     return Common::NapiGetNull(env);
148 }
149 
AsyncCompleteCallbackIsDistributedEnabled(napi_env env,napi_status status,void * data)150 void AsyncCompleteCallbackIsDistributedEnabled(napi_env env, napi_status status, void *data)
151 {
152     ANS_LOGI("enter");
153     if (!data) {
154         ANS_LOGE("Invalid async callback data");
155         return;
156     }
157     ANS_LOGI("IsDistributedEnabled napi_create_async_work end");
158     AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabled *>(data);
159     if (asynccallbackinfo) {
160         napi_value result = nullptr;
161         if (asynccallbackinfo->info.errorCode != ERR_OK) {
162             result = Common::NapiGetNull(env);
163         } else {
164             napi_get_boolean(env, asynccallbackinfo->enable, &result);
165         }
166         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
167         if (asynccallbackinfo->info.callback != nullptr) {
168             napi_delete_reference(env, asynccallbackinfo->info.callback);
169         }
170         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
171         delete asynccallbackinfo;
172         asynccallbackinfo = nullptr;
173     }
174 }
175 
IsDistributedEnabled(napi_env env,napi_callback_info info)176 napi_value IsDistributedEnabled(napi_env env, napi_callback_info info)
177 {
178     ANS_LOGI("enter");
179 
180     napi_ref callback = nullptr;
181     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
182         return Common::NapiGetUndefined(env);
183     }
184 
185     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoIsEnabled {.env = env, .asyncWork = nullptr};
186     if (!asynccallbackinfo) {
187         return Common::JSParaError(env, callback);
188     }
189     napi_value promise = nullptr;
190     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
191 
192     napi_value resourceName = nullptr;
193     napi_create_string_latin1(env, "isDistributedEnabled", NAPI_AUTO_LENGTH, &resourceName);
194     // Asynchronous function call
195     napi_create_async_work(
196         env,
197         nullptr,
198         resourceName,
199         [](napi_env env, void *data) {
200             ANS_LOGI("IsDistributedEnabled napi_create_async_work start");
201             AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabled *>(data);
202 
203             if (asynccallbackinfo) {
204                 asynccallbackinfo->info.errorCode =
205                     NotificationHelper::IsDistributedEnabled(asynccallbackinfo->enable);
206                 ANS_LOGI("IsDistributedEnabled enable = %{public}d", asynccallbackinfo->enable);
207             }
208         },
209         AsyncCompleteCallbackIsDistributedEnabled,
210         (void *)asynccallbackinfo,
211         &asynccallbackinfo->asyncWork);
212 
213     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
214     if (status != napi_ok) {
215         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
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         return Common::JSParaError(env, callback);
223     }
224 
225     if (asynccallbackinfo->info.isCallback) {
226         return Common::NapiGetNull(env);
227     } else {
228         return promise;
229     }
230 }
231 
EnableDistributed(napi_env env,napi_callback_info info)232 napi_value EnableDistributed(napi_env env, napi_callback_info info)
233 {
234     ANS_LOGI("enter");
235 
236     EnabledParams params {};
237     if (ParseParameters(env, info, params) == nullptr) {
238         return Common::NapiGetUndefined(env);
239     }
240 
241     AsyncCallbackInfoEnabled *asynccallbackinfo =
242         new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
243     if (!asynccallbackinfo) {
244         return Common::JSParaError(env, params.callback);
245     }
246     napi_value promise = nullptr;
247     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
248 
249     napi_value resourceName = nullptr;
250     napi_create_string_latin1(env, "enableDistributed", NAPI_AUTO_LENGTH, &resourceName);
251     // Asynchronous function call
252     napi_create_async_work(
253         env,
254         nullptr,
255         resourceName,
256         [](napi_env env, void *data) {
257             ANS_LOGI("EnableDistributed napi_create_async_work start");
258             AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
259 
260             if (asynccallbackinfo) {
261                 asynccallbackinfo->info.errorCode =
262                     NotificationHelper::EnableDistributed(asynccallbackinfo->params.enable);
263             }
264         },
265         [](napi_env env, napi_status status, void *data) {
266             ANS_LOGI("EnableDistributed napi_create_async_work end");
267             AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
268             if (asynccallbackinfo) {
269                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
270                 if (asynccallbackinfo->info.callback != nullptr) {
271                     napi_delete_reference(env, asynccallbackinfo->info.callback);
272                 }
273                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
274                 delete asynccallbackinfo;
275                 asynccallbackinfo = nullptr;
276             }
277         },
278         (void *)asynccallbackinfo,
279         &asynccallbackinfo->asyncWork);
280 
281     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
282     if (status != napi_ok) {
283         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
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         return Common::JSParaError(env, params.callback);
291     }
292 
293     if (asynccallbackinfo->info.isCallback) {
294         return Common::NapiGetNull(env);
295     } else {
296         return promise;
297     }
298 }
299 
EnableDistributedByBundle(napi_env env,napi_callback_info info)300 napi_value EnableDistributedByBundle(napi_env env, napi_callback_info info)
301 {
302     ANS_LOGI("enter");
303 
304     EnabledByBundleParams params {};
305     if (ParseParameters(env, info, params) == nullptr) {
306         return Common::NapiGetUndefined(env);
307     }
308 
309     AsyncCallbackInfoEnabledByBundle *asynccallbackinfo =
310         new (std::nothrow) AsyncCallbackInfoEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
311     if (!asynccallbackinfo) {
312         return Common::JSParaError(env, params.callback);
313     }
314     napi_value promise = nullptr;
315     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
316 
317     napi_value resourceName = nullptr;
318     napi_create_string_latin1(env, "enableDistributedByBundle", NAPI_AUTO_LENGTH, &resourceName);
319     // Asynchronous function call
320     napi_create_async_work(
321         env,
322         nullptr,
323         resourceName,
324         [](napi_env env, void *data) {
325             ANS_LOGI("EnableDistributedByBundle napi_create_async_work start");
326             AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
327             if (asynccallbackinfo) {
328                 asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedByBundle(
329                     asynccallbackinfo->params.option, asynccallbackinfo->params.enable);
330             }
331         },
332         [](napi_env env, napi_status status, void *data) {
333             ANS_LOGI("EnableDistributedByBundle napi_create_async_work end");
334             AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
335             if (asynccallbackinfo) {
336                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
337                 if (asynccallbackinfo->info.callback != nullptr) {
338                     napi_delete_reference(env, asynccallbackinfo->info.callback);
339                 }
340                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
341                 delete asynccallbackinfo;
342                 asynccallbackinfo = nullptr;
343             }
344         },
345         (void *)asynccallbackinfo,
346         &asynccallbackinfo->asyncWork);
347 
348     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
349     if (status != napi_ok) {
350         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
351         if (asynccallbackinfo->info.callback != nullptr) {
352             napi_delete_reference(env, asynccallbackinfo->info.callback);
353         }
354         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
355         delete asynccallbackinfo;
356         asynccallbackinfo = nullptr;
357         return Common::JSParaError(env, params.callback);
358     }
359 
360     if (asynccallbackinfo->info.isCallback) {
361         return Common::NapiGetNull(env);
362     } else {
363         return promise;
364     }
365 }
366 
EnableDistributedSelf(napi_env env,napi_callback_info info)367 napi_value EnableDistributedSelf(napi_env env, napi_callback_info info)
368 {
369     ANS_LOGI("enter");
370 
371     EnabledParams params {};
372     if (ParseParameters(env, info, params) == nullptr) {
373         return Common::NapiGetUndefined(env);
374     }
375 
376     AsyncCallbackInfoEnabled *asynccallbackinfo =
377         new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
378     if (!asynccallbackinfo) {
379         return Common::JSParaError(env, params.callback);
380     }
381     napi_value promise = nullptr;
382     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
383 
384     napi_value resourceName = nullptr;
385     napi_create_string_latin1(env, "enableDistributedSelf", NAPI_AUTO_LENGTH, &resourceName);
386     // Asynchronous function call
387     napi_create_async_work(
388         env,
389         nullptr,
390         resourceName,
391         [](napi_env env, void *data) {
392             ANS_LOGI("EnableDistributedSelf napi_create_async_work start");
393             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
394             if (asynccallbackinfo) {
395                 asynccallbackinfo->info.errorCode =
396                     NotificationHelper::EnableDistributedSelf(asynccallbackinfo->params.enable);
397                 ANS_LOGI("EnableDistributedSelf enable = %{public}d", asynccallbackinfo->params.enable);
398             }
399         },
400         [](napi_env env, napi_status status, void *data) {
401             ANS_LOGI("EnableDistributedSelf napi_create_async_work end");
402             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
403             if (asynccallbackinfo) {
404                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
405                 if (asynccallbackinfo->info.callback != nullptr) {
406                     napi_delete_reference(env, asynccallbackinfo->info.callback);
407                 }
408                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
409                 delete asynccallbackinfo;
410                 asynccallbackinfo = nullptr;
411             }
412         },
413         (void *)asynccallbackinfo,
414         &asynccallbackinfo->asyncWork);
415 
416     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
417     if (status != napi_ok) {
418         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
419         if (asynccallbackinfo->info.callback != nullptr) {
420             napi_delete_reference(env, asynccallbackinfo->info.callback);
421         }
422         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
423         delete asynccallbackinfo;
424         asynccallbackinfo = nullptr;
425         return Common::JSParaError(env, params.callback);
426     }
427 
428     if (asynccallbackinfo->info.isCallback) {
429         return Common::NapiGetNull(env);
430     } else {
431         return promise;
432     }
433 }
434 
AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env,napi_status status,void * data)435 void AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env, napi_status status, void *data)
436 {
437     ANS_LOGI("enter");
438     if (!data) {
439         ANS_LOGE("Invalid async callback data");
440         return;
441     }
442     ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work end");
443     AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
444     if (asynccallbackinfo) {
445         napi_value result = nullptr;
446         if (asynccallbackinfo->info.errorCode != ERR_OK) {
447             result = Common::NapiGetNull(env);
448         } else {
449             napi_get_boolean(env, asynccallbackinfo->enable, &result);
450         }
451         Common::ReturnCallbackPromise(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 
IsDistributedEnableByBundle(napi_env env,napi_callback_info info)461 napi_value IsDistributedEnableByBundle(napi_env env, napi_callback_info info)
462 {
463     ANS_LOGI("enter");
464 
465     IsEnabledByBundleParams params {};
466     if (ParseParameters(env, info, params) == nullptr) {
467         return Common::NapiGetUndefined(env);
468     }
469 
470     AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo =
471         new (std::nothrow) AsyncCallbackInfoIsEnabledByBundle {.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, "isDistributedEnableByBundle", NAPI_AUTO_LENGTH, &resourceName);
480     // Asynchronous function call
481     napi_create_async_work(
482         env,
483         nullptr,
484         resourceName,
485         [](napi_env env, void *data) {
486             ANS_LOGI("IsDistributedEnableByBundle napi_create_async_work start");
487             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
488             if (asynccallbackinfo) {
489                 asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnableByBundle(
490                     asynccallbackinfo->params.option, asynccallbackinfo->enable);
491             }
492         },
493         AsyncCompleteCallbackIsDistributedEnableByBundle,
494         (void *)asynccallbackinfo,
495         &asynccallbackinfo->asyncWork);
496 
497     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
498     if (status != napi_ok) {
499         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
500         if (asynccallbackinfo->info.callback != nullptr) {
501             napi_delete_reference(env, asynccallbackinfo->info.callback);
502         }
503         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
504         delete asynccallbackinfo;
505         asynccallbackinfo = nullptr;
506         return Common::JSParaError(env, params.callback);
507     }
508 
509     if (asynccallbackinfo->info.isCallback) {
510         return Common::NapiGetNull(env);
511     } else {
512         return promise;
513     }
514 }
515 
AsyncCompleteCallbackGetDeviceRemindType(napi_env env,napi_status status,void * data)516 void AsyncCompleteCallbackGetDeviceRemindType(napi_env env, napi_status status, void *data)
517 {
518     ANS_LOGI("enter");
519     if (!data) {
520         ANS_LOGE("Invalid async callback data");
521         return;
522     }
523     ANS_LOGI("GetDeviceRemindType napi_create_async_work end");
524     AsyncCallbackInfoGetRemindType *asynccallbackinfo = static_cast<AsyncCallbackInfoGetRemindType *>(data);
525     if (asynccallbackinfo) {
526         napi_value result = nullptr;
527         if (asynccallbackinfo->info.errorCode != ERR_OK) {
528             result = Common::NapiGetNull(env);
529         } else {
530             DeviceRemindType outType = DeviceRemindType::IDLE_DONOT_REMIND;
531             if (!Common::DeviceRemindTypeCToJS(asynccallbackinfo->remindType, outType)) {
532                 asynccallbackinfo->info.errorCode = ERROR;
533                 result = Common::NapiGetNull(env);
534             }
535             napi_create_int32(env, (int32_t)outType, &result);
536         }
537         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
538         if (asynccallbackinfo->info.callback != nullptr) {
539             napi_delete_reference(env, asynccallbackinfo->info.callback);
540         }
541         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
542         delete asynccallbackinfo;
543         asynccallbackinfo = nullptr;
544     }
545 }
546 
GetDeviceRemindType(napi_env env,napi_callback_info info)547 napi_value GetDeviceRemindType(napi_env env, napi_callback_info info)
548 {
549     ANS_LOGI("enter");
550 
551     napi_ref callback = nullptr;
552     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
553         return Common::NapiGetUndefined(env);
554     }
555 
556     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetRemindType {.env = env, .asyncWork = nullptr};
557     if (!asynccallbackinfo) {
558         return Common::JSParaError(env, callback);
559     }
560     napi_value promise = nullptr;
561     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
562 
563     napi_value resourceName = nullptr;
564     napi_create_string_latin1(env, "getDeviceRemindType", NAPI_AUTO_LENGTH, &resourceName);
565     // Asynchronous function call
566     napi_create_async_work(
567         env,
568         nullptr,
569         resourceName,
570         [](napi_env env, void *data) {
571             ANS_LOGI("GetDeviceRemindType napi_create_async_work start");
572             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetRemindType *>(data);
573             if (asynccallbackinfo) {
574                 asynccallbackinfo->info.errorCode =
575                     NotificationHelper::GetDeviceRemindType(asynccallbackinfo->remindType);
576             }
577         },
578         AsyncCompleteCallbackGetDeviceRemindType,
579         (void *)asynccallbackinfo,
580         &asynccallbackinfo->asyncWork);
581 
582     napi_status status = napi_queue_async_work(env, asynccallbackinfo->asyncWork);
583     if (status != napi_ok) {
584         ANS_LOGE("napi_queue_async_work failed return: %{public}d", status);
585         if (asynccallbackinfo->info.callback != nullptr) {
586             napi_delete_reference(env, asynccallbackinfo->info.callback);
587         }
588         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
589         delete asynccallbackinfo;
590         asynccallbackinfo = nullptr;
591         return Common::JSParaError(env, callback);
592     }
593 
594     if (asynccallbackinfo->info.isCallback) {
595         return Common::NapiGetNull(env);
596     } else {
597         return promise;
598     }
599 }
600 
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledWithoutAppParams & params)601 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledWithoutAppParams &params)
602 {
603     ANS_LOGI("enter");
604 
605     size_t argc = ENABLED_SYNC_MAX_PARA;
606     napi_value argv[ENABLED_SYNC_MAX_PARA] = {nullptr};
607     napi_value thisVar = nullptr;
608     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
609     if (argc < ENABLED_SYNC_MIN_PARA) {
610         ANS_LOGE("Wrong number of arguments.");
611         return nullptr;
612     }
613 
614     // argv[0]: userId
615     napi_valuetype valuetype = napi_undefined;
616     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
617     if (valuetype != napi_number) {
618         ANS_LOGE("Wrong argument type. Number expected.");
619         return nullptr;
620     }
621     NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], &params.userId));
622     if (params.userId <= SUBSCRIBE_USER_INIT) {
623         ANS_LOGE("Wrong userId[%{public}d].", params.userId);
624         return nullptr;
625     }
626 
627     // argv[1]: enable
628     NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
629     if (valuetype != napi_boolean) {
630         ANS_LOGE("Wrong argument type. Bool expected.");
631         return nullptr;
632     }
633     napi_get_value_bool(env, argv[PARAM1], &params.enable);
634 
635     // argv[2]:callback
636     if (argc >= ENABLED_SYNC_MAX_PARA) {
637         NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
638         if (valuetype != napi_function) {
639             ANS_LOGE("Wrong argument type. Function expected.");
640             return nullptr;
641         }
642         napi_create_reference(env, argv[PARAM2], 1, &params.callback);
643     }
644 
645     return Common::NapiGetNull(env);
646 }
647 
SetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)648 napi_value SetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
649 {
650     ANS_LOGI("enter");
651 
652     EnabledWithoutAppParams params {};
653     if (ParseParameters(env, info, params) == nullptr) {
654         return Common::JSParaError(env, params.callback);
655     }
656 
657     AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
658         new (std::nothrow) AsyncCallbackInfoEnabledWithoutApp {.env = env, .asyncWork = nullptr, .params = params};
659     if (!asynccallbackinfo) {
660         return Common::JSParaError(env, params.callback);
661     }
662     napi_value promise = nullptr;
663     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
664 
665     napi_value resourceName = nullptr;
666     napi_create_string_latin1(env, "SetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
667     // Asynchronous function call
668     napi_create_async_work(
669         env,
670         nullptr,
671         resourceName,
672         [](napi_env env, void *data) {
673             ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work start");
674             AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
675                 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
676             if (asynccallbackinfo) {
677                 asynccallbackinfo->info.errorCode = NotificationHelper::SetSyncNotificationEnabledWithoutApp(
678                     asynccallbackinfo->params.userId, asynccallbackinfo->params.enable);
679             }
680         },
681         [](napi_env env, napi_status status, void *data) {
682             ANS_LOGI("SetSyncNotificationEnabledWithoutApp napi_create_async_work end");
683             AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
684                 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
685             if (asynccallbackinfo) {
686                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
687                 if (asynccallbackinfo->info.callback != nullptr) {
688                     napi_delete_reference(env, asynccallbackinfo->info.callback);
689                 }
690                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
691                 delete asynccallbackinfo;
692                 asynccallbackinfo = nullptr;
693             }
694         },
695         (void *)asynccallbackinfo,
696         &asynccallbackinfo->asyncWork);
697 
698     if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
699         if (asynccallbackinfo->info.callback != nullptr) {
700             napi_delete_reference(env, asynccallbackinfo->info.callback);
701         }
702         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
703         delete asynccallbackinfo;
704         asynccallbackinfo = nullptr;
705         return Common::JSParaError(env, params.callback);
706     }
707 
708     if (asynccallbackinfo->info.isCallback) {
709         return Common::NapiGetNull(env);
710     }
711     return promise;
712 }
713 
ParseParameters(const napi_env & env,const napi_callback_info & info,GetEnabledWithoutAppParams & params)714 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, GetEnabledWithoutAppParams &params)
715 {
716     ANS_LOGI("enter");
717 
718     size_t argc = ENABLED_SYNC_MIN_PARA;
719     napi_value argv[ENABLED_SYNC_MIN_PARA] = {nullptr};
720     napi_value thisVar = nullptr;
721     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
722     if (argc < ENABLED_SYNC_MIN_PARA - 1) {
723         ANS_LOGE("Wrong number of arguments.");
724         return nullptr;
725     }
726 
727     // argv[0]: userId
728     napi_valuetype valuetype = napi_undefined;
729     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
730     if (valuetype != napi_number) {
731         ANS_LOGE("Wrong argument type. Number expected.");
732         return nullptr;
733     }
734     NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], &params.userId));
735     if (params.userId <= SUBSCRIBE_USER_INIT) {
736         ANS_LOGE("Wrong userId[%{public}d].", params.userId);
737         return nullptr;
738     }
739 
740     // argv[1]:callback
741     if (argc >= ENABLED_SYNC_MIN_PARA) {
742         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
743         if (valuetype != napi_function) {
744             ANS_LOGE("Wrong argument type. Function expected.");
745             return nullptr;
746         }
747         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
748     }
749 
750     return Common::NapiGetNull(env);
751 }
752 
GetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)753 napi_value GetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
754 {
755     ANS_LOGI("enter");
756 
757     GetEnabledWithoutAppParams params {};
758     if (ParseParameters(env, info, params) == nullptr) {
759         return Common::JSParaError(env, params.callback);
760     }
761 
762     AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
763         new (std::nothrow) AsyncCallbackInfoGetEnabledWithoutApp {
764         .env = env, .asyncWork = nullptr, .params = params};
765     if (!asynccallbackinfo) {
766         return Common::JSParaError(env, params.callback);
767     }
768     napi_value promise = nullptr;
769     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
770 
771     napi_value resourceName = nullptr;
772     napi_create_string_latin1(env, "GetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
773     // Asynchronous function call
774     napi_create_async_work(
775         env,
776         nullptr,
777         resourceName,
778         [](napi_env env, void *data) {
779             ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work start");
780             AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
781                 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
782             if (asynccallbackinfo) {
783                 asynccallbackinfo->info.errorCode = NotificationHelper::GetSyncNotificationEnabledWithoutApp(
784                     asynccallbackinfo->params.userId, asynccallbackinfo->enable);
785             }
786         },
787         [](napi_env env, napi_status status, void *data) {
788             ANS_LOGI("GetSyncNotificationEnabledWithoutApp napi_create_async_work end");
789             AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
790                 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
791             if (asynccallbackinfo) {
792                 napi_value result = nullptr;
793                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
794                     result = Common::NapiGetNull(env);
795                 } else {
796                     napi_get_boolean(env, asynccallbackinfo->enable, &result);
797                 }
798                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
799                 if (asynccallbackinfo->info.callback != nullptr) {
800                     napi_delete_reference(env, asynccallbackinfo->info.callback);
801                 }
802                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
803                 delete asynccallbackinfo;
804                 asynccallbackinfo = nullptr;
805             }
806         },
807         (void *)asynccallbackinfo,
808         &asynccallbackinfo->asyncWork);
809 
810     if (napi_queue_async_work(env, asynccallbackinfo->asyncWork) != napi_ok) {
811         if (asynccallbackinfo->info.callback != nullptr) {
812             napi_delete_reference(env, asynccallbackinfo->info.callback);
813         }
814         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
815         delete asynccallbackinfo;
816         asynccallbackinfo = nullptr;
817         return Common::JSParaError(env, params.callback);
818     }
819 
820     if (asynccallbackinfo->info.isCallback) {
821         return Common::NapiGetNull(env);
822     }
823     return promise;
824 }
825 }  // namespace NotificationNapi
826 }  // namespace OHOS