xref: /openbmc/phosphor-led-manager/utils.cpp (revision 4d44a55e)
1 #include "utils.hpp"
2 
3 #include <phosphor-logging/lg2.hpp>
4 
5 namespace phosphor
6 {
7 namespace led
8 {
9 namespace utils
10 {
11 
12 // Get service name
13 const std::string DBusHandler::getService(const std::string& path,
14                                           const std::string& interface) const
15 {
16     using InterfaceList = std::vector<std::string>;
17     std::unordered_map<std::string, std::vector<std::string>> mapperResponse;
18 
19     auto& bus = DBusHandler::getBus();
20 
21     auto mapper = bus.new_method_call(mapperBusName, mapperObjPath, mapperIntf,
22                                       "GetObject");
23     mapper.append(path, InterfaceList({interface}));
24 
25     auto mapperResponseMsg = bus.call(mapper);
26     mapperResponseMsg.read(mapperResponse);
27     if (mapperResponse.empty())
28     {
29         lg2::error(
30             "Failed to read getService mapper response, OBJECT_PATH = {PATH}, INTERFACE = {INTERFACE}",
31             "PATH", path, "INTERFACE", interface);
32         return "";
33     }
34 
35     // the value here will be the service name
36     return mapperResponse.cbegin()->first;
37 }
38 
39 // Get all properties
40 const PropertyMap DBusHandler::getAllProperties(
41     const std::string& objectPath, const std::string& interface) const
42 {
43     PropertyMap properties;
44 
45     auto& bus = DBusHandler::getBus();
46     auto service = getService(objectPath, interface);
47     if (service.empty())
48     {
49         return properties;
50     }
51 
52     auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
53                                       proIntf, "GetAll");
54     method.append(interface);
55 
56     auto reply = bus.call(method);
57     reply.read(properties);
58 
59     return properties;
60 }
61 
62 // Get the property name
63 const PropertyValue DBusHandler::getProperty(
64     const std::string& objectPath, const std::string& interface,
65     const std::string& propertyName) const
66 {
67     PropertyValue value{};
68 
69     auto& bus = DBusHandler::getBus();
70     auto service = getService(objectPath, interface);
71     if (service.empty())
72     {
73         return value;
74     }
75 
76     auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
77                                       proIntf, "Get");
78     method.append(interface, propertyName);
79 
80     auto reply = bus.call(method);
81     reply.read(value);
82 
83     return value;
84 }
85 
86 // Set property
87 void DBusHandler::setProperty(
88     const std::string& objectPath, const std::string& interface,
89     const std::string& propertyName, const PropertyValue& value) const
90 {
91     auto& bus = DBusHandler::getBus();
92     auto service = getService(objectPath, interface);
93     if (service.empty())
94     {
95         return;
96     }
97 
98     auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
99                                       proIntf, "Set");
100     method.append(interface.c_str(), propertyName.c_str(), value);
101 
102     bus.call_noreply(method);
103 }
104 
105 const std::vector<std::string> DBusHandler::getSubTreePaths(
106     const std::string& objectPath, const std::string& interface)
107 {
108     std::vector<std::string> paths;
109 
110     auto& bus = DBusHandler::getBus();
111 
112     auto method = bus.new_method_call(mapperBusName, mapperObjPath, mapperIntf,
113                                       "GetSubTreePaths");
114     method.append(objectPath.c_str());
115     method.append(0); // Depth 0 to search all
116     method.append(std::vector<std::string>({interface.c_str()}));
117     auto reply = bus.call(method);
118 
119     reply.read(paths);
120 
121     return paths;
122 }
123 
124 } // namespace utils
125 } // namespace led
126 } // namespace phosphor
127