* Copyright (c) 2026 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "version_config_parser.h"
#include "event_json_parser.h"
#include "parameter_ex.h"
#include "json/json.h"
#include <string>
namespace OHOS {
namespace HiviewDFX {
static constexpr uint8_t BETA_COLLECT = 0b0001;
static constexpr uint8_t COMM_COLLECT = 0b0010;
static constexpr uint8_t BETA_PRESERVE = 0b0100;
static constexpr uint8_t COMM_PRESERVE = 0b1000;
static constexpr char PRESERVE[] = "preserve";
static constexpr char COLLECT[] = "collect";
uint8_t GetDefaultConfig(const std::string& key, const uint8_t betaCfg, const uint8_t commCfg)
{
uint8_t controlTag = DO_NOTHING;
if ((key == PRESERVE && DEFAULT_PRESERVE_VAL) || (key == COLLECT && DEFAULT_COLLECT_VAL)) {
controlTag |= betaCfg | commCfg;
}
return controlTag;
}
uint8_t GetBoolCfg(bool enabled, const uint8_t betaCfg, const uint8_t commCfg)
{
uint8_t controlTag = DO_NOTHING;
if (enabled) {
controlTag |= betaCfg | commCfg;
}
return controlTag;
}
uint8_t GetNumConfig(uint8_t cfgVal, const std::string& key, const uint8_t betaCfg, const uint8_t commCfg)
{
uint8_t controlTag = DO_NOTHING;
switch (cfgVal) {
case ALL:
controlTag |= betaCfg | commCfg;
break;
case COMMERCIAL_ONLY:
controlTag |= commCfg;
break;
case BETA_ONLY:
controlTag |= betaCfg;
break;
case NONE:
break;
default:
controlTag = GetDefaultConfig(key, betaCfg, commCfg);
}
return controlTag;
}
VersionConfigParser::VersionConfigParser(const Json::Value& jsonValue)
{
controlTag_ = ParseConfig(jsonValue);
}
uint8_t VersionConfigParser::ParseConfig(const Json::Value& jsonValue)
{
uint8_t controlTag = DO_NOTHING;
if (jsonValue.isObject()) {
controlTag |= ParseConfig(jsonValue, COLLECT, BETA_COLLECT, COMM_COLLECT);
controlTag |= ParseConfig(jsonValue, PRESERVE, BETA_PRESERVE, COMM_PRESERVE);
}
return controlTag;
}
uint8_t VersionConfigParser::ParseConfig(const Json::Value& jsonValue, const std::string& key,
const uint8_t betaCfg, const uint8_t commCfg)
{
if (!jsonValue.isMember(key.c_str())) {
return GetDefaultConfig(key, betaCfg, commCfg);
}
Json::Value cfgJson = jsonValue[key];
if (cfgJson.isBool()) {
return GetBoolCfg(cfgJson.asBool(), betaCfg, commCfg);
} else if (cfgJson.isUInt()) {
return GetNumConfig(static_cast<uint8_t>(cfgJson.asUInt()), key, betaCfg, commCfg);
} else {
return GetDefaultConfig(key, betaCfg, commCfg);
}
}
bool VersionConfigParser::ShouldCollect() const
{
if (Parameter::IsBetaVersion()) {
return controlTag_ & BETA_COLLECT;
} else {
return controlTag_ & COMM_COLLECT;
}
}
bool VersionConfigParser::ShouldPreserve() const
{
if (Parameter::IsBetaVersion()) {
return controlTag_ & BETA_PRESERVE;
} else {
return controlTag_ & COMM_PRESERVE;
}
}
}
}