1 #pragma once
2 
3 #include "config.h"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <xyz/openbmc_project/Object/Delete/server.hpp>
7 #include <xyz/openbmc_project/Software/Version/server.hpp>
8 
9 namespace phosphor
10 {
11 namespace software
12 {
13 namespace updater
14 {
15 
16 using eraseFunc = std::function<void(std::string)>;
17 
18 using VersionInherit = sdbusplus::server::object_t<
19     sdbusplus::xyz::openbmc_project::Software::server::Version>;
20 using DeleteInherit = sdbusplus::server::object_t<
21     sdbusplus::xyz::openbmc_project::Object::server::Delete>;
22 
23 namespace sdbusRule = sdbusplus::bus::match::rules;
24 
25 class Version;
26 
27 /** @class Delete
28  *  @brief OpenBMC Delete implementation.
29  *  @details A concrete implementation for xyz.openbmc_project.Object.Delete
30  *  D-Bus API.
31  */
32 class Delete : public DeleteInherit
33 {
34   public:
35     /** @brief Constructs Delete.
36      *
37      *  @param[in] bus    - The D-Bus bus object
38      *  @param[in] path   - The D-Bus object path
39      *  @param[in] version - The Version object.
40      */
41     Delete(sdbusplus::bus_t& bus, const std::string& path, Version& version) :
42         DeleteInherit(bus, path.c_str(), action::emit_interface_added),
43         version(version)
44     {
45     }
46 
47     /**
48      * @brief Delete the D-Bus object.
49      *        Overrides the default delete function by calling
50      *        Version class erase Method.
51      **/
52     void delete_() override;
53 
54   private:
55     /** @brief The Version Object. */
56     Version& version;
57 };
58 
59 /** @class Version
60  *  @brief OpenBMC version software management implementation.
61  *  @details A concrete implementation for xyz.openbmc_project.Software.Version
62  *  D-Bus API.
63  */
64 class Version : public VersionInherit
65 {
66   public:
67     /** @brief Constructs Version Software Manager.
68      *
69      * @param[in] bus            - The D-Bus bus object
70      * @param[in] objPath        - The D-Bus object path
71      * @param[in] versionId      - The version Id
72      * @param[in] versionString  - The version string
73      * @param[in] versionPurpose - The version purpose
74      * @param[in] callback       - The eraseFunc callback
75      */
76     Version(sdbusplus::bus_t& bus, const std::string& objPath,
77             const std::string& versionId, const std::string& versionString,
78             VersionPurpose versionPurpose, eraseFunc callback) :
79         VersionInherit(bus, (objPath).c_str(),
80                        VersionInherit::action::defer_emit),
81         eraseCallback(callback), bus(bus), objPath(objPath),
82         versionId(versionId), versionStr(versionString)
83     {
84         // Set properties.
85         purpose(versionPurpose);
86         version(versionString);
87 
88         deleteObject = std::make_unique<Delete>(bus, objPath, *this);
89 
90         // Emit deferred signal.
91         emit_object_added();
92     }
93 
94     /**
95      * @brief Return the version id
96      */
97     std::string getVersionId() const
98     {
99         return versionId;
100     }
101 
102     /**
103      * @brief Read the manifest file to get the values of the keys.
104      *
105      * @param[in] filePath - The path to the file which contains the value
106      *                       of keys.
107      * @param[in] keys     - A vector of keys.
108      *
109      * @return The map of keys with filled values.
110      **/
111     static std::map<std::string, std::string>
112         getValues(const std::string& filePath,
113                   const std::vector<std::string>& keys);
114 
115     /**
116      * @brief Read the manifest file to get the value of the key.
117      *
118      * @param[in] filePath - The path to the file which contains the value
119      *                       of keys.
120      * @param[in] key      - The string of the key.
121      *
122      * @return The string of the value.
123      **/
124     static std::string getValue(const std::string& filePath,
125                                 const std::string& key);
126 
127     /** @brief Get information from extVersion
128      *
129      * @param[in] extVersion - The extended version string that contains
130      *                         key/value pairs separated by comma.
131      *
132      * @return The map of key/value pairs
133      */
134     static std::map<std::string, std::string>
135         getExtVersionInfo(const std::string& extVersion);
136 
137     /** @brief The temUpdater's erase callback. */
138     eraseFunc eraseCallback;
139 
140     /** @brief Get the version string. */
141     const std::string& getVersionString() const
142     {
143         return versionStr;
144     }
145 
146   private:
147     /** @brief Persistent sdbusplus DBus bus connection */
148     sdbusplus::bus_t& bus;
149 
150     /** @brief Persistent DBus object path */
151     std::string objPath;
152 
153     /** @brief This Version's version Id */
154     const std::string versionId;
155 
156     /** @brief This Version's version string */
157     const std::string versionStr;
158 
159     /** @brief Persistent Delete D-Bus object */
160     std::unique_ptr<Delete> deleteObject;
161 };
162 
163 } // namespace updater
164 } // namespace software
165 } // namespace phosphor
166