xref: /openbmc/entity-manager/src/entity_manager/dbus_interface.hpp (revision d7908697f33dd4904a14ab128512528a7e8372c3)
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