#pragma once #include #include namespace openpower { namespace pels { using DBusValue = sdbusplus::message::variant; using DBusProperty = std::string; using DBusInterface = std::string; using DBusService = std::string; using DBusPath = std::string; using DBusInterfaceList = std::vector; using DBusPropertyMap = std::map; /** * @class DataInterface * * An abstract interface class for gathering data about the system * for use in PELs. Implemented this way to facilitate mocking. */ class DataInterfaceBase { public: DataInterfaceBase() = default; virtual ~DataInterfaceBase() = default; DataInterfaceBase(const DataInterfaceBase&) = default; DataInterfaceBase& operator=(const DataInterfaceBase&) = default; DataInterfaceBase(DataInterfaceBase&&) = default; DataInterfaceBase& operator=(DataInterfaceBase&&) = default; /** * @brief Pure virtual for returning the MTM * * @return string - The machine Type/Model string */ virtual std::string getMachineTypeModel() const = 0; /** * @brief Pure virtual for returning the machine SN * * @return string - The machine serial number */ virtual std::string getMachineSerialNumber() const = 0; }; /** * @class DataInterface * * Concrete implementation of DataInterfaceBase. */ class DataInterface : public DataInterfaceBase { public: DataInterface() = delete; ~DataInterface() = default; DataInterface(const DataInterface&) = default; DataInterface& operator=(const DataInterface&) = default; DataInterface(DataInterface&&) = default; DataInterface& operator=(DataInterface&&) = default; /** * @brief Constructor * * @param[in] bus - The sdbusplus bus object */ explicit DataInterface(sdbusplus::bus::bus& bus); /** * @brief Returns the machine type/model value * * @return string - The machine Type/Model string */ std::string getMachineTypeModel() const override { return _machineTypeModel; } /** * @brief Returns the machine SN * * @return string - The machine serial number */ std::string getMachineSerialNumber() const override { return _machineSerialNumber; } private: /** * @brief Reads the machine type/model and SN from D-Bus. * * Looks for them on the 'system' inventory object, and also * places a properties changed watch on them to obtain any changes * (or read them for the first time if the inventory isn't ready * when this function runs.) */ void readMTMS(); /** * @brief Finds the D-Bus service name that hosts the * passed in path and interface. * * @param[in] objectPath - The D-Bus object path * @param[in] interface - The D-Bus interface */ DBusService getService(const std::string& objectPath, const std::string& interface); /** * @brief Wrapper for the 'GetAll' properties method call * * @param[in] service - The D-Bus service to call it on * @param[in] objectPath - The D-Bus object path * @param[in] interface - The interface to get the props on * * @return DBusPropertyMap - The property results */ DBusPropertyMap getAllProperties(const std::string& service, const std::string& objectPath, const std::string& interface); /** * @brief The properties changed callback for the Asset iface * on the system inventory object. * * @param[in] msg - The sdbusplus message of the signal */ void sysAssetPropChanged(sdbusplus::message::message& msg); /** * @brief The machine type-model. Always kept up to date */ std::string _machineTypeModel; /** * @brief The machine serial number. Always kept up to date */ std::string _machineSerialNumber; /** * @brief The match object for the system path's properties */ std::unique_ptr _sysInventoryPropMatch; /** * @brief The sdbusplus bus object for making D-Bus calls. */ sdbusplus::bus::bus& _bus; }; } // namespace pels } // namespace openpower