1 #pragma once
2 
3 #include "bios_table.h"
4 
5 #include "bios_table.hpp"
6 #include "common/utils.hpp"
7 
8 #include <nlohmann/json.hpp>
9 
10 #include <cstdint>
11 #include <filesystem>
12 #include <memory>
13 #include <optional>
14 #include <string>
15 #include <vector>
16 
17 namespace pldm
18 {
19 namespace responder
20 {
21 namespace bios
22 {
23 
24 using Json = nlohmann::json;
25 using namespace pldm::utils;
26 
27 /** @class BIOSAttribute
28  *  @brief Provide interfaces to implement specific types of attributes
29  */
30 class BIOSAttribute
31 {
32   public:
33     /** @brief Construct a bios attribute
34      *  @param[in] entry - Json Object
35      *  @param[in] dbusHandler - Dbus Handler
36      */
37     BIOSAttribute(const Json& entry, DBusHandler* const dbusHandler);
38 
39     /** Virtual destructor
40      */
41     virtual ~BIOSAttribute() = default;
42 
43     /** @brief Set Attribute value On Dbus according to the attribute value
44      * entry
45      *  @param[in] attrValueEntry - The attribute value entry
46      *  @param[in] attrEntry - The attribute entry corresponding to the
47      *                         attribute value entry
48      *  @param[in] stringTable - The string table
49      */
50     virtual void
51         setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
52                            const pldm_bios_attr_table_entry* attrEntry,
53                            const BIOSStringTable& stringTable) = 0;
54 
55     /** @brief Construct corresponding entries at the end of the attribute table
56      *         and attribute value tables
57      *  @param[in] stringTable - The string Table
58      *  @param[in,out] attrTable - The attribute table
59      *  @param[in,out] attrValueTable - The attribute value table
60      */
61     virtual void constructEntry(const BIOSStringTable& stringTable,
62                                 Table& attrTable, Table& attrValueTable) = 0;
63 
64     /** @brief Method to update the value for an attribute
65      *  @param[in,out] newValue - An attribute value table row with the new
66      * value for the attribute
67      *  @param[in] attrHdl - attribute handle
68      *  @param[in] attrType - attribute type
69      *  @param[in] newPropVal - The new value
70      *  @return PLDM Success or failure status
71      */
72     virtual int updateAttrVal(Table& newValue, uint16_t attrHdl,
73                               uint8_t attrType,
74                               const PropertyValue& newPropVal) = 0;
75 
76     /** @brief Generate attribute entry by the spec DSP0247_1.0.0 Table 14
77      *  @param[in] attributevalue - attribute value(Enumeration, String and
78      *             Integer)
79      *  @param[in,out] attrValueEntry - attribute entry
80      */
81     virtual void generateAttributeEntry(
82         const std::variant<int64_t, std::string>& attributevalue,
83         Table& attrValueEntry) = 0;
84 
85     /** @brief Method to return the D-Bus map */
86     std::optional<DBusMapping> getDBusMap();
87 
88     /** @brief Name of this attribute */
89     const std::string name;
90 
91     /** Weather this attribute is read-only */
92     bool readOnly;
93 
94     const std::string displayName;
95 
96     const std::string helpText;
97 
98   protected:
99     /** @brief dbus backend, nullopt if this attribute is read-only*/
100     std::optional<DBusMapping> dBusMap;
101 
102     /** @brief dbus handler */
103     DBusHandler* const dbusHandler;
104 };
105 
106 } // namespace bios
107 } // namespace responder
108 } // namespace pldm
109