1*ee2bd8adSUnive Tien #pragma once 2*ee2bd8adSUnive Tien 3*ee2bd8adSUnive Tien #include "update_manager.hpp" 4*ee2bd8adSUnive Tien 5*ee2bd8adSUnive Tien namespace pldm::fw_update 6*ee2bd8adSUnive Tien { 7*ee2bd8adSUnive Tien 8*ee2bd8adSUnive Tien class AggregateUpdateManager : public UpdateManager 9*ee2bd8adSUnive Tien { 10*ee2bd8adSUnive Tien public: 11*ee2bd8adSUnive Tien AggregateUpdateManager() = delete; 12*ee2bd8adSUnive Tien AggregateUpdateManager(const AggregateUpdateManager&) = delete; 13*ee2bd8adSUnive Tien AggregateUpdateManager(AggregateUpdateManager&&) = delete; 14*ee2bd8adSUnive Tien AggregateUpdateManager& operator=(const AggregateUpdateManager&) = delete; 15*ee2bd8adSUnive Tien AggregateUpdateManager& operator=(AggregateUpdateManager&&) = delete; 16*ee2bd8adSUnive Tien 17*ee2bd8adSUnive Tien /** 18*ee2bd8adSUnive Tien * @brief Constructor for AggregateUpdateManager 19*ee2bd8adSUnive Tien * 20*ee2bd8adSUnive Tien * @param[in] event - Reference to the PLDM daemon's main event loop 21*ee2bd8adSUnive Tien * @param[in] handler - PLDM request handler 22*ee2bd8adSUnive Tien * @param[in] instanceIdDb - Reference to the instance ID database 23*ee2bd8adSUnive Tien * @param[in] descriptorMap - Descriptor map for the update manager 24*ee2bd8adSUnive Tien * @param[in] componentInfoMap - Component information map for the update 25*ee2bd8adSUnive Tien * manager 26*ee2bd8adSUnive Tien */ AggregateUpdateManager(Event & event,pldm::requester::Handler<pldm::requester::Request> & handler,InstanceIdDb & instanceIdDb,const DescriptorMap & descriptorMap,const ComponentInfoMap & componentInfoMap)27*ee2bd8adSUnive Tien explicit AggregateUpdateManager( 28*ee2bd8adSUnive Tien Event& event, 29*ee2bd8adSUnive Tien pldm::requester::Handler<pldm::requester::Request>& handler, 30*ee2bd8adSUnive Tien InstanceIdDb& instanceIdDb, const DescriptorMap& descriptorMap, 31*ee2bd8adSUnive Tien const ComponentInfoMap& componentInfoMap) : 32*ee2bd8adSUnive Tien UpdateManager(event, handler, instanceIdDb, descriptorMap, 33*ee2bd8adSUnive Tien componentInfoMap) 34*ee2bd8adSUnive Tien {} 35*ee2bd8adSUnive Tien 36*ee2bd8adSUnive Tien /** 37*ee2bd8adSUnive Tien * @brief Handle PLDM requests for the aggregate update manager 38*ee2bd8adSUnive Tien * 39*ee2bd8adSUnive Tien * This function processes incoming PLDM requests and dispatches them to the 40*ee2bd8adSUnive Tien * appropriate update manager based on the software identifier. 41*ee2bd8adSUnive Tien * 42*ee2bd8adSUnive Tien * @param[in] eid - Remote MCTP Endpoint ID 43*ee2bd8adSUnive Tien * @param[in] command - PLDM command code 44*ee2bd8adSUnive Tien * @param[in] request - PLDM request message 45*ee2bd8adSUnive Tien * @param[in] reqMsgLen - PLDM request message length 46*ee2bd8adSUnive Tien * @return PLDM response message 47*ee2bd8adSUnive Tien */ 48*ee2bd8adSUnive Tien Response handleRequest(mctp_eid_t eid, uint8_t command, 49*ee2bd8adSUnive Tien const pldm_msg* request, size_t reqMsgLen) override; 50*ee2bd8adSUnive Tien 51*ee2bd8adSUnive Tien /** 52*ee2bd8adSUnive Tien * @brief Create a new UpdateManager instance for a specific software 53*ee2bd8adSUnive Tien * identifier 54*ee2bd8adSUnive Tien * 55*ee2bd8adSUnive Tien * This function creates and stores a new UpdateManager instance associated 56*ee2bd8adSUnive Tien * with the given software identifier, along with its corresponding 57*ee2bd8adSUnive Tien * descriptor and component information maps. 58*ee2bd8adSUnive Tien * 59*ee2bd8adSUnive Tien * @param[in] softwareIdentifier - The software identifier (pair of eid and 60*ee2bd8adSUnive Tien * component identifier) 61*ee2bd8adSUnive Tien * @param[in] descriptors - The descriptors associated with the software 62*ee2bd8adSUnive Tien * identifier 63*ee2bd8adSUnive Tien * @param[in] componentInfo - The component information associated with the 64*ee2bd8adSUnive Tien * software identifier 65*ee2bd8adSUnive Tien * @param[in] updateObjPath - The D-Bus object path for the update manager 66*ee2bd8adSUnive Tien */ 67*ee2bd8adSUnive Tien void createUpdateManager(const SoftwareIdentifier& softwareIdentifier, 68*ee2bd8adSUnive Tien const Descriptors& descriptors, 69*ee2bd8adSUnive Tien const ComponentInfo& componentInfo, 70*ee2bd8adSUnive Tien const std::string& updateObjPath); 71*ee2bd8adSUnive Tien 72*ee2bd8adSUnive Tien /** 73*ee2bd8adSUnive Tien * @brief Erase an existing UpdateManager instance associated with a 74*ee2bd8adSUnive Tien * specific software identifier 75*ee2bd8adSUnive Tien * 76*ee2bd8adSUnive Tien * This function removes the UpdateManager instance and its associated 77*ee2bd8adSUnive Tien * descriptor and component information maps from the internal storage based 78*ee2bd8adSUnive Tien * on the provided software identifier. 79*ee2bd8adSUnive Tien * 80*ee2bd8adSUnive Tien * @param[in] softwareIdentifier - The software identifier (pair of eid and 81*ee2bd8adSUnive Tien * component identifier) 82*ee2bd8adSUnive Tien */ 83*ee2bd8adSUnive Tien void eraseUpdateManager(const SoftwareIdentifier& softwareIdentifier); 84*ee2bd8adSUnive Tien 85*ee2bd8adSUnive Tien /** 86*ee2bd8adSUnive Tien * @brief Erase UpdateManager instances that satisfy a given predicate 87*ee2bd8adSUnive Tien * 88*ee2bd8adSUnive Tien * This function iterates through the stored UpdateManager instances and 89*ee2bd8adSUnive Tien * removes those that satisfy the provided predicate function. It also 90*ee2bd8adSUnive Tien * removes the associated descriptor and component information maps. 91*ee2bd8adSUnive Tien * 92*ee2bd8adSUnive Tien * @param[in] predicate - A function that takes a SoftwareIdentifier and 93*ee2bd8adSUnive Tien * returns true if the corresponding UpdateManager should be erased 94*ee2bd8adSUnive Tien */ 95*ee2bd8adSUnive Tien void eraseUpdateManagerIf( 96*ee2bd8adSUnive Tien std::function<bool(const SoftwareIdentifier&)>&& predicate); 97*ee2bd8adSUnive Tien 98*ee2bd8adSUnive Tien private: 99*ee2bd8adSUnive Tien /** 100*ee2bd8adSUnive Tien * @brief Map of UpdateManager instances keyed by software identifier 101*ee2bd8adSUnive Tien */ 102*ee2bd8adSUnive Tien std::map<SoftwareIdentifier, std::unique_ptr<UpdateManager>> updateManagers; 103*ee2bd8adSUnive Tien 104*ee2bd8adSUnive Tien /** 105*ee2bd8adSUnive Tien * @brief Map of descriptor maps keyed by software identifier 106*ee2bd8adSUnive Tien */ 107*ee2bd8adSUnive Tien std::map<SoftwareIdentifier, std::unique_ptr<Descriptors>> descriptorMap; 108*ee2bd8adSUnive Tien 109*ee2bd8adSUnive Tien /** 110*ee2bd8adSUnive Tien * @brief Map of component information maps keyed by software identifier 111*ee2bd8adSUnive Tien */ 112*ee2bd8adSUnive Tien std::map<SoftwareIdentifier, std::unique_ptr<ComponentInfo>> 113*ee2bd8adSUnive Tien componentInfoMap; 114*ee2bd8adSUnive Tien }; 115*ee2bd8adSUnive Tien 116*ee2bd8adSUnive Tien } // namespace pldm::fw_update 117