/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "distributed.h" #include "ans_inner_errors.h" namespace OHOS { namespace NotificationNapi { const int ENABLED_MAX_PARA = 2; const int ENABLED_MIN_PARA = 1; const int ENABLED_BUNDLE_MAX_PARA = 3; const int ENABLED_BUNDLE_MIN_PARA = 2; const int IS_ENABLED_BUNDLE_MAX_PARA = 2; const int IS_ENABLED_BUNDLE_MIN_PARA = 1; const int ENABLED_SYNC_MAX_PARA = 3; const int ENABLED_SYNC_MIN_PARA = 2; napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledParams ¶ms) { ANS_LOGD("enter"); size_t argc = ENABLED_MAX_PARA; napi_value argv[ENABLED_MAX_PARA] = {nullptr}; napi_value thisVar = nullptr; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL)); if (argc < ENABLED_MIN_PARA) { ANS_LOGE("Wrong number of arguments."); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } napi_valuetype valuetype = napi_undefined; // argv[0]: enable NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype)); if (valuetype != napi_boolean) { ANS_LOGE("Wrong argument type. Bool expected."); std::string msg = "Incorrect parameter types.The type of param must be boolean."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } napi_get_value_bool(env, argv[PARAM0], ¶ms.enable); // argv[1]:callback if (argc >= ENABLED_MAX_PARA) { NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype)); if (valuetype != napi_function) { ANS_LOGE("Callback is not function excute promise."); return Common::NapiGetNull(env); } napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback); } return Common::NapiGetNull(env); } napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledByBundleParams ¶ms) { ANS_LOGD("enter"); size_t argc = ENABLED_BUNDLE_MAX_PARA; napi_value argv[ENABLED_BUNDLE_MAX_PARA] = {nullptr}; napi_value thisVar = nullptr; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL)); if (argc < ENABLED_BUNDLE_MIN_PARA) { ANS_LOGE("Wrong number of arguments"); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } // argv[0]: bundle napi_valuetype valuetype = napi_undefined; NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype)); if (valuetype != napi_object) { ANS_LOGE("Wrong argument type. Object expected"); std::string msg = "Incorrect parameter types.The type of param must be object."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option); if (retValue == nullptr) { ANS_LOGE("GetBundleOption failed"); Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED); return nullptr; } // argv[1]: enable NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype)); if (valuetype != napi_boolean) { ANS_LOGE("Wrong argument type. Bool expected."); std::string msg = "Incorrect parameter types.The type of param must be boolean."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } napi_get_value_bool(env, argv[PARAM1], ¶ms.enable); // argv[2]:callback if (argc >= ENABLED_BUNDLE_MAX_PARA) { NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype)); if (valuetype != napi_function) { ANS_LOGE("Callback is not function excute promise."); return Common::NapiGetNull(env); } napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback); } return Common::NapiGetNull(env); } napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, IsEnabledByBundleParams ¶ms) { ANS_LOGD("enter"); size_t argc = IS_ENABLED_BUNDLE_MAX_PARA; napi_value argv[IS_ENABLED_BUNDLE_MAX_PARA] = {nullptr}; napi_value thisVar = nullptr; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL)); if (argc < IS_ENABLED_BUNDLE_MIN_PARA) { ANS_LOGE("Wrong number of arguments."); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } // argv[0]: bundle napi_valuetype valuetype = napi_undefined; NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype)); if (valuetype != napi_object) { ANS_LOGE("Parameter type error. Object expected."); std::string msg = "Incorrect parameter types.The type of param must be object."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } auto retValue = Common::GetBundleOption(env, argv[PARAM0], params.option); if (retValue == nullptr) { ANS_LOGE("GetBundleOption failed."); Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED); return nullptr; } // argv[1]:callback or deviceType if (argc >= IS_ENABLED_BUNDLE_MAX_PARA) { NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype)); if (valuetype == napi_string) { char str[STR_MAX_SIZE] = {0}; size_t strLen = 0; napi_get_value_string_utf8(env, argv[PARAM1], str, STR_MAX_SIZE - 1, &strLen); if (std::strlen(str) == 0) { ANS_LOGE("Property deviceType is empty"); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } params.deviceType = str; params.hasDeviceType = true; } else if (valuetype == napi_function) { napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback); } else { ANS_LOGE("Property is error"); Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED); return nullptr; } } return Common::NapiGetNull(env); } void AsyncCompleteCallbackIsDistributedEnabled(napi_env env, napi_status status, void *data) { ANS_LOGD("enter"); if (!data) { ANS_LOGE("Invalid async callback data."); return; } ANS_LOGD("IsDistributedEnabled work complete."); AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { napi_value result = nullptr; if (asynccallbackinfo->info.errorCode != ERR_OK) { result = Common::NapiGetNull(env); } else { napi_get_boolean(env, asynccallbackinfo->enable, &result); } Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete isDistributedEnabled callback reference."); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } } napi_value IsDistributedEnabled(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); napi_ref callback = nullptr; if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) { return Common::NapiGetUndefined(env); } auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoIsEnabled {.env = env, .asyncWork = nullptr}; if (!asynccallbackinfo) { ANS_LOGD("Asynccallbackinfo is nullptr."); return Common::JSParaError(env, callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise); ANS_LOGD("Create isDistributedEnabled string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "isDistributedEnabled", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("IsDistributedEnabled work excute"); AsyncCallbackInfoIsEnabled *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnabled(asynccallbackinfo->enable); ANS_LOGI("IsDistributedEnabled enable = %{public}d", asynccallbackinfo->enable); } }, AsyncCompleteCallbackIsDistributedEnabled, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("isDistributedEnabled callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } napi_value EnableDistributed(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); EnabledParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::NapiGetUndefined(env); } AsyncCallbackInfoEnabled *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { ANS_LOGD("AsyncCallbackinfo is nullptr."); return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGD("Create enableDistributed string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "enableDistributed", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("EnableDistributed work excute."); AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributed(asynccallbackinfo->params.enable); } }, [](napi_env env, napi_status status, void *data) { ANS_LOGD("EnableDistributed work complete."); AsyncCallbackInfoEnabled *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env)); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete enableDistributed callback reference."); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } ANS_LOGD("EnableDistributed work complete end."); }, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("enableDistributed callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } napi_value EnableDistributedByBundle(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); EnabledByBundleParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::NapiGetUndefined(env); } AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { ANS_LOGD("AsyncCallbackinfo is nullptr."); return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGD("Create enableDistributedByBundle string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "enableDistributedByBundle", NAPI_AUTO_LENGTH, &resourceName); // Async function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("EnableDistributedByBundle work excute."); AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedByBundle( asynccallbackinfo->params.option, asynccallbackinfo->params.enable); } }, [](napi_env env, napi_status status, void *data) { ANS_LOGD("EnableDistributedByBundle work complete."); AsyncCallbackInfoEnabledByBundle *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env)); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete enableDistributedByBundle callback reference"); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } ANS_LOGD("EnableDistributedByBundle work complete end."); }, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("enableDistributedByBundle callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } napi_value EnableDistributedSelf(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); EnabledParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::NapiGetUndefined(env); } AsyncCallbackInfoEnabled *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoEnabled {.env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGI("Create enableDistributedSelf string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "enableDistributedSelf", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("EnableDistributedSelf work excute."); auto asynccallbackinfo = reinterpret_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::EnableDistributedSelf(asynccallbackinfo->params.enable); ANS_LOGI("EnableDistributedSelf enable = %{public}d", asynccallbackinfo->params.enable); } }, [](napi_env env, napi_status status, void *data) { ANS_LOGD("EnableDistributedSelf work complete."); auto asynccallbackinfo = reinterpret_cast(data); if (asynccallbackinfo) { Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env)); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete enableDistributedSelf callback reference"); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } ANS_LOGD("EnableDistributedSelf work complete end."); }, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("enableDistributedSelf callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } void AsyncCompleteCallbackIsDistributedEnableByBundle(napi_env env, napi_status status, void *data) { ANS_LOGD("enter"); if (!data) { ANS_LOGE("Invalid async callback data"); return; } ANS_LOGD("IsDistributedEnableByBundle work complete."); AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { napi_value result = nullptr; if (asynccallbackinfo->info.errorCode != ERR_OK) { result = Common::NapiGetNull(env); } else { napi_get_boolean(env, asynccallbackinfo->enable, &result); } Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete isDistributedEnableByBundle callback reference"); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } } napi_value IsDistributedEnableByBundle(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); IsEnabledByBundleParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::NapiGetUndefined(env); } AsyncCallbackInfoIsEnabledByBundle *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoIsEnabledByBundle {.env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { ANS_LOGD("Asynccallbackinfo is nullptr."); return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGD("Create isDistributedEnableByBundle string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "isDistributedEnableByBundle", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("IsDistributedEnableByBundle work excute."); auto asynccallbackinfo = reinterpret_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::IsDistributedEnableByBundle( asynccallbackinfo->params.option, asynccallbackinfo->enable); } }, AsyncCompleteCallbackIsDistributedEnableByBundle, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("isDistributedEnableByBundle callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } void AsyncCompleteCallbackGetDeviceRemindType(napi_env env, napi_status status, void *data) { ANS_LOGD("enter"); if (!data) { ANS_LOGE("Invalidity async callback data"); return; } ANS_LOGD("GetDeviceRemindType work complete."); AsyncCallbackInfoGetRemindType *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { napi_value result = nullptr; if (asynccallbackinfo->info.errorCode != ERR_OK) { ANS_LOGD("errorCode is not ERR_OK."); result = Common::NapiGetNull(env); } else { DeviceRemindType outType = DeviceRemindType::IDLE_DONOT_REMIND; if (!AnsEnumUtil::DeviceRemindTypeCToJS(asynccallbackinfo->remindType, outType)) { asynccallbackinfo->info.errorCode = ERROR; result = Common::NapiGetNull(env); } napi_create_int32(env, (int32_t)outType, &result); } Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete getDeviceRemindType callback reference."); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } } napi_value GetDeviceRemindType(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); napi_ref callback = nullptr; if (Common::ParseParaOnlyCallback(env, info, callback) == nullptr) { return Common::NapiGetUndefined(env); } auto asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetRemindType {.env = env, .asyncWork = nullptr}; if (!asynccallbackinfo) { ANS_LOGD("Create asynccallbackinfo fail."); return Common::JSParaError(env, callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, callback, asynccallbackinfo->info, promise); ANS_LOGD("Create getDeviceRemindType string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "getDeviceRemindType", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("GetDeviceRemindType work excute."); auto asynccallbackinfo = reinterpret_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::GetDeviceRemindType(asynccallbackinfo->remindType); } }, AsyncCompleteCallbackGetDeviceRemindType, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("getDeviceRemindType callback is nullptr."); return Common::NapiGetNull(env); } else { return promise; } } napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, EnabledWithoutAppParams ¶ms) { ANS_LOGD("enter"); size_t argc = ENABLED_SYNC_MAX_PARA; napi_value argv[ENABLED_SYNC_MAX_PARA] = {nullptr}; napi_value thisVar = nullptr; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); if (argc < ENABLED_SYNC_MIN_PARA) { ANS_LOGE("Wrong number of arguments."); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } // argv[0]: userId napi_valuetype valuetype = napi_undefined; NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype)); if (valuetype != napi_number) { ANS_LOGE("Argument type error. Number expected."); std::string msg = "Incorrect parameter types.The type of param must be number."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId)); if (params.userId <= SUBSCRIBE_USER_INIT) { ANS_LOGE("Wrong userId[%{public}d].", params.userId); Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED); return nullptr; } // argv[1]: enable NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype)); if (valuetype != napi_boolean) { ANS_LOGE("Wrong argument type. Bool expected."); std::string msg = "Incorrect parameter types.The type of param must be boolean."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } napi_get_value_bool(env, argv[PARAM1], ¶ms.enable); // argv[2]:callback if (argc >= ENABLED_SYNC_MAX_PARA) { NAPI_CALL(env, napi_typeof(env, argv[PARAM2], &valuetype)); if (valuetype != napi_function) { ANS_LOGE("Callback is not function excute promise."); return Common::NapiGetNull(env); } napi_create_reference(env, argv[PARAM2], 1, ¶ms.callback); } return Common::NapiGetNull(env); } napi_value SetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); EnabledWithoutAppParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::JSParaError(env, params.callback); } AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoEnabledWithoutApp {.env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { ANS_LOGD("Asynccallbackinfo is nullptr."); return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGD("Create SetSyncNotificationEnabledWithoutApp string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "SetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("SetSyncNotificationEnabledWithoutApp work excute."); AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::SetSyncNotificationEnabledWithoutApp( asynccallbackinfo->params.userId, asynccallbackinfo->params.enable); } }, [](napi_env env, napi_status status, void *data) { ANS_LOGD("SetSyncNotificationEnabledWithoutApp work complete."); AsyncCallbackInfoEnabledWithoutApp *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { Common::ReturnCallbackPromise(env, asynccallbackinfo->info, Common::NapiGetNull(env)); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete setSyncNotificationEnabledWithoutApp callback reference."); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } }, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("setSyncNotificationEnabledWithoutApp callback is nullptr."); return Common::NapiGetNull(env); } return promise; } napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, GetEnabledWithoutAppParams ¶ms) { ANS_LOGD("enter"); size_t argc = ENABLED_SYNC_MIN_PARA; napi_value argv[ENABLED_SYNC_MIN_PARA] = {nullptr}; napi_value thisVar = nullptr; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL)); if (argc < ENABLED_SYNC_MIN_PARA - 1) { ANS_LOGE("Wrong number of arguments."); Common::NapiThrow(env, ERROR_PARAM_INVALID, MANDATORY_PARAMETER_ARE_LEFT_UNSPECIFIED); return nullptr; } // argv[0]: userId napi_valuetype valuetype = napi_undefined; NAPI_CALL(env, napi_typeof(env, argv[PARAM0], &valuetype)); if (valuetype != napi_number) { ANS_LOGE("Wrong argument type. Number expected."); std::string msg = "Incorrect parameter types.The type of param must be number."; Common::NapiThrow(env, ERROR_PARAM_INVALID, msg); return nullptr; } NAPI_CALL(env, napi_get_value_int32(env, argv[PARAM0], ¶ms.userId)); if (params.userId <= SUBSCRIBE_USER_INIT) { ANS_LOGE("Wrong userId[%{public}d].", params.userId); Common::NapiThrow(env, ERROR_PARAM_INVALID, PARAMETER_VERIFICATION_FAILED); return nullptr; } // argv[1]:callback if (argc >= ENABLED_SYNC_MIN_PARA) { NAPI_CALL(env, napi_typeof(env, argv[PARAM1], &valuetype)); if (valuetype != napi_function) { ANS_LOGE("Callback is not function excute promise."); return Common::NapiGetNull(env); } napi_create_reference(env, argv[PARAM1], 1, ¶ms.callback); } return Common::NapiGetNull(env); } napi_value GetSyncNotificationEnabledWithoutApp(napi_env env, napi_callback_info info) { ANS_LOGD("enter"); GetEnabledWithoutAppParams params {}; if (ParseParameters(env, info, params) == nullptr) { return Common::JSParaError(env, params.callback); } AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo = new (std::nothrow) AsyncCallbackInfoGetEnabledWithoutApp { .env = env, .asyncWork = nullptr, .params = params}; if (!asynccallbackinfo) { ANS_LOGD("Asynccallbackinfo is nullptr."); return Common::JSParaError(env, params.callback); } napi_value promise = nullptr; Common::PaddingCallbackPromiseInfo(env, params.callback, asynccallbackinfo->info, promise); ANS_LOGD("Create GetSyncNotificationEnabledWithoutApp string."); napi_value resourceName = nullptr; napi_create_string_latin1(env, "GetSyncNotificationEnabledWithoutApp", NAPI_AUTO_LENGTH, &resourceName); // Asynchronous function call napi_create_async_work( env, nullptr, resourceName, [](napi_env env, void *data) { ANS_LOGD("GetSyncNotificationEnabledWithoutApp work excute."); AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { asynccallbackinfo->info.errorCode = NotificationHelper::GetSyncNotificationEnabledWithoutApp( asynccallbackinfo->params.userId, asynccallbackinfo->enable); } }, [](napi_env env, napi_status status, void *data) { ANS_LOGD("GetSyncNotificationEnabledWithoutApp work complete."); AsyncCallbackInfoGetEnabledWithoutApp *asynccallbackinfo = static_cast(data); if (asynccallbackinfo) { napi_value result = nullptr; if (asynccallbackinfo->info.errorCode != ERR_OK) { result = Common::NapiGetNull(env); } else { napi_get_boolean(env, asynccallbackinfo->enable, &result); } Common::ReturnCallbackPromise(env, asynccallbackinfo->info, result); if (asynccallbackinfo->info.callback != nullptr) { ANS_LOGD("Delete getSyncNotificationEnabledWithoutApp callback reference."); napi_delete_reference(env, asynccallbackinfo->info.callback); } napi_delete_async_work(env, asynccallbackinfo->asyncWork); delete asynccallbackinfo; asynccallbackinfo = nullptr; } }, (void *)asynccallbackinfo, &asynccallbackinfo->asyncWork); napi_queue_async_work_with_qos(env, asynccallbackinfo->asyncWork, napi_qos_user_initiated); if (asynccallbackinfo->info.isCallback) { ANS_LOGD("GetSyncNotificationEnabledWithoutApp callback is nullptr."); return Common::NapiGetNull(env); } return promise; } } // namespace NotificationNapi } // namespace OHOS