Программа ConfigManager

Программа 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 включает следующие интерфейсы:

Использование 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);

}

}

В начало