129683b53SJohn Wang #include "bios_string_attribute.hpp"
229683b53SJohn Wang 
329683b53SJohn Wang #include "utils.hpp"
429683b53SJohn Wang 
529683b53SJohn Wang #include <iostream>
629683b53SJohn Wang #include <tuple>
729683b53SJohn Wang #include <variant>
829683b53SJohn Wang 
929683b53SJohn Wang namespace pldm
1029683b53SJohn Wang {
1129683b53SJohn Wang namespace responder
1229683b53SJohn Wang {
1329683b53SJohn Wang namespace bios
1429683b53SJohn Wang {
1529683b53SJohn Wang 
1629683b53SJohn Wang BIOSStringAttribute::BIOSStringAttribute(const Json& entry,
1729683b53SJohn Wang                                          DBusHandler* const dbusHandler) :
1829683b53SJohn Wang     BIOSAttribute(entry, dbusHandler)
1929683b53SJohn Wang {
2029683b53SJohn Wang     std::string strTypeTmp = entry.at("string_type");
2129683b53SJohn Wang     auto iter = strTypeMap.find(strTypeTmp);
2229683b53SJohn Wang     if (iter == strTypeMap.end())
2329683b53SJohn Wang     {
2429683b53SJohn Wang         std::cerr << "Wrong string type, STRING_TYPE=" << strTypeTmp
2529683b53SJohn Wang                   << " ATTRIBUTE_NAME=" << name << "\n";
2629683b53SJohn Wang         throw std::invalid_argument("Wrong string type");
2729683b53SJohn Wang     }
2829683b53SJohn Wang     stringInfo.stringType = static_cast<uint8_t>(iter->second);
2929683b53SJohn Wang 
3029683b53SJohn Wang     stringInfo.minLength = entry.at("minimum_string_length");
3129683b53SJohn Wang     stringInfo.maxLength = entry.at("maximum_string_length");
3229683b53SJohn Wang     stringInfo.defLength = entry.at("default_string_length");
3329683b53SJohn Wang     stringInfo.defString = entry.at("default_string");
3429683b53SJohn Wang 
3529683b53SJohn Wang     pldm_bios_table_attr_entry_string_info info = {
3629683b53SJohn Wang         0,
3729683b53SJohn Wang         readOnly,
3829683b53SJohn Wang         stringInfo.stringType,
3929683b53SJohn Wang         stringInfo.minLength,
4029683b53SJohn Wang         stringInfo.maxLength,
4129683b53SJohn Wang         stringInfo.defLength,
4229683b53SJohn Wang         stringInfo.defString.data(),
4329683b53SJohn Wang     };
4429683b53SJohn Wang 
4529683b53SJohn Wang     const char* errmsg;
4629683b53SJohn Wang     auto rc = pldm_bios_table_attr_entry_string_info_check(&info, &errmsg);
4729683b53SJohn Wang     if (rc != PLDM_SUCCESS)
4829683b53SJohn Wang     {
4929683b53SJohn Wang         std::cerr << "Wrong field for string attribute, ATTRIBUTE_NAME=" << name
5029683b53SJohn Wang                   << " ERRMSG=" << errmsg
5129683b53SJohn Wang                   << " MINIMUM_STRING_LENGTH=" << stringInfo.minLength
5229683b53SJohn Wang                   << " MAXIMUM_STRING_LENGTH=" << stringInfo.maxLength
5329683b53SJohn Wang                   << " DEFAULT_STRING_LENGTH=" << stringInfo.defLength
5429683b53SJohn Wang                   << " DEFAULT_STRING=" << stringInfo.defString << "\n";
5529683b53SJohn Wang         throw std::invalid_argument("Wrong field for string attribute");
5629683b53SJohn Wang     }
5729683b53SJohn Wang }
5829683b53SJohn Wang 
5929683b53SJohn Wang void BIOSStringAttribute::setAttrValueOnDbus(
6029683b53SJohn Wang     const pldm_bios_attr_val_table_entry* attrValueEntry,
6129683b53SJohn Wang     const pldm_bios_attr_table_entry*, const BIOSStringTable&)
6229683b53SJohn Wang {
6329683b53SJohn Wang     if (readOnly)
6429683b53SJohn Wang     {
6529683b53SJohn Wang         return;
6629683b53SJohn Wang     }
6729683b53SJohn Wang 
6829683b53SJohn Wang     PropertyValue value =
6929683b53SJohn Wang         table::attribute_value::decodeStringEntry(attrValueEntry);
7029683b53SJohn Wang     dbusHandler->setDbusProperty(*dBusMap, value);
7129683b53SJohn Wang }
7229683b53SJohn Wang 
7329683b53SJohn Wang std::string BIOSStringAttribute::getAttrValue()
7429683b53SJohn Wang {
7529683b53SJohn Wang     if (readOnly)
7629683b53SJohn Wang     {
7729683b53SJohn Wang         return stringInfo.defString;
7829683b53SJohn Wang     }
7929683b53SJohn Wang     try
8029683b53SJohn Wang     {
8129683b53SJohn Wang         return dbusHandler->getDbusProperty<std::string>(
8229683b53SJohn Wang             dBusMap->objectPath.c_str(), dBusMap->propertyName.c_str(),
8329683b53SJohn Wang             dBusMap->interface.c_str());
8429683b53SJohn Wang     }
8529683b53SJohn Wang     catch (const std::exception& e)
8629683b53SJohn Wang     {
8729683b53SJohn Wang         std::cerr << "Get String Attribute Value Error: AttributeName = "
8829683b53SJohn Wang                   << name << std::endl;
8929683b53SJohn Wang         return stringInfo.defString;
9029683b53SJohn Wang     }
9129683b53SJohn Wang }
9229683b53SJohn Wang 
9329683b53SJohn Wang void BIOSStringAttribute::constructEntry(const BIOSStringTable& stringTable,
9429683b53SJohn Wang                                          Table& attrTable,
9529683b53SJohn Wang                                          Table& attrValueTable)
9629683b53SJohn Wang {
9729683b53SJohn Wang     pldm_bios_table_attr_entry_string_info info = {
9829683b53SJohn Wang         stringTable.findHandle(name), readOnly,
9929683b53SJohn Wang         stringInfo.stringType,        stringInfo.minLength,
10029683b53SJohn Wang         stringInfo.maxLength,         stringInfo.defLength,
10129683b53SJohn Wang         stringInfo.defString.data(),
10229683b53SJohn Wang     };
10329683b53SJohn Wang 
10429683b53SJohn Wang     auto attrTableEntry =
10529683b53SJohn Wang         table::attribute::constructStringEntry(attrTable, &info);
10629683b53SJohn Wang     auto [attrHandle, attrType, _] =
10729683b53SJohn Wang         table::attribute::decodeHeader(attrTableEntry);
10829683b53SJohn Wang     auto currStr = getAttrValue();
10929683b53SJohn Wang     table::attribute_value::constructStringEntry(attrValueTable, attrHandle,
11029683b53SJohn Wang                                                  attrType, currStr);
11129683b53SJohn Wang }
11229683b53SJohn Wang 
113*46ece063SSampa Misra int BIOSStringAttribute::updateAttrVal(Table& newValue, uint16_t attrHdl,
114*46ece063SSampa Misra                                        uint8_t attrType,
115*46ece063SSampa Misra                                        const PropertyValue& newPropVal)
116*46ece063SSampa Misra {
117*46ece063SSampa Misra     try
118*46ece063SSampa Misra     {
119*46ece063SSampa Misra         const auto& newStringValue = std::get<std::string>(newPropVal);
120*46ece063SSampa Misra         table::attribute_value::constructStringEntry(newValue, attrHdl,
121*46ece063SSampa Misra                                                      attrType, newStringValue);
122*46ece063SSampa Misra     }
123*46ece063SSampa Misra     catch (const std::bad_variant_access& e)
124*46ece063SSampa Misra     {
125*46ece063SSampa Misra         std::cerr << "invalid value passed for the property, error: "
126*46ece063SSampa Misra                   << e.what() << "\n";
127*46ece063SSampa Misra         return PLDM_ERROR;
128*46ece063SSampa Misra     }
129*46ece063SSampa Misra     return PLDM_SUCCESS;
130*46ece063SSampa Misra }
131*46ece063SSampa Misra 
13229683b53SJohn Wang } // namespace bios
13329683b53SJohn Wang } // namespace responder
13429683b53SJohn Wang } // namespace pldm
135