bios: Add a configuration parser for integer attribute

Add a configuration parser for integer attribute
and check the fields for string attribute

Signed-off-by: John Wang <wangzqbj@inspur.com>
Change-Id: I3be56f4a64373fb442ef58ad9d6693ffb8994917
diff --git a/libpldmresponder/bios_parser.cpp b/libpldmresponder/bios_parser.cpp
index 0c39acb..a80771b 100644
--- a/libpldmresponder/bios_parser.cpp
+++ b/libpldmresponder/bios_parser.cpp
@@ -8,6 +8,8 @@
 #include <optional>
 #include <phosphor-logging/log.hpp>
 
+#include "libpldm/bios_table.h"
+
 namespace bios_parser
 {
 
@@ -280,47 +282,52 @@
 
 } // namespace internal
 
-int setup(const Json& entry)
+int setup(const Json& jsonEntry)
 {
 
-    std::string attr = entry.value("attribute_name", "");
+    std::string attr = jsonEntry.value("attribute_name", "");
     // Transfer string type from string to enum
-    std::string strTypeTmp = entry.value("string_type", "Unknown");
+    std::string strTypeTmp = jsonEntry.value("string_type", "Unknown");
     auto iter = strTypeMap.find(strTypeTmp);
     if (iter == strTypeMap.end())
     {
-        log<level::ERR>(
-            "Wrong string type",
-            phosphor::logging::entry("STRING_TYPE=%s", strTypeTmp.c_str()),
-            phosphor::logging::entry("ATTRIBUTE_NAME=%s", attr.c_str()));
+        log<level::ERR>("Wrong string type",
+                        entry("STRING_TYPE=%s", strTypeTmp.c_str()),
+                        entry("ATTRIBUTE_NAME=%s", attr.c_str()));
         return -1;
     }
     uint8_t strType = iter->second;
 
-    uint16_t minStrLen = entry.value("minimum_string_length", 0);
-    uint16_t maxStrLen = entry.value("maximum_string_length", 0);
-    if (maxStrLen - minStrLen < 0)
+    uint16_t minStrLen = jsonEntry.value("minimum_string_length", 0);
+    uint16_t maxStrLen = jsonEntry.value("maximum_string_length", 0);
+    uint16_t defaultStrLen = jsonEntry.value("default_string_length", 0);
+    std::string defaultStr = jsonEntry.value("default_string", "");
+
+    pldm_bios_table_attr_entry_string_info info = {
+        0,     /* name handle */
+        false, /* read only */
+        strType, minStrLen, maxStrLen, defaultStrLen, defaultStr.data(),
+    };
+
+    const char* errmsg;
+    auto rc = pldm_bios_table_attr_entry_string_info_check(&info, &errmsg);
+    if (rc != PLDM_SUCCESS)
     {
-        log<level::ERR>(
-            "Maximum string length is smaller than minimum string length",
-            phosphor::logging::entry("ATTRIBUTE_NAME=%s", attr.c_str()));
-        return -1;
-    }
-    uint16_t defaultStrLen = entry.value("default_string_length", 0);
-    std::string defaultStr = entry.value("default_string", "");
-    if ((defaultStrLen == 0) && (defaultStr.size() > 0))
-    {
-        log<level::ERR>(
-            "Default string length is 0, but default string is existing",
-            phosphor::logging::entry("ATTRIBUTE_NAME=%s", attr.c_str()));
+        log<level::ERR>("Wrong filed for string attribute",
+                        entry("ATTRIBUTE_NAME=%s", attr.c_str()),
+                        entry("ERRMSG=%s", errmsg),
+                        entry("MINIMUM_STRING_LENGTH=%u", minStrLen),
+                        entry("MAXIMUM_STRING_LENGTH=%u", maxStrLen),
+                        entry("DEFAULT_STRING_LENGTH=%u", defaultStrLen),
+                        entry("DEFAULT_STRING=%s", defaultStr.data()));
         return -1;
     }
 
     // Defaulting all the types of attributes to BIOSString
     internal::valueMap.emplace(
         std::move(attr),
-        std::make_tuple(entry.count("dbus") == 0, strType, minStrLen, maxStrLen,
-                        defaultStrLen, std::move(defaultStr)));
+        std::make_tuple(jsonEntry.count("dbus") == 0, strType, minStrLen,
+                        maxStrLen, defaultStrLen, std::move(defaultStr)));
 
     return 0;
 }
@@ -348,6 +355,71 @@
 
 } // namespace bios_string
 
