Add APIs to store/load BIOS tables

This commit implements C++ APIs to store a PLDM BIOS table into
persistent storage, and to load the same back into memory. This commit
also defines C structs representing the different BIOS tables.

Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: I4a771a368c6931464f45ae4a8f467b579c7a5d74
diff --git a/libpldmresponder/bios_table.hpp b/libpldmresponder/bios_table.hpp
new file mode 100644
index 0000000..2b4077c
--- /dev/null
+++ b/libpldmresponder/bios_table.hpp
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <stdint.h>
+
+#include <filesystem>
+#include <vector>
+
+#include "libpldm/bios.h"
+
+namespace pldm
+{
+
+namespace responder
+{
+
+namespace bios
+{
+
+using Table = std::vector<uint8_t>;
+using Response = std::vector<uint8_t>;
+namespace fs = std::filesystem;
+
+/** @class BIOSTable
+ *
+ *  @brief Provides APIs for storing and loading BIOS tables
+ *
+ *  Typical usage is as follows:
+ *  BIOSTable table(BIOS_STRING_TABLE_FILE_PATH);
+ *  if (table.isEmpty()) { // no persisted table
+ *    // construct BIOSTable 't'
+ *    // prepare Response 'r'
+ *    // send response to GetBIOSTable
+ *    table.store(t); // persisted
+ *  }
+ *  else { // persisted table exists
+ *    // create Response 'r' which has response fields (except
+ *    // the table itself) to a GetBIOSTable command
+ *    table.load(r); // actual table will be pushed back to the vector
+ *  }
+ */
+class BIOSTable
+{
+  public:
+    /** @brief Ctor - set file path to persist BIOS table
+     *
+     *  @param[in] filePath - file where BIOS table should be persisted
+     */
+    BIOSTable(const char* filePath);
+
+    /** @brief Checks if there's a persisted BIOS table
+     *
+     *  @return bool - true if table exists, false otherwise
+     */
+    bool isEmpty() const noexcept;
+
+    /** @brief Persist a BIOS table(string/attribute/attribute value)
+     *
+     *  @param[in] table - BIOS table
+     */
+    void store(const Table& table);
+
+    /** @brief Load BIOS table from persistent store to memory
+     *
+     *  @param[in,out] response - PLDM response message to GetBIOSTable
+     *  (excluding table), table will be pushed back to this.
+     */
+    void load(Response& response) const;
+
+  private:
+    // file storing PLDM BIOS table
+    fs::path filePath;
+};
+
+} // namespace bios
+} // namespace responder
+} // namespace pldm