diff options
-rw-r--r-- | control/functor.hpp | 80 | ||||
-rw-r--r-- | control/handlers.hpp | 19 | ||||
-rw-r--r-- | control/matches.hpp | 14 | ||||
-rw-r--r-- | control/zone.hpp | 16 |
4 files changed, 129 insertions, 0 deletions
diff --git a/control/functor.hpp b/control/functor.hpp index 8e85fcb..0a2b955 100644 --- a/control/functor.hpp +++ b/control/functor.hpp @@ -255,6 +255,86 @@ auto objectSignal(const char* path, } /** + * @struct Interface Removed + * @brief A match filter functor for Dbus interface removed signals + * + * @tparam U - The type of the handler + */ +template <typename U> +struct InterfaceRemoved +{ + InterfaceRemoved() = delete; + ~InterfaceRemoved() = default; + InterfaceRemoved(const InterfaceRemoved&) = default; + InterfaceRemoved& operator=(const InterfaceRemoved&) = default; + InterfaceRemoved(InterfaceRemoved&&) = default; + InterfaceRemoved& operator=(InterfaceRemoved&&) = default; + InterfaceRemoved(const char* path, + const char* iface, + U&& handler) : + _path(path), + _iface(iface), + _handler(std::forward<U>(handler)) { } + + /** @brief Run signal handler function + * + * Extract the property from the InterfacesRemoved + * message and run the handler function. + */ + void operator()(sdbusplus::bus::bus&, + sdbusplus::message::message& msg, + Zone& zone) const + { + if (msg) + { + std::vector<std::string> intfs; + sdbusplus::message::object_path op; + + msg.read(op); + if (static_cast<const std::string&>(op) != _path) + { + // Object path does not match this handler's path + return; + } + + msg.read(intfs); + auto itIntf = std::find(intfs.begin(), intfs.end(), _iface); + if (itIntf == intfs.cend()) + { + // Interface not found on this handler's path + return; + } + + _handler(zone); + } + } + +private: + const char* _path; + const char* _iface; + U _handler; +}; + +/** + * @brief Used to process a Dbus interface removed signal event + * + * @param[in] path - Object path + * @param[in] iface - Object interface + * @param[in] handler - Handler function to perform + * + * @tparam U - The type of the handler + */ +template <typename U> +auto objectSignal(const char* path, + const char* iface, + U&& handler) +{ + return InterfaceRemoved<U>(path, + iface, + std::forward<U>(handler)); +} + +/** * @struct Name Owner Changed * @brief A match filter functor for Dbus name owner changed signals * diff --git a/control/handlers.hpp b/control/handlers.hpp index 96cfa2f..ef5d5d8 100644 --- a/control/handlers.hpp +++ b/control/handlers.hpp @@ -49,6 +49,25 @@ auto setService(Group&& group) }; } +/** + * @brief A handler function to remove an interface from an object path + * @details Removes an interface from an object's path which includes removing + * all properties that would be under that interface + * + * @param[in] path - Object's path name + * @param[in] interface - Object's interface name + * + * @return Lambda function + * A lambda function to remove the interface + */ +auto removeInterface(const char* path, const char* interface) +{ + return[=](auto& zone) + { + zone.removeObjIntf(path, interface); + }; +} + } // namespace handler } // namespace control } // namespace fan diff --git a/control/matches.hpp b/control/matches.hpp index 855a749..ccacbc4 100644 --- a/control/matches.hpp +++ b/control/matches.hpp @@ -47,6 +47,20 @@ inline auto interfacesAdded(const std::string& obj) } /** + * @brief A match function that constructs an InterfacesRemoved match string + * @details Constructs an InterfacesRemoved match string with a given object + * path + * + * @param[in] obj - Object's path name + * + * @return - An InterfacesRemoved match string + */ +inline auto interfacesRemoved(const std::string& obj) +{ + return rules::interfacesRemoved(obj); +} + +/** * @brief A match function that constructs a NameOwnerChanged match string * @details Constructs a NameOwnerChanged match string with a given object * path and interface diff --git a/control/zone.hpp b/control/zone.hpp index c047b62..481f12c 100644 --- a/control/zone.hpp +++ b/control/zone.hpp @@ -151,6 +151,22 @@ class Zone }; /** + * @brief Remove an object's interface + * + * @param[in] object - Name of the object with the interface + * @param[in] interface - Interface name to remove + */ + inline void removeObjIntf(const char* object, + const char* interface) + { + auto it = _properties.find(object); + if (it != std::end(_properties)) + { + _properties[object].erase(interface); + } + } + + /** * @brief Remove a service associated to a group * * @param[in] group - Group associated with service |