1 #pragma once
2
3 namespace phosphor
4 {
5 namespace fan
6 {
7 namespace control
8 {
9 namespace handler
10 {
11
12 /**
13 * @brief A handler function to set/update a property on a zone
14 * @details Sets or updates a zone property to the given value using the
15 * provided zone dbus object's set property function
16 *
17 * @param[in] intf - Interface on zone object
18 * @param[in] prop - Property on interface
19 * @param[in] func - Zone set property function pointer
20 * @param[in] value - Value to set property to
21 * @param[in] persist - Persist property value or not
22 *
23 * @return Lambda function
24 * A lambda function to set/update the zone property
25 */
26 template <typename T>
setZoneProperty(const char * intf,const char * prop,T (Zone::* func)(T),T && value,bool persist)27 auto setZoneProperty(const char* intf, const char* prop, T (Zone::*func)(T),
28 T&& value, bool persist)
29 {
30 return [=, value = std::forward<T>(value)](auto& zone) {
31 (zone.*func)(value);
32 if (persist)
33 {
34 zone.setPersisted(intf, prop);
35 }
36 };
37 }
38
39 /**
40 * @brief A handler function to set/update a property
41 * @details Sets or updates a property's value determined by a combination of
42 * an object's path, interface, and property names
43 *
44 * @param[in] path - Object's path name
45 * @param[in] interface - Object's interface name
46 * @param[in] property - Object's property name
47 *
48 * @return Lambda function
49 * A lambda function to set/update the property value
50 */
51 template <typename T>
setProperty()52 auto setProperty()
53 {
54 return [](auto& zone, auto& path, auto& intf, auto& prop, T&& arg) {
55 zone.setPropertyValue(path, intf, prop, std::forward<T>(arg));
56 };
57 }
58
59 /**
60 * @brief A handler function to set/update service name owner state
61 * @details Sets or updates service name owner state used by a group where
62 * a service name without an owner represents the service no longer exists
63 *
64 * @param[in] group - Group associated with a service
65 *
66 * @return Lambda function
67 * A lambda function to set/update the service name owner state
68 */
setService(Group && group)69 inline auto setService(Group&& group)
70 {
71 return [group = std::move(group)](auto& zone, auto& name, bool hasOwner) {
72 // Update service name owner state list of a group
73 zone.setServiceOwner(&group, name, hasOwner);
74 };
75 }
76
77 /**
78 * @brief A handler function to remove an interface from an object path
79 * @details Removes an interface from an object's path which includes removing
80 * all properties that would be under that interface
81 *
82 * @param[in] path - Object's path name
83 * @param[in] interface - Object's interface name
84 *
85 * @return Lambda function
86 * A lambda function to remove the interface
87 */
removeInterface(const char * path,const char * interface)88 inline auto removeInterface(const char* path, const char* interface)
89 {
90 return [=](auto& zone) { zone.removeObjectInterface(path, interface); };
91 }
92
93 } // namespace handler
94 } // namespace control
95 } // namespace fan
96 } // namespace phosphor
97