xref: /openbmc/phosphor-ipmi-blobs/example/example.hpp (revision 6c415c67011532fc0fb7c3051a4cf657ea93dfe0)
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