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