1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci * You may obtain a copy of the License at 6d9f0492fSopenharmony_ci * 7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci * 9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci * limitations under the License. 14d9f0492fSopenharmony_ci */ 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ci#include "param_wrapper.h" 17d9f0492fSopenharmony_ci 18d9f0492fSopenharmony_ci#include <unordered_map> 19d9f0492fSopenharmony_ci#include <vector> 20d9f0492fSopenharmony_ci#include <climits> 21d9f0492fSopenharmony_ci 22d9f0492fSopenharmony_ci#include "beget_ext.h" 23d9f0492fSopenharmony_ci#include "param_comm.h" 24d9f0492fSopenharmony_ci#include "init_param.h" 25d9f0492fSopenharmony_ci#include "init_utils.h" 26d9f0492fSopenharmony_ci#include "sysparam_errno.h" 27d9f0492fSopenharmony_ci#include "securec.h" 28d9f0492fSopenharmony_ci#include "parameter.h" 29d9f0492fSopenharmony_ci#include "parameters.h" 30d9f0492fSopenharmony_ci 31d9f0492fSopenharmony_cinamespace OHOS { 32d9f0492fSopenharmony_cinamespace system { 33d9f0492fSopenharmony_cistatic constexpr int MAX_VALUE_LEN = 128; 34d9f0492fSopenharmony_cibool SetParameter(const std::string& key, const std::string& value) 35d9f0492fSopenharmony_ci{ 36d9f0492fSopenharmony_ci int ret = SystemSetParameter(key.c_str(), value.c_str()); 37d9f0492fSopenharmony_ci return (ret == 0) ? true : false; 38d9f0492fSopenharmony_ci} 39d9f0492fSopenharmony_ci 40d9f0492fSopenharmony_citemplate<typename T> 41d9f0492fSopenharmony_cibool StringToInt(const std::string& str, T min, T max, T& out) 42d9f0492fSopenharmony_ci{ 43d9f0492fSopenharmony_ci long long int result = 0; 44d9f0492fSopenharmony_ci if (StringToLL(str.c_str(), &result) != 0) { 45d9f0492fSopenharmony_ci return false; 46d9f0492fSopenharmony_ci } 47d9f0492fSopenharmony_ci if (result < min || max < result) { 48d9f0492fSopenharmony_ci return false; 49d9f0492fSopenharmony_ci } 50d9f0492fSopenharmony_ci out = static_cast<T>(result); 51d9f0492fSopenharmony_ci return true; 52d9f0492fSopenharmony_ci} 53d9f0492fSopenharmony_ci 54d9f0492fSopenharmony_citemplate<typename T> 55d9f0492fSopenharmony_cibool StringToUint(const std::string& str, T max, T& out) 56d9f0492fSopenharmony_ci{ 57d9f0492fSopenharmony_ci unsigned long long int result = 0; 58d9f0492fSopenharmony_ci if (StringToULL(str.c_str(), &result) != 0) { 59d9f0492fSopenharmony_ci return false; 60d9f0492fSopenharmony_ci } 61d9f0492fSopenharmony_ci if (max < result) { 62d9f0492fSopenharmony_ci return false; 63d9f0492fSopenharmony_ci } 64d9f0492fSopenharmony_ci out = static_cast<T>(result); 65d9f0492fSopenharmony_ci return true; 66d9f0492fSopenharmony_ci} 67d9f0492fSopenharmony_ci 68d9f0492fSopenharmony_cistd::string GetParameter(const std::string& key, const std::string& def) 69d9f0492fSopenharmony_ci{ 70d9f0492fSopenharmony_ci uint32_t size = 0; 71d9f0492fSopenharmony_ci int ret = SystemReadParam(key.c_str(), NULL, &size); 72d9f0492fSopenharmony_ci if (ret == 0) { 73d9f0492fSopenharmony_ci std::vector<char> value(MAX_VALUE_LEN); 74d9f0492fSopenharmony_ci ret = SystemReadParam(key.c_str(), value.data(), &size); 75d9f0492fSopenharmony_ci if (ret == 0) { 76d9f0492fSopenharmony_ci return std::string(value.data()); 77d9f0492fSopenharmony_ci } 78d9f0492fSopenharmony_ci } 79d9f0492fSopenharmony_ci if (IsValidParamValue(def.c_str(), MAX_VALUE_LEN) == 1) { 80d9f0492fSopenharmony_ci return std::string(def); 81d9f0492fSopenharmony_ci } 82d9f0492fSopenharmony_ci return ""; 83d9f0492fSopenharmony_ci} 84d9f0492fSopenharmony_ci 85d9f0492fSopenharmony_cibool GetBoolParameter(const std::string& key, bool def) 86d9f0492fSopenharmony_ci{ 87d9f0492fSopenharmony_ci static const std::string trueMap[] = { "1", "y", "yes", "on", "true" }; 88d9f0492fSopenharmony_ci static const std::string falseMap[] = { "0", "off", "n", "no", "false" }; 89d9f0492fSopenharmony_ci std::string value = GetParameter(key, ""); 90d9f0492fSopenharmony_ci for (size_t i = 0; i < sizeof(trueMap) / sizeof(trueMap[0]); i++) { 91d9f0492fSopenharmony_ci if (trueMap[i] == value) { 92d9f0492fSopenharmony_ci return true; 93d9f0492fSopenharmony_ci } 94d9f0492fSopenharmony_ci } 95d9f0492fSopenharmony_ci for (size_t i = 0; i < sizeof(falseMap) / sizeof(falseMap[0]); i++) { 96d9f0492fSopenharmony_ci if (falseMap[i] == value) { 97d9f0492fSopenharmony_ci return false; 98d9f0492fSopenharmony_ci } 99d9f0492fSopenharmony_ci } 100d9f0492fSopenharmony_ci return def; 101d9f0492fSopenharmony_ci} 102d9f0492fSopenharmony_ci 103d9f0492fSopenharmony_ciint GetStringParameter(const std::string &key, std::string &value, const std::string def) 104d9f0492fSopenharmony_ci{ 105d9f0492fSopenharmony_ci uint32_t size = 0; 106d9f0492fSopenharmony_ci int ret = SystemReadParam(key.c_str(), NULL, &size); 107d9f0492fSopenharmony_ci if (ret == 0) { 108d9f0492fSopenharmony_ci std::vector<char> data(size + 1); 109d9f0492fSopenharmony_ci ret = SystemReadParam(key.c_str(), data.data(), &size); 110d9f0492fSopenharmony_ci if (ret == 0) { 111d9f0492fSopenharmony_ci value = std::string(data.data()); 112d9f0492fSopenharmony_ci return EC_SUCCESS; 113d9f0492fSopenharmony_ci } 114d9f0492fSopenharmony_ci } 115d9f0492fSopenharmony_ci if (IsValidParamValue(def.c_str(), MAX_VALUE_LEN) == 1) { 116d9f0492fSopenharmony_ci value = std::string(def); 117d9f0492fSopenharmony_ci return EC_SUCCESS; 118d9f0492fSopenharmony_ci } 119d9f0492fSopenharmony_ci return EC_FAILURE; 120d9f0492fSopenharmony_ci} 121d9f0492fSopenharmony_ci 122d9f0492fSopenharmony_citemplate<typename T> 123d9f0492fSopenharmony_ciT GetIntParameter(const std::string& key, T def, T min, T max) 124d9f0492fSopenharmony_ci{ 125d9f0492fSopenharmony_ci if (!std::is_signed<T>::value) { 126d9f0492fSopenharmony_ci return def; 127d9f0492fSopenharmony_ci } 128d9f0492fSopenharmony_ci T result; 129d9f0492fSopenharmony_ci std::string value = GetParameter(key, ""); 130d9f0492fSopenharmony_ci if (!value.empty() && StringToInt(value, min, max, result)) { 131d9f0492fSopenharmony_ci return result; 132d9f0492fSopenharmony_ci } 133d9f0492fSopenharmony_ci return def; 134d9f0492fSopenharmony_ci} 135d9f0492fSopenharmony_ci 136d9f0492fSopenharmony_citemplate int8_t GetIntParameter(const std::string&, int8_t, int8_t, int8_t); 137d9f0492fSopenharmony_citemplate int16_t GetIntParameter(const std::string&, int16_t, int16_t, int16_t); 138d9f0492fSopenharmony_citemplate int32_t GetIntParameter(const std::string&, int32_t, int32_t, int32_t); 139d9f0492fSopenharmony_citemplate int64_t GetIntParameter(const std::string&, int64_t, int64_t, int64_t); 140d9f0492fSopenharmony_ci 141d9f0492fSopenharmony_citemplate<typename T> 142d9f0492fSopenharmony_ciT GetUintParameter(const std::string& key, T def, T max) 143d9f0492fSopenharmony_ci{ 144d9f0492fSopenharmony_ci if (!std::is_unsigned<T>::value) { 145d9f0492fSopenharmony_ci return def; 146d9f0492fSopenharmony_ci } 147d9f0492fSopenharmony_ci T result; 148d9f0492fSopenharmony_ci std::string value = GetParameter(key, ""); 149d9f0492fSopenharmony_ci if (!value.empty() && StringToUint(value, max, result)) { 150d9f0492fSopenharmony_ci return result; 151d9f0492fSopenharmony_ci } 152d9f0492fSopenharmony_ci return def; 153d9f0492fSopenharmony_ci} 154d9f0492fSopenharmony_ci 155d9f0492fSopenharmony_citemplate uint8_t GetUintParameter(const std::string&, uint8_t, uint8_t); 156d9f0492fSopenharmony_citemplate uint16_t GetUintParameter(const std::string&, uint16_t, uint16_t); 157d9f0492fSopenharmony_citemplate uint32_t GetUintParameter(const std::string&, uint32_t, uint32_t); 158d9f0492fSopenharmony_citemplate uint64_t GetUintParameter(const std::string&, uint64_t, uint64_t); 159d9f0492fSopenharmony_ci 160d9f0492fSopenharmony_cistd::string GetDeviceType(void) 161d9f0492fSopenharmony_ci{ 162d9f0492fSopenharmony_ci std::unordered_map<std::string, std::string> deviceTypeMap = { 163d9f0492fSopenharmony_ci {"watch", "wearable"}, 164d9f0492fSopenharmony_ci {"fitnessWatch", "liteWearable"}, 165d9f0492fSopenharmony_ci }; 166d9f0492fSopenharmony_ci static const char *productType = nullptr; 167d9f0492fSopenharmony_ci const char *type = GetProperty("const.product.devicetype", &productType); 168d9f0492fSopenharmony_ci if (type == nullptr) { 169d9f0492fSopenharmony_ci type = GetProperty("const.build.characteristics", &productType); 170d9f0492fSopenharmony_ci } 171d9f0492fSopenharmony_ci if (type == nullptr) { 172d9f0492fSopenharmony_ci return std::string(""); 173d9f0492fSopenharmony_ci } 174d9f0492fSopenharmony_ci if (deviceTypeMap.count(type) != 0) { 175d9f0492fSopenharmony_ci return deviceTypeMap[type]; 176d9f0492fSopenharmony_ci } 177d9f0492fSopenharmony_ci return std::string(type); 178d9f0492fSopenharmony_ci} 179d9f0492fSopenharmony_ci 180d9f0492fSopenharmony_ciint GetIntParameter(const std::string &key, int def) 181d9f0492fSopenharmony_ci{ 182d9f0492fSopenharmony_ci return GetIntParameter(key, def, INT_MIN, INT_MAX); 183d9f0492fSopenharmony_ci} 184d9f0492fSopenharmony_ci} // namespace system 185d9f0492fSopenharmony_ci} // namespace OHOS 186