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