1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "battery_config.h"
17094332d3Sopenharmony_ci
18094332d3Sopenharmony_ci#include "battery_log.h"
19094332d3Sopenharmony_ci#include <climits>
20094332d3Sopenharmony_ci#include "string_ex.h"
21094332d3Sopenharmony_ci#include "config_policy_utils.h"
22094332d3Sopenharmony_ci
23094332d3Sopenharmony_cinamespace OHOS {
24094332d3Sopenharmony_cinamespace HDI {
25094332d3Sopenharmony_cinamespace Battery {
26094332d3Sopenharmony_cinamespace V2_0 {
27094332d3Sopenharmony_cinamespace {
28094332d3Sopenharmony_ciconstexpr const char* BATTERY_CONFIG_PATH = "etc/battery/battery_config.json";
29094332d3Sopenharmony_ciconstexpr const char* SYSTEM_BATTERY_CONFIG_PATH = "/system/etc/battery/battery_config.json";
30094332d3Sopenharmony_ciconstexpr const char* VENDOR_BATTERY_CONFIG_PATH = "/vendor/etc/battery/battery_config.json";
31094332d3Sopenharmony_ciconstexpr const char* VENDOR_BATTERY_SPLIT_CONFIG_PATH = "/vendor/etc/battery/charge_config.json";
32094332d3Sopenharmony_ciconstexpr const char* BATTERY_CONFIG_EXCEPTION_PATH = "";
33094332d3Sopenharmony_ciconstexpr int32_t MAP_KEY_INDEX = 0;
34094332d3Sopenharmony_ciconstexpr int32_t BEGIN_SOC_INDEX = 0;
35094332d3Sopenharmony_ciconstexpr int32_t END_SOC_INDEX = 1;
36094332d3Sopenharmony_ciconstexpr int32_t MAX_SOC_RANGE = 2;
37094332d3Sopenharmony_ciconstexpr int32_t RED_INDEX = 0;
38094332d3Sopenharmony_ciconstexpr int32_t GREEN_INDEX = 1;
39094332d3Sopenharmony_ciconstexpr int32_t BLUE_INDEX = 2;
40094332d3Sopenharmony_ciconstexpr int32_t MAX_RGB_RANGE = 3;
41094332d3Sopenharmony_ciconstexpr int32_t MAX_DEPTH = 5;
42094332d3Sopenharmony_ciconstexpr int32_t MIN_DEPTH = 1;
43094332d3Sopenharmony_ciconstexpr uint32_t MOVE_LEFT_16 = 16;
44094332d3Sopenharmony_ciconstexpr uint32_t MOVE_LEFT_8 = 8;
45094332d3Sopenharmony_ciconstexpr uint32_t SYSTEM_PATH_CHECK = 4;
46094332d3Sopenharmony_ciconstexpr uint32_t DATA_PATH_CHECK = 5;
47094332d3Sopenharmony_ci}
48094332d3Sopenharmony_cistd::shared_ptr<BatteryConfig> BatteryConfig::instance_ = nullptr;
49094332d3Sopenharmony_cistd::mutex BatteryConfig::mutex_;
50094332d3Sopenharmony_ci
51094332d3Sopenharmony_ciBatteryConfig& BatteryConfig::GetInstance()
52094332d3Sopenharmony_ci{
53094332d3Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
54094332d3Sopenharmony_ci    if (instance_ == nullptr) {
55094332d3Sopenharmony_ci        instance_ = std::make_shared<BatteryConfig>();
56094332d3Sopenharmony_ci    }
57094332d3Sopenharmony_ci    return *(instance_.get());
58094332d3Sopenharmony_ci}
59094332d3Sopenharmony_ci
60094332d3Sopenharmony_cibool BatteryConfig::ParseConfig()
61094332d3Sopenharmony_ci{
62094332d3Sopenharmony_ci    char buf[MAX_PATH_LEN];
63094332d3Sopenharmony_ci    char* path = GetOneCfgFile(BATTERY_CONFIG_PATH, buf, MAX_PATH_LEN);
64094332d3Sopenharmony_ci    if (path == nullptr || *path == '\0') {
65094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "GetOneCfgFile battery_config.json is NULL");
66094332d3Sopenharmony_ci        path = const_cast<char*>(BATTERY_CONFIG_EXCEPTION_PATH);
67094332d3Sopenharmony_ci    }
68094332d3Sopenharmony_ci    BATTERY_HILOGD(COMP_HDI, "GetOneCfgFile battery_config.json");
69094332d3Sopenharmony_ci
70094332d3Sopenharmony_ci    Json::CharReaderBuilder readerBuilder;
71094332d3Sopenharmony_ci    std::ifstream ifsConf;
72094332d3Sopenharmony_ci    Json::Value config;
73094332d3Sopenharmony_ci    readerBuilder["collectComments"] = false;
74094332d3Sopenharmony_ci    JSONCPP_STRING errs;
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci    ifsConf.open(VENDOR_BATTERY_SPLIT_CONFIG_PATH);
77094332d3Sopenharmony_ci    bool isOpen = ifsConf.is_open();
78094332d3Sopenharmony_ci    if (isOpen) {
79094332d3Sopenharmony_ci        if (parseFromStream(readerBuilder, ifsConf, &config, &errs) && !config.empty()) {
80094332d3Sopenharmony_ci            ParseConfSplit(config);
81094332d3Sopenharmony_ci        }
82094332d3Sopenharmony_ci        ifsConf.close();
83094332d3Sopenharmony_ci
84094332d3Sopenharmony_ci        if (!OpenFile(ifsConf, path)) {
85094332d3Sopenharmony_ci            return false;
86094332d3Sopenharmony_ci        }
87094332d3Sopenharmony_ci        if (parseFromStream(readerBuilder, ifsConf, &config, &errs) && !config.empty()) {
88094332d3Sopenharmony_ci            ParseConfInner(config);
89094332d3Sopenharmony_ci        }
90094332d3Sopenharmony_ci    } else {
91094332d3Sopenharmony_ci        if (!OpenFile(ifsConf, path)) {
92094332d3Sopenharmony_ci            return false;
93094332d3Sopenharmony_ci        }
94094332d3Sopenharmony_ci        if (parseFromStream(readerBuilder, ifsConf, &config, &errs) && !config.empty()) {
95094332d3Sopenharmony_ci            ParseConfInner(config);
96094332d3Sopenharmony_ci            ParseConfSplit(config);
97094332d3Sopenharmony_ci        }
98094332d3Sopenharmony_ci    }
99094332d3Sopenharmony_ci
100094332d3Sopenharmony_ci    ifsConf.close();
101094332d3Sopenharmony_ci    return true;
102094332d3Sopenharmony_ci}
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_ciconst std::vector<BatteryConfig::LightConfig>& BatteryConfig::GetLightConfig() const
105094332d3Sopenharmony_ci{
106094332d3Sopenharmony_ci    return lightConfig_;
107094332d3Sopenharmony_ci}
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_ciconst BatteryConfig::ChargerConfig& BatteryConfig::GetChargerConfig() const
110094332d3Sopenharmony_ci{
111094332d3Sopenharmony_ci    return chargerConfig_;
112094332d3Sopenharmony_ci}
113094332d3Sopenharmony_ci
114094332d3Sopenharmony_ciconst std::map<std::string, BatteryConfig::ChargeSceneConfig>& BatteryConfig::GetChargeSceneConfigMap() const
115094332d3Sopenharmony_ci{
116094332d3Sopenharmony_ci    return chargeSceneConfigMap_;
117094332d3Sopenharmony_ci}
118094332d3Sopenharmony_ci
119094332d3Sopenharmony_ciconst UeventMap& BatteryConfig::GetUeventList() const
120094332d3Sopenharmony_ci{
121094332d3Sopenharmony_ci    return ueventMap_;
122094332d3Sopenharmony_ci}
123094332d3Sopenharmony_ci
124094332d3Sopenharmony_civoid BatteryConfig::DestroyInstance()
125094332d3Sopenharmony_ci{
126094332d3Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
127094332d3Sopenharmony_ci    instance_ = nullptr;
128094332d3Sopenharmony_ci}
129094332d3Sopenharmony_ci
130094332d3Sopenharmony_cibool BatteryConfig::OpenFile(std::ifstream& ifsConf, const std::string& configPath)
131094332d3Sopenharmony_ci{
132094332d3Sopenharmony_ci    bool isOpen = false;
133094332d3Sopenharmony_ci    if (!configPath.empty()) {
134094332d3Sopenharmony_ci        ifsConf.open(configPath);
135094332d3Sopenharmony_ci        isOpen = ifsConf.is_open();
136094332d3Sopenharmony_ci        BATTERY_HILOGD(COMP_HDI, "open file is %{public}d", isOpen);
137094332d3Sopenharmony_ci    }
138094332d3Sopenharmony_ci    if (isOpen) {
139094332d3Sopenharmony_ci        return true;
140094332d3Sopenharmony_ci    }
141094332d3Sopenharmony_ci
142094332d3Sopenharmony_ci    ifsConf.open(VENDOR_BATTERY_CONFIG_PATH);
143094332d3Sopenharmony_ci    isOpen = ifsConf.is_open();
144094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "open then vendor battery_config.json is %{public}d", isOpen);
145094332d3Sopenharmony_ci
146094332d3Sopenharmony_ci    if (isOpen) {
147094332d3Sopenharmony_ci        return true;
148094332d3Sopenharmony_ci    }
149094332d3Sopenharmony_ci
150094332d3Sopenharmony_ci    ifsConf.open(SYSTEM_BATTERY_CONFIG_PATH);
151094332d3Sopenharmony_ci    isOpen = ifsConf.is_open();
152094332d3Sopenharmony_ci    BATTERY_HILOGI(FEATURE_CHARGING, "open then system battery_config.json is %{public}d", isOpen);
153094332d3Sopenharmony_ci    return isOpen;
154094332d3Sopenharmony_ci}
155094332d3Sopenharmony_ci
156094332d3Sopenharmony_civoid BatteryConfig::ParseConfInner(const Json::Value& config)
157094332d3Sopenharmony_ci{
158094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "start parse battery config inner");
159094332d3Sopenharmony_ci    ParseLightConfig(GetValue(config, "light"));
160094332d3Sopenharmony_ci    ParseChargerConfig(GetValue(config, "charger"));
161094332d3Sopenharmony_ci}
162094332d3Sopenharmony_ci
163094332d3Sopenharmony_civoid BatteryConfig::ParseConfSplit(const Json::Value& config)
164094332d3Sopenharmony_ci{
165094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "start parse split config inner");
166094332d3Sopenharmony_ci    ParseChargeSceneConfig(GetValue(config, "charge_scene"));
167094332d3Sopenharmony_ci    ParseUeventConfig(GetValue(config, "uevent"));
168094332d3Sopenharmony_ci}
169094332d3Sopenharmony_ci
170094332d3Sopenharmony_civoid BatteryConfig::ParseChargerConfig(const Json::Value& chargerConfig)
171094332d3Sopenharmony_ci{
172094332d3Sopenharmony_ci    if (chargerConfig.isNull() || !chargerConfig.isObject()) {
173094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "chargerConfig is invalid");
174094332d3Sopenharmony_ci        return;
175094332d3Sopenharmony_ci    }
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_ci    Json::Value currentPath = GetValue(chargerConfig, "current_limit.path");
178094332d3Sopenharmony_ci    if (isValidJsonString(currentPath)) {
179094332d3Sopenharmony_ci        chargerConfig_.currentPath = currentPath.asString();
180094332d3Sopenharmony_ci    }
181094332d3Sopenharmony_ci
182094332d3Sopenharmony_ci    Json::Value voltagePath = GetValue(chargerConfig, "voltage_limit.path");
183094332d3Sopenharmony_ci    if (isValidJsonString(voltagePath)) {
184094332d3Sopenharmony_ci        chargerConfig_.voltagePath = voltagePath.asString();
185094332d3Sopenharmony_ci    }
186094332d3Sopenharmony_ci
187094332d3Sopenharmony_ci    Json::Value chargeTypePath = GetValue(chargerConfig, "type.path");
188094332d3Sopenharmony_ci    if (isValidJsonString(chargeTypePath)) {
189094332d3Sopenharmony_ci        chargerConfig_.chargeTypePath = chargeTypePath.asString();
190094332d3Sopenharmony_ci    }
191094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "The battery charger configuration parse succeed");
192094332d3Sopenharmony_ci}
193094332d3Sopenharmony_ci
194094332d3Sopenharmony_civoid BatteryConfig::ParseLightConfig(const Json::Value& lightConfig)
195094332d3Sopenharmony_ci{
196094332d3Sopenharmony_ci    if (lightConfig.isNull() || !lightConfig.isObject()) {
197094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "lightConf is invalid");
198094332d3Sopenharmony_ci        return;
199094332d3Sopenharmony_ci    }
200094332d3Sopenharmony_ci    lightConfig_.clear();
201094332d3Sopenharmony_ci    Json::Value::Members members = lightConfig.getMemberNames();
202094332d3Sopenharmony_ci    for (auto iter = members.begin(); iter != members.end(); iter++) {
203094332d3Sopenharmony_ci        std::string key = *iter;
204094332d3Sopenharmony_ci        Json::Value valueObj = lightConfig[key];
205094332d3Sopenharmony_ci        if (valueObj.isNull() || !valueObj.isObject()) {
206094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The light conf is invalid, key=%{public}s", key.c_str());
207094332d3Sopenharmony_ci            continue;
208094332d3Sopenharmony_ci        }
209094332d3Sopenharmony_ci
210094332d3Sopenharmony_ci        Json::Value soc = GetValue(valueObj, "soc");
211094332d3Sopenharmony_ci        Json::Value rgb = GetValue(valueObj, "rgb");
212094332d3Sopenharmony_ci        if (!soc.isArray() || !rgb.isArray()) {
213094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The battery light %{public}s configuration is invalid.", key.c_str());
214094332d3Sopenharmony_ci            continue;
215094332d3Sopenharmony_ci        }
216094332d3Sopenharmony_ci        if (soc.size() != MAX_SOC_RANGE || !soc[BEGIN_SOC_INDEX].isInt() || !soc[END_SOC_INDEX].isInt()) {
217094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The battery light %{public}s soc data type error.", key.c_str());
218094332d3Sopenharmony_ci            continue;
219094332d3Sopenharmony_ci        }
220094332d3Sopenharmony_ci        if (rgb.size() != MAX_RGB_RANGE || !rgb[RED_INDEX].isUInt() || !rgb[GREEN_INDEX].isUInt() ||
221094332d3Sopenharmony_ci            !rgb[BLUE_INDEX].isUInt()) {
222094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The battery light %{public}s rgb data type error.", key.c_str());
223094332d3Sopenharmony_ci            continue;
224094332d3Sopenharmony_ci        }
225094332d3Sopenharmony_ci
226094332d3Sopenharmony_ci        BatteryConfig::LightConfig tempLightConfig = {
227094332d3Sopenharmony_ci            .beginSoc = soc[BEGIN_SOC_INDEX].asInt(),
228094332d3Sopenharmony_ci            .endSoc = soc[END_SOC_INDEX].asInt(),
229094332d3Sopenharmony_ci            .rgb = (rgb[RED_INDEX].asUInt() << MOVE_LEFT_16) |
230094332d3Sopenharmony_ci                (rgb[GREEN_INDEX].asUInt() << MOVE_LEFT_8) |
231094332d3Sopenharmony_ci                rgb[BLUE_INDEX].asUInt()
232094332d3Sopenharmony_ci        };
233094332d3Sopenharmony_ci        lightConfig_.push_back(tempLightConfig);
234094332d3Sopenharmony_ci    }
235094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "The battery light configuration size %{public}d",
236094332d3Sopenharmony_ci        static_cast<int32_t>(lightConfig_.size()));
237094332d3Sopenharmony_ci}
238094332d3Sopenharmony_ci
239094332d3Sopenharmony_civoid BatteryConfig::ParseChargeSceneConfig(const Json::Value& chargeSceneConfig)
240094332d3Sopenharmony_ci{
241094332d3Sopenharmony_ci    if (chargeSceneConfig.isNull() || !chargeSceneConfig.isObject()) {
242094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "chargeSceneConfig is invalid");
243094332d3Sopenharmony_ci        return;
244094332d3Sopenharmony_ci    }
245094332d3Sopenharmony_ci
246094332d3Sopenharmony_ci    chargeSceneConfigMap_.clear();
247094332d3Sopenharmony_ci    Json::Value::Members members = chargeSceneConfig.getMemberNames();
248094332d3Sopenharmony_ci    for (auto iter = members.begin(); iter != members.end(); iter++) {
249094332d3Sopenharmony_ci        std::string key = *iter;
250094332d3Sopenharmony_ci        Json::Value valueObj = chargeSceneConfig[key];
251094332d3Sopenharmony_ci        if (!IsValidChargeSceneConfig(key, valueObj)) {
252094332d3Sopenharmony_ci            continue;
253094332d3Sopenharmony_ci        }
254094332d3Sopenharmony_ci
255094332d3Sopenharmony_ci        BatteryConfig::ChargeSceneConfig tempChargeSceneConfig;
256094332d3Sopenharmony_ci        bool parseSupportPathResult = ParseChargeSceneSupport(valueObj, tempChargeSceneConfig);
257094332d3Sopenharmony_ci        bool parseSetPathResult = ParseChargeSceneSet(valueObj, tempChargeSceneConfig);
258094332d3Sopenharmony_ci        bool parseGetPathResult = ParseChargeSceneGet(valueObj, tempChargeSceneConfig);
259094332d3Sopenharmony_ci        if (parseSupportPathResult || parseSetPathResult || parseGetPathResult) {
260094332d3Sopenharmony_ci            chargeSceneConfigMap_.insert(std::make_pair(key, tempChargeSceneConfig));
261094332d3Sopenharmony_ci        }
262094332d3Sopenharmony_ci    }
263094332d3Sopenharmony_ci
264094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "The charge scene config size: %{public}d",
265094332d3Sopenharmony_ci        static_cast<int32_t>(chargeSceneConfigMap_.size()));
266094332d3Sopenharmony_ci}
267094332d3Sopenharmony_ci
268094332d3Sopenharmony_cibool BatteryConfig::IsValidChargeSceneConfig(const std::string& key, const Json::Value& valueObj)
269094332d3Sopenharmony_ci{
270094332d3Sopenharmony_ci    if (key.empty() || valueObj.isNull() || !valueObj.isObject()) {
271094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "The charge scene config is invalid, key=%{public}s", key.c_str());
272094332d3Sopenharmony_ci        return false;
273094332d3Sopenharmony_ci    }
274094332d3Sopenharmony_ci
275094332d3Sopenharmony_ci    Json::Value supportPath = GetValue(valueObj, "support.path");
276094332d3Sopenharmony_ci    Json::Value setPath = GetValue(valueObj, "set.path");
277094332d3Sopenharmony_ci    Json::Value getPath = GetValue(valueObj, "get.path");
278094332d3Sopenharmony_ci    if (!isValidJsonString(supportPath) && !isValidJsonString(setPath) && !isValidJsonString(getPath)) {
279094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "The charge scene config path is invalid, key=%{public}s", key.c_str());
280094332d3Sopenharmony_ci        return false;
281094332d3Sopenharmony_ci    }
282094332d3Sopenharmony_ci
283094332d3Sopenharmony_ci    return true;
284094332d3Sopenharmony_ci}
285094332d3Sopenharmony_ci
286094332d3Sopenharmony_cibool BatteryConfig::ParseChargeSceneSupport(const Json::Value& valueObj, BatteryConfig::ChargeSceneConfig& config)
287094332d3Sopenharmony_ci{
288094332d3Sopenharmony_ci    Json::Value supportPath = GetValue(valueObj, "support.path");
289094332d3Sopenharmony_ci    Json::Value type = GetValue(valueObj, "support.type");
290094332d3Sopenharmony_ci    Json::Value expectValue = GetValue(valueObj, "support.expect_value");
291094332d3Sopenharmony_ci    if (isValidJsonString(supportPath)) {
292094332d3Sopenharmony_ci        std::string path = supportPath.asString();
293094332d3Sopenharmony_ci        if (IsValidSysPath(path)) {
294094332d3Sopenharmony_ci            config.supportPath = path;
295094332d3Sopenharmony_ci            config.type = isValidJsonString(type) ? type.asString() : "";
296094332d3Sopenharmony_ci            config.expectValue = isValidJsonString(expectValue) ? expectValue.asString() : "";
297094332d3Sopenharmony_ci            return true;
298094332d3Sopenharmony_ci        }
299094332d3Sopenharmony_ci    }
300094332d3Sopenharmony_ci    return false;
301094332d3Sopenharmony_ci}
302094332d3Sopenharmony_ci
303094332d3Sopenharmony_cibool BatteryConfig::ParseChargeSceneSet(const Json::Value& valueObj, BatteryConfig::ChargeSceneConfig& config)
304094332d3Sopenharmony_ci{
305094332d3Sopenharmony_ci    Json::Value setPath = GetValue(valueObj, "set.path");
306094332d3Sopenharmony_ci    if (isValidJsonString(setPath)) {
307094332d3Sopenharmony_ci        std::string path = setPath.asString();
308094332d3Sopenharmony_ci        if (IsValidSysPath(path)) {
309094332d3Sopenharmony_ci            config.setPath = path;
310094332d3Sopenharmony_ci            return true;
311094332d3Sopenharmony_ci        }
312094332d3Sopenharmony_ci    }
313094332d3Sopenharmony_ci    return false;
314094332d3Sopenharmony_ci}
315094332d3Sopenharmony_ci
316094332d3Sopenharmony_cibool BatteryConfig::ParseChargeSceneGet(const Json::Value& valueObj, BatteryConfig::ChargeSceneConfig& config)
317094332d3Sopenharmony_ci{
318094332d3Sopenharmony_ci    Json::Value getPath = GetValue(valueObj, "get.path");
319094332d3Sopenharmony_ci    if (isValidJsonString(getPath)) {
320094332d3Sopenharmony_ci        std::string path = getPath.asString();
321094332d3Sopenharmony_ci        if (IsValidSysPath(path)) {
322094332d3Sopenharmony_ci            config.getPath = path;
323094332d3Sopenharmony_ci            return true;
324094332d3Sopenharmony_ci        }
325094332d3Sopenharmony_ci    }
326094332d3Sopenharmony_ci    return false;
327094332d3Sopenharmony_ci}
328094332d3Sopenharmony_ci
329094332d3Sopenharmony_cibool BatteryConfig::IsValidSysPath(const std::string& path)
330094332d3Sopenharmony_ci{
331094332d3Sopenharmony_ci    char resolvedPath[PATH_MAX] = {};
332094332d3Sopenharmony_ci    if ((realpath(path.c_str(), resolvedPath) == nullptr) ||
333094332d3Sopenharmony_ci        ((strncmp(resolvedPath, "/sys", SYSTEM_PATH_CHECK) != 0) &&
334094332d3Sopenharmony_ci        (strncmp(resolvedPath, "/data", DATA_PATH_CHECK) != 0))) {
335094332d3Sopenharmony_ci        return false;
336094332d3Sopenharmony_ci    }
337094332d3Sopenharmony_ci    return true;
338094332d3Sopenharmony_ci}
339094332d3Sopenharmony_ci
340094332d3Sopenharmony_civoid BatteryConfig::ParseUeventConfig(const Json::Value& ueventConfig)
341094332d3Sopenharmony_ci{
342094332d3Sopenharmony_ci    if (ueventConfig.isNull() || !ueventConfig.isObject()) {
343094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "ueventConfig is invalid");
344094332d3Sopenharmony_ci        return;
345094332d3Sopenharmony_ci    }
346094332d3Sopenharmony_ci    ueventMap_.clear();
347094332d3Sopenharmony_ci    Json::Value::Members members = ueventConfig.getMemberNames();
348094332d3Sopenharmony_ci    for (auto iter = members.begin(); iter != members.end(); iter++) {
349094332d3Sopenharmony_ci        std::string key = *iter;
350094332d3Sopenharmony_ci        Json::Value valueObj = ueventConfig[key];
351094332d3Sopenharmony_ci        if (valueObj.isNull() || !valueObj.isObject()) {
352094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The uevent conf is invalid, key=%{public}s", key.c_str());
353094332d3Sopenharmony_ci            continue;
354094332d3Sopenharmony_ci        }
355094332d3Sopenharmony_ci        std::vector<std::pair<std::string, std::string>> ueventList;
356094332d3Sopenharmony_ci        Json::Value::Members ObjMembers = valueObj.getMemberNames();
357094332d3Sopenharmony_ci        for (auto it = ObjMembers.begin(); it != ObjMembers.end(); it++) {
358094332d3Sopenharmony_ci            std::string event = *it;
359094332d3Sopenharmony_ci            if (!valueObj[event].isString()) {
360094332d3Sopenharmony_ci                BATTERY_HILOGW(COMP_SVC, "The uevent conf is invalid, key=%{public}s", key.c_str());
361094332d3Sopenharmony_ci            }
362094332d3Sopenharmony_ci            std::string act = valueObj[event].asString();
363094332d3Sopenharmony_ci            ueventList.push_back(std::make_pair(event, act));
364094332d3Sopenharmony_ci        }
365094332d3Sopenharmony_ci        ueventMap_.emplace(*iter, ueventList);
366094332d3Sopenharmony_ci        BATTERY_HILOGI(COMP_HDI, "%{public}s size: %{public}d", key.c_str(),
367094332d3Sopenharmony_ci            static_cast<int32_t>(ueventList.size()));
368094332d3Sopenharmony_ci    }
369094332d3Sopenharmony_ci    BATTERY_HILOGI(COMP_HDI, "The uevent config size: %{public}d", static_cast<int32_t>(ueventMap_.size()));
370094332d3Sopenharmony_ci}
371094332d3Sopenharmony_ci
372094332d3Sopenharmony_cibool BatteryConfig::SplitKey(const std::string& key, std::vector<std::string>& keys) const
373094332d3Sopenharmony_ci{
374094332d3Sopenharmony_ci    SplitStr(TrimStr(key), ".", keys);
375094332d3Sopenharmony_ci    return (keys.size() < MIN_DEPTH || keys.size() > MAX_DEPTH) ? false : true;
376094332d3Sopenharmony_ci}
377094332d3Sopenharmony_ci
378094332d3Sopenharmony_ciJson::Value BatteryConfig::GetValue(const Json::Value& config, std::string key) const
379094332d3Sopenharmony_ci{
380094332d3Sopenharmony_ci    std::vector<std::string> keys;
381094332d3Sopenharmony_ci    if (!SplitKey(key, keys)) {
382094332d3Sopenharmony_ci        BATTERY_HILOGW(COMP_HDI, "The key does not meet the. key=%{public}s", key.c_str());
383094332d3Sopenharmony_ci        return Json::Value();
384094332d3Sopenharmony_ci    }
385094332d3Sopenharmony_ci
386094332d3Sopenharmony_ci    std::string firstKey = keys[MAP_KEY_INDEX];
387094332d3Sopenharmony_ci    Json::Value value = (config.isObject() && config.isMember(firstKey)) ? config[firstKey] : Json::Value();
388094332d3Sopenharmony_ci    if (value.isNull()) {
389094332d3Sopenharmony_ci        BATTERY_HILOGD(COMP_HDI, "Value is empty. key=%{public}s", key.c_str());
390094332d3Sopenharmony_ci        return value;
391094332d3Sopenharmony_ci    }
392094332d3Sopenharmony_ci
393094332d3Sopenharmony_ci    for (size_t i = 1; i < keys.size(); ++i) {
394094332d3Sopenharmony_ci        if (!value.isObject() || !value.isMember(keys[i])) {
395094332d3Sopenharmony_ci            BATTERY_HILOGW(COMP_HDI, "The key is not configured. key=%{public}s", keys[i].c_str());
396094332d3Sopenharmony_ci            break;
397094332d3Sopenharmony_ci        }
398094332d3Sopenharmony_ci        value = value[keys[i]];
399094332d3Sopenharmony_ci    }
400094332d3Sopenharmony_ci    return value;
401094332d3Sopenharmony_ci}
402094332d3Sopenharmony_ci
403094332d3Sopenharmony_cibool BatteryConfig::isValidJsonString(const Json::Value& config) const
404094332d3Sopenharmony_ci{
405094332d3Sopenharmony_ci    return !config.isNull() && config.isString();
406094332d3Sopenharmony_ci}
407094332d3Sopenharmony_ci}  // namespace V2_0
408094332d3Sopenharmony_ci}  // namespace Battery
409094332d3Sopenharmony_ci}  // namespace HDI
410094332d3Sopenharmony_ci}  // namespace OHOS
411