1 #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
13 namespace dbus_interface
14 {
15 void tryIfaceInitialize(
16 std::shared_ptr<sdbusplus::asio::dbus_interface>& iface);
17
18 std::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
23 template <typename PropertyType>
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)24 void 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
69 template <typename PropertyType>
addProperty(const std::string & name,const PropertyType & value,sdbusplus::asio::dbus_interface * iface,nlohmann::json & systemConfiguration,const std::string & jsonPointerString,sdbusplus::asio::PropertyPermission permission)70 void 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
102 template <typename PropertyType>
addValueToDBus(const std::string & key,const nlohmann::json & value,sdbusplus::asio::dbus_interface & iface,sdbusplus::asio::PropertyPermission permission,nlohmann::json & systemConfiguration,const std::string & path)103 void addValueToDBus(const std::string& key, const nlohmann::json& value,
104 sdbusplus::asio::dbus_interface& iface,
105 sdbusplus::asio::PropertyPermission permission,
106 nlohmann::json& systemConfiguration,
107 const std::string& path)
108 {
109 if (value.is_array())
110 {
111 addArrayToDbus<PropertyType>(key, value, &iface, permission,
112 systemConfiguration, path);
113 }
114 else
115 {
116 addProperty(key, value.get<PropertyType>(), &iface, systemConfiguration,
117 path, sdbusplus::asio::PropertyPermission::readOnly);
118 }
119 }
120
121 void createDeleteObjectMethod(
122 const std::string& jsonPointerPath,
123 const std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
124 sdbusplus::asio::object_server& objServer,
125 nlohmann::json& systemConfiguration);
126
127 void populateInterfaceFromJson(
128 nlohmann::json& systemConfiguration, const std::string& jsonPointerPath,
129 std::shared_ptr<sdbusplus::asio::dbus_interface>& iface,
130 nlohmann::json& dict, sdbusplus::asio::object_server& objServer,
131 sdbusplus::asio::PropertyPermission permission =
132 sdbusplus::asio::PropertyPermission::readOnly);
133
134 void createAddObjectMethod(
135 const std::string& jsonPointerPath, const std::string& path,
136 nlohmann::json& systemConfiguration,
137 sdbusplus::asio::object_server& objServer, const std::string& board);
138
139 std::vector<std::weak_ptr<sdbusplus::asio::dbus_interface>>&
140 getDeviceInterfaces(const nlohmann::json& device);
141
142 } // namespace dbus_interface
143