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