190bfaea4SRatan Gupta #pragma once
290bfaea4SRatan Gupta 
390bfaea4SRatan Gupta #include <phosphor-logging/log.hpp>
490bfaea4SRatan Gupta #include "callback.hpp"
590bfaea4SRatan Gupta 
690bfaea4SRatan Gupta namespace phosphor
790bfaea4SRatan Gupta {
890bfaea4SRatan Gupta namespace dbus
990bfaea4SRatan Gupta {
1090bfaea4SRatan Gupta namespace monitoring
1190bfaea4SRatan Gupta {
1290bfaea4SRatan Gupta 
1390bfaea4SRatan Gupta /** @class EventBase
1490bfaea4SRatan Gupta  *  @brief Event callback implementation.
1590bfaea4SRatan Gupta  *
1690bfaea4SRatan Gupta  *  The event callback creates the event dbus object
1790bfaea4SRatan Gupta  *  which has event message and metadata as key value pairs
1890bfaea4SRatan Gupta  *  as specified by the client supplied property index.
1990bfaea4SRatan Gupta  */
2090bfaea4SRatan Gupta class EventBase : public IndexedCallback
2190bfaea4SRatan Gupta {
2290bfaea4SRatan Gupta     public:
2390bfaea4SRatan Gupta         EventBase() = delete;
2490bfaea4SRatan Gupta         EventBase(const EventBase&) = delete;
2590bfaea4SRatan Gupta         EventBase(EventBase&&) = default;
2690bfaea4SRatan Gupta         EventBase& operator=(const EventBase&) = delete;
2790bfaea4SRatan Gupta         EventBase& operator=(EventBase&&) = default;
2890bfaea4SRatan Gupta         virtual ~EventBase() = default;
2990bfaea4SRatan Gupta         EventBase(const PropertyIndex& index) :
3090bfaea4SRatan Gupta             IndexedCallback(index) {}
3190bfaea4SRatan Gupta 
3290bfaea4SRatan Gupta         /** @brief Callback interface implementation. */
33*a45e086dSRatan Gupta         void operator()(Context ctx) override
3490bfaea4SRatan Gupta         {
3590bfaea4SRatan Gupta             for (const auto& n : index)
3690bfaea4SRatan Gupta             {
3790bfaea4SRatan Gupta                 const auto& path = std::get<pathIndex>(n.first);
3890bfaea4SRatan Gupta                 const auto& propertyMeta = std::get<metaIndex>(n.first);
3990bfaea4SRatan Gupta                 const auto& value = std::get<valueIndex>(n.second);
4090bfaea4SRatan Gupta 
4190bfaea4SRatan Gupta                 if (!value.get().empty())
4290bfaea4SRatan Gupta                 {
4390bfaea4SRatan Gupta                     createEvent(
4490bfaea4SRatan Gupta                             path,
4590bfaea4SRatan Gupta                             propertyMeta,
4690bfaea4SRatan Gupta                             value);
4790bfaea4SRatan Gupta                 }
4890bfaea4SRatan Gupta             }
4990bfaea4SRatan Gupta 
5090bfaea4SRatan Gupta         }
5190bfaea4SRatan Gupta 
5290bfaea4SRatan Gupta     private:
5390bfaea4SRatan Gupta 
5490bfaea4SRatan Gupta         /** @brief Create the event Dbus Object.
5590bfaea4SRatan Gupta          *  @param[in] path - Dbus Object Path for which the
5690bfaea4SRatan Gupta          *                    property has changed.
5790bfaea4SRatan Gupta          *  @param[in] property - Name of the property whose value
5890bfaea4SRatan Gupta          *                        has been changed.
5990bfaea4SRatan Gupta          *  @param[in] value - Changed property value.
6090bfaea4SRatan Gupta          */
6190bfaea4SRatan Gupta         virtual void createEvent(
6290bfaea4SRatan Gupta             const std::string& path,
6390bfaea4SRatan Gupta             const std::string& property,
6490bfaea4SRatan Gupta             const any_ns::any& value) const = 0;
6590bfaea4SRatan Gupta 
6690bfaea4SRatan Gupta 
6790bfaea4SRatan Gupta };
6890bfaea4SRatan Gupta 
6990bfaea4SRatan Gupta /** @class Event
7090bfaea4SRatan Gupta  *  @brief C++ type specific logic for the event callback.
7190bfaea4SRatan Gupta  *
7290bfaea4SRatan Gupta  *  @tparam T - The C++ type of the property values being traced.
7390bfaea4SRatan Gupta  */
7490bfaea4SRatan Gupta template <typename T>
7590bfaea4SRatan Gupta class Event : public EventBase
7690bfaea4SRatan Gupta {
7790bfaea4SRatan Gupta     public:
7890bfaea4SRatan Gupta         Event() = delete;
7990bfaea4SRatan Gupta         Event(const Event&) = delete;
8090bfaea4SRatan Gupta         Event(Event&&) = default;
8190bfaea4SRatan Gupta         Event& operator=(const Event&) = delete;
8290bfaea4SRatan Gupta         Event& operator=(Event&&) = default;
8390bfaea4SRatan Gupta         ~Event() = default;
8490bfaea4SRatan Gupta 
8590bfaea4SRatan Gupta         /** @brief Constructor.
8690bfaea4SRatan Gupta          *  @param[in] eventName - Name of the event.
8790bfaea4SRatan Gupta          *  @param[in] eventMessage- Event Message.
8890bfaea4SRatan Gupta          *  @param[in] index - look up index for the properties.
8990bfaea4SRatan Gupta          */
9090bfaea4SRatan Gupta         Event(std::string eventName,
9190bfaea4SRatan Gupta               std::string eventMessage,
9290bfaea4SRatan Gupta               const PropertyIndex& index) :
9390bfaea4SRatan Gupta             EventBase(index),
9490bfaea4SRatan Gupta             name(eventName),
9590bfaea4SRatan Gupta             message(eventMessage) {}
9690bfaea4SRatan Gupta 
9790bfaea4SRatan Gupta     private:
9890bfaea4SRatan Gupta         /** @brief Create the event Dbus Object.
9990bfaea4SRatan Gupta          *  @param[in] path - Dbus Object Path for which the
10090bfaea4SRatan Gupta          *                    property has changed.
10190bfaea4SRatan Gupta          *  @param[in] property - Name of the property whose value
10290bfaea4SRatan Gupta          *                        has been changed.
10390bfaea4SRatan Gupta          *  @param[in] value - Changed property value.
10490bfaea4SRatan Gupta          */
10590bfaea4SRatan Gupta         void createEvent(
10690bfaea4SRatan Gupta             const std::string& path,
10790bfaea4SRatan Gupta             const std::string& property,
10890bfaea4SRatan Gupta             const any_ns::any& value) const override {}
10990bfaea4SRatan Gupta 
11090bfaea4SRatan Gupta         /** @brief Event Name */
11190bfaea4SRatan Gupta         std::string name;
11290bfaea4SRatan Gupta 
11390bfaea4SRatan Gupta         /** @brief Event Message */
11490bfaea4SRatan Gupta         std::string message;
11590bfaea4SRatan Gupta };
11690bfaea4SRatan Gupta 
11790bfaea4SRatan Gupta } // namespace monitoring
11890bfaea4SRatan Gupta } // namespace dbus
11990bfaea4SRatan Gupta } // namespace phosphor
120