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