1 #pragma once
2 
3 #include "bios_table.hpp"
4 #include "common/utils.hpp"
5 
6 #include <libpldm/bios_table.h>
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 
26 /** @class BIOSAttribute
27  *  @brief Provide interfaces to implement specific types of attributes
28  */
29 class BIOSAttribute
30 {
31   public:
32     /** @brief Construct a bios attribute
33      *  @param[in] entry - Json Object
34      *  @param[in] dbusHandler - Dbus Handler
35      */
36     BIOSAttribute(const Json& entry,
37                   pldm::utils::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      *  @param[in,out] optAttributeValue - init value of the attribute
61      */
62     virtual void constructEntry(
63         const BIOSStringTable& stringTable, Table& attrTable,
64         Table& attrValueTable,
65         std::optional<std::variant<int64_t, std::string>> optAttributeValue =
66             std::nullopt) = 0;
67 
68     /** @brief Method to update the value for an attribute
69      *  @param[in,out] newValue - An attribute value table row with the new
70      * value for the attribute
71      *  @param[in] attrHdl - attribute handle
72      *  @param[in] attrType - attribute type
73      *  @param[in] newPropVal - The new value
74      *  @return PLDM Success or failure status
75      */
76     virtual int updateAttrVal(Table& newValue, uint16_t attrHdl,
77                               uint8_t attrType,
78                               const pldm::utils::PropertyValue& newPropVal) = 0;
79 
80     /** @brief Generate attribute entry by the spec DSP0247_1.0.0 Table 14
81      *  @param[in] attributevalue - attribute value(Enumeration, String and
82      *             Integer)
83      *  @param[in,out] attrValueEntry - attribute entry
84      */
85     virtual void generateAttributeEntry(
86         const std::variant<int64_t, std::string>& attributevalue,
87         Table& attrValueEntry) = 0;
88 
89     /** @brief Method to return the D-Bus map */
90     std::optional<pldm::utils::DBusMapping> getDBusMap();
91 
92     /** @brief Name of this attribute */
93     const std::string name;
94 
95     /** Weather this attribute is read-only */
96     bool readOnly;
97 
98     const std::string displayName;
99 
100     const std::string helpText;
101 
102   protected:
103     /** @brief dbus backend, nullopt if this attribute is read-only*/
104     std::optional<pldm::utils::DBusMapping> dBusMap;
105 
106     /** @brief dbus handler */
107     pldm::utils::DBusHandler* const dbusHandler;
108 };
109 
110 } // namespace bios
111 } // namespace responder
112 } // namespace pldm
113