1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "system_properties_adapter_impl.h"
17 
18 #include <securec.h>
19 
20 #include "init_param.h"
21 #include "nweb_config_helper.h"
22 #include "nweb_log.h"
23 #include "parameter.h"
24 #include "parameters.h"
25 #include "sysversion.h"
26 #include "hitrace_adapter_impl.h"
27 
28 namespace OHOS::NWeb {
29 const std::string FACTORY_CONFIG_VALUE = "factoryConfig";
30 const std::string FACTORY_LEVEL_VALUE = "factoryLevel";
31 const std::string FACTORY_LEVEL_WATCH = "16";
32 const std::string FACTORY_LEVEL_PC = "8";
33 const std::string FACTORY_LEVEL_TABLET = "4";
34 const std::string FACTORY_LEVEL_PHONE = "2";
35 const std::string FACTORY_LEVEL_DEFAULT = "1";
36 
37 const std::string PROP_RENDER_DUMP = "web.render.dump";
38 const std::string PROP_DEBUG_TRACE = "web.debug.trace";
39 const std::unordered_map<std::string, PropertiesKey> PROP_KEY_MAP = {
40     {PROP_RENDER_DUMP, PropertiesKey::PROP_RENDER_DUMP},
41     {PROP_DEBUG_TRACE, PropertiesKey::PROP_DEBUG_TRACE}};
42 
SystemPropertiesChangeCallback(const char * key,const char * value,void * context)43 void SystemPropertiesChangeCallback(const char* key, const char* value, void* context)
44 {
45     WVLOG_D("sys prop change key: %{public}s ,value : %{public}s ", key,  value);
46     SystemPropertiesAdapterImpl::GetInstance().DispatchAllWatcherInfo(key, value);
47 }
48 
49 // static
GetInstance()50 SystemPropertiesAdapterImpl& SystemPropertiesAdapterImpl::GetInstance()
51 {
52     static SystemPropertiesAdapterImpl instance;
53     return instance;
54 }
55 
SystemPropertiesAdapterImpl()56 SystemPropertiesAdapterImpl::SystemPropertiesAdapterImpl()
57 {
58     std::string osFullName =
59         OHOS::system::GetParameter("const.ohos.fullname", "");
60     if (osFullName.empty()) {
61         WVLOG_E("get os full name failed");
62         return;
63     }
64     size_t index = osFullName.find('-');
65     if (index == std::string::npos) {
66         return;
67     }
68     std::string baseOsNameTmp = osFullName.substr(0, index);
69 
70     int versionPartOne;
71     int versionPartTwo;
72     int versionPartThree;
73     int versionPartFour;
74     const char* tmp = strstr(osFullName.c_str(), "-");
75     if (tmp == NULL) {
76         return;
77     }
78     tmp++;
79     int ret = sscanf_s(tmp, "%d.%d.%d.%d",
80         &versionPartOne, &versionPartTwo, &versionPartThree, &versionPartFour);
81     if (ret <= 0) {
82         WVLOG_E("paser os full name failed");
83         return;
84     }
85     softwareMajorVersion_ = versionPartOne;
86     softwareSeniorVersion_ = versionPartTwo;
87     baseOsName_ = baseOsNameTmp;
88     AddAllSysPropWatchers();
89 }
90 
~SystemPropertiesAdapterImpl()91 SystemPropertiesAdapterImpl::~SystemPropertiesAdapterImpl()
92 {
93     RemoveAllSysPropWatchers();
94 }
95 
GetResourceUseHapPathEnable()96 bool SystemPropertiesAdapterImpl::GetResourceUseHapPathEnable()
97 {
98     return OHOS::system::GetBoolParameter("compress", false);
99 }
100 
GetDeviceInfoProductModel()101 std::string SystemPropertiesAdapterImpl::GetDeviceInfoProductModel()
102 {
103     return GetProductModel();
104 }
105 
GetDeviceInfoBrand()106 std::string SystemPropertiesAdapterImpl::GetDeviceInfoBrand()
107 {
108     return GetBrand();
109 }
110 
GetDeviceInfoMajorVersion()111 int32_t SystemPropertiesAdapterImpl::GetDeviceInfoMajorVersion()
112 {
113     return GetMajorVersion();
114 }
115 
GetProductDeviceType()116 ProductDeviceType SystemPropertiesAdapterImpl::GetProductDeviceType()
117 {
118     ProductDeviceType factoryLevel = AnalysisFromConfig();
119     if (factoryLevel != ProductDeviceType::DEVICE_TYPE_UNKNOWN) {
120         return factoryLevel;
121     }
122     WVLOG_W("read config factoryLevel: fail");
123     // RK or other device cant read config,need read from system deviceType
124     std::string deviceType = OHOS::system::GetDeviceType();
125     if (deviceType == "phone" || deviceType == "default") {
126         return ProductDeviceType::DEVICE_TYPE_MOBILE;
127     } else if (deviceType == "tablet") {
128         return ProductDeviceType::DEVICE_TYPE_TABLET;
129     } else if (deviceType == "2in1") {
130         return ProductDeviceType::DEVICE_TYPE_2IN1;
131     }
132     return ProductDeviceType::DEVICE_TYPE_UNKNOWN;
133 }
134 
AnalysisFromConfig()135 ProductDeviceType SystemPropertiesAdapterImpl::AnalysisFromConfig()
136 {
137     std::string factoryLevel = NWebConfigHelper::Instance()
138         .ParsePerfConfig(FACTORY_CONFIG_VALUE, FACTORY_LEVEL_VALUE);
139     if (factoryLevel.empty()) {
140         NWebConfigHelper::Instance().ReadConfigIfNeeded();
141         factoryLevel = NWebConfigHelper::Instance().
142             ParsePerfConfig(FACTORY_CONFIG_VALUE, FACTORY_LEVEL_VALUE);
143     }
144     WVLOG_D("read config factoryLevel: %{public}s ", factoryLevel.c_str());
145     if (factoryLevel == FACTORY_LEVEL_PHONE || factoryLevel == FACTORY_LEVEL_DEFAULT) {
146         return ProductDeviceType::DEVICE_TYPE_MOBILE;
147     } else if (factoryLevel == FACTORY_LEVEL_TABLET) {
148         return ProductDeviceType::DEVICE_TYPE_TABLET;
149     } else if (factoryLevel == FACTORY_LEVEL_PC) {
150         return ProductDeviceType::DEVICE_TYPE_2IN1;
151     }
152     return ProductDeviceType::DEVICE_TYPE_UNKNOWN;
153 }
154 
GetWebOptimizationValue()155 bool SystemPropertiesAdapterImpl::GetWebOptimizationValue()
156 {
157     return OHOS::system::GetBoolParameter("web.optimization", true);
158 }
159 
IsAdvancedSecurityMode()160 bool SystemPropertiesAdapterImpl::IsAdvancedSecurityMode()
161 {
162     char buffer[32] = { 0 };
163     uint32_t buffSize = sizeof(buffer);
164 
165     if (SystemGetParameter("ohos.boot.advsecmode.state", buffer, &buffSize) == 0 && strcmp(buffer, "0") != 0) {
166         return true;
167     }
168     return false;
169 }
170 
GetUserAgentOSName()171 std::string SystemPropertiesAdapterImpl::GetUserAgentOSName()
172 {
173     return OHOS::system::GetParameter("const.product.os.dist.name", "");
174 }
175 
GetUserAgentOSVersion()176 std::string SystemPropertiesAdapterImpl::GetUserAgentOSVersion()
177 {
178     return OHOS::system::GetParameter("const.product.os.dist.apiname", "").empty() ?
179         OHOS::system::GetParameter("const.product.os.dist.version", "") :
180         OHOS::system::GetParameter("const.product.os.dist.apiname", "");
181 }
182 
GetUserAgentBaseOSName()183 std::string SystemPropertiesAdapterImpl::GetUserAgentBaseOSName()
184 {
185     return baseOsName_;
186 }
187 
GetSoftwareMajorVersion()188 int32_t SystemPropertiesAdapterImpl::GetSoftwareMajorVersion()
189 {
190     return softwareMajorVersion_;
191 }
192 
GetSoftwareSeniorVersion()193 int32_t SystemPropertiesAdapterImpl::GetSoftwareSeniorVersion()
194 {
195     return softwareSeniorVersion_;
196 }
197 
GetNetlogMode()198 std::string SystemPropertiesAdapterImpl::GetNetlogMode()
199 {
200     return OHOS::system::GetParameter("web.debug.netlog", "");
201 }
202 
GetTraceDebugEnable()203 bool SystemPropertiesAdapterImpl::GetTraceDebugEnable()
204 {
205     return OHOS::system::GetBoolParameter("web.debug.trace", false);
206 }
207 
GetSiteIsolationMode()208 std::string SystemPropertiesAdapterImpl::GetSiteIsolationMode()
209 {
210     return OHOS::system::GetParameter("web.debug.strictsiteIsolation.enable", "");
211 }
212 
GetFlowBufMaxFd()213 int32_t SystemPropertiesAdapterImpl::GetFlowBufMaxFd()
214 {
215     return OHOS::system::GetIntParameter("web.flowbuffer.maxfd", -1);
216 }
217 
GetOOPGPUEnable()218 bool SystemPropertiesAdapterImpl::GetOOPGPUEnable()
219 {
220     if (GetDeviceInfoProductModel() == "emulator") {
221         return false;
222     }
223     if (OHOS::system::GetParameter("web.oop.gpu", "") == "true") {
224         return true;
225     }
226 
227     return false;
228 }
229 
SetOOPGPUDisable()230 void SystemPropertiesAdapterImpl::SetOOPGPUDisable()
231 {
232     if (OHOS::system::GetParameter("web.oop.gpu", "") == "None") {
233         OHOS::system::SetParameter("web.oop.gpu", "false");
234     }
235     return;
236 }
237 
AddAllSysPropWatchers()238 void SystemPropertiesAdapterImpl::AddAllSysPropWatchers()
239 {
240     for (auto &item : PROP_KEY_MAP) {
241         auto errNo =  WatchParameter(item.first.c_str(), SystemPropertiesChangeCallback, nullptr);
242         if (errNo == 0) {
243             sysPropObserver_[item.second];
244             sysPropMutex_[item.second];
245         } else {
246             WVLOG_I("add watch error result: %{public}d", errNo);
247         }
248     }
249 }
250 
RemoveAllSysPropWatchers()251 void SystemPropertiesAdapterImpl::RemoveAllSysPropWatchers()
252 {
253     for (auto &item : PROP_KEY_MAP) {
254         auto errNo = RemoveParameterWatcher(item.first.c_str(), nullptr, nullptr);
255         if (errNo != 0) {
256             WVLOG_I("remove watch error result: %{public}d", errNo);
257         }
258     }
259 }
260 
DispatchAllWatcherInfo(const char * key,const char * value)261 void SystemPropertiesAdapterImpl::DispatchAllWatcherInfo(const char* key, const char* value)
262 {
263     auto propKeyIt = PROP_KEY_MAP.find(key);
264     if (propKeyIt == PROP_KEY_MAP.end()) {
265         WVLOG_I("sys prop change key is invalid: %{public}s", key);
266         return;
267     }
268 
269     PropertiesKey propkey = propKeyIt->second;
270     auto& keyObservers = sysPropObserver_[propkey];
271 
272     if (keyObservers.size() == 0) {
273         WVLOG_I("no observers in this key: %{public}s", key);
274         return;
275     }
276 
277     std::shared_lock lock(sysPropMutex_[propkey]);
278     for (auto &item : keyObservers) {
279         item->PropertiesUpdate(value);
280     }
281 }
282 
AttachSysPropObserver(PropertiesKey key,SystemPropertiesObserver * observer)283 void SystemPropertiesAdapterImpl::AttachSysPropObserver(PropertiesKey key, SystemPropertiesObserver* observer)
284 {
285     auto observerIt = sysPropObserver_.find(key);
286     if (observerIt == sysPropObserver_.end()) {
287         WVLOG_I("properties key invalid in attach");
288         return;
289     }
290 
291     if (observer == nullptr) {
292         WVLOG_I("properties key observer invalid in attach");
293         return;
294     }
295 
296     std::vector<SystemPropertiesObserver*>& observerVec = observerIt->second;
297     std::unique_lock lock(sysPropMutex_[key]);
298     observerVec.push_back(observer);
299 }
300 
DetachSysPropObserver(PropertiesKey key,SystemPropertiesObserver * observer)301 void SystemPropertiesAdapterImpl::DetachSysPropObserver(PropertiesKey key, SystemPropertiesObserver* observer)
302 {
303     auto observerIt = sysPropObserver_.find(key);
304     if (observerIt == sysPropObserver_.end()) {
305         WVLOG_I("properties key invalid in detach");
306         return;
307     }
308 
309     if (observer == nullptr) {
310         WVLOG_I("properties key observer invalid in detach");
311         return;
312     }
313 
314     std::vector<SystemPropertiesObserver*>& observerVec = observerIt->second;
315     std::unique_lock lock(sysPropMutex_[key]);
316 
317     auto it = std::find(observerVec.begin(), observerVec.end(), observer);
318     if (it != observerVec.end()) {
319         observerVec.erase(it);
320     }
321 }
322 
GetBoolParameter(const std::string & key,bool defaultValue)323 bool SystemPropertiesAdapterImpl::GetBoolParameter(const std::string& key, bool defaultValue)
324 {
325     return OHOS::system::GetBoolParameter(key, defaultValue);
326 }
327 
GetLTPOConfig(const std::string & settingName)328 std::vector<FrameRateSetting> SystemPropertiesAdapterImpl::GetLTPOConfig(const std::string& settingName)
329 {
330     return NWebConfigHelper::Instance().GetPerfConfig(settingName);
331 }
332 
GetOOPGPUStatus()333 std::string SystemPropertiesAdapterImpl::GetOOPGPUStatus()
334 {
335     if (GetDeviceInfoProductModel() == "emulator") {
336         return "false";
337     }
338     return OHOS::system::GetParameter("web.oop.gpu", "");
339 }
340 } // namespace OHOS::NWeb
341