diff options
Diffstat (limited to 'include/ipmid/filter.hpp')
-rw-r--r-- | include/ipmid/filter.hpp | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/include/ipmid/filter.hpp b/include/ipmid/filter.hpp index 3cd5d21..950e3c3 100644 --- a/include/ipmid/filter.hpp +++ b/include/ipmid/filter.hpp @@ -17,7 +17,7 @@ #include <algorithm> #include <boost/callable_traits.hpp> #include <cstdint> -#include <ipmid/api.hpp> +#include <ipmid/api-types.hpp> #include <ipmid/message.hpp> #include <memory> #include <tuple> @@ -91,4 +91,45 @@ static inline auto makeFilter(const Filter& filter) return makeFilter(std::forward<Filter>(lFilter)); } +namespace impl +{ + +// IPMI command filter registration implementation +void registerFilter(int prio, ::ipmi::FilterBase::ptr filter); + +} // namespace impl + +/** + * @brief IPMI command filter registration function + * + * This function should be used to register IPMI command filter functions. + * This function just passes the callback to makeFilter, which creates a + * wrapper functor object that ultimately calls the callback. + * + * Filters are called with a ipmi::message::Request shared_ptr on all IPMI + * commands in priority order and each filter has the opportunity to reject the + * command (by returning an IPMI error competion code.) If all the filters + * return success, the actual IPMI command will be executed. Filters can reject + * the command for any reason, based on system state, the context, the command + * payload, etc. + * + * @param prio - priority at which to register; see api.hpp + * @param filter - the callback function that will handle this request + * + * @return bool - success of registering the handler + */ +template <typename Filter> +void registerFilter(int prio, Filter&& filter) +{ + auto f = ipmi::makeFilter(std::forward<Filter>(filter)); + impl::registerFilter(prio, f); +} + +template <typename Filter> +void registerFilter(int prio, const Filter& filter) +{ + auto f = ipmi::makeFilter(filter); + impl::registerFilter(prio, f); +} + } // namespace ipmi |