xref: /openbmc/pldm/fw-update/activation.hpp (revision 5c7253ad)
1 #pragma once
2 
3 #include "fw-update/update_manager.hpp"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <xyz/openbmc_project/Object/Delete/server.hpp>
7 #include <xyz/openbmc_project/Software/Activation/server.hpp>
8 #include <xyz/openbmc_project/Software/ActivationProgress/server.hpp>
9 
10 #include <string>
11 
12 namespace pldm
13 {
14 
15 namespace fw_update
16 {
17 
18 using ActivationIntf = sdbusplus::server::object::object<
19     sdbusplus::xyz::openbmc_project::Software::server::Activation>;
20 using ActivationProgressIntf = sdbusplus::server::object::object<
21     sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
22 using DeleteIntf = sdbusplus::server::object::object<
23     sdbusplus::xyz::openbmc_project::Object::server::Delete>;
24 
25 /** @class ActivationProgress
26  *
27  *  Concrete implementation of xyz.openbmc_project.Software.ActivationProgress
28  *  D-Bus interface
29  */
30 class ActivationProgress : public ActivationProgressIntf
31 {
32   public:
33     /** @brief Constructor
34      *
35      * @param[in] bus - Bus to attach to
36      * @param[in] objPath - D-Bus object path
37      */
38     ActivationProgress(sdbusplus::bus::bus& bus, const std::string& objPath) :
39         ActivationProgressIntf(bus, objPath.c_str(),
40                                action::emit_interface_added)
41     {
42         progress(0);
43     }
44 };
45 
46 /** @class Delete
47  *
48  *  Concrete implementation of xyz.openbmc_project.Object.Delete D-Bus interface
49  */
50 class Delete : public DeleteIntf
51 {
52   public:
53     /** @brief Constructor
54      *
55      *  @param[in] bus - Bus to attach to
56      *  @param[in] objPath - D-Bus object path
57      *  @param[in] updateManager - Reference to FW update manager
58      */
59     Delete(sdbusplus::bus::bus& bus, const std::string& objPath,
60            UpdateManager* updateManager) :
61         DeleteIntf(bus, objPath.c_str(), action::emit_interface_added),
62         updateManager(updateManager)
63     {}
64 
65     /** @brief Delete the Activation D-Bus object for the FW update package */
66     void delete_() override
67     {
68         updateManager->clearActivationInfo();
69     }
70 
71   private:
72     UpdateManager* updateManager;
73 };
74 
75 /** @class Activation
76  *
77  *  Concrete implementation of xyz.openbmc_project.Object.Activation D-Bus
78  *  interface
79  */
80 class Activation : public ActivationIntf
81 {
82   public:
83     /** @brief Constructor
84      *
85      *  @param[in] bus - Bus to attach to
86      *  @param[in] objPath - D-Bus object path
87      *  @param[in] updateManager - Reference to FW update manager
88      */
89     Activation(sdbusplus::bus::bus& bus, std::string objPath,
90                Activations activationStatus, UpdateManager* updateManager) :
91         ActivationIntf(bus, objPath.c_str(), true),
92         bus(bus), objPath(objPath), updateManager(updateManager)
93     {
94         activation(activationStatus);
95         deleteImpl = std::make_unique<Delete>(bus, objPath, updateManager);
96         emit_object_added();
97     }
98 
99     using sdbusplus::xyz::openbmc_project::Software::server::Activation::
100         activation;
101     using sdbusplus::xyz::openbmc_project::Software::server::Activation::
102         requestedActivation;
103 
104     /** @brief Overriding Activation property setter function
105      */
106     Activations activation(Activations value) override
107     {
108         if (value == Activations::Activating)
109         {
110             deleteImpl.reset();
111             updateManager->activatePackage();
112         }
113         else if (value == Activations::Active || value == Activations::Failed)
114         {
115             if (!deleteImpl)
116             {
117                 deleteImpl =
118                     std::make_unique<Delete>(bus, objPath, updateManager);
119             }
120         }
121 
122         return ActivationIntf::activation(value);
123     }
124 
125     /** @brief Overriding RequestedActivations property setter function
126      */
127     RequestedActivations
128         requestedActivation(RequestedActivations value) override
129     {
130         if ((value == RequestedActivations::Active) &&
131             (requestedActivation() != RequestedActivations::Active))
132         {
133             if ((ActivationIntf::activation() == Activations::Ready))
134             {
135                 activation(Activations::Activating);
136             }
137         }
138         return ActivationIntf::requestedActivation(value);
139     }
140 
141   private:
142     sdbusplus::bus::bus& bus;
143     const std::string objPath;
144     UpdateManager* updateManager;
145     std::unique_ptr<Delete> deleteImpl;
146 };
147 
148 } // namespace fw_update
149 
150 } // namespace pldm
151