summaryrefslogtreecommitdiffstats
path: root/src/functor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/functor.hpp')
-rw-r--r--src/functor.hpp262
1 files changed, 0 insertions, 262 deletions
diff --git a/src/functor.hpp b/src/functor.hpp
deleted file mode 100644
index 3faf39b..0000000
--- a/src/functor.hpp
+++ /dev/null
@@ -1,262 +0,0 @@
-#pragma once
-
-#include "data_types.hpp"
-
-namespace phosphor
-{
-namespace dbus
-{
-namespace monitoring
-{
-
-class Monitor;
-
-/**
- * @brief Create a condition function object
- *
- * @param[in] condition - The condition being created
- *
- * @return - The created condition function object
- */
-template <typename T>
-auto make_condition(T&& condition)
-{
- return Condition(std::forward<T>(condition));
-}
-
-/**
- * @brief Create an action function object
- *
- * @param[in] action - The action being created
- *
- * @return - The created action function object
- */
-template <typename T>
-auto make_action(T&& action)
-{
- return Action(std::forward<T>(action));
-}
-
-/**
- * @struct Property Changed Condtion
- * @brief A match filter functor to test Dbus property value changed signals
- *
- * @tparam T - The type of the property value
- * @tparam U - The type of the condition
- */
-template <typename T, typename U>
-struct PropertyChangedCondition
-{
- PropertyChangedCondition() = delete;
- ~PropertyChangedCondition() = default;
- PropertyChangedCondition(const PropertyChangedCondition&) = default;
- PropertyChangedCondition& operator=(const PropertyChangedCondition&) =
- default;
- PropertyChangedCondition(PropertyChangedCondition&&) = default;
- PropertyChangedCondition& operator=(PropertyChangedCondition&&) =
- default;
- PropertyChangedCondition(const char* iface, const char* property,
- U&& condition) :
- _iface(iface),
- _property(property),
- _condition(std::forward<U>(condition)) { }
-
- /** @brief Test a property value.
- *
- * Extract the property from the PropertiesChanged
- * message and run the condition test.
- */
- bool operator()(
- sdbusplus::bus::bus&,
- sdbusplus::message::message& msg,
- Monitor&) const
- {
- std::map<std::string, sdbusplus::message::variant<T>> properties;
- const char* iface = nullptr;
-
- msg.read(iface);
- if (!iface || strcmp(iface, _iface))
- {
- return false;
- }
-
- msg.read(properties);
- auto it = properties.find(_property);
- if (it == properties.cend())
- {
- return false;
- }
-
- return _condition(
- std::forward<T>(it->second.template get<T>()));
- }
-
-private:
- const char* _iface;
- const char* _property;
- U _condition;
-};
-
-/**
- * @struct Property Condition Base
- * @brief A match filter functor to test property values
- * @details The base property condition struct that retrieves the property value
- * for a property condition
- */
-struct PropertyConditionBase
-{
- PropertyConditionBase() = delete;
- virtual ~PropertyConditionBase() = default;
- PropertyConditionBase(const PropertyConditionBase&) = default;
- PropertyConditionBase& operator=(const PropertyConditionBase&) = default;
- PropertyConditionBase(PropertyConditionBase&&) = default;
- PropertyConditionBase& operator=(PropertyConditionBase&&) = default;
-
- /** @brief Constructor
- *
- * The service argument can be nullptr. If something
- * else is provided the function will call the the
- * service directly. If omitted, the function will
- * look up the service in the ObjectMapper.
- *
- * @param path - The path of the object containing
- * the property to be tested.
- * @param iface - The interface hosting the property
- * to be tested.
- * @param property - The property to be tested.
- * @param service - The DBus service hosting the object.
- */
- PropertyConditionBase(
- const char* path,
- const char* iface,
- const char* property,
- const char* service) :
- _path(path ? path : std::string()),
- _iface(iface),
- _property(property),
- _service(service) {}
-
- /** @brief Forward comparison to type specific implementation. */
- virtual bool eval(sdbusplus::message::message&) const = 0;
-
- /** @brief Test a property value.
- *
- * Make a DBus call and test the value of any property.
- */
- bool operator()(
- sdbusplus::bus::bus&,
- sdbusplus::message::message&,
- Monitor&) const;
-
-private:
- std::string _path;
- std::string _iface;
- std::string _property;
- const char* _service;
-};
-
-/**
- * @struct Property Condtion
- * @brief A match filter functor to test property values
- *
- * @tparam T - The type of the property value
- * @tparam U - The type of the condition
- */
-template <typename T, typename U>
-struct PropertyCondition final : public PropertyConditionBase
-{
- PropertyCondition() = delete;
- ~PropertyCondition() = default;
- PropertyCondition(const PropertyCondition&) = default;
- PropertyCondition& operator=(const PropertyCondition&) = default;
- PropertyCondition(PropertyCondition&&) = default;
- PropertyCondition& operator=(PropertyCondition&&) = default;
-
- /** @brief Constructor
- *
- * The service argument can be nullptr. If something
- * else is provided the function will call the the
- * service directly. If omitted, the function will
- * look up the service in the ObjectMapper.
- *
- * @param path - The path of the object containing
- * the property to be tested.
- * @param iface - The interface hosting the property
- * to be tested.
- * @param property - The property to be tested.
- * @param condition - The test to run on the property.
- * @param service - The DBus service hosting the object.
- */
- PropertyCondition(
- const char* path,
- const char* iface,
- const char* property,
- U&& condition,
- const char* service) :
- PropertyConditionBase(path, iface, property, service),
- _condition(std::forward<decltype(condition)>(condition)) {}
-
- /** @brief Test a property value.
- *
- * Make a DBus call and test the value of any property.
- */
- bool eval(sdbusplus::message::message& msg) const override
- {
- sdbusplus::message::variant<T> value;
- msg.read(value);
- return _condition(std::forward<T>(value.template get<T>()));
- }
-
-private:
- U _condition;
-};
-
-/**
- * @brief Used to process a Dbus property changed signal event
- *
- * @param[in] iface - Item value interface
- * @param[in] property - Item value property
- * @param[in] condition - Condition function to perform
- *
- * @tparam T - The type of the property
- * @tparam U - The type of the condition
- */
-template <typename T, typename U>
-auto propertySignal(const char* iface,
- const char* property,
- U&& condition)
-{
- return PropertyChangedCondition<T, U>(iface,
- property,
- std::move(condition));
-}
-
-/**
- * @brief Used to process conditions on a start event
- *
- * @param[in] path - Item's Dbus path
- * @param[in] iface - Item value interface
- * @param[in] property - Item value property
- * @param[in] condition - Condition function to perform
- * @param[in] service - Service to lookup Dbus object
- *
- * @tparam T - The type of the property
- * @tparam U - The type of the condition
- */
-template <typename T, typename U>
-auto propertyStart(const char* path,
- const char* iface,
- const char* property,
- U&& condition,
- const char* service = nullptr)
-{
- return PropertyCondition<T, U>(path,
- iface,
- property,
- std::move(condition),
- service);
-}
-
-} // namespace monitoring
-} // namespace dbus
-} // namespace phosphor
OpenPOWER on IntegriCloud