blob: d4580c9b2d6b4d12fc5148fd8383640a13ed8062 [file] [log] [blame]
Deepak Kodihalli867f7aa2017-02-27 00:22:50 -06001#include <algorithm>
2#include <sdbusplus/server.hpp>
3#include <sdbusplus/exception.hpp>
4#include <org/openbmc/Associations/server.hpp>
5
6namespace sdbusplus
7{
8namespace org
9{
10namespace openbmc
11{
12namespace server
13{
14
15Associations::Associations(bus::bus& bus, const char* path)
16 : _org_openbmc_Associations_interface(
17 bus, path, _interface, _vtable, this)
18{
19}
20
21Associations::Associations(bus::bus& bus, const char* path,
22 const std::map<std::string, PropertiesVariant>& vals)
23 : Associations(bus, path)
24{
25 for (const auto& v : vals)
26 {
27 setPropertyByName(v.first, v.second);
28 }
29}
30
31
32
33auto Associations::associations() const ->
34 std::vector<std::tuple<std::string, std::string, std::string>>
35{
36 return _associations;
37}
38
39int Associations::_callback_get_associations(
40 sd_bus* bus, const char* path, const char* interface,
41 const char* property, sd_bus_message* reply, void* context,
42 sd_bus_error* error)
43{
44 using sdbusplus::server::binding::details::convertForMessage;
45
46 try
47 {
48 auto m = message::message(reply);
49#ifndef DISABLE_TRANSACTION
50 {
51 auto tbus = m.get_bus();
52 sdbusplus::server::transaction::Transaction t(tbus, m);
53 sdbusplus::server::transaction::set_id
54 (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
55 }
56#endif
57
58 auto o = static_cast<Associations*>(context);
59 m.append(convertForMessage(o->associations()));
60 }
61 catch(sdbusplus::internal_exception_t& e)
62 {
63 sd_bus_error_set_const(error, e.name(), e.description());
64 return -EINVAL;
65 }
66
67 return true;
68}
69
70auto Associations::associations(std::vector<std::tuple<std::string, std::string, std::string>> value) ->
71 std::vector<std::tuple<std::string, std::string, std::string>>
72{
73 if (_associations != value)
74 {
75 _associations = value;
76 _org_openbmc_Associations_interface.property_changed("associations");
77 }
78
79 return _associations;
80}
81
82int Associations::_callback_set_associations(
83 sd_bus* bus, const char* path, const char* interface,
84 const char* property, sd_bus_message* value, void* context,
85 sd_bus_error* error)
86{
87 try
88 {
89 auto m = message::message(value);
90#ifndef DISABLE_TRANSACTION
91 {
92 auto tbus = m.get_bus();
93 sdbusplus::server::transaction::Transaction t(tbus, m);
94 sdbusplus::server::transaction::set_id
95 (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
96 }
97#endif
98
99 auto o = static_cast<Associations*>(context);
100
101 std::vector<std::tuple<std::string, std::string, std::string>> v{};
102 m.read(v);
103 o->associations(v);
104 }
105 catch(sdbusplus::internal_exception_t& e)
106 {
107 sd_bus_error_set_const(error, e.name(), e.description());
108 return -EINVAL;
109 }
110
111 return true;
112}
113
114namespace details
115{
116namespace Associations
117{
118static const auto _property_associations =
119 utility::tuple_to_array(message::types::type_id<
120 std::vector<std::tuple<std::string, std::string, std::string>>>());
121}
122}
123
124void Associations::setPropertyByName(const std::string& name,
125 const PropertiesVariant& val)
126{
127 if (name == "associations")
128 {
129 auto& v = message::variant_ns::get<std::vector<std::tuple<std::string, std::string, std::string>>>(val);
130 associations(v);
131 return;
132 }
133}
134
135auto Associations::getPropertyByName(const std::string& name) ->
136 PropertiesVariant
137{
138 if (name == "associations")
139 {
140 return associations();
141 }
142
143 return PropertiesVariant();
144}
145
146
147const vtable::vtable_t Associations::_vtable[] = {
148 vtable::start(),
149 vtable::property("associations",
150 details::Associations::_property_associations
151 .data(),
152 _callback_get_associations,
153 _callback_set_associations,
154 vtable::property_::emits_change),
155 vtable::end()
156};
157
158} // namespace server
159} // namespace openbmc
160} // namespace org
161} // namespace sdbusplus
162