|  | #pragma once | 
|  |  | 
|  | #include "common/instance_id.hpp" | 
|  | #include "xyz/openbmc_project/Common/error.hpp" | 
|  | #include "xyz/openbmc_project/PLDM/Requester/server.hpp" | 
|  |  | 
|  | #include <sdbusplus/bus.hpp> | 
|  | #include <sdbusplus/server/object.hpp> | 
|  |  | 
|  | #include <map> | 
|  |  | 
|  | namespace pldm | 
|  | { | 
|  | namespace dbus_api | 
|  | { | 
|  |  | 
|  | using RequesterIntf = sdbusplus::server::object_t< | 
|  | sdbusplus::xyz::openbmc_project::PLDM::server::Requester>; | 
|  |  | 
|  | /** @class Requester | 
|  | *  @brief OpenBMC PLDM.Requester implementation. | 
|  | *  @details A concrete implementation for the | 
|  | *  xyz.openbmc_project.PLDM.Requester DBus APIs. | 
|  | */ | 
|  | class Requester : public RequesterIntf | 
|  | { | 
|  | public: | 
|  | Requester() = delete; | 
|  | Requester(const Requester&) = delete; | 
|  | Requester& operator=(const Requester&) = delete; | 
|  | Requester(Requester&&) = delete; | 
|  | Requester& operator=(Requester&&) = delete; | 
|  | virtual ~Requester() = default; | 
|  |  | 
|  | /** @brief Constructor to put object onto bus at a dbus path. | 
|  | *  @param[in] bus - Bus to attach to. | 
|  | *  @param[in] path - Path to attach at. | 
|  | *  @param[in] db - The database to use for allocating instance IDs | 
|  | *  @note will throw TooManyResources() if there were no free instance IDs | 
|  | *  Throws std::system_category().default_error_condition if there is | 
|  | *  something wrong with the instance ID database. | 
|  | */ | 
|  | Requester(sdbusplus::bus_t& bus, const std::string& path, | 
|  | InstanceIdDb& db) : | 
|  | RequesterIntf(bus, path.c_str()), pldmInstanceIdDb(db) {}; | 
|  |  | 
|  | /** @brief Implementation for RequesterIntf.GetInstanceId */ | 
|  | uint8_t getInstanceId(uint8_t eid) override | 
|  | { | 
|  | int id; | 
|  |  | 
|  | // Ideally we would be able to look up the TID for a given EID. We don't | 
|  | // have that infrastructure in place yet. So use the EID value for the | 
|  | // TID. This is an interim step towards the PLDM requester logic moving | 
|  | // into libpldm, and eventually this won't be needed. | 
|  | try | 
|  | { | 
|  | id = pldmInstanceIdDb.next(eid); | 
|  | } | 
|  | catch (const std::runtime_error& e) | 
|  | { | 
|  | throw sdbusplus::xyz::openbmc_project::Common::Error:: | 
|  | TooManyResources(); | 
|  | } | 
|  |  | 
|  | return id; | 
|  | } | 
|  |  | 
|  | /** @brief Mark an instance id as unused | 
|  | *  @param[in] eid - MCTP eid to which this instance id belongs | 
|  | *  @param[in] instanceId - PLDM instance id to be freed | 
|  | *  @note will throw std::runtime_error if the instance ID was not | 
|  | *  previously allocated. | 
|  | *  Throws std::system_category().default_error_condition if there is | 
|  | *  something wrong with the instance ID database. | 
|  | */ | 
|  | void markFree(uint8_t eid, uint8_t instanceId) | 
|  | { | 
|  | pldmInstanceIdDb.free(eid, instanceId); | 
|  | } | 
|  |  | 
|  | private: | 
|  | InstanceIdDb& pldmInstanceIdDb; | 
|  | }; | 
|  |  | 
|  | } // namespace dbus_api | 
|  | } // namespace pldm |