#pragma once #include "config.h" #include "property_change_listener.hpp" #include "settings.hpp" #include "types.hpp" #include #include #include namespace phosphor { namespace time { /** @class Manager * @brief The manager to handle OpenBMC time. * @details It registers various time related settings and properties signals * on DBus and handle the changes. * For certain properties it also notifies the changed events to listeners. */ class Manager { public: friend class TestManager; explicit Manager(sdbusplus::bus::bus& bus); Manager(const Manager&) = delete; Manager& operator=(const Manager&) = delete; Manager(Manager&&) = delete; Manager& operator=(Manager&&) = delete; ~Manager() = default; private: /** @brief Persistent sdbusplus DBus connection */ sdbusplus::bus::bus& bus; /** @brief The match of settings property change */ std::vector settingsMatches; /** @brief Settings objects of intereset */ settings::Objects settings; /** @brief The current time mode */ Mode timeMode = DEFAULT_TIME_MODE; /** @brief Get setting from settingsd service * * @param[in] path - The dbus object path * @param[in] interface - The dbus interface * @param[in] setting - The string of the setting * * @return The setting value in string */ std::string getSetting(const char* path, const char* interface, const char* setting) const; /** @brief Set current time mode from the time mode string * * @param[in] mode - The string of time mode * * @return - true if the mode is updated * false if it's the same as before */ bool setCurrentTimeMode(const std::string& mode); /** @brief Called on time mode is changed * * Notify listeners that time mode is changed and update ntp setting * * @param[in] mode - The string of time mode */ void onTimeModeChanged(const std::string& mode); /** @brief Callback to handle change in a setting * * @param[in] msg - sdbusplus dbusmessage * * @return 0 on success, < 0 on failure. */ int onSettingsChanged(sdbusplus::message::message& msg); /** @brief Notified on settings property changed * * @param[in] key - The name of property that is changed * @param[in] value - The value of the property */ void onPropertyChanged(const std::string& key, const std::string& value); /** @brief Update the NTP setting to systemd time service * * @param[in] value - The time mode value, e.g. "NTP" or "MANUAL" */ void updateNtpSetting(const std::string& value); /** @brief The static function called on settings property changed * * @param[in] msg - Data associated with subscribed signal * @param[in] userData - Pointer to this object instance * @param[out] retError - Not used but required with signal API */ static int onPropertyChanged(sd_bus_message* msg, void* userData, sd_bus_error* retError); /** @brief The string of time mode property */ static constexpr auto PROPERTY_TIME_MODE = "TimeSyncMethod"; }; } // namespace time } // namespace phosphor