blob: 21c43430e746a21ba492b0be37e16207519bf42e [file] [log] [blame]
Andrew Geisslera90a31a2016-12-13 16:16:28 -06001#include <algorithm>
2#include <sdbusplus/server.hpp>
3#include <sdbusplus/exception.hpp>
4#include <xyz/openbmc_project/State/Chassis/server.hpp>
5
6namespace sdbusplus
7{
8namespace xyz
9{
10namespace openbmc_project
11{
12namespace State
13{
14namespace server
15{
16
17Chassis::Chassis(bus::bus& bus, const char* path)
18 : _xyz_openbmc_project_State_Chassis_interface(
19 bus, path, _interface, _vtable, this)
20{
21}
22
23
24
25auto Chassis::requestedPowerTransition() const ->
26 Transition
27{
28 return _requestedPowerTransition;
29}
30
31int Chassis::_callback_get_RequestedPowerTransition(
32 sd_bus* bus, const char* path, const char* interface,
33 const char* property, sd_bus_message* reply, void* context,
34 sd_bus_error* error)
35{
36 using sdbusplus::server::binding::details::convertForMessage;
37
38 try
39 {
40 auto m = message::message(sd_bus_message_ref(reply));
41
42 auto o = static_cast<Chassis*>(context);
43 m.append(convertForMessage(o->requestedPowerTransition()));
44 }
45 catch(sdbusplus::internal_exception_t& e)
46 {
47 sd_bus_error_set_const(error, e.name(), e.description());
48 return -EINVAL;
49 }
50
51 return true;
52}
53
54auto Chassis::requestedPowerTransition(Transition value) ->
55 Transition
56{
57 if (_requestedPowerTransition != value)
58 {
59 _requestedPowerTransition = value;
60 _xyz_openbmc_project_State_Chassis_interface.property_changed("RequestedPowerTransition");
61 }
62
63 return _requestedPowerTransition;
64}
65
66int Chassis::_callback_set_RequestedPowerTransition(
67 sd_bus* bus, const char* path, const char* interface,
68 const char* property, sd_bus_message* value, void* context,
69 sd_bus_error* error)
70{
71 try
72 {
73 auto m = message::message(sd_bus_message_ref(value));
74
75 auto o = static_cast<Chassis*>(context);
76
77 std::string v{};
78 m.read(v);
79 o->requestedPowerTransition(convertTransitionFromString(v));
80 }
81 catch(sdbusplus::internal_exception_t& e)
82 {
83 sd_bus_error_set_const(error, e.name(), e.description());
84 return -EINVAL;
85 }
86
87 return true;
88}
89
90namespace details
91{
92namespace Chassis
93{
94static const auto _property_RequestedPowerTransition =
95 utility::tuple_to_array(message::types::type_id<
96 std::string>());
97}
98}
99auto Chassis::currentPowerState() const ->
100 PowerState
101{
102 return _currentPowerState;
103}
104
105int Chassis::_callback_get_CurrentPowerState(
106 sd_bus* bus, const char* path, const char* interface,
107 const char* property, sd_bus_message* reply, void* context,
108 sd_bus_error* error)
109{
110 using sdbusplus::server::binding::details::convertForMessage;
111
112 try
113 {
114 auto m = message::message(sd_bus_message_ref(reply));
115
116 auto o = static_cast<Chassis*>(context);
117 m.append(convertForMessage(o->currentPowerState()));
118 }
119 catch(sdbusplus::internal_exception_t& e)
120 {
121 sd_bus_error_set_const(error, e.name(), e.description());
122 return -EINVAL;
123 }
124
125 return true;
126}
127
128auto Chassis::currentPowerState(PowerState value) ->
129 PowerState
130{
131 if (_currentPowerState != value)
132 {
133 _currentPowerState = value;
134 _xyz_openbmc_project_State_Chassis_interface.property_changed("CurrentPowerState");
135 }
136
137 return _currentPowerState;
138}
139
140int Chassis::_callback_set_CurrentPowerState(
141 sd_bus* bus, const char* path, const char* interface,
142 const char* property, sd_bus_message* value, void* context,
143 sd_bus_error* error)
144{
145 try
146 {
147 auto m = message::message(sd_bus_message_ref(value));
148
149 auto o = static_cast<Chassis*>(context);
150
151 std::string v{};
152 m.read(v);
153 o->currentPowerState(convertPowerStateFromString(v));
154 }
155 catch(sdbusplus::internal_exception_t& e)
156 {
157 sd_bus_error_set_const(error, e.name(), e.description());
158 return -EINVAL;
159 }
160
161 return true;
162}
163
164namespace details
165{
166namespace Chassis
167{
168static const auto _property_CurrentPowerState =
169 utility::tuple_to_array(message::types::type_id<
170 std::string>());
171}
172}
173
174
175namespace
176{
177/** String to enum mapping for Chassis::Transition */
178static const std::tuple<const char*, Chassis::Transition> mappingChassisTransition[] =
179 {
180 std::make_tuple( "xyz.openbmc_project.State.Chassis.Transition.Off", Chassis::Transition::Off ),
181 std::make_tuple( "xyz.openbmc_project.State.Chassis.Transition.On", Chassis::Transition::On ),
182 };
183
184} // anonymous namespace
185
186auto Chassis::convertTransitionFromString(std::string& s) ->
187 Transition
188{
189 auto i = std::find_if(
190 std::begin(mappingChassisTransition),
191 std::end(mappingChassisTransition),
192 [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
193 if (std::end(mappingChassisTransition) == i)
194 {
195 throw sdbusplus::exception::InvalidEnumString();
196 }
197 else
198 {
199 return std::get<1>(*i);
200 }
201}
202
203std::string convertForMessage(Chassis::Transition v)
204{
205 auto i = std::find_if(
206 std::begin(mappingChassisTransition),
207 std::end(mappingChassisTransition),
208 [v](auto& e){ return v == std::get<1>(e); });
209 return std::get<0>(*i);
210}
211
212namespace
213{
214/** String to enum mapping for Chassis::PowerState */
215static const std::tuple<const char*, Chassis::PowerState> mappingChassisPowerState[] =
216 {
217 std::make_tuple( "xyz.openbmc_project.State.Chassis.PowerState.Off", Chassis::PowerState::Off ),
218 std::make_tuple( "xyz.openbmc_project.State.Chassis.PowerState.On", Chassis::PowerState::On ),
219 };
220
221} // anonymous namespace
222
223auto Chassis::convertPowerStateFromString(std::string& s) ->
224 PowerState
225{
226 auto i = std::find_if(
227 std::begin(mappingChassisPowerState),
228 std::end(mappingChassisPowerState),
229 [&s](auto& e){ return 0 == strcmp(s.c_str(), std::get<0>(e)); } );
230 if (std::end(mappingChassisPowerState) == i)
231 {
232 throw sdbusplus::exception::InvalidEnumString();
233 }
234 else
235 {
236 return std::get<1>(*i);
237 }
238}
239
240std::string convertForMessage(Chassis::PowerState v)
241{
242 auto i = std::find_if(
243 std::begin(mappingChassisPowerState),
244 std::end(mappingChassisPowerState),
245 [v](auto& e){ return v == std::get<1>(e); });
246 return std::get<0>(*i);
247}
248
249const vtable::vtable_t Chassis::_vtable[] = {
250 vtable::start(),
251 vtable::property("RequestedPowerTransition",
252 details::Chassis::_property_RequestedPowerTransition
253 .data(),
254 _callback_get_RequestedPowerTransition,
255 _callback_set_RequestedPowerTransition,
256 vtable::property_::emits_change),
257 vtable::property("CurrentPowerState",
258 details::Chassis::_property_CurrentPowerState
259 .data(),
260 _callback_get_CurrentPowerState,
261 _callback_set_CurrentPowerState,
262 vtable::property_::emits_change),
263 vtable::end()
264};
265
266} // namespace server
267} // namespace State
268} // namespace openbmc_project
269} // namespace xyz
270} // namespace sdbusplus
271