199552fe9Sopenharmony_ci/* 299552fe9Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 399552fe9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 499552fe9Sopenharmony_ci * you may not use this file except in compliance with the License. 599552fe9Sopenharmony_ci * You may obtain a copy of the License at 699552fe9Sopenharmony_ci * 799552fe9Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 899552fe9Sopenharmony_ci * 999552fe9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1099552fe9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1199552fe9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1299552fe9Sopenharmony_ci * See the License for the specific language governing permissions and 1399552fe9Sopenharmony_ci * limitations under the License. 1499552fe9Sopenharmony_ci */ 1599552fe9Sopenharmony_ci 1699552fe9Sopenharmony_ci#include "common.h" 1799552fe9Sopenharmony_ci 1899552fe9Sopenharmony_ci#include "standby_service_log.h" 1999552fe9Sopenharmony_ci 2099552fe9Sopenharmony_cinamespace OHOS { 2199552fe9Sopenharmony_cinamespace DevStandbyMgr { 2299552fe9Sopenharmony_cinamespace { 2399552fe9Sopenharmony_ciconst uint32_t ASYNC_CALLBACK_PARAM_NUM = 2; 2499552fe9Sopenharmony_ciconst uint32_t STRING_MAX_SIZE = 128; 2599552fe9Sopenharmony_ci} 2699552fe9Sopenharmony_ci 2799552fe9Sopenharmony_ciAsyncWorkData::AsyncWorkData(napi_env napiEnv) 2899552fe9Sopenharmony_ci{ 2999552fe9Sopenharmony_ci env = napiEnv; 3099552fe9Sopenharmony_ci} 3199552fe9Sopenharmony_ci 3299552fe9Sopenharmony_ciAsyncWorkData::~AsyncWorkData() 3399552fe9Sopenharmony_ci{ 3499552fe9Sopenharmony_ci if (callback) { 3599552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("AsyncWorkData::~AsyncWorkData delete callback"); 3699552fe9Sopenharmony_ci napi_delete_reference(env, callback); 3799552fe9Sopenharmony_ci callback = nullptr; 3899552fe9Sopenharmony_ci } 3999552fe9Sopenharmony_ci if (asyncWork) { 4099552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("AsyncWorkData::~AsyncWorkData delete asyncWork"); 4199552fe9Sopenharmony_ci napi_delete_async_work(env, asyncWork); 4299552fe9Sopenharmony_ci asyncWork = nullptr; 4399552fe9Sopenharmony_ci } 4499552fe9Sopenharmony_ci} 4599552fe9Sopenharmony_ci 4699552fe9Sopenharmony_cinapi_value Common::NapiGetNull(napi_env env) 4799552fe9Sopenharmony_ci{ 4899552fe9Sopenharmony_ci napi_value result = nullptr; 4999552fe9Sopenharmony_ci napi_get_null(env, &result); 5099552fe9Sopenharmony_ci return result; 5199552fe9Sopenharmony_ci} 5299552fe9Sopenharmony_ci 5399552fe9Sopenharmony_civoid Common::PaddingAsyncWorkData( 5499552fe9Sopenharmony_ci const napi_env& env, const napi_ref& callback, AsyncWorkData& info, napi_value& promise) 5599552fe9Sopenharmony_ci{ 5699552fe9Sopenharmony_ci if (callback) { 5799552fe9Sopenharmony_ci info.callback = callback; 5899552fe9Sopenharmony_ci info.isCallback = true; 5999552fe9Sopenharmony_ci } else { 6099552fe9Sopenharmony_ci napi_deferred deferred = nullptr; 6199552fe9Sopenharmony_ci NAPI_CALL_RETURN_VOID(env, napi_create_promise(env, &deferred, &promise)); 6299552fe9Sopenharmony_ci info.deferred = deferred; 6399552fe9Sopenharmony_ci info.isCallback = false; 6499552fe9Sopenharmony_ci } 6599552fe9Sopenharmony_ci} 6699552fe9Sopenharmony_ci 6799552fe9Sopenharmony_civoid Common::ReturnCallbackPromise(const napi_env& env, const AsyncWorkData& info, const napi_value& result) 6899552fe9Sopenharmony_ci{ 6999552fe9Sopenharmony_ci if (info.isCallback) { 7099552fe9Sopenharmony_ci SetCallback(env, info.callback, info.errCode, result); 7199552fe9Sopenharmony_ci } else { 7299552fe9Sopenharmony_ci SetPromise(env, info, result); 7399552fe9Sopenharmony_ci } 7499552fe9Sopenharmony_ci} 7599552fe9Sopenharmony_ci 7699552fe9Sopenharmony_civoid Common::SetCallback( 7799552fe9Sopenharmony_ci const napi_env& env, const napi_ref& callbackIn, const int32_t& errCode, const napi_value& result) 7899552fe9Sopenharmony_ci{ 7999552fe9Sopenharmony_ci napi_value undefined = nullptr; 8099552fe9Sopenharmony_ci napi_get_undefined(env, &undefined); 8199552fe9Sopenharmony_ci 8299552fe9Sopenharmony_ci napi_value callback = nullptr; 8399552fe9Sopenharmony_ci napi_value resultout = nullptr; 8499552fe9Sopenharmony_ci napi_get_reference_value(env, callbackIn, &callback); 8599552fe9Sopenharmony_ci napi_value results[ASYNC_CALLBACK_PARAM_NUM] = {nullptr}; 8699552fe9Sopenharmony_ci if (errCode == ERR_OK) { 8799552fe9Sopenharmony_ci results[0] = NapiGetNull(env); 8899552fe9Sopenharmony_ci } else { 8999552fe9Sopenharmony_ci int32_t errCodeInfo = FindErrCode(env, errCode); 9099552fe9Sopenharmony_ci std::string errMsg = FindErrMsg(env, errCode); 9199552fe9Sopenharmony_ci results[0] = GetCallbackErrorValue(env, errCodeInfo, errMsg); 9299552fe9Sopenharmony_ci } 9399552fe9Sopenharmony_ci results[1] = result; 9499552fe9Sopenharmony_ci NAPI_CALL_RETURN_VOID(env, 9599552fe9Sopenharmony_ci napi_call_function(env, undefined, callback, ASYNC_CALLBACK_PARAM_NUM, &results[0], &resultout)); 9699552fe9Sopenharmony_ci} 9799552fe9Sopenharmony_ci 9899552fe9Sopenharmony_cinapi_value Common::SetPromise( 9999552fe9Sopenharmony_ci const napi_env& env, const AsyncWorkData& info, const napi_value& result) 10099552fe9Sopenharmony_ci{ 10199552fe9Sopenharmony_ci if (info.errCode == ERR_OK) { 10299552fe9Sopenharmony_ci napi_resolve_deferred(env, info.deferred, result); 10399552fe9Sopenharmony_ci } else { 10499552fe9Sopenharmony_ci int32_t errCodeInfo = FindErrCode(env, info.errCode); 10599552fe9Sopenharmony_ci std::string errMsg = FindErrMsg(env, info.errCode); 10699552fe9Sopenharmony_ci napi_value error = nullptr; 10799552fe9Sopenharmony_ci napi_value eCode = nullptr; 10899552fe9Sopenharmony_ci napi_value eMsg = nullptr; 10999552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_int32(env, errCodeInfo, &eCode)); 11099552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, errMsg.c_str(), 11199552fe9Sopenharmony_ci errMsg.length(), &eMsg)); 11299552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_object(env, &error)); 11399552fe9Sopenharmony_ci NAPI_CALL(env, napi_set_named_property(env, error, "data", eCode)); 11499552fe9Sopenharmony_ci NAPI_CALL(env, napi_set_named_property(env, error, "code", eCode)); 11599552fe9Sopenharmony_ci NAPI_CALL(env, napi_set_named_property(env, error, "message", eMsg)); 11699552fe9Sopenharmony_ci napi_reject_deferred(env, info.deferred, error); 11799552fe9Sopenharmony_ci } 11899552fe9Sopenharmony_ci return result; 11999552fe9Sopenharmony_ci} 12099552fe9Sopenharmony_ci 12199552fe9Sopenharmony_cinapi_value Common::GetCallbackErrorValue(napi_env env, const int32_t errCode, const std::string errMsg) 12299552fe9Sopenharmony_ci{ 12399552fe9Sopenharmony_ci if (errCode == ERR_OK) { 12499552fe9Sopenharmony_ci return NapiGetNull(env); 12599552fe9Sopenharmony_ci } 12699552fe9Sopenharmony_ci napi_value error = nullptr; 12799552fe9Sopenharmony_ci napi_value eCode = nullptr; 12899552fe9Sopenharmony_ci napi_value eMsg = nullptr; 12999552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_int32(env, errCode, &eCode)); 13099552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_string_utf8(env, errMsg.c_str(), 13199552fe9Sopenharmony_ci errMsg.length(), &eMsg)); 13299552fe9Sopenharmony_ci NAPI_CALL(env, napi_create_object(env, &error)); 13399552fe9Sopenharmony_ci NAPI_CALL(env, napi_set_named_property(env, error, "code", eCode)); 13499552fe9Sopenharmony_ci NAPI_CALL(env, napi_set_named_property(env, error, "message", eMsg)); 13599552fe9Sopenharmony_ci return error; 13699552fe9Sopenharmony_ci} 13799552fe9Sopenharmony_ci 13899552fe9Sopenharmony_civoid Common::HandleErrCode(const napi_env &env, int32_t errCode) 13999552fe9Sopenharmony_ci{ 14099552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("HandleErrCode errCode = %{public}d", errCode); 14199552fe9Sopenharmony_ci if (errCode == ERR_OK) { 14299552fe9Sopenharmony_ci return; 14399552fe9Sopenharmony_ci } 14499552fe9Sopenharmony_ci std::string errMsg = FindErrMsg(env, errCode); 14599552fe9Sopenharmony_ci int32_t errCodeInfo = FindErrCode(env, errCode); 14699552fe9Sopenharmony_ci if (errMsg != "") { 14799552fe9Sopenharmony_ci napi_throw_error(env, std::to_string(errCodeInfo).c_str(), errMsg.c_str()); 14899552fe9Sopenharmony_ci } 14999552fe9Sopenharmony_ci} 15099552fe9Sopenharmony_ci 15199552fe9Sopenharmony_cistd::string Common::FindErrMsg(const napi_env& env, const int32_t errCode) 15299552fe9Sopenharmony_ci{ 15399552fe9Sopenharmony_ci if (errCode == ERR_OK) { 15499552fe9Sopenharmony_ci return ""; 15599552fe9Sopenharmony_ci } 15699552fe9Sopenharmony_ci auto iter = saErrCodeMsgMap.find(errCode); 15799552fe9Sopenharmony_ci if (iter != saErrCodeMsgMap.end()) { 15899552fe9Sopenharmony_ci std::string errMessage = "BussinessError "; 15999552fe9Sopenharmony_ci int32_t errCodeInfo = FindErrCode(env, errCode); 16099552fe9Sopenharmony_ci errMessage.append(std::to_string(errCodeInfo)).append(": ").append(iter->second); 16199552fe9Sopenharmony_ci return errMessage; 16299552fe9Sopenharmony_ci } 16399552fe9Sopenharmony_ci iter = paramErrCodeMsgMap.find(errCode); 16499552fe9Sopenharmony_ci if (iter != paramErrCodeMsgMap.end()) { 16599552fe9Sopenharmony_ci std::string errMessage = "BussinessError 401: Parameter error. "; 16699552fe9Sopenharmony_ci errMessage.append(paramErrCodeMsgMap[errCode]); 16799552fe9Sopenharmony_ci return errMessage; 16899552fe9Sopenharmony_ci } 16999552fe9Sopenharmony_ci return "Inner error."; 17099552fe9Sopenharmony_ci} 17199552fe9Sopenharmony_ci 17299552fe9Sopenharmony_ciint32_t Common::FindErrCode(const napi_env& env, const int32_t errCodeIn) 17399552fe9Sopenharmony_ci{ 17499552fe9Sopenharmony_ci auto iter = paramErrCodeMsgMap.find(errCodeIn); 17599552fe9Sopenharmony_ci if (iter != paramErrCodeMsgMap.end()) { 17699552fe9Sopenharmony_ci return ERR_STANDBY_INVALID_PARAM; 17799552fe9Sopenharmony_ci } 17899552fe9Sopenharmony_ci return errCodeIn > THRESHOLD ? errCodeIn / OFFSET : errCodeIn; 17999552fe9Sopenharmony_ci} 18099552fe9Sopenharmony_ci 18199552fe9Sopenharmony_cibool Common::HandleParamErr(const napi_env& env, int32_t errCode) 18299552fe9Sopenharmony_ci{ 18399552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("HandleParamErr errCode = %{public}d, isThrow = true", errCode); 18499552fe9Sopenharmony_ci if (errCode == ERR_OK) { 18599552fe9Sopenharmony_ci return false; 18699552fe9Sopenharmony_ci } 18799552fe9Sopenharmony_ci auto iter = paramErrCodeMsgMap.find(errCode); 18899552fe9Sopenharmony_ci if (iter != paramErrCodeMsgMap.end()) { 18999552fe9Sopenharmony_ci std::string errMessage = "BussinessError 401: Parameter error. "; 19099552fe9Sopenharmony_ci errMessage.append(paramErrCodeMsgMap[errCode]); 19199552fe9Sopenharmony_ci napi_throw_error(env, std::to_string(ERR_STANDBY_INVALID_PARAM).c_str(), errMessage.c_str()); 19299552fe9Sopenharmony_ci return true; 19399552fe9Sopenharmony_ci } 19499552fe9Sopenharmony_ci return false; 19599552fe9Sopenharmony_ci} 19699552fe9Sopenharmony_ci 19799552fe9Sopenharmony_civoid Common::SetInt32Value(const napi_env& env, const std::string& fieldStr, const int32_t intValue, napi_value& result) 19899552fe9Sopenharmony_ci{ 19999552fe9Sopenharmony_ci napi_value value = nullptr; 20099552fe9Sopenharmony_ci napi_create_int32(env, intValue, &value); 20199552fe9Sopenharmony_ci napi_set_named_property(env, result, fieldStr.c_str(), value); 20299552fe9Sopenharmony_ci} 20399552fe9Sopenharmony_ci 20499552fe9Sopenharmony_civoid Common::SetUint32Value(const napi_env& env, const std::string& fieldStr, 20599552fe9Sopenharmony_ci const uint32_t uintValue, napi_value& result) 20699552fe9Sopenharmony_ci{ 20799552fe9Sopenharmony_ci napi_value value = nullptr; 20899552fe9Sopenharmony_ci napi_create_uint32(env, uintValue, &value); 20999552fe9Sopenharmony_ci napi_set_named_property(env, result, fieldStr.c_str(), value); 21099552fe9Sopenharmony_ci} 21199552fe9Sopenharmony_ci 21299552fe9Sopenharmony_cinapi_value Common::GetStringValue(const napi_env &env, const napi_value &value, std::string &result) 21399552fe9Sopenharmony_ci{ 21499552fe9Sopenharmony_ci napi_valuetype valuetype = napi_undefined; 21599552fe9Sopenharmony_ci NAPI_CALL(env, napi_typeof(env, value, &valuetype)); 21699552fe9Sopenharmony_ci if (valuetype != napi_string) { 21799552fe9Sopenharmony_ci return nullptr; 21899552fe9Sopenharmony_ci } 21999552fe9Sopenharmony_ci 22099552fe9Sopenharmony_ci char str[STRING_MAX_SIZE] = {0}; 22199552fe9Sopenharmony_ci size_t strLen = 0; 22299552fe9Sopenharmony_ci napi_status status = napi_get_value_string_utf8(env, value, str, STRING_MAX_SIZE - 1, &strLen); 22399552fe9Sopenharmony_ci if (status != napi_ok) { 22499552fe9Sopenharmony_ci return nullptr; 22599552fe9Sopenharmony_ci } 22699552fe9Sopenharmony_ci result = std::string(str); 22799552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("GetStringValue result: %{public}s", result.c_str()); 22899552fe9Sopenharmony_ci return Common::NapiGetNull(env); 22999552fe9Sopenharmony_ci} 23099552fe9Sopenharmony_ci 23199552fe9Sopenharmony_civoid Common::SetStringValue(const napi_env& env, const std::string& fieldStr, 23299552fe9Sopenharmony_ci const std::string& stringValue, napi_value& result) 23399552fe9Sopenharmony_ci{ 23499552fe9Sopenharmony_ci napi_value value = nullptr; 23599552fe9Sopenharmony_ci napi_create_string_utf8(env, stringValue.c_str(), stringValue.length(), &value); 23699552fe9Sopenharmony_ci napi_set_named_property(env, result, fieldStr.c_str(), value); 23799552fe9Sopenharmony_ci} 23899552fe9Sopenharmony_ci 23999552fe9Sopenharmony_cinapi_value Common::GetUint32Value(const napi_env& env, const napi_value& value, uint32_t& result) 24099552fe9Sopenharmony_ci{ 24199552fe9Sopenharmony_ci napi_valuetype valuetype = napi_undefined; 24299552fe9Sopenharmony_ci NAPI_CALL(env, napi_typeof(env, value, &valuetype)); 24399552fe9Sopenharmony_ci if (valuetype != napi_number) { 24499552fe9Sopenharmony_ci return nullptr; 24599552fe9Sopenharmony_ci } 24699552fe9Sopenharmony_ci NAPI_CALL(env, napi_get_value_uint32(env, value, &result)); 24799552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("GetUint32Value result: %{public}d", static_cast<int32_t>(result)); 24899552fe9Sopenharmony_ci 24999552fe9Sopenharmony_ci return Common::NapiGetNull(env); 25099552fe9Sopenharmony_ci} 25199552fe9Sopenharmony_ci 25299552fe9Sopenharmony_cinapi_value Common::GetInt32Value(const napi_env& env, const napi_value& value, int32_t& result) 25399552fe9Sopenharmony_ci{ 25499552fe9Sopenharmony_ci napi_valuetype valuetype = napi_undefined; 25599552fe9Sopenharmony_ci NAPI_CALL(env, napi_typeof(env, value, &valuetype)); 25699552fe9Sopenharmony_ci if (valuetype != napi_number) { 25799552fe9Sopenharmony_ci return nullptr; 25899552fe9Sopenharmony_ci } 25999552fe9Sopenharmony_ci NAPI_CALL(env, napi_get_value_int32(env, value, &result)); 26099552fe9Sopenharmony_ci STANDBYSERVICE_LOGI("GetInt32Value result: %{public}d", static_cast<int32_t>(result)); 26199552fe9Sopenharmony_ci 26299552fe9Sopenharmony_ci return Common::NapiGetNull(env); 26399552fe9Sopenharmony_ci} 26499552fe9Sopenharmony_ci 26599552fe9Sopenharmony_cinapi_value Common::GetNamedInt32Value(const napi_env &env, napi_value &object, const char* utf8name, 26699552fe9Sopenharmony_ci int32_t& result) 26799552fe9Sopenharmony_ci{ 26899552fe9Sopenharmony_ci bool hasNamedProperty = false; 26999552fe9Sopenharmony_ci napi_value intValue = nullptr; 27099552fe9Sopenharmony_ci if (napi_has_named_property(env, object, utf8name, &hasNamedProperty) != napi_ok || !hasNamedProperty) { 27199552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("GetNamedInt32Value failed, %{public}s not exist, is nullptr", utf8name); 27299552fe9Sopenharmony_ci return nullptr; 27399552fe9Sopenharmony_ci } 27499552fe9Sopenharmony_ci NAPI_CALL(env, napi_get_named_property(env, object, utf8name, &intValue)); 27599552fe9Sopenharmony_ci if (!Common::GetInt32Value(env, intValue, result)) { 27699552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("GetNamedInt32Value failed, %{public}s is nullptr", utf8name); 27799552fe9Sopenharmony_ci return nullptr; 27899552fe9Sopenharmony_ci } 27999552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("GetNamedInt32Value: %{public}s is %{public}d", utf8name, result); 28099552fe9Sopenharmony_ci return Common::NapiGetNull(env); 28199552fe9Sopenharmony_ci} 28299552fe9Sopenharmony_ci 28399552fe9Sopenharmony_cinapi_value Common::GetNamedStringValue(const napi_env &env, napi_value &object, const char* utf8name, 28499552fe9Sopenharmony_ci std::string& result) 28599552fe9Sopenharmony_ci{ 28699552fe9Sopenharmony_ci bool hasNamedProperty = false; 28799552fe9Sopenharmony_ci napi_value stringValue = nullptr; 28899552fe9Sopenharmony_ci if (napi_has_named_property(env, object, utf8name, &hasNamedProperty) != napi_ok || !hasNamedProperty) { 28999552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("GetNamedStringValue failed, string not exist, is nullptr"); 29099552fe9Sopenharmony_ci return nullptr; 29199552fe9Sopenharmony_ci } 29299552fe9Sopenharmony_ci NAPI_CALL(env, napi_get_named_property(env, object, utf8name, &stringValue)); 29399552fe9Sopenharmony_ci if (!Common::GetStringValue(env, stringValue, result)) { 29499552fe9Sopenharmony_ci STANDBYSERVICE_LOGE("GetStringValue failed, the string is nullptr"); 29599552fe9Sopenharmony_ci return nullptr; 29699552fe9Sopenharmony_ci } 29799552fe9Sopenharmony_ci STANDBYSERVICE_LOGD("GetNamedStringValue: result is %{public}s", result.c_str()); 29899552fe9Sopenharmony_ci return Common::NapiGetNull(env); 29999552fe9Sopenharmony_ci} 30099552fe9Sopenharmony_ci} // namespace DevStandbyMgr 30199552fe9Sopenharmony_ci} // namespace OHOS