• 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_LOGD("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("Callback is not function excute promise.");
56             return Common::NapiGetNull(env);
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_LOGD("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("Callback is not function excute promise.");
103             return Common::NapiGetNull(env);
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_LOGD("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("Parameter type error. 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("Callback is not function excute promise.");
142             return Common::NapiGetNull(env);
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_LOGD("enter");
153     if (!data) {
154         ANS_LOGE("Invalid async callback data.");
155         return;
156     }
157     ANS_LOGI("IsDistributedEnabled work complete.");
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             ANS_LOGD("Delete isDistributedEnabled callback reference.");
169             napi_delete_reference(env, asynccallbackinfo->info.callback);
170         }
171         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
172         delete asynccallbackinfo;
173         asynccallbackinfo = nullptr;
174     }
175 }
176 
IsDistributedEnabled(napi_env env,napi_callback_info info)177 napi_value IsDistributedEnabled(napi_env env, napi_callback_info info)
178 {
179     ANS_LOGD("enter");
180 
181     napi_ref callback = nullptr;
182     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
183         return Common::NapiGetUndefined(env);
184     }
185 
186     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoIsEnabled {.env = env, .asyncWork = nullptr};
187     if (!asynccallbackinfo) {
188         ANS_LOGD("Asynccallbackinfo is nullptr.");
189         return Common::JSParaError(env, callback);
190     }
191     napi_value promise = nullptr;
192     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
193 
194     ANS_LOGD("Create isDistributedEnabled string.");
195     napi_value resourceName = nullptr;
196     napi_create_string_latin1(env, "isDistributedEnabled", NAPI_AUTO_LENGTH, &resourceName);
197     // Asynchronous function call
198     napi_create_async_work(
199         env,
200         nullptr,
201         resourceName,
202         [](napi_env env, void *data) {
203             ANS_LOGI("IsDistributedEnabled work excute");
204             AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabled *>(data);
205 
206             if (asynccallbackinfo) {
207                 asynccallbackinfo->info.errorCode =
208                     NotificationHelper::IsDistributedEnabled(asynccallbackinfo->enable);
209                 ANS_LOGI("IsDistributedEnabled enable = %{public}d", asynccallbackinfo->enable);
210             }
211         },
212         AsyncCompleteCallbackIsDistributedEnabled,
213         (void *)asynccallbackinfo,
214         &asynccallbackinfo->asyncWork);
215 
216     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
217 
218     if (asynccallbackinfo->info.isCallback) {
219         ANS_LOGD("isDistributedEnabled callback is nullptr.");
220         return Common::NapiGetNull(env);
221     } else {
222         return promise;
223     }
224 }
225 
EnableDistributed(napi_env env,napi_callback_info info)226 napi_value EnableDistributed(napi_env env, napi_callback_info info)
227 {
228     ANS_LOGD("enter");
229 
230     EnabledParams params {};
231     if (ParseParameters(env, info, params) == nullptr) {
232         return Common::NapiGetUndefined(env);
233     }
234 
235     AsyncCallbackInfoEnabled *asynccallbackinfo =
236         new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
237     if (!asynccallbackinfo) {
238         ANS_LOGD("AsyncCallbackinfo is nullptr.");
239         return Common::JSParaError(env, params.callback);
240     }
241     napi_value promise = nullptr;
242     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
243 
244     ANS_LOGD("Create enableDistributed string.");
245     napi_value resourceName = nullptr;
246     napi_create_string_latin1(env, "enableDistributed", NAPI_AUTO_LENGTH, &resourceName);
247     // Asynchronous function call
248     napi_create_async_work(
249         env,
250         nullptr,
251         resourceName,
252         [](napi_env env, void *data) {
253             ANS_LOGI("EnableDistributed work excute.");
254             AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
255             if (asynccallbackinfo) {
256                 asynccallbackinfo->info.errorCode =
257                     NotificationHelper::EnableDistributed(asynccallbackinfo->params.enable);
258             }
259         },
260         [](napi_env env, napi_status status, void *data) {
261             ANS_LOGI("EnableDistributed work complete.");
262             AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabled *>(data);
263             if (asynccallbackinfo) {
264                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
265                 if (asynccallbackinfo->info.callback != nullptr) {
266                     ANS_LOGD("Delete enableDistributed callback reference.");
267                     napi_delete_reference(env, asynccallbackinfo->info.callback);
268                 }
269                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
270                 delete asynccallbackinfo;
271                 asynccallbackinfo = nullptr;
272             }
273             ANS_LOGD("EnableDistributed work complete end.");
274         },
275         (void *)asynccallbackinfo,
276         &asynccallbackinfo->asyncWork);
277 
278     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
279 
280     if (asynccallbackinfo->info.isCallback) {
281         ANS_LOGD("enableDistributed callback is nullptr.");
282         return Common::NapiGetNull(env);
283     } else {
284         return promise;
285     }
286 }
287 
EnableDistributedByBundle(napi_env env,napi_callback_info info)288 napi_value EnableDistributedByBundle(napi_env env, napi_callback_info info)
289 {
290     ANS_LOGD("enter");
291 
292     EnabledByBundleParams params {};
293     if (ParseParameters(env, info, params) == nullptr) {
294         return Common::NapiGetUndefined(env);
295     }
296 
297     AsyncCallbackInfoEnabledByBundle *asynccallbackinfo =
298         new (std::nothrow) AsyncCallbackInfoEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
299     if (!asynccallbackinfo) {
300         ANS_LOGD("AsyncCallbackinfo is nullptr.");
301         return Common::JSParaError(env, params.callback);
302     }
303     napi_value promise = nullptr;
304     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
305 
306     ANS_LOGD("Create enableDistributedByBundle string.");
307     napi_value resourceName = nullptr;
308     napi_create_string_latin1(env, "enableDistributedByBundle", NAPI_AUTO_LENGTH, &resourceName);
309     // Async function call
310     napi_create_async_work(
311         env,
312         nullptr,
313         resourceName,
314         [](napi_env env, void *data) {
315             ANS_LOGI("EnableDistributedByBundle work excute.");
316             AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
317             if (asynccallbackinfo) {
318                 asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedByBundle(
319                     asynccallbackinfo->params.option, asynccallbackinfo->params.enable);
320             }
321         },
322         [](napi_env env, napi_status status, void *data) {
323             ANS_LOGI("EnableDistributedByBundle work complete.");
324             AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoEnabledByBundle *>(data);
325             if (asynccallbackinfo) {
326                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
327                 if (asynccallbackinfo->info.callback != nullptr) {
328                     ANS_LOGD("Delete enableDistributedByBundle callback reference");
329                     napi_delete_reference(env, asynccallbackinfo->info.callback);
330                 }
331                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
332                 delete asynccallbackinfo;
333                 asynccallbackinfo = nullptr;
334             }
335             ANS_LOGD("EnableDistributedByBundle work complete end.");
336         },
337         (void *)asynccallbackinfo,
338         &asynccallbackinfo->asyncWork);
339 
340     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
341 
342     if (asynccallbackinfo->info.isCallback) {
343         ANS_LOGD("enableDistributedByBundle callback is nullptr.");
344         return Common::NapiGetNull(env);
345     } else {
346         return promise;
347     }
348 }
349 
EnableDistributedSelf(napi_env env,napi_callback_info info)350 napi_value EnableDistributedSelf(napi_env env, napi_callback_info info)
351 {
352     ANS_LOGD("enter");
353 
354     EnabledParams params {};
355     if (ParseParameters(env, info, params) == nullptr) {
356         return Common::NapiGetUndefined(env);
357     }
358 
359     AsyncCallbackInfoEnabled *asynccallbackinfo =
360         new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params};
361     if (!asynccallbackinfo) {
362         return Common::JSParaError(env, params.callback);
363     }
364     napi_value promise = nullptr;
365     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
366 
367     ANS_LOGI("Create enableDistributedSelf string.");
368     napi_value resourceName = nullptr;
369     napi_create_string_latin1(env, "enableDistributedSelf", NAPI_AUTO_LENGTH, &resourceName);
370     // Asynchronous function call
371     napi_create_async_work(
372         env,
373         nullptr,
374         resourceName,
375         [](napi_env env, void *data) {
376             ANS_LOGI("EnableDistributedSelf work excute.");
377             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
378             if (asynccallbackinfo) {
379                 asynccallbackinfo->info.errorCode =
380                     NotificationHelper::EnableDistributedSelf(asynccallbackinfo->params.enable);
381                 ANS_LOGI("EnableDistributedSelf enable = %{public}d", asynccallbackinfo->params.enable);
382             }
383         },
384         [](napi_env env, napi_status status, void *data) {
385             ANS_LOGI("EnableDistributedSelf work complete.");
386             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoEnabled *>(data);
387             if (asynccallbackinfo) {
388                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
389                 if (asynccallbackinfo->info.callback != nullptr) {
390                     ANS_LOGD("Delete enableDistributedSelf callback reference");
391                     napi_delete_reference(env, asynccallbackinfo->info.callback);
392                 }
393                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
394                 delete asynccallbackinfo;
395                 asynccallbackinfo = nullptr;
396             }
397             ANS_LOGD("EnableDistributedSelf work complete end.");
398         },
399         (void *)asynccallbackinfo,
400         &asynccallbackinfo->asyncWork);
401 
402     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
403 
404     if (asynccallbackinfo->info.isCallback) {
405         ANS_LOGD("enableDistributedSelf callback is nullptr.");
406         return Common::NapiGetNull(env);
407     } else {
408         return promise;
409     }
410 }
411 
AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env,napi_status status,void * data)412 void AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env, napi_status status, void *data)
413 {
414     ANS_LOGD("enter");
415     if (!data) {
416         ANS_LOGE("Invalid async callback data");
417         return;
418     }
419     ANS_LOGI("IsDistributedEnableByBundle work complete.");
420     AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = static_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
421     if (asynccallbackinfo) {
422         napi_value result = nullptr;
423         if (asynccallbackinfo->info.errorCode != ERR_OK) {
424             result = Common::NapiGetNull(env);
425         } else {
426             napi_get_boolean(env, asynccallbackinfo->enable, &result);
427         }
428         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
429         if (asynccallbackinfo->info.callback != nullptr) {
430             ANS_LOGD("Delete isDistributedEnableByBundle callback reference");
431             napi_delete_reference(env, asynccallbackinfo->info.callback);
432         }
433         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
434         delete asynccallbackinfo;
435         asynccallbackinfo = nullptr;
436     }
437 }
438 
IsDistributedEnableByBundle(napi_env env,napi_callback_info info)439 napi_value IsDistributedEnableByBundle(napi_env env, napi_callback_info info)
440 {
441     ANS_LOGD("enter");
442 
443     IsEnabledByBundleParams params {};
444     if (ParseParameters(env, info, params) == nullptr) {
445         return Common::NapiGetUndefined(env);
446     }
447 
448     AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo =
449         new (std::nothrow) AsyncCallbackInfoIsEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params};
450     if (!asynccallbackinfo) {
451         ANS_LOGD("Asynccallbackinfo is nullptr.");
452         return Common::JSParaError(env, params.callback);
453     }
454     napi_value promise = nullptr;
455     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
456 
457     ANS_LOGD("Create isDistributedEnableByBundle string.");
458     napi_value resourceName = nullptr;
459     napi_create_string_latin1(env, "isDistributedEnableByBundle", NAPI_AUTO_LENGTH, &resourceName);
460     // Asynchronous function call
461     napi_create_async_work(
462         env,
463         nullptr,
464         resourceName,
465         [](napi_env env, void *data) {
466             ANS_LOGI("IsDistributedEnableByBundle work excute.");
467             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoIsEnabledByBundle *>(data);
468             if (asynccallbackinfo) {
469                 asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnableByBundle(
470                     asynccallbackinfo->params.option, asynccallbackinfo->enable);
471             }
472         },
473         AsyncCompleteCallbackIsDistributedEnableByBundle,
474         (void *)asynccallbackinfo,
475         &asynccallbackinfo->asyncWork);
476 
477     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
478 
479     if (asynccallbackinfo->info.isCallback) {
480         ANS_LOGD("isDistributedEnableByBundle callback is nullptr.");
481         return Common::NapiGetNull(env);
482     } else {
483         return promise;
484     }
485 }
486 
AsyncCompleteCallbackGetDeviceRemindType(napi_env env,napi_status status,void * data)487 void AsyncCompleteCallbackGetDeviceRemindType(napi_env env, napi_status status, void *data)
488 {
489     ANS_LOGD("enter");
490     if (!data) {
491         ANS_LOGE("Invalidity async callback data");
492         return;
493     }
494     ANS_LOGI("GetDeviceRemindType work complete.");
495     AsyncCallbackInfoGetRemindType *asynccallbackinfo = static_cast<AsyncCallbackInfoGetRemindType *>(data);
496     if (asynccallbackinfo) {
497         napi_value result = nullptr;
498         if (asynccallbackinfo->info.errorCode != ERR_OK) {
499             ANS_LOGD("errorCode is not ERR_OK.");
500             result = Common::NapiGetNull(env);
501         } else {
502             DeviceRemindType outType = DeviceRemindType::IDLE_DONOT_REMIND;
503             if (!Common::DeviceRemindTypeCToJS(asynccallbackinfo->remindType, outType)) {
504                 asynccallbackinfo->info.errorCode = ERROR;
505                 result = Common::NapiGetNull(env);
506             }
507             napi_create_int32(env, (int32_t)outType, &result);
508         }
509         Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
510         if (asynccallbackinfo->info.callback != nullptr) {
511             ANS_LOGD("Delete getDeviceRemindType callback reference.");
512             napi_delete_reference(env, asynccallbackinfo->info.callback);
513         }
514         napi_delete_async_work(env, asynccallbackinfo->asyncWork);
515         delete asynccallbackinfo;
516         asynccallbackinfo = nullptr;
517     }
518 }
519 
GetDeviceRemindType(napi_env env,napi_callback_info info)520 napi_value GetDeviceRemindType(napi_env env, napi_callback_info info)
521 {
522     ANS_LOGD("enter");
523 
524     napi_ref callback = nullptr;
525     if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) {
526         return Common::NapiGetUndefined(env);
527     }
528 
529     auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetRemindType {.env = env, .asyncWork = nullptr};
530     if (!asynccallbackinfo) {
531         ANS_LOGD("Create asynccallbackinfo fail.");
532         return Common::JSParaError(env, callback);
533     }
534     napi_value promise = nullptr;
535     Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise);
536 
537     ANS_LOGD("Create getDeviceRemindType string.");
538     napi_value resourceName = nullptr;
539     napi_create_string_latin1(env, "getDeviceRemindType", NAPI_AUTO_LENGTH, &resourceName);
540     // Asynchronous function call
541     napi_create_async_work(
542         env,
543         nullptr,
544         resourceName,
545         [](napi_env env, void *data) {
546             ANS_LOGI("GetDeviceRemindType work excute.");
547             auto asynccallbackinfo = reinterpret_cast<AsyncCallbackInfoGetRemindType *>(data);
548             if (asynccallbackinfo) {
549                 asynccallbackinfo->info.errorCode =
550                     NotificationHelper::GetDeviceRemindType(asynccallbackinfo->remindType);
551             }
552         },
553         AsyncCompleteCallbackGetDeviceRemindType,
554         (void *)asynccallbackinfo,
555         &asynccallbackinfo->asyncWork);
556 
557     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
558 
559     if (asynccallbackinfo->info.isCallback) {
560         ANS_LOGD("getDeviceRemindType callback is nullptr.");
561         return Common::NapiGetNull(env);
562     } else {
563         return promise;
564     }
565 }
566 
ParseParameters(const napi_env & env,const napi_callback_info & info,EnabledWithoutAppParams & params)567 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledWithoutAppParams &params)
568 {
569     ANS_LOGD("enter");
570 
571     size_t argc = ENABLED_SYNC_MAX_PARA;
572     napi_value argv[ENABLED_SYNC_MAX_PARA] = {nullptr};
573     napi_value thisVar = nullptr;
574     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
575     if (argc < ENABLED_SYNC_MIN_PARA) {
576         ANS_LOGE("Wrong number of arguments.");
577         return nullptr;
578     }
579 
580     // argv[0]: userId
581     napi_valuetype valuetype = napi_undefined;
582     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
583     if (valuetype != napi_number) {
584         ANS_LOGE("Argument type error. Number expected.");
585         return nullptr;
586     }
587     NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], &params.userId));
588     if (params.userId <= SUBSCRIBE_USER_INIT) {
589         ANS_LOGE("Wrong userId[%{public}d].", params.userId);
590         return nullptr;
591     }
592 
593     // argv[1]: enable
594     NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
595     if (valuetype != napi_boolean) {
596         ANS_LOGE("Wrong argument type. Bool expected.");
597         return nullptr;
598     }
599     napi_get_value_bool(env, argv[PARAM1], &params.enable);
600 
601     // argv[2]:callback
602     if (argc >= ENABLED_SYNC_MAX_PARA) {
603         NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype));
604         if (valuetype != napi_function) {
605             ANS_LOGE("Callback is not function excute promise.");
606             return Common::NapiGetNull(env);
607         }
608         napi_create_reference(env, argv[PARAM2], 1, &params.callback);
609     }
610 
611     return Common::NapiGetNull(env);
612 }
613 
SetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)614 napi_value SetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
615 {
616     ANS_LOGD("enter");
617 
618     EnabledWithoutAppParams params {};
619     if (ParseParameters(env, info, params) == nullptr) {
620         return Common::JSParaError(env, params.callback);
621     }
622 
623     AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
624         new (std::nothrow) AsyncCallbackInfoEnabledWithoutApp {.env = env, .asyncWork = nullptr, .params = params};
625     if (!asynccallbackinfo) {
626         ANS_LOGD("Asynccallbackinfo is nullptr.");
627         return Common::JSParaError(env, params.callback);
628     }
629     napi_value promise = nullptr;
630     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
631 
632     ANS_LOGD("Create SetSyncNotificationEnabledWithoutApp string.");
633     napi_value resourceName = nullptr;
634     napi_create_string_latin1(env, "SetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
635     // Asynchronous function call
636     napi_create_async_work(
637         env,
638         nullptr,
639         resourceName,
640         [](napi_env env, void *data) {
641             ANS_LOGI("SetSyncNotificationEnabledWithoutApp work excute.");
642             AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
643                 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
644             if (asynccallbackinfo) {
645                 asynccallbackinfo->info.errorCode = NotificationHelper::SetSyncNotificationEnabledWithoutApp(
646                     asynccallbackinfo->params.userId, asynccallbackinfo->params.enable);
647             }
648         },
649         [](napi_env env, napi_status status, void *data) {
650             ANS_LOGI("SetSyncNotificationEnabledWithoutApp work complete.");
651             AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo =
652                 static_cast<AsyncCallbackInfoEnabledWithoutApp *>(data);
653             if (asynccallbackinfo) {
654                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env));
655                 if (asynccallbackinfo->info.callback != nullptr) {
656                     ANS_LOGD("Delete setSyncNotificationEnabledWithoutApp callback reference.");
657                     napi_delete_reference(env, asynccallbackinfo->info.callback);
658                 }
659                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
660                 delete asynccallbackinfo;
661                 asynccallbackinfo = nullptr;
662             }
663         },
664         (void *)asynccallbackinfo,
665         &asynccallbackinfo->asyncWork);
666 
667     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
668 
669     if (asynccallbackinfo->info.isCallback) {
670         ANS_LOGD("setSyncNotificationEnabledWithoutApp callback is nullptr.");
671         return Common::NapiGetNull(env);
672     }
673     return promise;
674 }
675 
ParseParameters(const napi_env & env,const napi_callback_info & info,GetEnabledWithoutAppParams & params)676 napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, GetEnabledWithoutAppParams &params)
677 {
678     ANS_LOGD("enter");
679 
680     size_t argc = ENABLED_SYNC_MIN_PARA;
681     napi_value argv[ENABLED_SYNC_MIN_PARA] = {nullptr};
682     napi_value thisVar = nullptr;
683     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
684     if (argc < ENABLED_SYNC_MIN_PARA - 1) {
685         ANS_LOGE("Wrong number of arguments.");
686         return nullptr;
687     }
688 
689     // argv[0]: userId
690     napi_valuetype valuetype = napi_undefined;
691     NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype));
692     if (valuetype != napi_number) {
693         ANS_LOGE("Wrong argument type. Number expected.");
694         return nullptr;
695     }
696     NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], &params.userId));
697     if (params.userId <= SUBSCRIBE_USER_INIT) {
698         ANS_LOGE("Wrong userId[%{public}d].", params.userId);
699         return nullptr;
700     }
701 
702     // argv[1]:callback
703     if (argc >= ENABLED_SYNC_MIN_PARA) {
704         NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype));
705         if (valuetype != napi_function) {
706             ANS_LOGE("Callback is not function excute promise.");
707             return Common::NapiGetNull(env);
708         }
709         napi_create_reference(env, argv[PARAM1], 1, &params.callback);
710     }
711 
712     return Common::NapiGetNull(env);
713 }
714 
GetSyncNotificationEnabledWithoutApp(napi_env env,napi_callback_info info)715 napi_value GetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info)
716 {
717     ANS_LOGD("enter");
718 
719     GetEnabledWithoutAppParams params {};
720     if (ParseParameters(env, info, params) == nullptr) {
721         return Common::JSParaError(env, params.callback);
722     }
723 
724     AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
725         new (std::nothrow) AsyncCallbackInfoGetEnabledWithoutApp {
726         .env = env, .asyncWork = nullptr, .params = params};
727     if (!asynccallbackinfo) {
728         ANS_LOGD("Asynccallbackinfo is nullptr.");
729         return Common::JSParaError(env, params.callback);
730     }
731     napi_value promise = nullptr;
732     Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise);
733 
734     ANS_LOGD("Create GetSyncNotificationEnabledWithoutApp string.");
735     napi_value resourceName = nullptr;
736     napi_create_string_latin1(env, "GetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName);
737     // Asynchronous function call
738     napi_create_async_work(
739         env,
740         nullptr,
741         resourceName,
742         [](napi_env env, void *data) {
743             ANS_LOGI("GetSyncNotificationEnabledWithoutApp work excute.");
744             AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
745                 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
746             if (asynccallbackinfo) {
747                 asynccallbackinfo->info.errorCode = NotificationHelper::GetSyncNotificationEnabledWithoutApp(
748                     asynccallbackinfo->params.userId, asynccallbackinfo->enable);
749             }
750         },
751         [](napi_env env, napi_status status, void *data) {
752             ANS_LOGI("GetSyncNotificationEnabledWithoutApp work complete.");
753             AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo =
754                 static_cast<AsyncCallbackInfoGetEnabledWithoutApp *>(data);
755             if (asynccallbackinfo) {
756                 napi_value result = nullptr;
757                 if (asynccallbackinfo->info.errorCode != ERR_OK) {
758                     result = Common::NapiGetNull(env);
759                 } else {
760                     napi_get_boolean(env, asynccallbackinfo->enable, &result);
761                 }
762                 Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result);
763                 if (asynccallbackinfo->info.callback != nullptr) {
764                     ANS_LOGD("Delete getSyncNotificationEnabledWithoutApp callback reference.");
765                     napi_delete_reference(env, asynccallbackinfo->info.callback);
766                 }
767                 napi_delete_async_work(env, asynccallbackinfo->asyncWork);
768                 delete asynccallbackinfo;
769                 asynccallbackinfo = nullptr;
770             }
771         },
772         (void *)asynccallbackinfo,
773         &asynccallbackinfo->asyncWork);
774 
775     napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated);
776 
777     if (asynccallbackinfo->info.isCallback) {
778         ANS_LOGD("GetSyncNotificationEnabledWithoutApp callback is nullptr.");
779         return Common::NapiGetNull(env);
780     }
781     return promise;
782 }
783 }  // namespace NotificationNapi
784 }  // namespace OHOS