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