blob: 35ea742011ea9fc95466f3cb7b5579fc396c904e [file] [log] [blame]
#pragma once
#include "configuration.hpp"
#include <nlohmann/json.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <iostream>
#include <set>
#include <vector>
namespace dbus_interface
{
void tryIfaceInitialize(
std::shared_ptr<sdbusplus::asio::dbus_interface>& iface);
std::shared_ptr<sdbusplus::asio::dbus_interface> createInterface(
sdbusplus::asio::object_server& objServer, const std::string& path,
const std::string& interface, const std::string& parent,
bool checkNull = false);
template <typename PropertyType>
void addArrayToDbus(const std::string& name, const nlohmann::json& array,
sdbusplus::asio::dbus_interface* iface,
sdbusplus::asio::PropertyPermission permission,
nlohmann::json& systemConfiguration,
const std::string& jsonPointerString)
{
std::vector<PropertyType> values;
for (const auto& property : array)
{
auto ptr = property.get_ptr<const PropertyType*>();
if (ptr != nullptr)
{
values.emplace_back(*ptr);
}
}
if (permission == sdbusplus::asio::PropertyPermission::readOnly)
{
iface->register_property(name, values);
}
else
{
iface->register_property(
name, values,
[&systemConfiguration,
jsonPointerString{std::string(jsonPointerString)}](
const std::vector<PropertyType>& newVal,
std::vector<PropertyType>& val) {
val = newVal;
if (!configuration::setJsonFromPointer(jsonPointerString, val,
systemConfiguration))
{
std::cerr << "error setting json field\n";
return -1;
}
if (!configuration::writeJsonFiles(systemConfiguration))
{
std::cerr << "error setting json file\n";
return -1;
}
return 1;
});
}
}
template <typename PropertyType>
void addProperty(const std::string& name, const PropertyType& value,
sdbusplus::asio::dbus_interface* iface,
nlohmann::json& systemConfiguration,
const std::string& jsonPointerString,
sdbusplus::asio::PropertyPermission permission)
{
if (permission == sdbusplus::asio::PropertyPermission::readOnly)
{
iface->register_property(name, value);
return;
}
iface->register_property(
name, value,
[&systemConfiguration,
jsonPointerString{std::string(jsonPointerString)}](
const PropertyType& newVal, PropertyType& val) {
val = newVal;
if (!configuration::setJsonFromPointer(jsonPointerString, val,
systemConfiguration))
{
std::cerr << "error setting json field\n";
return -1;
}
if (!configuration::writeJsonFiles(systemConfiguration))
{
std::cerr << "error setting json file\n";
return -1;
}
return 1;
});
}
void createDeleteObjectMethod(
const std::string& jsonPointerPath,
const std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
sdbusplus::asio::object_server& objServer,
nlohmann::json& systemConfiguration);
void populateInterfaceFromJson(
nlohmann::json& systemConfiguration, const std::string& jsonPointerPath,
std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
nlohmann::json& dict, sdbusplus::asio::object_server& objServer,
sdbusplus::asio::PropertyPermission permission =
sdbusplus::asio::PropertyPermission::readOnly);
void createAddObjectMethod(
const std::string& jsonPointerPath, const std::string& path,
nlohmann::json& systemConfiguration,
sdbusplus::asio::object_server& objServer, const std::string& board);
std::vector<std::weak_ptr<sdbusplus::asio::dbus_interface>>&
getDeviceInterfaces(const nlohmann::json& device);
} // namespace dbus_interface