xref: /openbmc/pldm/fw-update/activation.hpp (revision 6da4f91b)
14d8d5770STom Joseph #pragma once
24d8d5770STom Joseph 
34d8d5770STom Joseph #include "fw-update/update_manager.hpp"
44d8d5770STom Joseph 
54d8d5770STom Joseph #include <sdbusplus/bus.hpp>
64d8d5770STom Joseph #include <xyz/openbmc_project/Object/Delete/server.hpp>
74d8d5770STom Joseph #include <xyz/openbmc_project/Software/Activation/server.hpp>
84d8d5770STom Joseph #include <xyz/openbmc_project/Software/ActivationProgress/server.hpp>
94d8d5770STom Joseph 
104d8d5770STom Joseph #include <string>
114d8d5770STom Joseph 
124d8d5770STom Joseph namespace pldm
134d8d5770STom Joseph {
144d8d5770STom Joseph 
154d8d5770STom Joseph namespace fw_update
164d8d5770STom Joseph {
174d8d5770STom Joseph 
1884b790cbSPatrick Williams using ActivationIntf = sdbusplus::server::object_t<
194d8d5770STom Joseph     sdbusplus::xyz::openbmc_project::Software::server::Activation>;
2084b790cbSPatrick Williams using ActivationProgressIntf = sdbusplus::server::object_t<
214d8d5770STom Joseph     sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
2284b790cbSPatrick Williams using DeleteIntf = sdbusplus::server::object_t<
234d8d5770STom Joseph     sdbusplus::xyz::openbmc_project::Object::server::Delete>;
244d8d5770STom Joseph 
254d8d5770STom Joseph /** @class ActivationProgress
264d8d5770STom Joseph  *
274d8d5770STom Joseph  *  Concrete implementation of xyz.openbmc_project.Software.ActivationProgress
284d8d5770STom Joseph  *  D-Bus interface
294d8d5770STom Joseph  */
304d8d5770STom Joseph class ActivationProgress : public ActivationProgressIntf
314d8d5770STom Joseph {
324d8d5770STom Joseph   public:
334d8d5770STom Joseph     /** @brief Constructor
344d8d5770STom Joseph      *
354d8d5770STom Joseph      * @param[in] bus - Bus to attach to
364d8d5770STom Joseph      * @param[in] objPath - D-Bus object path
374d8d5770STom Joseph      */
ActivationProgress(sdbusplus::bus_t & bus,const std::string & objPath)3884b790cbSPatrick Williams     ActivationProgress(sdbusplus::bus_t& bus, const std::string& objPath) :
394d8d5770STom Joseph         ActivationProgressIntf(bus, objPath.c_str(),
404d8d5770STom Joseph                                action::emit_interface_added)
414d8d5770STom Joseph     {
424d8d5770STom Joseph         progress(0);
434d8d5770STom Joseph     }
444d8d5770STom Joseph };
454d8d5770STom Joseph 
464d8d5770STom Joseph /** @class Delete
474d8d5770STom Joseph  *
484d8d5770STom Joseph  *  Concrete implementation of xyz.openbmc_project.Object.Delete D-Bus interface
494d8d5770STom Joseph  */
504d8d5770STom Joseph class Delete : public DeleteIntf
514d8d5770STom Joseph {
524d8d5770STom Joseph   public:
534d8d5770STom Joseph     /** @brief Constructor
544d8d5770STom Joseph      *
554d8d5770STom Joseph      *  @param[in] bus - Bus to attach to
564d8d5770STom Joseph      *  @param[in] objPath - D-Bus object path
574d8d5770STom Joseph      *  @param[in] updateManager - Reference to FW update manager
584d8d5770STom Joseph      */
Delete(sdbusplus::bus_t & bus,const std::string & objPath,UpdateManager * updateManager)5984b790cbSPatrick Williams     Delete(sdbusplus::bus_t& bus, const std::string& objPath,
604d8d5770STom Joseph            UpdateManager* updateManager) :
614d8d5770STom Joseph         DeleteIntf(bus, objPath.c_str(), action::emit_interface_added),
624d8d5770STom Joseph         updateManager(updateManager)
634d8d5770STom Joseph     {}
644d8d5770STom Joseph 
654d8d5770STom Joseph     /** @brief Delete the Activation D-Bus object for the FW update package */
delete_()664d8d5770STom Joseph     void delete_() override
674d8d5770STom Joseph     {
684d8d5770STom Joseph         updateManager->clearActivationInfo();
694d8d5770STom Joseph     }
704d8d5770STom Joseph 
714d8d5770STom Joseph   private:
724d8d5770STom Joseph     UpdateManager* updateManager;
734d8d5770STom Joseph };
744d8d5770STom Joseph 
754d8d5770STom Joseph /** @class Activation
764d8d5770STom Joseph  *
774d8d5770STom Joseph  *  Concrete implementation of xyz.openbmc_project.Object.Activation D-Bus
784d8d5770STom Joseph  *  interface
794d8d5770STom Joseph  */
804d8d5770STom Joseph class Activation : public ActivationIntf
814d8d5770STom Joseph {
824d8d5770STom Joseph   public:
834d8d5770STom Joseph     /** @brief Constructor
844d8d5770STom Joseph      *
854d8d5770STom Joseph      *  @param[in] bus - Bus to attach to
864d8d5770STom Joseph      *  @param[in] objPath - D-Bus object path
874d8d5770STom Joseph      *  @param[in] updateManager - Reference to FW update manager
884d8d5770STom Joseph      */
Activation(sdbusplus::bus_t & bus,std::string objPath,Activations activationStatus,UpdateManager * updateManager)8984b790cbSPatrick Williams     Activation(sdbusplus::bus_t& bus, std::string objPath,
904d8d5770STom Joseph                Activations activationStatus, UpdateManager* updateManager) :
91357b72dcSPatrick Williams         ActivationIntf(bus, objPath.c_str(),
92357b72dcSPatrick Williams                        ActivationIntf::action::defer_emit),
934d8d5770STom Joseph         bus(bus), objPath(objPath), updateManager(updateManager)
944d8d5770STom Joseph     {
954d8d5770STom Joseph         activation(activationStatus);
964d8d5770STom Joseph         deleteImpl = std::make_unique<Delete>(bus, objPath, updateManager);
974d8d5770STom Joseph         emit_object_added();
984d8d5770STom Joseph     }
994d8d5770STom Joseph 
1004d8d5770STom Joseph     using sdbusplus::xyz::openbmc_project::Software::server::Activation::
1014d8d5770STom Joseph         activation;
1024d8d5770STom Joseph     using sdbusplus::xyz::openbmc_project::Software::server::Activation::
1034d8d5770STom Joseph         requestedActivation;
1044d8d5770STom Joseph 
1054d8d5770STom Joseph     /** @brief Overriding Activation property setter function
1064d8d5770STom Joseph      */
activation(Activations value)1074d8d5770STom Joseph     Activations activation(Activations value) override
1084d8d5770STom Joseph     {
1094d8d5770STom Joseph         if (value == Activations::Activating)
1104d8d5770STom Joseph         {
1114d8d5770STom Joseph             deleteImpl.reset();
1124d8d5770STom Joseph             updateManager->activatePackage();
1134d8d5770STom Joseph         }
1144d8d5770STom Joseph         else if (value == Activations::Active || value == Activations::Failed)
1154d8d5770STom Joseph         {
1164d8d5770STom Joseph             if (!deleteImpl)
1174d8d5770STom Joseph             {
118*6da4f91bSPatrick Williams                 deleteImpl = std::make_unique<Delete>(bus, objPath,
119*6da4f91bSPatrick Williams                                                       updateManager);
1204d8d5770STom Joseph             }
1214d8d5770STom Joseph         }
1224d8d5770STom Joseph 
1234d8d5770STom Joseph         return ActivationIntf::activation(value);
1244d8d5770STom Joseph     }
1254d8d5770STom Joseph 
1264d8d5770STom Joseph     /** @brief Overriding RequestedActivations property setter function
1274d8d5770STom Joseph      */
1284d8d5770STom Joseph     RequestedActivations
requestedActivation(RequestedActivations value)1294d8d5770STom Joseph         requestedActivation(RequestedActivations value) override
1304d8d5770STom Joseph     {
1314d8d5770STom Joseph         if ((value == RequestedActivations::Active) &&
1324d8d5770STom Joseph             (requestedActivation() != RequestedActivations::Active))
1334d8d5770STom Joseph         {
1344d8d5770STom Joseph             if ((ActivationIntf::activation() == Activations::Ready))
1354d8d5770STom Joseph             {
1364d8d5770STom Joseph                 activation(Activations::Activating);
1374d8d5770STom Joseph             }
1384d8d5770STom Joseph         }
1394d8d5770STom Joseph         return ActivationIntf::requestedActivation(value);
1404d8d5770STom Joseph     }
1414d8d5770STom Joseph 
1424d8d5770STom Joseph   private:
14384b790cbSPatrick Williams     sdbusplus::bus_t& bus;
1444d8d5770STom Joseph     const std::string objPath;
1454d8d5770STom Joseph     UpdateManager* updateManager;
1464d8d5770STom Joseph     std::unique_ptr<Delete> deleteImpl;
1474d8d5770STom Joseph };
1484d8d5770STom Joseph 
1494d8d5770STom Joseph } // namespace fw_update
1504d8d5770STom Joseph 
1514d8d5770STom Joseph } // namespace pldm
152