You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.7 KiB
124 lines
4.7 KiB
/*
|
|
* Copyright 2020 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
#include "common/strings.h"
|
|
#include "common/type_helper.h"
|
|
#include "storage/serializable.h"
|
|
|
|
namespace bluetooth {
|
|
namespace storage {
|
|
|
|
class MutationEntry {
|
|
public:
|
|
enum EntryType { SET, REMOVE_PROPERTY, REMOVE_SECTION };
|
|
|
|
enum PropertyType { NORMAL, MEMORY_ONLY };
|
|
|
|
template <typename T, typename std::enable_if<std::is_integral_v<T>, int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
|
|
return MutationEntry::Set(
|
|
property_type, std::move(section_param), std::move(property_param), std::to_string(value_param));
|
|
}
|
|
|
|
template <typename T, typename std::enable_if<std::is_enum_v<T>, int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
|
|
using EnumUnderlyingType = typename std::underlying_type_t<T>;
|
|
return MutationEntry::Set<EnumUnderlyingType>(
|
|
property_type,
|
|
std::move(section_param),
|
|
std::move(property_param),
|
|
static_cast<EnumUnderlyingType>(value_param));
|
|
}
|
|
|
|
template <typename T, typename std::enable_if<std::is_same_v<T, bool>, int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
|
|
return MutationEntry::Set(
|
|
property_type, std::move(section_param), std::move(property_param), common::ToString(value_param));
|
|
}
|
|
|
|
template <typename T, typename std::enable_if<std::is_same_v<T, std::string>, int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, T value_param) {
|
|
return MutationEntry::Set(
|
|
property_type, std::move(section_param), std::move(property_param), std::move(value_param));
|
|
}
|
|
|
|
template <typename T, typename std::enable_if<std::is_base_of_v<Serializable<T>, T>, int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, const T& value_param) {
|
|
return MutationEntry::Set(
|
|
property_type, std::move(section_param), std::move(property_param), value_param.ToLegacyConfigString());
|
|
}
|
|
|
|
template <
|
|
typename T,
|
|
typename std::enable_if<
|
|
bluetooth::common::is_specialization_of<T, std::vector>::value &&
|
|
std::is_base_of_v<Serializable<typename T::value_type>, typename T::value_type>,
|
|
int>::type = 0>
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, const T& value_param) {
|
|
std::vector<std::string> str_values;
|
|
str_values.reserve(value_param.size());
|
|
for (const auto& v : value_param) {
|
|
str_values.push_back(v.ToLegacyConfigString());
|
|
}
|
|
return MutationEntry::Set(
|
|
property_type, std::move(section_param), std::move(property_param), common::StringJoin(str_values, " "));
|
|
}
|
|
|
|
static MutationEntry Set(
|
|
PropertyType property_type, std::string section_param, std::string property_param, std::string value_param) {
|
|
return MutationEntry(
|
|
EntryType::SET, property_type, std::move(section_param), std::move(property_param), std::move(value_param));
|
|
}
|
|
|
|
static MutationEntry Remove(PropertyType property_type, std::string section_param) {
|
|
return MutationEntry(EntryType::REMOVE_SECTION, property_type, std::move(section_param));
|
|
}
|
|
|
|
static MutationEntry Remove(PropertyType property_type, std::string section_param, std::string property_param) {
|
|
return MutationEntry(
|
|
EntryType::REMOVE_PROPERTY, property_type, std::move(section_param), std::move(property_param));
|
|
}
|
|
|
|
private:
|
|
friend class ConfigCache;
|
|
friend class Mutation;
|
|
|
|
MutationEntry(
|
|
EntryType entry_type_param,
|
|
PropertyType property_type_param,
|
|
std::string section_param,
|
|
std::string property_param = "",
|
|
std::string value_param = "");
|
|
|
|
EntryType entry_type;
|
|
PropertyType property_type;
|
|
std::string section;
|
|
std::string property;
|
|
std::string value;
|
|
};
|
|
|
|
} // namespace storage
|
|
} // namespace bluetooth
|