forked from carlos-mazieri/openbmc-dbus-populate-tool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
methods_map.cpp
142 lines (118 loc) · 4.7 KB
/
methods_map.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "methods_map.hpp"
#include <boost/asio/io_service.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <map>
#include <unordered_map>
#include <vector>
#include <tuple>
#include <array>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define log_func() std::cout << __func__ << "()" << std::endl
namespace local
{
using MethodMapSupported = std::unordered_map<std::string, int>;
using MethodsMap = std::unordered_map<std::string, MethodMapSupported>;
/**
* These keys here are just examples
*/
const std::string exampleKey = "xyz.openbmc_project.Example"
":/xyz/openbmc_project/Eample"
":xyz.openbmc_project.Example.Server";
const std::string objectMapperKey = "xyz.openbmc_project.ObjectMapper"
":/xyz/openbmc_project/object_mapper"
":xyz.openbmc_project.ObjectMapper";
MethodMapSupported exampleMethods =
{
{"ExampleMethod", 1},
{"GetObject", 1}
};
MethodsMap methodsMap =
{
// uncomment the below line to have a dummy GetObject() method for ObjecMapper
// {objectMapperKey, objectMapperMethods}
{exampleKey, exampleMethods}
};
namespace methods
{
/** Just an example of implementation using xyz.openbmc_project.ObjectMapper service and method GetObject
# busctl introspect xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.ObjectMapper interface - - -
.GetAncestors method sas a{sa{sas}} -
.GetObject method sas a{sas} -
.GetSubTree method sias a{sa{sas}} -
.GetSubTreePaths method sias as -
*/
std::map<std::string, std::vector<std::string>>
MapperGetObject(const std::string& objectPath,
std::vector<std::string>& /*interfaces*/)
{
// suppose there are few services involved in my environment:
// xyz.openbmc_project.GpioDeviceService which object-paths have a pattern
// if that pattern does not match then uses a default service
const std::string& service =
objectPath.find("GpioDeviceItem") != std::string::npos
? "xyz.openbmc_project.GpioDeviceService" \
: "xyz.openbmc_project.MyDefaultService";
std::vector<std::string> services{service};
std::map<std::string, std::vector<std::string>> ret;
ret[service] = services;
return ret;
}
} // namespace methodsMap
bool isMethodSupported(const std::string& service,
const std::string& path,
const std::string& interface,
const std::string& method)
{
constexpr auto colon = ":";
std::string key = service + colon + path + colon + interface;
bool ret = methodsMap.count(key) != 0 ;
if (ret == true)
{
auto& mMap = methodsMap[key];
ret = mMap.count(method) != 0;
}
return ret;
}
bool registerMethod(std::shared_ptr<sdbusplus::asio::dbus_interface> iface,
const std::string& service,
const std::string& path,
const std::string& interface,
const std::string& method)
{
bool ret = isMethodSupported(service, path, interface, method);
if (ret == true)
{
// just examples how to define and register methods
if (method == "GetObject")
{
ret = iface->register_method(method, &methods::MapperGetObject);
std::cout << "iface->register_method(" << method <<") ret="
<< ret << std::endl;
}
else if (method == "ExampleMethod")
{
// register here
}
else
{
std::cerr << "Not able to create the method: "
<< method << std::endl;
}
}
return ret;
}
}