Implement OCC status interface

Change-Id: I43822cb28bc2d23398fb09352c9876e169c666f7
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/Makefile.am b/Makefile.am
index b68f9a0..a15ea12 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,10 +1,12 @@
 # Build these headers, don't install them
 noinst_HEADERS = \
-	occ_pass_through.hpp
+	occ_pass_through.hpp \
+	occ_status.hpp
 
 sbin_PROGRAMS = openpower-occ-control
 openpower_occ_control_SOURCES = \
 	occ_pass_through.cpp \
+	occ_status.cpp \
 	app.cpp \
 	org/open_power/OCC/PassThrough/error.cpp
 
diff --git a/occ_manager.hpp b/occ_manager.hpp
index 067a6d2..a1b5234 100644
--- a/occ_manager.hpp
+++ b/occ_manager.hpp
@@ -6,6 +6,7 @@
 #include <functional>
 #include <sdbusplus/bus.hpp>
 #include "occ_pass_through.hpp"
+#include "occ_status.hpp"
 #include "config.h"
 
 namespace sdbusRule = sdbusplus::bus::match::rules;
@@ -28,8 +29,8 @@
         Manager& operator=(Manager&&) = default;
         ~Manager() = default;
 
-        /** @brief Ctor - Add OCC pass-through objects on the bus. Create
-         *         OCC objects when corresponding CPU inventory is created.
+        /** @brief Adds OCC pass-through and status objects on the bus
+         *         when corresponding CPU inventory is created.
          *  @param[in] bus - handle to the bus
          */
         Manager(sdbusplus::bus::bus& bus):
@@ -68,11 +69,15 @@
             name.replace(index, std::strlen(CPU_NAME), OCC_NAME);
 
             auto path = fs::path(OCC_CONTROL_ROOT) / name;
-            objects.emplace_back(
+            passThroughObjects.emplace_back(
                 std::make_unique<PassThrough>(
                     bus,
                     path.c_str()));
 
+            statusObjects.emplace_back(
+                std::make_unique<Status>(
+                    bus,
+                    path.c_str()));
             return 0;
         }
 
@@ -81,7 +86,10 @@
         sdbusplus::bus::bus& bus;
 
         /** @brief OCC pass-through objects */
-        std::vector<std::unique_ptr<PassThrough>> objects;
+        std::vector<std::unique_ptr<PassThrough>> passThroughObjects;
+
+        /** @brief OCC Status objects */
+        std::vector<std::unique_ptr<Status>> statusObjects;
 
         /** @brief sbdbusplus match objects */
         std::vector<sdbusplus::bus::match_t> cpuMatches;
diff --git a/occ_status.cpp b/occ_status.cpp
new file mode 100644
index 0000000..a78ea47
--- /dev/null
+++ b/occ_status.cpp
@@ -0,0 +1,14 @@
+#include "occ_status.hpp"
+namespace open_power
+{
+namespace occ
+{
+
+// Handles updates to occActive property
+bool Status::occActive(bool value)
+{
+    return Base::Status::occActive(value);
+}
+
+} // namespace occ
+} // namespace open_power
diff --git a/occ_status.hpp b/occ_status.hpp
new file mode 100644
index 0000000..068f83b
--- /dev/null
+++ b/occ_status.hpp
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+#include <org/open_power/OCC/Status/server.hpp>
+namespace open_power
+{
+namespace occ
+{
+
+namespace Base = sdbusplus::org::open_power::OCC::server;
+using Interface = sdbusplus::server::object::object<Base::Status>;
+
+/** @class Status
+ *  @brief Implementation of OCC Active Status
+ */
+class Status : public Interface
+{
+    public:
+        Status() = delete;
+        ~Status() = default;
+        Status(const Status&) = delete;
+        Status& operator=(const Status&) = delete;
+        Status(Status&&) = default;
+        Status& operator=(Status&&) = default;
+
+        /** @brief Constructs the Status object
+         *
+         *  @param[in] bus  - DBus bus to attach to
+         *  @param[in] path - DBus object path
+         */
+        Status(sdbusplus::bus::bus& bus, const char* path)
+            : Interface(bus, path)
+        {
+            // Nothing to do here
+        }
+
+        /** @brief SET OccActive to True or False
+         *
+         *  @param[in] value - Intended value
+         *
+         *  @return          - Updated value of the property
+         */
+        bool occActive(bool value) override;
+};
+
+} // namespace occ
+} // namespace open_power