fw-update: Implement firmware UpdateManager

The UpdateManager parses the PLDM package and co-ordinates with
the DeviceUpdater to update all the PLDM enabled firmware devices.

Tested: Completed firmware update using PLDM for an FD

Signed-off-by: Tom Joseph <rushtotom@gmail.com>
Change-Id: Ia87675e0a88cb1f72ad82934e539739db193b9f6
diff --git a/fw-update/activation.hpp b/fw-update/activation.hpp
new file mode 100644
index 0000000..ed216d8
--- /dev/null
+++ b/fw-update/activation.hpp
@@ -0,0 +1,150 @@
+#pragma once
+
+#include "fw-update/update_manager.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <xyz/openbmc_project/Object/Delete/server.hpp>
+#include <xyz/openbmc_project/Software/Activation/server.hpp>
+#include <xyz/openbmc_project/Software/ActivationProgress/server.hpp>
+
+#include <string>
+
+namespace pldm
+{
+
+namespace fw_update
+{
+
+using ActivationIntf = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::Activation>;
+using ActivationProgressIntf = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
+using DeleteIntf = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Object::server::Delete>;
+
+/** @class ActivationProgress
+ *
+ *  Concrete implementation of xyz.openbmc_project.Software.ActivationProgress
+ *  D-Bus interface
+ */
+class ActivationProgress : public ActivationProgressIntf
+{
+  public:
+    /** @brief Constructor
+     *
+     * @param[in] bus - Bus to attach to
+     * @param[in] objPath - D-Bus object path
+     */
+    ActivationProgress(sdbusplus::bus::bus& bus, const std::string& objPath) :
+        ActivationProgressIntf(bus, objPath.c_str(),
+                               action::emit_interface_added)
+    {
+        progress(0);
+    }
+};
+
+/** @class Delete
+ *
+ *  Concrete implementation of xyz.openbmc_project.Object.Delete D-Bus interface
+ */
+class Delete : public DeleteIntf
+{
+  public:
+    /** @brief Constructor
+     *
+     *  @param[in] bus - Bus to attach to
+     *  @param[in] objPath - D-Bus object path
+     *  @param[in] updateManager - Reference to FW update manager
+     */
+    Delete(sdbusplus::bus::bus& bus, const std::string& objPath,
+           UpdateManager* updateManager) :
+        DeleteIntf(bus, objPath.c_str(), action::emit_interface_added),
+        updateManager(updateManager)
+    {}
+
+    /** @brief Delete the Activation D-Bus object for the FW update package */
+    void delete_() override
+    {
+        updateManager->clearActivationInfo();
+    }
+
+  private:
+    UpdateManager* updateManager;
+};
+
+/** @class Activation
+ *
+ *  Concrete implementation of xyz.openbmc_project.Object.Activation D-Bus
+ *  interface
+ */
+class Activation : public ActivationIntf
+{
+  public:
+    /** @brief Constructor
+     *
+     *  @param[in] bus - Bus to attach to
+     *  @param[in] objPath - D-Bus object path
+     *  @param[in] updateManager - Reference to FW update manager
+     */
+    Activation(sdbusplus::bus::bus& bus, std::string objPath,
+               Activations activationStatus, UpdateManager* updateManager) :
+        ActivationIntf(bus, objPath.c_str(), true),
+        bus(bus), objPath(objPath), updateManager(updateManager)
+    {
+        activation(activationStatus);
+        deleteImpl = std::make_unique<Delete>(bus, objPath, updateManager);
+        emit_object_added();
+    }
+
+    using sdbusplus::xyz::openbmc_project::Software::server::Activation::
+        activation;
+    using sdbusplus::xyz::openbmc_project::Software::server::Activation::
+        requestedActivation;
+
+    /** @brief Overriding Activation property setter function
+     */
+    Activations activation(Activations value) override
+    {
+        if (value == Activations::Activating)
+        {
+            deleteImpl.reset();
+            updateManager->activatePackage();
+        }
+        else if (value == Activations::Active || value == Activations::Failed)
+        {
+            if (!deleteImpl)
+            {
+                deleteImpl =
+                    std::make_unique<Delete>(bus, objPath, updateManager);
+            }
+        }
+
+        return ActivationIntf::activation(value);
+    }
+
+    /** @brief Overriding RequestedActivations property setter function
+     */
+    RequestedActivations
+        requestedActivation(RequestedActivations value) override
+    {
+        if ((value == RequestedActivations::Active) &&
+            (requestedActivation() != RequestedActivations::Active))
+        {
+            if ((ActivationIntf::activation() == Activations::Ready))
+            {
+                activation(Activations::Activating);
+            }
+        }
+        return ActivationIntf::requestedActivation(value);
+    }
+
+  private:
+    sdbusplus::bus::bus& bus;
+    const std::string objPath;
+    UpdateManager* updateManager;
+    std::unique_ptr<Delete> deleteImpl;
+};
+
+} // namespace fw_update
+
+} // namespace pldm