xref: /openbmc/phosphor-ipmi-flash/bmc/version-handler/version_handler.hpp (revision abf17354324e2ad81bbbf2c63dbdffc5453b62b8)
185e54f1bSJason Ling #pragma once
285e54f1bSJason Ling #include "buildjson.hpp"
3c78bfc82SJason Ling #include "image_handler.hpp"
485e54f1bSJason Ling #include "status.hpp"
5c78bfc82SJason Ling #include "util.hpp"
685e54f1bSJason Ling 
785e54f1bSJason Ling #include <blobs-ipmid/blobs.hpp>
885e54f1bSJason Ling 
9c78bfc82SJason Ling #include <cstdint>
10c78bfc82SJason Ling #include <map>
1185e54f1bSJason Ling #include <memory>
12c78bfc82SJason Ling #include <string>
13c78bfc82SJason Ling #include <unordered_map>
14c78bfc82SJason Ling #include <vector>
15*abf17354SWilliam A. Kennington III 
1685e54f1bSJason Ling namespace ipmi_flash
1785e54f1bSJason Ling {
18c78bfc82SJason Ling 
19c78bfc82SJason Ling class VersionBlobHandler : public blobs::GenericBlobInterface
20c78bfc82SJason Ling {
21c78bfc82SJason Ling   public:
22*abf17354SWilliam A. Kennington III     struct ActionPack
23*abf17354SWilliam A. Kennington III     {
24*abf17354SWilliam A. Kennington III         /** Only file operation action supported currently */
25*abf17354SWilliam A. Kennington III         std::unique_ptr<TriggerableActionInterface> onOpen;
26*abf17354SWilliam A. Kennington III     };
27*abf17354SWilliam A. Kennington III 
28c78bfc82SJason Ling     /**
29c78bfc82SJason Ling      * Create a VersionBlobHandler.
30c78bfc82SJason Ling      *
31*abf17354SWilliam A. Kennington III      * @param[in] configs - list of blob configurations to support
32c78bfc82SJason Ling      */
33*abf17354SWilliam A. Kennington III     VersionBlobHandler(std::vector<HandlerConfig<ActionPack>>&& configs);
34*abf17354SWilliam A. Kennington III 
35c78bfc82SJason Ling     ~VersionBlobHandler() = default;
36c78bfc82SJason Ling     VersionBlobHandler(const VersionBlobHandler&) = delete;
37c78bfc82SJason Ling     VersionBlobHandler& operator=(const VersionBlobHandler&) = delete;
38c78bfc82SJason Ling     VersionBlobHandler(VersionBlobHandler&&) = default;
39c78bfc82SJason Ling     VersionBlobHandler& operator=(VersionBlobHandler&&) = default;
40c78bfc82SJason Ling 
41c78bfc82SJason Ling     bool canHandleBlob(const std::string& path) override;
42c78bfc82SJason Ling     std::vector<std::string> getBlobIds() override;
43c78bfc82SJason Ling     bool deleteBlob(const std::string& path) override;
44c78bfc82SJason Ling     bool stat(const std::string&, blobs::BlobMeta* meta) override;
45c78bfc82SJason Ling     bool open(uint16_t session, uint16_t flags,
46c78bfc82SJason Ling               const std::string& path) override;
47c78bfc82SJason Ling     std::vector<uint8_t> read(uint16_t session, uint32_t offset,
48c78bfc82SJason Ling                               uint32_t requestedSize) override;
49c78bfc82SJason Ling     bool write(uint16_t session, uint32_t offset,
50c78bfc82SJason Ling                const std::vector<uint8_t>& data) override
51c78bfc82SJason Ling     {
52c78bfc82SJason Ling         return false; /* not supported */
53c78bfc82SJason Ling     };
54c78bfc82SJason Ling     bool writeMeta(uint16_t session, uint32_t offset,
55c78bfc82SJason Ling                    const std::vector<uint8_t>& data) override
56c78bfc82SJason Ling     {
57c78bfc82SJason Ling         return false; /* not supported */
58c78bfc82SJason Ling     }
59c78bfc82SJason Ling     bool commit(uint16_t session, const std::vector<uint8_t>& data) override
60c78bfc82SJason Ling     {
61c78bfc82SJason Ling         return false; // not supported
62c78bfc82SJason Ling     }
63c78bfc82SJason Ling     bool close(uint16_t session) override;
64c78bfc82SJason Ling     bool stat(uint16_t session, blobs::BlobMeta* meta) override;
65c78bfc82SJason Ling     bool expire(uint16_t session) override;
66c78bfc82SJason Ling     bool cleanup(uint16_t session);
67c78bfc82SJason Ling 
68c78bfc82SJason Ling   private:
69*abf17354SWilliam A. Kennington III     struct BlobInfo
70*abf17354SWilliam A. Kennington III     {
71*abf17354SWilliam A. Kennington III         std::string blobId;
72*abf17354SWilliam A. Kennington III         std::unique_ptr<ActionPack> actions;
73*abf17354SWilliam A. Kennington III         std::unique_ptr<ImageHandlerInterface> handler;
74*abf17354SWilliam A. Kennington III         blobs::StateFlags blobState = static_cast<blobs::StateFlags>(0);
75*abf17354SWilliam A. Kennington III     };
76*abf17354SWilliam A. Kennington III 
77*abf17354SWilliam A. Kennington III     std::unordered_map<std::string, BlobInfo> blobInfoMap;
78c78bfc82SJason Ling     std::unordered_map<uint16_t, std::string> sessionToBlob;
79c78bfc82SJason Ling };
8085e54f1bSJason Ling } // namespace ipmi_flash
81