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)32c5fe26a6SPatrick 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) : 95*eab4f8c0SPatrick Williams EventBase(index), name(eventName), message(eventMessage) 963fe976ccSGeorge Liu {} 9790bfaea4SRatan Gupta 9890bfaea4SRatan Gupta private: 9990bfaea4SRatan Gupta /** @brief Create the event Dbus Object. 10090bfaea4SRatan Gupta * @param[in] path - Dbus Object Path for which the 10190bfaea4SRatan Gupta * property has changed. 10290bfaea4SRatan Gupta * @param[in] property - Name of the property whose value 10390bfaea4SRatan Gupta * has been changed. 10490bfaea4SRatan Gupta * @param[in] value - Changed property value. 10590bfaea4SRatan Gupta */ createEvent(const std::string & path,const std::string & property,const std::any & value) const106d1eac88dSBrad Bishop void createEvent(const std::string& path, const std::string& property, 10726dc0bcbSPatrick Williams const std::any& value) const override 1083e84ec66SRatan Gupta { 1093e84ec66SRatan Gupta std::stringstream ss{}; 11026dc0bcbSPatrick Williams ss << std::any_cast<T>(value); 111d1eac88dSBrad Bishop phosphor::events::getManager().create(name, message, path, property, 112d1eac88dSBrad Bishop ss.str()); 1133e84ec66SRatan Gupta } 11490bfaea4SRatan Gupta 11590bfaea4SRatan Gupta /** @brief Event Name */ 11690bfaea4SRatan Gupta std::string name; 11790bfaea4SRatan Gupta 11890bfaea4SRatan Gupta /** @brief Event Message */ 11990bfaea4SRatan Gupta std::string message; 12090bfaea4SRatan Gupta }; 12190bfaea4SRatan Gupta 12290bfaea4SRatan Gupta } // namespace monitoring 12390bfaea4SRatan Gupta } // namespace dbus 12490bfaea4SRatan Gupta } // namespace phosphor 125