1 #pragma once 2 3 #include <blobs-ipmid/blobs.hpp> 4 5 #include <cstdint> 6 #include <memory> 7 #include <string> 8 #include <vector> 9 10 namespace blobs 11 { 12 13 class SmbiosBlobHandler : public GenericBlobInterface 14 { 15 public: 16 SmbiosBlobHandler() = default; 17 ~SmbiosBlobHandler() = default; 18 SmbiosBlobHandler(const SmbiosBlobHandler&) = delete; 19 SmbiosBlobHandler& operator=(const SmbiosBlobHandler&) = delete; 20 SmbiosBlobHandler(SmbiosBlobHandler&&) = default; 21 SmbiosBlobHandler& operator=(SmbiosBlobHandler&&) = default; 22 23 struct SmbiosBlob 24 { SmbiosBlobblobs::SmbiosBlobHandler::SmbiosBlob25 SmbiosBlob(uint16_t id, const std::string& path, uint16_t flags) : 26 sessionId(id), blobId(path), state(0) 27 { 28 if (flags & blobs::OpenFlags::write) 29 { 30 state |= blobs::StateFlags::open_write; 31 } 32 33 /* Pre-allocate the buffer.capacity() with maxBufferSize */ 34 buffer.reserve(maxBufferSize); 35 } 36 37 /* The blob handler session id. */ 38 uint16_t sessionId; 39 40 /* The identifier for the blob */ 41 std::string blobId; 42 43 /* The current state. */ 44 uint16_t state; 45 46 /* The staging buffer. */ 47 std::vector<uint8_t> buffer; 48 }; 49 50 bool canHandleBlob(const std::string& path) override; 51 std::vector<std::string> getBlobIds() override; 52 bool deleteBlob(const std::string& path) override; 53 bool stat(const std::string& path, struct BlobMeta* meta) override; 54 bool open(uint16_t session, uint16_t flags, 55 const std::string& path) override; 56 std::vector<uint8_t> read(uint16_t session, uint32_t offset, 57 uint32_t requestedSize) override; 58 bool write(uint16_t session, uint32_t offset, 59 const std::vector<uint8_t>& data) override; 60 bool writeMeta(uint16_t session, uint32_t offset, 61 const std::vector<uint8_t>& data) override; 62 bool commit(uint16_t session, const std::vector<uint8_t>& data) override; 63 bool close(uint16_t session) override; 64 bool stat(uint16_t session, struct BlobMeta* meta) override; 65 bool expire(uint16_t session) override; 66 67 private: 68 static constexpr char blobId[] = "/smbios"; 69 70 /* SMBIOS table storage size */ 71 static constexpr uint32_t maxBufferSize = 64 * 1024; 72 73 /* The handler only allows one open blob. */ 74 std::unique_ptr<SmbiosBlob> blobPtr = nullptr; 75 }; 76 77 } // namespace blobs 78