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