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 ¶ms)
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 ¶ms)
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], ¶ms.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, ¶ms.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 ¶ms)
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], ¶ms.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, ¶ms.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 ¶ms)
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, ¶ms.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 ¶ms)
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], ¶ms.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], ¶ms.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, ¶ms.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 ¶ms)
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], ¶ms.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, ¶ms.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