Add time Manager to handle property changes callback

1. Implement time::Manager who registers property change signal for time
mode and owner;
2. Add PropertyChangeListner interface to handle the callback;
3. Make EpochBase to implement the interface.

Change-Id: I185580ae37353e1ed82a47e4905fb22e269ac09d
Signed-off-by: Lei YU <mine260309@gmail.com>
diff --git a/epoch_base.hpp b/epoch_base.hpp
index fc505d0..f31a32b 100644
--- a/epoch_base.hpp
+++ b/epoch_base.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "property_change_listener.hpp"
+
 #include <sdbusplus/bus.hpp>
 #include <xyz/openbmc_project/Time/EpochTime/server.hpp>
 
@@ -16,64 +18,30 @@
  *  DBus API for epoch time.
  */
 class EpochBase : public sdbusplus::server::object::object <
-    sdbusplus::xyz::openbmc_project::Time::server::EpochTime >
+    sdbusplus::xyz::openbmc_project::Time::server::EpochTime >,
+    public PropertyChangeListner
 {
     public:
         friend class TestEpochBase;
 
-        /** @brief Supported time modes
-         *  NTP     Time sourced by Network Time Server
-         *  MANUAL  User of the system need to set the time
-         */
-        enum class Mode
-        {
-            NTP,
-            MANUAL,
-        };
-
-        /** @brief Supported time owners
-         *  BMC     Time source may be NTP or MANUAL but it has to be set natively
-         *          on the BMC. Meaning, host can not set the time. What it also
-         *          means is that when BMC gets IPMI_SET_SEL_TIME, then its ignored.
-         *          similarly, when BMC gets IPMI_GET_SEL_TIME, then the BMC's time
-         *          is returned.
-         *
-         *  HOST    Its only IPMI_SEL_SEL_TIME that will set the time on BMC.
-         *          Meaning, IPMI_GET_SEL_TIME and request to get BMC time will
-         *          result in same value.
-         *
-         *  SPLIT   Both BMC and HOST will maintain their individual clocks but then
-         *          the time information is stored in BMC. BMC can have either NTP
-         *          or MANUAL as it's source of time and will set the time directly
-         *          on the BMC. When IPMI_SET_SEL_TIME is received, then the delta
-         *          between that and BMC's time is calculated and is stored.
-         *          When BMC reads the time, the current time is returned.
-         *          When IPMI_GET_SEL_TIME is received, BMC's time is retrieved and
-         *          then the delta offset is factored in prior to returning.
-         *
-         *  BOTH:   BMC's time is set with whoever that sets the time. Similarly,
-         *          BMC's time is returned to whoever that asks the time.
-         */
-        enum class Owner
-        {
-            BMC,
-            HOST,
-            SPLIT,
-            BOTH,
-        };
-
         EpochBase(sdbusplus::bus::bus& bus,
                   const char* objPath);
 
+        /** @brief Notified on time mode changed */
+        void onModeChanged(Mode mode) override;
+
+        /** @brief Notified on time owner changed */
+        void onOwnerChanged(Owner owner) override;
+
     protected:
         /** @brief Persistent sdbusplus DBus connection */
         sdbusplus::bus::bus& bus;
 
         /** @brief The current time mode */
-        Mode timeMode;
+        Mode timeMode = Mode::NTP;
 
         /** @brief The current time owner */
-        Owner timeOwner;
+        Owner timeOwner = Owner::BMC;
 
         /** @brief Set current time to system
          *
@@ -89,57 +57,6 @@
          * @return Microseconds since UTC
          */
         std::chrono::microseconds getTime() const;
-
-        /** @brief Convert a string to enum Mode
-         *
-         * Convert the time mode string to enum.
-         * Valid strings are "NTP", "MANUAL"
-         * If it's not a valid time mode string, return NTP.
-         *
-         * @param[in] mode - The string of time mode
-         *
-         * @return The Mode enum
-         */
-        static Mode convertToMode(const std::string& mode);
-
-        /** @brief Convert a string to enum Owner
-         *
-         * Convert the time owner string to enum.
-         * Valid strings are "BMC", "HOST", "SPLIT", "BOTH"
-         * If it's not a valid time owner string, return BMC.
-         *
-         * @param[in] owner - The string of time owner
-         *
-         * @return The Owner enum
-         */
-        static Owner convertToOwner(const std::string& owner);
-
-    private:
-        /** @brief Initialize the time mode and owner */
-        void initialize();
-
-        /** @brief Set current time mode
-         *
-         * @param[in] mode - The string of time mode
-         */
-        void setCurrentTimeMode(const std::string& mode);
-
-        /** @brief Set current time owner
-         *
-         * @param[in] owner - The string of time owner
-         */
-        void setCurrentTimeOwner(const std::string& owner);
-
-        /** @brief Get setting value from settings manager
-         *
-         * @param[in] setting - The string of the setting to get
-         *
-         * @return The value of the setting
-         */
-        std::string getSettings(const char* setting) const;
-
-        /** @brief The map maps the string key to enum Owner */
-        static const std::map<std::string, Owner> ownerMap;
 };
 
 } // namespace time