185e54f1bSJason Ling #pragma once 2*cc7f385bSWilliam A. Kennington III #include "handler_config.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> 129936c456SWilliam A. Kennington III #include <optional> 139936c456SWilliam A. Kennington III #include <set> 14c78bfc82SJason Ling #include <string> 15b45eb5eeSWilliam A. Kennington III #include <string_view> 16c78bfc82SJason Ling #include <unordered_map> 17c78bfc82SJason Ling #include <vector> 18abf17354SWilliam A. Kennington III 1985e54f1bSJason Ling namespace ipmi_flash 2085e54f1bSJason Ling { 21c78bfc82SJason Ling 22c78bfc82SJason Ling class VersionBlobHandler : public blobs::GenericBlobInterface 23c78bfc82SJason Ling { 24c78bfc82SJason Ling public: 25abf17354SWilliam A. Kennington III struct ActionPack 26abf17354SWilliam A. Kennington III { 27abf17354SWilliam A. Kennington III /** Only file operation action supported currently */ 28abf17354SWilliam A. Kennington III std::unique_ptr<TriggerableActionInterface> onOpen; 29abf17354SWilliam A. Kennington III }; 30abf17354SWilliam A. Kennington III 31c78bfc82SJason Ling /** 32c78bfc82SJason Ling * Create a VersionBlobHandler. 33c78bfc82SJason Ling * 34abf17354SWilliam A. Kennington III * @param[in] configs - list of blob configurations to support 35c78bfc82SJason Ling */ 36abf17354SWilliam A. Kennington III VersionBlobHandler(std::vector<HandlerConfig<ActionPack>>&& configs); 37abf17354SWilliam A. Kennington III 38c78bfc82SJason Ling ~VersionBlobHandler() = default; 39c78bfc82SJason Ling VersionBlobHandler(const VersionBlobHandler&) = delete; 40c78bfc82SJason Ling VersionBlobHandler& operator=(const VersionBlobHandler&) = delete; 41c78bfc82SJason Ling VersionBlobHandler(VersionBlobHandler&&) = default; 42c78bfc82SJason Ling VersionBlobHandler& operator=(VersionBlobHandler&&) = default; 43c78bfc82SJason Ling 44c78bfc82SJason Ling bool canHandleBlob(const std::string& path) override; 45c78bfc82SJason Ling std::vector<std::string> getBlobIds() override; 46c78bfc82SJason Ling bool deleteBlob(const std::string& path) override; 47c78bfc82SJason Ling bool stat(const std::string&, blobs::BlobMeta* meta) override; 48c78bfc82SJason Ling bool open(uint16_t session, uint16_t flags, 49c78bfc82SJason Ling const std::string& path) override; 50c78bfc82SJason Ling std::vector<uint8_t> read(uint16_t session, uint32_t offset, 51c78bfc82SJason Ling uint32_t requestedSize) override; 52c78bfc82SJason Ling bool write(uint16_t session, uint32_t offset, 53c78bfc82SJason Ling const std::vector<uint8_t>& data) override 54c78bfc82SJason Ling { 55c78bfc82SJason Ling return false; /* not supported */ 56c78bfc82SJason Ling }; 57c78bfc82SJason Ling bool writeMeta(uint16_t session, uint32_t offset, 58c78bfc82SJason Ling const std::vector<uint8_t>& data) override 59c78bfc82SJason Ling { 60c78bfc82SJason Ling return false; /* not supported */ 61c78bfc82SJason Ling } 62c78bfc82SJason Ling bool commit(uint16_t session, const std::vector<uint8_t>& data) override 63c78bfc82SJason Ling { 64c78bfc82SJason Ling return false; // not supported 65c78bfc82SJason Ling } 66c78bfc82SJason Ling bool close(uint16_t session) override; 67c78bfc82SJason Ling bool stat(uint16_t session, blobs::BlobMeta* meta) override; 68c78bfc82SJason Ling bool expire(uint16_t session) override; 69c78bfc82SJason Ling 70c78bfc82SJason Ling private: 719936c456SWilliam A. Kennington III struct SessionInfo; 729936c456SWilliam A. Kennington III 73abf17354SWilliam A. Kennington III struct BlobInfo 74abf17354SWilliam A. Kennington III { 75b45eb5eeSWilliam A. Kennington III Pinned<std::string> blobId; 76abf17354SWilliam A. Kennington III std::unique_ptr<ActionPack> actions; 77abf17354SWilliam A. Kennington III std::unique_ptr<ImageHandlerInterface> handler; 789936c456SWilliam A. Kennington III std::set<SessionInfo*> sessionsToUpdate; 799936c456SWilliam A. Kennington III }; 809936c456SWilliam A. Kennington III 819936c456SWilliam A. Kennington III struct SessionInfo 829936c456SWilliam A. Kennington III { 839936c456SWilliam A. Kennington III BlobInfo* blob; 849936c456SWilliam A. Kennington III 859936c456SWilliam A. Kennington III // A cached copy of the version data shared by all clients for a single 869936c456SWilliam A. Kennington III // execution of the version retrieval action. This is is null until the 879936c456SWilliam A. Kennington III // TriggerableAction has completed. If the action is an error, the 889936c456SWilliam A. Kennington III // shared object is nullopt. Otherwise, contains a vector of the version 899936c456SWilliam A. Kennington III // data when successfully read. 909936c456SWilliam A. Kennington III std::shared_ptr<const std::optional<std::vector<uint8_t>>> data; 91abf17354SWilliam A. Kennington III }; 92abf17354SWilliam A. Kennington III 93b45eb5eeSWilliam A. Kennington III std::unordered_map<std::string_view, std::unique_ptr<BlobInfo>> blobInfoMap; 949936c456SWilliam A. Kennington III std::unordered_map<uint16_t, std::unique_ptr<SessionInfo>> sessionInfoMap; 95c78bfc82SJason Ling }; 969936c456SWilliam A. Kennington III 9785e54f1bSJason Ling } // namespace ipmi_flash 98