blob: 9738462a7062daaba865270777659dd5ce1df760 [file] [log] [blame]
/*
* Copyright (C) 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.
*/
// Autogenerated by dumpstate_hal_config.xsd
#define LOG_TAG "dumpstate.hal.configuration.V1_0"
#include <memory>
#include <libxml/parser.h>
#include <libxml/xinclude.h>
#include "config/dumpstate_hal_configuration_V1_0.h"
namespace dumpstate {
namespace hal {
namespace configuration {
namespace V1_0 {
template <class T>
constexpr void (*xmlDeleter)(T* t);
template <>
constexpr auto xmlDeleter<xmlDoc> = xmlFreeDoc;
template <>
auto xmlDeleter<xmlChar> = [](xmlChar* s) { xmlFree(s); };
template <class T>
constexpr auto make_xmlUnique(T* t) {
auto deleter = [](T* t) { xmlDeleter<T>(t); };
return std::unique_ptr<T, decltype(deleter)>{t, deleter};
}
static std::string getXmlAttribute(const xmlNode* cur, const char* attribute) {
auto xmlValue = make_xmlUnique(xmlGetProp(cur, reinterpret_cast<const xmlChar*>(attribute)));
if (xmlValue == nullptr) {
return "";
}
std::string value(reinterpret_cast<const char*>(xmlValue.get()));
return value;
}
std::optional<DumpstateHalConfiguration> readBuffer(const std::string& xml) {
auto doc = make_xmlUnique(xmlParseMemory(xml.data(), xml.size()));
if (doc == nullptr) {
return std::nullopt;
}
xmlNodePtr child = xmlDocGetRootElement(doc.get());
if (child == NULL) {
return std::nullopt;
}
if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("dumpstateHalConfiguration"))) {
DumpstateHalConfiguration value = DumpstateHalConfiguration::read(child);
return value;
}
return std::nullopt;
}
std::optional<DumpstateHalConfiguration> readFile(const char* configFile) {
auto doc = make_xmlUnique(xmlParseFile(configFile));
if (doc == nullptr) {
return std::nullopt;
}
xmlNodePtr child = xmlDocGetRootElement(doc.get());
if (child == NULL) {
return std::nullopt;
}
if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("dumpstateHalConfiguration"))) {
DumpstateHalConfiguration value = DumpstateHalConfiguration::read(child);
return value;
}
return std::nullopt;
}
Service::Service(std::string name, std::string command)
: name_(std::move(name)), command_(std::move(command)) {}
const std::string& Service::getName() const {
return name_;
}
bool Service::hasName() const {
return true;
}
const std::string& Service::getCommand() const {
return command_;
}
bool Service::hasCommand() const {
return true;
}
Service Service::read(xmlNode* root) {
std::string raw;
raw = getXmlAttribute(root, "name");
std::string name;
if (raw != "") {
std::string& value = raw;
name = value;
}
raw = getXmlAttribute(root, "command");
std::string command;
if (raw != "") {
std::string& value = raw;
command = value;
}
Service instance(name, command);
return instance;
}
Services::Services(std::vector<Service> service) : service_(std::move(service)) {}
const std::vector<Service>& Services::getService() const {
return service_;
}
bool Services::hasService() const {
return !(service_.empty());
}
const Service* Services::getFirstService() const {
if (service_.empty()) {
return nullptr;
}
return &service_[0];
}
Services Services::read(xmlNode* root) {
std::string raw;
std::vector<Service> service;
for (xmlNode* child = root->xmlChildrenNode; child != nullptr; child = child->next) {
if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("service"))) {
Service value = Service::read(child);
service.push_back(std::move(value));
}
}
Services instance(service);
return instance;
}
SystemLogs::SystemLogs(std::vector<Service> service) : service_(std::move(service)) {}
const std::vector<Service>& SystemLogs::getService() const {
return service_;
}
bool SystemLogs::hasService() const {
return !(service_.empty());
}
const Service* SystemLogs::getFirstService() const {
if (service_.empty()) {
return nullptr;
}
return &service_[0];
}
SystemLogs SystemLogs::read(xmlNode* root) {
std::string raw;
std::vector<Service> service;
for (xmlNode* child = root->xmlChildrenNode; child != nullptr; child = child->next) {
if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("service"))) {
Service value = Service::read(child);
service.push_back(std::move(value));
}
}
SystemLogs instance(service);
return instance;
}
DumpstateHalConfiguration::DumpstateHalConfiguration(std::vector<Services> services,
std::vector<SystemLogs> systemLogs,
float version)
: services_(std::move(services)), systemLogs_(std::move(systemLogs)), version_(version) {}
const std::vector<Services>& DumpstateHalConfiguration::getServices() const {
return services_;
}
bool DumpstateHalConfiguration::hasServices() const {
return !(services_.empty());
}
const Services* DumpstateHalConfiguration::getFirstServices() const {
if (services_.empty()) {
return nullptr;
}
return &services_[0];
}
const std::vector<SystemLogs>& DumpstateHalConfiguration::getSystemLogs() const {
return systemLogs_;
}
bool DumpstateHalConfiguration::hasSystemLogs() const {
return !(systemLogs_.empty());
}
const SystemLogs* DumpstateHalConfiguration::getFirstSystemLogs() const {
if (systemLogs_.empty()) {
return nullptr;
}
return &systemLogs_[0];
}
const float& DumpstateHalConfiguration::getVersion() const {
return version_;
}
bool DumpstateHalConfiguration::hasVersion() const {
return true;
}
DumpstateHalConfiguration DumpstateHalConfiguration::read(xmlNode* root) {
std::string raw;
raw = getXmlAttribute(root, "version");
float version = 0;
if (raw != "") {
float value = std::stof(raw);
version = value;
}
std::vector<Services> services;
std::vector<SystemLogs> systemLogs;
for (xmlNode* child = root->xmlChildrenNode; child != nullptr; child = child->next) {
if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("services"))) {
Services value = Services::read(child);
services.push_back(std::move(value));
} else if (!xmlStrcmp(child->name, reinterpret_cast<const xmlChar*>("systemLogs"))) {
SystemLogs value = SystemLogs::read(child);
systemLogs.push_back(std::move(value));
}
}
DumpstateHalConfiguration instance(services, systemLogs, version);
return instance;
}
} // namespace V1_0
} // namespace configuration
} // namespace hal
} // namespace dumpstate