190bfaea4SRatan Gupta #pragma once
290bfaea4SRatan Gupta 
390bfaea4SRatan Gupta #include "callback.hpp"
43e84ec66SRatan Gupta #include "event_manager.hpp"
53e84ec66SRatan Gupta 
63e84ec66SRatan Gupta #include <sstream>
7ae4c95c6SAndrew Geissler #include <string>
890bfaea4SRatan Gupta 
990bfaea4SRatan Gupta namespace phosphor
1090bfaea4SRatan Gupta {
1190bfaea4SRatan Gupta namespace dbus
1290bfaea4SRatan Gupta {
1390bfaea4SRatan Gupta namespace monitoring
1490bfaea4SRatan Gupta {
1590bfaea4SRatan Gupta 
1690bfaea4SRatan Gupta /** @class EventBase
1790bfaea4SRatan Gupta  *  @brief Event callback implementation.
1890bfaea4SRatan Gupta  *
1990bfaea4SRatan Gupta  *  The event callback creates the event dbus object
2090bfaea4SRatan Gupta  *  which has event message and metadata as key value pairs
2190bfaea4SRatan Gupta  *  as specified by the client supplied property index.
2290bfaea4SRatan Gupta  */
2390bfaea4SRatan Gupta class EventBase : public IndexedCallback
2490bfaea4SRatan Gupta {
2590bfaea4SRatan Gupta   public:
2690bfaea4SRatan Gupta     EventBase() = delete;
2790bfaea4SRatan Gupta     EventBase(const EventBase&) = delete;
2890bfaea4SRatan Gupta     EventBase(EventBase&&) = default;
2990bfaea4SRatan Gupta     EventBase& operator=(const EventBase&) = delete;
3090bfaea4SRatan Gupta     EventBase& operator=(EventBase&&) = default;
3190bfaea4SRatan Gupta     virtual ~EventBase() = default;
EventBase(const PropertyIndex & index)32*c5fe26a6SPatrick Williams     EventBase(const PropertyIndex& index) : IndexedCallback(index) {}
3390bfaea4SRatan Gupta 
3490bfaea4SRatan Gupta     /** @brief Callback interface implementation. */
operator ()(Context ctx)35a45e086dSRatan Gupta     void operator()(Context ctx) override
3690bfaea4SRatan Gupta     {
37ef69ac02SRatan Gupta         if (ctx == Context::START)
38ef69ac02SRatan Gupta         {
39ef69ac02SRatan Gupta             // No action should be taken
40ef69ac02SRatan Gupta             // as this call back is being called from
41ef69ac02SRatan Gupta             // daemon Startup.
42ef69ac02SRatan Gupta             return;
43ef69ac02SRatan Gupta         }
44ef69ac02SRatan Gupta 
4590bfaea4SRatan Gupta         for (const auto& n : index)
4690bfaea4SRatan Gupta         {
4790bfaea4SRatan Gupta             const auto& path = std::get<pathIndex>(n.first);
481abcb06bSMatt Spinler             const auto& propertyMeta = std::get<propertyIndex>(n.first);
49abe43ab4SMatt Spinler             const auto& storage = std::get<storageIndex>(n.second);
50abe43ab4SMatt Spinler             const auto& value = std::get<valueIndex>(storage.get());
5190bfaea4SRatan Gupta 
5226dc0bcbSPatrick Williams             if (value.has_value())
5390bfaea4SRatan Gupta             {
54d1eac88dSBrad Bishop                 createEvent(path, propertyMeta, value);
5590bfaea4SRatan Gupta             }
5690bfaea4SRatan Gupta         }
5790bfaea4SRatan Gupta     }
5890bfaea4SRatan Gupta 
5990bfaea4SRatan Gupta   private:
6090bfaea4SRatan Gupta     /** @brief Create the event Dbus Object.
6190bfaea4SRatan Gupta      *  @param[in] path - Dbus Object Path for which the
6290bfaea4SRatan Gupta      *                    property has changed.
6390bfaea4SRatan Gupta      *  @param[in] property - Name of the property whose value
6490bfaea4SRatan Gupta      *                        has been changed.
6590bfaea4SRatan Gupta      *  @param[in] value - Changed property value.
6690bfaea4SRatan Gupta      */
67d1eac88dSBrad Bishop     virtual void createEvent(const std::string& path,
6890bfaea4SRatan Gupta                              const std::string& property,
6926dc0bcbSPatrick Williams                              const std::any& value) const = 0;
7090bfaea4SRatan Gupta };
7190bfaea4SRatan Gupta 
7290bfaea4SRatan Gupta /** @class Event
7390bfaea4SRatan Gupta  *  @brief C++ type specific logic for the event callback.
7490bfaea4SRatan Gupta  *
7590bfaea4SRatan Gupta  *  @tparam T - The C++ type of the property values being traced.
7690bfaea4SRatan Gupta  */
773d6d3182SPatrick Venture template <typename T>
783d6d3182SPatrick Venture class Event : public EventBase
7990bfaea4SRatan Gupta {
8090bfaea4SRatan Gupta   public:
8190bfaea4SRatan Gupta     Event() = delete;
8290bfaea4SRatan Gupta     Event(const Event&) = delete;
8390bfaea4SRatan Gupta     Event(Event&&) = default;
8490bfaea4SRatan Gupta     Event& operator=(const Event&) = delete;
8590bfaea4SRatan Gupta     Event& operator=(Event&&) = default;
8690bfaea4SRatan Gupta     ~Event() = default;
8790bfaea4SRatan Gupta 
8890bfaea4SRatan Gupta     /** @brief Constructor.
8990bfaea4SRatan Gupta      *  @param[in] eventName - Name of the event.
9090bfaea4SRatan Gupta      *  @param[in] eventMessage- Event Message.
9190bfaea4SRatan Gupta      *  @param[in] index - look up index for the properties.
9290bfaea4SRatan Gupta      */
Event(const std::string & eventName,const std::string & eventMessage,const PropertyIndex & index)930b45a3ceSPatrick Venture     Event(const std::string& eventName, const std::string& eventMessage,
9490bfaea4SRatan Gupta           const PropertyIndex& index) :
9590bfaea4SRatan Gupta         EventBase(index),
96d1eac88dSBrad Bishop         name(eventName), message(eventMessage)
973fe976ccSGeorge Liu     {}
9890bfaea4SRatan Gupta 
9990bfaea4SRatan Gupta   private:
10090bfaea4SRatan Gupta     /** @brief Create the event Dbus Object.
10190bfaea4SRatan Gupta      *  @param[in] path - Dbus Object Path for which the
10290bfaea4SRatan Gupta      *                    property has changed.
10390bfaea4SRatan Gupta      *  @param[in] property - Name of the property whose value
10490bfaea4SRatan Gupta      *                        has been changed.
10590bfaea4SRatan Gupta      *  @param[in] value - Changed property value.
10690bfaea4SRatan Gupta      */
createEvent(const std::string & path,const std::string & property,const std::any & value) const107d1eac88dSBrad Bishop     void createEvent(const std::string& path, const std::string& property,
10826dc0bcbSPatrick Williams                      const std::any& value) const override
1093e84ec66SRatan Gupta     {
1103e84ec66SRatan Gupta         std::stringstream ss{};
11126dc0bcbSPatrick Williams         ss << std::any_cast<T>(value);
112d1eac88dSBrad Bishop         phosphor::events::getManager().create(name, message, path, property,
113d1eac88dSBrad Bishop                                               ss.str());
1143e84ec66SRatan Gupta     }
11590bfaea4SRatan Gupta 
11690bfaea4SRatan Gupta     /** @brief Event Name */
11790bfaea4SRatan Gupta     std::string name;
11890bfaea4SRatan Gupta 
11990bfaea4SRatan Gupta     /** @brief Event Message */
12090bfaea4SRatan Gupta     std::string message;
12190bfaea4SRatan Gupta };
12290bfaea4SRatan Gupta 
12390bfaea4SRatan Gupta } // namespace monitoring
12490bfaea4SRatan Gupta } // namespace dbus
12590bfaea4SRatan Gupta } // namespace phosphor
126