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