blob: 35ea742011ea9fc95466f3cb7b5579fc396c904e [file] [log] [blame]
Christopher Meis12bea9b2025-04-03 10:14:42 +02001#pragma once
2
3#include "configuration.hpp"
4
5#include <nlohmann/json.hpp>
6#include <sdbusplus/asio/connection.hpp>
7#include <sdbusplus/asio/object_server.hpp>
8
9#include <iostream>
10#include <set>
11#include <vector>
12
13namespace dbus_interface
14{
15void tryIfaceInitialize(
16 std::shared_ptr<sdbusplus::asio::dbus_interface>& iface);
17
18std::shared_ptr<sdbusplus::asio::dbus_interface> createInterface(
19 sdbusplus::asio::object_server& objServer, const std::string& path,
20 const std::string& interface, const std::string& parent,
21 bool checkNull = false);
22
23template <typename PropertyType>
24void addArrayToDbus(const std::string& name, const nlohmann::json& array,
25 sdbusplus::asio::dbus_interface* iface,
26 sdbusplus::asio::PropertyPermission permission,
27 nlohmann::json& systemConfiguration,
28 const std::string& jsonPointerString)
29{
30 std::vector<PropertyType> values;
31 for (const auto& property : array)
32 {
33 auto ptr = property.get_ptr<const PropertyType*>();
34 if (ptr != nullptr)
35 {
36 values.emplace_back(*ptr);
37 }
38 }
39
40 if (permission == sdbusplus::asio::PropertyPermission::readOnly)
41 {
42 iface->register_property(name, values);
43 }
44 else
45 {
46 iface->register_property(
47 name, values,
48 [&systemConfiguration,
49 jsonPointerString{std::string(jsonPointerString)}](
50 const std::vector<PropertyType>& newVal,
51 std::vector<PropertyType>& val) {
52 val = newVal;
53 if (!configuration::setJsonFromPointer(jsonPointerString, val,
54 systemConfiguration))
55 {
56 std::cerr << "error setting json field\n";
57 return -1;
58 }
59 if (!configuration::writeJsonFiles(systemConfiguration))
60 {
61 std::cerr << "error setting json file\n";
62 return -1;
63 }
64 return 1;
65 });
66 }
67}
68
69template <typename PropertyType>
70void addProperty(const std::string& name, const PropertyType& value,
71 sdbusplus::asio::dbus_interface* iface,
72 nlohmann::json& systemConfiguration,
73 const std::string& jsonPointerString,
74 sdbusplus::asio::PropertyPermission permission)
75{
76 if (permission == sdbusplus::asio::PropertyPermission::readOnly)
77 {
78 iface->register_property(name, value);
79 return;
80 }
81 iface->register_property(
82 name, value,
83 [&systemConfiguration,
84 jsonPointerString{std::string(jsonPointerString)}](
85 const PropertyType& newVal, PropertyType& val) {
86 val = newVal;
87 if (!configuration::setJsonFromPointer(jsonPointerString, val,
88 systemConfiguration))
89 {
90 std::cerr << "error setting json field\n";
91 return -1;
92 }
93 if (!configuration::writeJsonFiles(systemConfiguration))
94 {
95 std::cerr << "error setting json file\n";
96 return -1;
97 }
98 return 1;
99 });
100}
101
102void createDeleteObjectMethod(
103 const std::string& jsonPointerPath,
104 const std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
105 sdbusplus::asio::object_server& objServer,
106 nlohmann::json& systemConfiguration);
107
108void populateInterfaceFromJson(
109 nlohmann::json& systemConfiguration, const std::string& jsonPointerPath,
110 std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
111 nlohmann::json& dict, sdbusplus::asio::object_server& objServer,
112 sdbusplus::asio::PropertyPermission permission =
113 sdbusplus::asio::PropertyPermission::readOnly);
114
115void createAddObjectMethod(
116 const std::string& jsonPointerPath, const std::string& path,
117 nlohmann::json& systemConfiguration,
118 sdbusplus::asio::object_server& objServer, const std::string& board);
119
120std::vector<std::weak_ptr<sdbusplus::asio::dbus_interface>>&
121 getDeviceInterfaces(const nlohmann::json& device);
122
123} // namespace dbus_interface