xref: /openbmc/pldm/pldmd/invoker.hpp (revision c453e164)
11521f6d1SDeepak Kodihalli #pragma once
21521f6d1SDeepak Kodihalli 
31521f6d1SDeepak Kodihalli #include "handler.hpp"
41521f6d1SDeepak Kodihalli 
5*c453e164SGeorge Liu #include <libpldm/base.h>
6*c453e164SGeorge Liu 
71521f6d1SDeepak Kodihalli #include <map>
81521f6d1SDeepak Kodihalli #include <memory>
91521f6d1SDeepak Kodihalli 
101521f6d1SDeepak Kodihalli namespace pldm
111521f6d1SDeepak Kodihalli {
121521f6d1SDeepak Kodihalli 
131521f6d1SDeepak Kodihalli using Type = uint8_t;
141521f6d1SDeepak Kodihalli 
151521f6d1SDeepak Kodihalli namespace responder
161521f6d1SDeepak Kodihalli {
171521f6d1SDeepak Kodihalli 
181521f6d1SDeepak Kodihalli class Invoker
191521f6d1SDeepak Kodihalli {
201521f6d1SDeepak Kodihalli   public:
211521f6d1SDeepak Kodihalli     /** @brief Register a handler for a PLDM Type
221521f6d1SDeepak Kodihalli      *
231521f6d1SDeepak Kodihalli      *  @param[in] pldmType - PLDM type code
241521f6d1SDeepak Kodihalli      *  @param[in] handler - PLDM Type handler
251521f6d1SDeepak Kodihalli      */
261521f6d1SDeepak Kodihalli     void registerHandler(Type pldmType, std::unique_ptr<CmdHandler> handler)
271521f6d1SDeepak Kodihalli     {
281521f6d1SDeepak Kodihalli         handlers.emplace(pldmType, std::move(handler));
291521f6d1SDeepak Kodihalli     }
301521f6d1SDeepak Kodihalli 
311521f6d1SDeepak Kodihalli     /** @brief Invoke a PLDM command handler
321521f6d1SDeepak Kodihalli      *
331521f6d1SDeepak Kodihalli      *  @param[in] pldmType - PLDM type code
341521f6d1SDeepak Kodihalli      *  @param[in] pldmCommand - PLDM command code
351521f6d1SDeepak Kodihalli      *  @param[in] request - PLDM request message
361521f6d1SDeepak Kodihalli      *  @param[in] reqMsgLen - PLDM request message size
371521f6d1SDeepak Kodihalli      *  @return PLDM response message
381521f6d1SDeepak Kodihalli      */
391521f6d1SDeepak Kodihalli     Response handle(Type pldmType, Command pldmCommand, const pldm_msg* request,
401521f6d1SDeepak Kodihalli                     size_t reqMsgLen)
411521f6d1SDeepak Kodihalli     {
421521f6d1SDeepak Kodihalli         return handlers.at(pldmType)->handle(pldmCommand, request, reqMsgLen);
431521f6d1SDeepak Kodihalli     }
441521f6d1SDeepak Kodihalli 
451521f6d1SDeepak Kodihalli   private:
461521f6d1SDeepak Kodihalli     std::map<Type, std::unique_ptr<CmdHandler>> handlers;
471521f6d1SDeepak Kodihalli };
481521f6d1SDeepak Kodihalli 
491521f6d1SDeepak Kodihalli } // namespace responder
501521f6d1SDeepak Kodihalli } // namespace pldm
51