initial commit

Add initial code from phosphor-ipmi-flash/tools that was not specific to
firmware update over ipmi-blobs.

Change-Id: I360537a7392347fe989397a699f6a712bc36e62c
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/src/ipmiblob/blob_interface.hpp b/src/ipmiblob/blob_interface.hpp
new file mode 100644
index 0000000..f85be59
--- /dev/null
+++ b/src/ipmiblob/blob_interface.hpp
@@ -0,0 +1,91 @@
+#pragma once
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+namespace host_tool
+{
+
+struct StatResponse
+{
+    std::uint16_t blob_state;
+    std::uint32_t size;
+    std::vector<std::uint8_t> metadata;
+};
+
+class BlobInterface
+{
+  public:
+    virtual ~BlobInterface() = default;
+
+    /**
+     * Write metadata to a blob.
+     *
+     * @param[in] session - the session id.
+     * @param[in] offset - the offset for the metadata to write.
+     * @param[in] bytes - the bytes to send.
+     * @throws BlobException on failure.
+     */
+    virtual void writeMeta(std::uint16_t session, std::uint32_t offset,
+                           const std::vector<std::uint8_t>& bytes) = 0;
+
+    /**
+     * Write bytes to a blob.
+     *
+     * @param[in] session - the session id.
+     * @param[in] offset - the offset to which to write the bytes.
+     * @param[in] bytes - the bytes to send.
+     * @throws BlobException on failure.
+     */
+    virtual void writeBytes(std::uint16_t session, std::uint32_t offset,
+                            const std::vector<std::uint8_t>& bytes) = 0;
+
+    /**
+     * Get a list of the blob_ids provided by the BMC.
+     *
+     * @return list of strings, each representing a blob_id returned.
+     */
+    virtual std::vector<std::string> getBlobList() = 0;
+
+    /**
+     * Get the stat() on the blob_id.
+     *
+     * @param[in] id - the blob_id.
+     * @return metadata structure.
+     */
+    virtual StatResponse getStat(const std::string& id) = 0;
+
+    /**
+     * Attempt to open the file using the specific data interface flag.
+     *
+     * @param[in] blob - the blob_id to open.
+     * @param[in] handlerFlags - the data interface flag, if relevant.
+     * @return the session id on success.
+     * @throws BlobException on failure.
+     */
+    virtual std::uint16_t openBlob(const std::string& id,
+                                   std::uint16_t handlerFlags) = 0;
+
+    /**
+     * Attempt to close the open session.
+     *
+     * @param[in] session - the session to close.
+     */
+    virtual void closeBlob(std::uint16_t session) = 0;
+
+    /**
+     * Read bytes from a blob.
+     *
+     * @param[in] session - the session id.
+     * @param[in] offset - the offset to which to write the bytes.
+     * @param[in] length - the number of bytes to read.
+     * @return the bytes read
+     * @throws BlobException on failure.
+     */
+    virtual std::vector<std::uint8_t> readBytes(std::uint16_t session,
+                                                std::uint32_t offset,
+                                                std::uint32_t length) = 0;
+};
+
+} // namespace host_tool