1 #pragma once
2 
3 #include "bios_attribute.hpp"
4 
5 #include <map>
6 #include <set>
7 #include <string>
8 #include <variant>
9 
10 class TestBIOSEnumAttribute;
11 
12 namespace pldm
13 {
14 namespace responder
15 {
16 namespace bios
17 {
18 
19 /** @class BIOSEnumAttribute
20  *  @brief Associate enum entry(attr table and attribute value table) and
21  *         dbus attribute
22  */
23 class BIOSEnumAttribute : public BIOSAttribute
24 {
25   public:
26     friend class ::TestBIOSEnumAttribute;
27     /** @brief Construct a bios enum attribute
28      *  @param[in] entry - Json Object
29      *  @param[in] dbusHandler - Dbus Handler
30      */
31     BIOSEnumAttribute(const Json& entry, DBusHandler* const dbusHandler);
32 
33     /** @brief Set Attribute value On Dbus according to the attribute value
34      *         entry
35      *  @param[in] attrValueEntry - The attribute value entry
36      *  @param[in] attrEntry - The attribute entry corresponding to the
37      *                         attribute value entry
38      *  @param[in] stringTable - The string table
39      */
40     void
41         setAttrValueOnDbus(const pldm_bios_attr_val_table_entry* attrValueEntry,
42                            const pldm_bios_attr_table_entry* attrEntry,
43                            const BIOSStringTable& stringTable) override;
44 
45     /** @brief Construct corresponding entries at the end of the attribute table
46      *         and attribute value tables
47      *  @param[in] stringTable - The string Table
48      *  @param[in,out] attrTable - The attribute table
49      *  @param[in,out] attrValueTable - The attribute value table
50      */
51     void constructEntry(const BIOSStringTable& stringTable, Table& attrTable,
52                         Table& attrValueTable) override;
53 
54     int updateAttrVal(Table& newValue, uint16_t attrHdl, uint8_t attrType,
55                       const PropertyValue& newPropVal);
56 
57   private:
58     std::vector<std::string> possibleValues;
59     std::string defaultValue;
60 
61     /** @brief Get index of the given value in possible values
62      *  @param[in] value - The given value
63      *  @param[in] pVs - The possible values
64      *  @return Index of the given value in possible values
65      */
66     uint8_t getValueIndex(const std::string& value,
67                           const std::vector<std::string>& pVs);
68 
69     /** @brief Get handles of possible values
70      *  @param[in] stringTable - The bios string table
71      *  @param[in] pVs - The possible values
72      *  @return The handles
73      */
74     std::vector<uint16_t>
75         getPossibleValuesHandle(const BIOSStringTable& stringTable,
76                                 const std::vector<std::string>& pVs);
77 
78     using ValMap = std::map<PropertyValue, std::string>;
79 
80     /** @brief Map of value on dbus and pldm */
81     ValMap valMap;
82 
83     /** @brief Build the map of dbus value to pldm enum value
84      *  @param[in] dbusVals - The dbus values in the json's dbus section
85      */
86     void buildValMap(const Json& dbusVals);
87 
88     /** @brief Get index of the current value in possible values
89      *  @return The index of the current value in possible values
90      */
91     uint8_t getAttrValueIndex();
92 };
93 
94 } // namespace bios
95 } // namespace responder
96 } // namespace pldm
97