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