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