blob: 335eade159e5aa437400a5de4c2d37ecf8a5a0ae [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 Venture6c415c62018-11-14 14:01:36 -08004#include <memory>
Patrick Venturec0f499b2018-09-14 17:57:42 -07005#include <string>
6#include <unordered_map>
7#include <vector>
8
Patrick Venture6c415c62018-11-14 14:01:36 -08009#ifdef __cplusplus
10extern "C" {
11#endif
12
13/**
14 * This method must be declared as extern C for blob manager to lookup the
15 * symbol.
16 */
17std::unique_ptr<blobs::GenericBlobInterface> createHandler();
18
19#ifdef __cplusplus
20}
21#endif
22
Patrick Venturec0f499b2018-09-14 17:57:42 -070023namespace blobs
24{
25
26constexpr int kBufferSize = 1024;
27
28struct ExampleBlob
29{
30 ExampleBlob() = default;
31 ExampleBlob(uint16_t id, uint16_t flags) :
Patrick Venturee01c0af2018-09-27 14:56:42 -070032 sessionId(id), flags(flags),
33 state(StateFlags::open_read | StateFlags::open_write), length(0)
Patrick Venturec0f499b2018-09-14 17:57:42 -070034 {
35 }
36
37 /* The blob handler session id. */
38 uint16_t sessionId;
39
40 /* The flags passed into open. */
41 uint16_t flags;
42
Patrick Venturee01c0af2018-09-27 14:56:42 -070043 /* The current state. */
44 uint16_t state;
45
Patrick Venturec0f499b2018-09-14 17:57:42 -070046 /* 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
55class 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;
Patrick Venture5c4b17b2018-10-04 10:32:22 -070076 bool writeMeta(uint16_t session, uint32_t offset,
77 const std::vector<uint8_t>& data) override;
Patrick Venturec0f499b2018-09-14 17:57:42 -070078 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