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