blob: 8ccea4af288a554bad6b57cd1bb68ec7dd2339f7 [file] [log] [blame]
#pragma once
#include "config.h"
#include "property_change_listener.hpp"
#include "settings.hpp"
#include "types.hpp"
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <string>
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<sdbusplus::bus::match::match> 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