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