1 #pragma once
2 
3 #include "bios_table.hpp"
4 #include "utils.hpp"
5 
6 #include <cstdint>
7 #include <filesystem>
8 #include <memory>
9 #include <nlohmann/json.hpp>
10 #include <optional>
11 #include <string>
12 #include <vector>
13 
14 #include "bios_table.h"
15 
16 namespace pldm
17 {
18 namespace responder
19 {
20 namespace bios
21 {
22 
23 using Json = nlohmann::json;
24 using namespace pldm::utils;
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, DBusHandler* const dbusHandler);
37 
38     /** Virtual destructor
39      */
40     virtual ~BIOSAttribute() = default;
41 
42     /** @brief Set Attribute value On Dbus according to the attribute value
43      * entry
44      *  @param[in] attrValueEntry - The attribute value entry
45      *  @param[in] attrEntry - The attribute entry corresponding to the
46      *                         attribute value entry
47      *  @param[in] stringTable - The string table
48      */
49     virtual void
50         setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
51                            const pldm_bios_attr_table_entry* attrEntry,
52                            const BIOSStringTable& stringTable) = 0;
53 
54     /** @brief Construct corresponding entries at the end of the attribute table
55      *         and attribute value tables
56      *  @param[in] stringTable - The string Table
57      *  @param[in,out] attrTable - The attribute table
58      *  @param[in,out] attrValueTable - The attribute value table
59      */
60     virtual void constructEntry(const BIOSStringTable& stringTable,
61                                 Table& attrTable, Table& attrValueTable) = 0;
62 
63     /** @brief Method to update the value for an attribute
64      *  @param[in,out] newValue - An attribute value table row with the new
65      * value for the attribute
66      *  @param[in] attrHdl - attribute handle
67      *  @param[in] attrType - attribute type
68      *  @param[in] newPropVal - The new value
69      *  @return PLDM Success or failure status
70      */
71     virtual int updateAttrVal(Table& newValue, uint16_t attrHdl,
72                               uint8_t attrType,
73                               const PropertyValue& newPropVal) = 0;
74 
75     /** @brief Method to return the D-Bus map */
76     std::optional<DBusMapping> getDBusMap();
77 
78     /** @brief Name of this attribute */
79     const std::string name;
80 
81     /** Weather this attribute is read-only */
82     const bool readOnly;
83 
84   protected:
85     /** @brief dbus backend, nullopt if this attribute is read-only*/
86     std::optional<DBusMapping> dBusMap;
87 
88     /** @brief dbus handler */
89     DBusHandler* const dbusHandler;
90 };
91 
92 } // namespace bios
93 } // namespace responder
94 } // namespace pldm
95