Программа ConfigManager предоставляет методы для работы с конфигурациями программ.
API программы ConfigManager представлено на двух языках – C и C++. Чтобы получить доступ к этому API, скомпонуйте вашу программу с библиотекой, используя CMake-команду target_link_libraries().
CMakeLists.txt
target_link_libraries(${EXECUTABLE_NAME}
${config_manager_CLIENT_LIB} # Для программ на языке C замените на config_manager_CLIENT_LIB_FOR_C
${config_manager_DYNAMIC_API_LIB}
${config_manager_CHANGE_SERVER_LIB}
${config_manager_CHANGE_DYNAMIC_SUB_LIB}
)
API программы ConfigManager включает следующие интерфейсы:
IConfigManagerClientИнтерфейс для управления конфигурациями программы.
IConfigChangeClientИнтерфейс, содержащий callback-метод для выполнения действия при изменении конфигурации.
IConfigChangeSubscriptionИнтерфейс для управления подпиской на события изменения конфигураций.
Использование API программы ConfigManager вы можете посмотреть в примере config_manager_example_package.
Сериализация данных
Для сериализации JSON-данных на языке C++ используется библиотека, позволяющая работать с данными в формате JSON и определять их тип. Чтобы создать экземпляр сериализатора на языке C++, используется метод CreateConfigJsonSerializer(), описанный в файле /opt/KasperskyOS-SDK-KISG-Platform-<version>/sysroot-*-kos/include/component/secure_platform/config_manager/config_manager_client/config_manager_json_serializer_factory.h.
config_manager_json_serializer_factory.h (фрагмент)
namespace config_manager {
std::unique_ptr<ISerializer> CreateConfigJsonSerializer();
}
Для сериализации JSON-данных на языке C необходимо самостоятельно описать тип данных и записать преобразованные данные в буфер для их последующего изменения. Для выполнения операций с разным типом данных, вы можете использовать готовые библиотеки config_value_for_c.h, dictionary_for_c.h, list_for_c.h, string_for_c.h, расположенные в директории /opt/KasperskyOS-SDK-KISG-Platform-<version>/sysroot-*-kos/include/component/secure_platform/config_manager/config_manager_client_for_c/.
Типы данных
Класс config_manager::Value является оберткой над всеми типами данных, использующимися программой ConfigManager. Для этого используется класс boost::any. Описание класса config_manager::Value содержится в файле /opt/KasperskyOS-SDK-KISG-Platform-<version>/sysroot-*-kos/include/component/secure_platform/config_manager/config_manager_client/config_value.h. Также в этом файле содержится описание сложных типы данных, таких как список и словарь, методов config_manager::To*, использующихся для оборачивания данных в config_manager::Value, и методов config_manager::As*, использующихся для извлечения данных из класса config_manager::Value.
config_value.h (фрагмент)
namespace config_manager {
...
class Value : public boost::any
{
public:
using boost::any::any;
};
...
using ListValue = std::vector<Value>;
using DictionaryValue = std::unordered_map<std::string, Value>;
using StringType = std::string;
using IntType = std::int64_t;
using UIntType = std::uint64_t;
using BoolType = bool;
using FloatType = double;
inline Value ToBoolValue(BoolType val)
{
return Value{val};
}
inline Value ToStringValue(std::string str)
{
return Value{StringType{std::move(str)}};
}
inline Value ToIntValue(std::int64_t val)
{
return Value{IntType{val}};
}
inline Value ToUIntValue(std::uint64_t val)
{
return Value{UIntType{val}};
}
inline Value ToFloatValue(double val)
{
return Value{FloatType{val}};
}
inline Value ToListValue(const ListValue& list)
{
return Value{list};
}
inline Value ToDictValue(const DictionaryValue& dict)
{
return Value{dict};
}
inline Value ToListValue(ListValue&& list)
{
return Value{std::move(list)};
}
inline Value ToDictValue(DictionaryValue&& dict)
{
return Value{std::move(dict)};
}
inline Value ToNullValue()
{
return Value{};
}
inline ListValue AsList(const Value& value)
{
return detail::CastValue<ListValue>(value);
}
inline DictionaryValue AsDictionary(const Value& value)
{
return detail::CastValue<DictionaryValue>(value);
}
inline BoolType AsBool(const Value& value)
{
return detail::CastValue<BoolType>(value);
}
inline StringType AsString(const Value& value)
{
return detail::CastValue<StringType>(value);
}
inline IntType AsInt(const Value& value)
{
return detail::CastValue<IntType>(value);
}
inline UIntType AsUInt(const Value& value)
{
return detail::CastValue<UIntType>(value);
}
inline FloatType AsFloat(const Value& value)
{
return detail::CastValue<FloatType>(value);
}
inline ListValue AsList(Value&& value)
{
return detail::CastValue<ListValue>(std::move(value));
}
inline DictionaryValue AsDictionary(Value&& value)
{
return detail::CastValue<DictionaryValue>(std::move(value));
}
inline StringType AsString(Value&& value)
{
return detail::CastValue<StringType>(std::move(value));
}
inline ListValue* AsListPtr(Value* value)
{
return detail::CastValue<ListValue>(value);
}
inline const ListValue* AsListPtr(const Value* value)
{
return detail::CastValue<ListValue>(value);
}
inline DictionaryValue* AsDictionaryPtr(Value* value)
{
return detail::CastValue<DictionaryValue>(value);
}
inline const DictionaryValue* AsDictionaryPtr(const Value* value)
{
return detail::CastValue<DictionaryValue>(value);
}
inline BoolType* AsBoolPtr(Value* value)
{
return detail::CastValue<BoolType>(value);
}
inline const BoolType* AsBoolPtr(const Value* value)
{
return detail::CastValue<BoolType>(value);
}
inline StringType* AsStringPtr(Value* value)
{
return detail::CastValue<StringType>(value);
}
inline const StringType* AsStringPtr(const Value* value)
{
return detail::CastValue<StringType>(value);
}
inline IntType* AsIntPtr(Value* value)
{
return detail::CastValue<IntType>(value);
}
inline const IntType* AsIntPtr(const Value* value)
{
return detail::CastValue<IntType>(value);
}
inline UIntType* AsUIntPtr(Value* value)
{
return detail::CastValue<UIntType>(value);
}
inline const UIntType* AsUIntPtr(const Value* value)
{
return detail::CastValue<UIntType>(value);
}
inline FloatType* AsFloatPtr(Value* value)
{
return detail::CastValue<FloatType>(value);
}
inline const FloatType* AsFloatPtr(const Value* value)
{
return detail::CastValue<FloatType>(value);
}
}
В начало