blob: 28dde14afbfd123f4955f8a3f16b0c545e767435 [file] [log] [blame]
John Wang29683b52020-02-27 16:41:44 +08001#include "bios_string_attribute.hpp"
2
Deepak Kodihallid130e1a2020-06-17 05:55:32 -05003#include "common/utils.hpp"
John Wang29683b52020-02-27 16:41:44 +08004
Riya Dixit49cfb132023-03-02 04:26:53 -06005#include <phosphor-logging/lg2.hpp>
6
John Wang29683b52020-02-27 16:41:44 +08007#include <tuple>
8#include <variant>
9
Riya Dixit49cfb132023-03-02 04:26:53 -060010PHOSPHOR_LOG2_USING;
11
Brad Bishop5079ac42021-08-19 18:35:06 -040012using namespace pldm::utils;
13
John Wang29683b52020-02-27 16:41:44 +080014namespace pldm
15{
16namespace responder
17{
18namespace bios
19{
John Wang29683b52020-02-27 16:41:44 +080020BIOSStringAttribute::BIOSStringAttribute(const Json& entry,
21 DBusHandler* const dbusHandler) :
22 BIOSAttribute(entry, dbusHandler)
23{
24 std::string strTypeTmp = entry.at("string_type");
25 auto iter = strTypeMap.find(strTypeTmp);
26 if (iter == strTypeMap.end())
27 {
Riya Dixit49cfb132023-03-02 04:26:53 -060028 error(
29 "Wrong string type, STRING_TYPE={STR_TYPE} ATTRIBUTE_NAME={ATTR_NAME}",
30 "STR_TYP", strTypeTmp, "ATTR_NAME", name);
John Wang29683b52020-02-27 16:41:44 +080031 throw std::invalid_argument("Wrong string type");
32 }
33 stringInfo.stringType = static_cast<uint8_t>(iter->second);
34
35 stringInfo.minLength = entry.at("minimum_string_length");
36 stringInfo.maxLength = entry.at("maximum_string_length");
37 stringInfo.defLength = entry.at("default_string_length");
38 stringInfo.defString = entry.at("default_string");
39
40 pldm_bios_table_attr_entry_string_info info = {
41 0,
42 readOnly,
43 stringInfo.stringType,
44 stringInfo.minLength,
45 stringInfo.maxLength,
46 stringInfo.defLength,
47 stringInfo.defString.data(),
48 };
49
50 const char* errmsg;
51 auto rc = pldm_bios_table_attr_entry_string_info_check(&info, &errmsg);
52 if (rc != PLDM_SUCCESS)
53 {
Riya Dixit49cfb132023-03-02 04:26:53 -060054 error(
55 "Wrong field for string attribute, ATTRIBUTE_NAME={ATTR_NAME} ERRMSG={ERR_MSG} MINIMUM_STRING_LENGTH={MIN_LEN} MAXIMUM_STRING_LENGTH={MAX_LEN} DEFAULT_STRING_LENGTH={DEF_LEN} DEFAULT_STRING={DEF_STR}",
56 "ATTR_NAME", name, "ERR_MSG", errmsg, "MIN_LEN",
57 stringInfo.minLength, "MAX_LEN", stringInfo.maxLength, "DEF_LEN",
58 stringInfo.defLength, "DEF_STR", stringInfo.defString);
John Wang29683b52020-02-27 16:41:44 +080059 throw std::invalid_argument("Wrong field for string attribute");
60 }
61}
62
63void BIOSStringAttribute::setAttrValueOnDbus(
64 const pldm_bios_attr_val_table_entry* attrValueEntry,
65 const pldm_bios_attr_table_entry*, const BIOSStringTable&)
66{
George Liu5bb9edb2021-08-05 20:10:32 +080067 if (!dBusMap.has_value())
John Wang29683b52020-02-27 16:41:44 +080068 {
69 return;
70 }
71
72 PropertyValue value =
73 table::attribute_value::decodeStringEntry(attrValueEntry);
74 dbusHandler->setDbusProperty(*dBusMap, value);
75}
76
77std::string BIOSStringAttribute::getAttrValue()
78{
George Liu5bb9edb2021-08-05 20:10:32 +080079 if (!dBusMap.has_value())
John Wang29683b52020-02-27 16:41:44 +080080 {
81 return stringInfo.defString;
82 }
83 try
84 {
85 return dbusHandler->getDbusProperty<std::string>(
86 dBusMap->objectPath.c_str(), dBusMap->propertyName.c_str(),
87 dBusMap->interface.c_str());
88 }
89 catch (const std::exception& e)
90 {
Kamalkumar Patel58cbcaf2023-10-06 03:48:25 -050091 error(
92 "Error getting string attribute '{ATTR}' from '{INTERFACE}': {ERROR}",
93 "ATTR", name, "INTERFACE", dBusMap->interface, "ERROR", e);
John Wang29683b52020-02-27 16:41:44 +080094 return stringInfo.defString;
95 }
96}
97
Tom Josephca7b2522020-11-18 12:27:11 +053098void BIOSStringAttribute::constructEntry(
99 const BIOSStringTable& stringTable, Table& attrTable, Table& attrValueTable,
100 std::optional<std::variant<int64_t, std::string>> optAttributeValue)
John Wang29683b52020-02-27 16:41:44 +0800101{
102 pldm_bios_table_attr_entry_string_info info = {
103 stringTable.findHandle(name), readOnly,
104 stringInfo.stringType, stringInfo.minLength,
105 stringInfo.maxLength, stringInfo.defLength,
106 stringInfo.defString.data(),
107 };
108
Patrick Williams6da4f912023-05-10 07:50:53 -0500109 auto attrTableEntry = table::attribute::constructStringEntry(attrTable,
110 &info);
111 auto [attrHandle, attrType,
112 _] = table::attribute::decodeHeader(attrTableEntry);
Tom Josephca7b2522020-11-18 12:27:11 +0530113
114 std::string currStr{};
115 if (optAttributeValue.has_value())
116 {
117 auto attributeValue = optAttributeValue.value();
118 if (attributeValue.index() == 1)
119 {
120 currStr = std::get<std::string>(attributeValue);
121 }
122 else
123 {
124 currStr = getAttrValue();
125 }
126 }
127 else
128 {
129 currStr = getAttrValue();
130 }
131
John Wang29683b52020-02-27 16:41:44 +0800132 table::attribute_value::constructStringEntry(attrValueTable, attrHandle,
133 attrType, currStr);
134}
135
Sampa Misra46ece062020-03-18 07:17:44 -0500136int BIOSStringAttribute::updateAttrVal(Table& newValue, uint16_t attrHdl,
137 uint8_t attrType,
138 const PropertyValue& newPropVal)
139{
140 try
141 {
142 const auto& newStringValue = std::get<std::string>(newPropVal);
143 table::attribute_value::constructStringEntry(newValue, attrHdl,
144 attrType, newStringValue);
145 }
146 catch (const std::bad_variant_access& e)
147 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600148 error("invalid value passed for the property, error: {ERR_EXCEP}",
149 "ERR_EXCEP", e.what());
Sampa Misra46ece062020-03-18 07:17:44 -0500150 return PLDM_ERROR;
151 }
152 return PLDM_SUCCESS;
153}
154
George Liu1244acf2020-08-14 09:11:11 +0800155void BIOSStringAttribute::generateAttributeEntry(
156 const std::variant<int64_t, std::string>& attributevalue,
157 Table& attrValueEntry)
158{
159 std::string value = std::get<std::string>(attributevalue);
160 uint16_t len = value.size();
161
162 attrValueEntry.resize(sizeof(pldm_bios_attr_val_table_entry) +
163 sizeof(uint16_t) + len - 1);
164
165 auto entry = reinterpret_cast<pldm_bios_attr_val_table_entry*>(
166 attrValueEntry.data());
167
168 entry->attr_type = 1;
169 memcpy(entry->value, &len, sizeof(uint16_t));
170 memcpy(entry->value + sizeof(uint16_t), value.c_str(), value.size());
171}
172
John Wang29683b52020-02-27 16:41:44 +0800173} // namespace bios
174} // namespace responder
175} // namespace pldm