+namespace bios_integer
+{
+
+AttrValuesMap valueMap;
+
+int setup(const Json& jsonEntry)
+{
+
+    std::string attr = jsonEntry.value("attribute_name", "");
+    // Transfer string type from string to enum
+
+    uint64_t lowerBound = jsonEntry.value("lower_bound", 0);
+    uint64_t upperBound = jsonEntry.value("upper_bound", 0);
+    uint32_t scalarIncrement = jsonEntry.value("scalar_increment", 1);
+    uint64_t defaultValue = jsonEntry.value("default_value", 0);
+    pldm_bios_table_attr_entry_integer_info info = {
+        0,     /* name handle*/
+        false, /* read only */
+        lowerBound, upperBound, scalarIncrement, defaultValue,
+    };
+    const char* errmsg = nullptr;
+    auto rc = pldm_bios_table_attr_entry_integer_info_check(&info, &errmsg);
+    if (rc != PLDM_SUCCESS)
+    {
+        log<level::ERR>("Wrong filed for integer attribute",
+                        entry("ATTRIBUTE_NAME=%s", attr.c_str()),
+                        entry("ERRMSG=%s", errmsg),
+                        entry("LOWER_BOUND=%llu", lowerBound),
+                        entry("UPPER_BOUND=%llu", upperBound),
+                        entry("DEFAULT_VALUE=%llu", defaultValue),
+                        entry("SCALAR_INCREMENT=%lu", scalarIncrement));
+        return -1;
+    }
+
+    valueMap.emplace(std::move(attr),
+                     std::make_tuple(jsonEntry.count("dbus") == 0, lowerBound,
+                                     upperBound, scalarIncrement,
+                                     defaultValue));
+
+    return 0;
+}
+
+const AttrValuesMap& getValues()
+{
+    return valueMap;
+}
+
+uint64_t getAttrValue(const AttrName& attrName)
+{
+    const auto& dBusMap = BIOSAttrLookup.at(attrName);
+    std::variant<std::string> propValue;
+
+    if (dBusMap == std::nullopt)
+    { // return default string
+        const auto& valueEntry = valueMap.at(attrName);
+        return std::get<AttrDefaultValue>(valueEntry);
+    }
+
+    return pldm::responder::DBusHandler().getDbusProperty<uint64_t>(
+        dBusMap->objectPath.c_str(), dBusMap->propertyName.c_str(),
+        dBusMap->interface.c_str());
+}
+
+} // namespace bios_integer
+
 const std::map<BIOSJsonName, BIOSStringHandler> BIOSStringHandlers = {
     {bIOSEnumJson, bios_enum::setupBIOSStrings},
 };
@@ -355,6 +427,7 @@
 const std::map<BIOSJsonName, typeHandler> BIOSTypeHandlers = {
     {bIOSEnumJson, bios_enum::setup},
     {bIOSStrJson, bios_string::setup},
+    {bIOSIntegerJson, bios_integer::setup},
 };
 
 void setupBIOSStrings(const BIOSJsonName& jsonName, const Json& entry,
@@ -368,14 +441,14 @@
     }
 }
 
-void setupBIOSAttrLookup(const Json& entry, AttrLookup& lookup)
+void setupBIOSAttrLookup(const Json& jsonEntry, AttrLookup& lookup)
 {
     std::optional<DBusMapping> dBusMap;
-    std::string attrName = entry.value("attribute_name", "");
+    std::string attrName = jsonEntry.value("attribute_name", "");
 
-    if (entry.count("dbus") != 0)
+    if (jsonEntry.count("dbus") != 0)
     {
-        auto dBusEntry = entry.value("dbus", emptyJson);
+        auto dBusEntry = jsonEntry.value("dbus", emptyJson);
         std::string objectPath = dBusEntry.value("object_path", "");
         std::string interface = dBusEntry.value("interface", "");
         std::string propertyName = dBusEntry.value("property_name", "");
@@ -388,12 +461,9 @@
         {
             log<level::ERR>(
                 "Invalid dbus config",
-                phosphor::logging::entry("OBJPATH=%s",
-                                         dBusMap->objectPath.c_str()),
-                phosphor::logging::entry("INTERFACE=%s",
-                                         dBusMap->interface.c_str()),
-                phosphor::logging::entry("PROPERTY_NAME=%s",
-                                         dBusMap->propertyName.c_str()));
+                entry("OBJPATH=%s", dBusMap->objectPath.c_str()),
+                entry("INTERFACE=%s", dBusMap->interface.c_str()),
+                entry("PROPERTY_NAME=%s", dBusMap->propertyName.c_str()));
         }
     }
     lookup.emplace(attrName, dBusMap);
@@ -409,7 +479,8 @@
     return 0;
 }
 
-const std::vector<BIOSJsonName> BIOSConfigFiles = {bIOSEnumJson, bIOSStrJson};
+const std::vector<BIOSJsonName> BIOSConfigFiles = {bIOSEnumJson, bIOSStrJson,
+                                                   bIOSIntegerJson};
 
 int setupConfig(const char* dirPath)
 {