1 #pragma once 2 3 #include <blobs-ipmid/blobs.hpp> 4 #include <memory> 5 #include <string> 6 #include <unordered_map> 7 #include <vector> 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /** 14 * This method must be declared as extern C for blob manager to lookup the 15 * symbol. 16 */ 17 std::unique_ptr<blobs::GenericBlobInterface> createHandler(); 18 19 #ifdef __cplusplus 20 } 21 #endif 22 23 namespace blobs 24 { 25 26 constexpr int kBufferSize = 1024; 27 28 struct ExampleBlob 29 { 30 ExampleBlob() = default; 31 ExampleBlob(uint16_t id, uint16_t flags) : 32 sessionId(id), flags(flags), 33 state(StateFlags::open_read | StateFlags::open_write), length(0) 34 { 35 } 36 37 /* The blob handler session id. */ 38 uint16_t sessionId; 39 40 /* The flags passed into open. */ 41 uint16_t flags; 42 43 /* The current state. */ 44 uint16_t state; 45 46 /* The buffer is a fixed size, but length represents the number of bytes 47 * expected to be used contiguously from offset 0. 48 */ 49 uint32_t length; 50 51 /* The staging buffer. */ 52 uint8_t buffer[kBufferSize]; 53 }; 54 55 class ExampleBlobHandler : public GenericBlobInterface 56 { 57 public: 58 /* We want everything explicitly default. */ 59 ExampleBlobHandler() = default; 60 ~ExampleBlobHandler() = default; 61 ExampleBlobHandler(const ExampleBlobHandler&) = default; 62 ExampleBlobHandler& operator=(const ExampleBlobHandler&) = default; 63 ExampleBlobHandler(ExampleBlobHandler&&) = default; 64 ExampleBlobHandler& operator=(ExampleBlobHandler&&) = default; 65 66 bool canHandleBlob(const std::string& path) override; 67 std::vector<std::string> getBlobIds() override; 68 bool deleteBlob(const std::string& path) override; 69 bool stat(const std::string& path, struct BlobMeta* meta) override; 70 bool open(uint16_t session, uint16_t flags, 71 const std::string& path) override; 72 std::vector<uint8_t> read(uint16_t session, uint32_t offset, 73 uint32_t requestedSize) override; 74 bool write(uint16_t session, uint32_t offset, 75 const std::vector<uint8_t>& data) override; 76 bool writeMeta(uint16_t session, uint32_t offset, 77 const std::vector<uint8_t>& data) override; 78 bool commit(uint16_t session, const std::vector<uint8_t>& data) override; 79 bool close(uint16_t session) override; 80 bool stat(uint16_t session, struct BlobMeta* meta) override; 81 bool expire(uint16_t session) override; 82 83 constexpr static char supportedPath[] = "/dev/fake/command"; 84 85 private: 86 ExampleBlob* getSession(uint16_t id); 87 88 std::unordered_map<uint16_t, ExampleBlob> sessions; 89 }; 90 91 } // namespace blobs 92