1 #pragma once
2 #include "bios_attribute.hpp"
3 
4 #include <string>
5 
6 class TestBIOSStringAttribute;
7 
8 namespace pldm
9 {
10 namespace responder
11 {
12 namespace bios
13 {
14 
15 /** @class BIOSStringAttribute
16  *  @brief Associate string entry(attr table and attribute value table) and dbus
17  *         attribute
18  */
19 class BIOSStringAttribute : public BIOSAttribute
20 {
21   public:
22     friend class ::TestBIOSStringAttribute;
23 
24     /** @brief BIOS string types */
25     enum class Encoding : uint8_t
26     {
27         UNKNOWN = 0x00,
28         ASCII = 0x01,
29         HEX = 0x02,
30         UTF_8 = 0x03,
31         UTF_16LE = 0x04,
32         UTF_16BE = 0x05,
33         VENDOR_SPECIFIC = 0xFF
34     };
35 
36     /** brief Mapping of string to enum for string type */
37     inline static const std::map<std::string, Encoding> strTypeMap{
38         {"Unknown", Encoding::UNKNOWN},
39         {"ASCII", Encoding::ASCII},
40         {"Hex", Encoding::HEX},
41         {"UTF-8", Encoding::UTF_8},
42         {"UTF-16LE", Encoding::UTF_16LE},
43         {"UTF-16LE", Encoding::UTF_16LE},
44         {"Vendor Specific", Encoding::VENDOR_SPECIFIC}};
45 
46     /** @brief Construct a bios string attribute
47      *  @param[in] entry - Json Object
48      *  @param[in] dbusHandler - Dbus Handler
49      */
50     BIOSStringAttribute(const Json& entry, DBusHandler* const dbusHandler);
51 
52     /** @brief Set Attribute value On Dbus according to the attribute value
53      *         entry
54      *  @param[in] attrValueEntry - The attribute value entry
55      *  @param[in] attrEntry - The attribute entry corresponding to the
56      *                         attribute value entry
57      *  @param[in] stringTable - The string table
58      */
59     void
60         setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
61                            const pldm_bios_attr_table_entry* attrEntry,
62                            const BIOSStringTable& stringTable) override;
63 
64     /** @brief Construct corresponding entries at the end of the attribute table
65      *         and attribute value tables
66      *  @param[in] stringTable - The string Table
67      *  @param[in,out] attrTable - The attribute table
68      *  @param[in,out] attrValueTable - The attribute value table
69      *  @param[in,out] optAttributeValue - init value of the attribute
70      */
71     void constructEntry(const BIOSStringTable& stringTable, Table& attrTable,
72                         Table& attrValueTable,
73                         std::optional<std::variant<int64_t, std::string>>
74                             optAttributeValue = std::nullopt) override;
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     void generateAttributeEntry(
82         const std::variant<int64_t, std::string>& attributevalue,
83         Table& attrValueEntry) override;
84 
85     int updateAttrVal(Table& newValue, uint16_t attrHdl, uint8_t attrType,
86                       const PropertyValue& newPropVal);
87 
88   private:
89     /** @brief string field from json */
90     table::attribute::StringField stringInfo;
91 
92     /** @brief Get attribute value on dbus */
93     std::string getAttrValue();
94 };
95 
96 } // namespace bios
97 } // namespace responder
98 } // namespace pldm
99