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