blob: 7ceebd68f900eb366f3247cf1ac59a534ad068f3 [file] [log] [blame]
Patrick Venturec0f499b2018-09-14 17:57:42 -07001#pragma once
2
Patrick Ventureaceb4ba2018-09-27 14:50:37 -07003#include <blobs-ipmid/blobs.hpp>
Patrick Williams52509572023-05-10 07:51:18 -05004
Patrick Venture6c415c62018-11-14 14:01:36 -08005#include <memory>
Patrick Venturec0f499b2018-09-14 17:57:42 -07006#include <string>
7#include <unordered_map>
8#include <vector>
9
Patrick Venture6c415c62018-11-14 14:01:36 -080010#ifdef __cplusplus
Patrick Williams52509572023-05-10 07:51:18 -050011extern "C"
12{
Patrick Venture6c415c62018-11-14 14:01:36 -080013#endif
14
Patrick Williams52509572023-05-10 07:51:18 -050015 /**
16 * This method must be declared as extern C for blob manager to lookup the
17 * symbol.
18 */
19 std::unique_ptr<blobs::GenericBlobInterface> createHandler();
Patrick Venture6c415c62018-11-14 14:01:36 -080020
21#ifdef __cplusplus
22}
23#endif
24
Patrick Venturec0f499b2018-09-14 17:57:42 -070025namespace blobs
26{
27
28constexpr int kBufferSize = 1024;
29
30struct ExampleBlob
31{
32 ExampleBlob() = default;
33 ExampleBlob(uint16_t id, uint16_t flags) :
Patrick Venturee01c0af2018-09-27 14:56:42 -070034 sessionId(id), flags(flags),
35 state(StateFlags::open_read | StateFlags::open_write), length(0)
Patrick Williams52509572023-05-10 07:51:18 -050036 {}
Patrick Venturec0f499b2018-09-14 17:57:42 -070037
38 /* The blob handler session id. */
39 uint16_t sessionId;
40
41 /* The flags passed into open. */
42 uint16_t flags;
43
Patrick Venturee01c0af2018-09-27 14:56:42 -070044 /* The current state. */
45 uint16_t state;
46
Patrick Venturec0f499b2018-09-14 17:57:42 -070047 /* The buffer is a fixed size, but length represents the number of bytes
48 * expected to be used contiguously from offset 0.
49 */
50 uint32_t length;
51
52 /* The staging buffer. */
53 uint8_t buffer[kBufferSize];
54};
55
56class ExampleBlobHandler : public GenericBlobInterface
57{
58 public:
59 /* We want everything explicitly default. */
60 ExampleBlobHandler() = default;
61 ~ExampleBlobHandler() = default;
62 ExampleBlobHandler(const ExampleBlobHandler&) = default;
63 ExampleBlobHandler& operator=(const ExampleBlobHandler&) = default;
64 ExampleBlobHandler(ExampleBlobHandler&&) = default;
65 ExampleBlobHandler& operator=(ExampleBlobHandler&&) = default;
66
67 bool canHandleBlob(const std::string& path) override;
68 std::vector<std::string> getBlobIds() override;
69 bool deleteBlob(const std::string& path) override;
Patrick Venture8bc11772019-06-04 07:20:24 -070070 bool stat(const std::string& path, BlobMeta* meta) override;
Patrick Venturec0f499b2018-09-14 17:57:42 -070071 bool open(uint16_t session, uint16_t flags,
72 const std::string& path) override;
73 std::vector<uint8_t> read(uint16_t session, uint32_t offset,
74 uint32_t requestedSize) override;
75 bool write(uint16_t session, uint32_t offset,
76 const std::vector<uint8_t>& data) override;
Patrick Venture5c4b17b2018-10-04 10:32:22 -070077 bool writeMeta(uint16_t session, uint32_t offset,
78 const std::vector<uint8_t>& data) override;
Patrick Venturec0f499b2018-09-14 17:57:42 -070079 bool commit(uint16_t session, const std::vector<uint8_t>& data) override;
80 bool close(uint16_t session) override;
Patrick Venture8bc11772019-06-04 07:20:24 -070081 bool stat(uint16_t session, BlobMeta* meta) override;
Patrick Venturec0f499b2018-09-14 17:57:42 -070082 bool expire(uint16_t session) override;
83
84 constexpr static char supportedPath[] = "/dev/fake/command";
85
86 private:
87 ExampleBlob* getSession(uint16_t id);
88
89 std::unordered_map<uint16_t, ExampleBlob> sessions;
90};
91
92} // namespace blobs