blob: 83cf530d5ae70f90cc2e2a913acda8d7529bb166 [file] [log] [blame]
Naveen Mosesa1af3292021-12-15 11:47:01 +05301#pragma once
2
Delphine CC Chiuccd7db02023-02-09 14:48:53 +08003#include "button_config.hpp"
Naveen Mosesa1af3292021-12-15 11:47:01 +05304#include "button_interface.hpp"
Naveen Mosesa1af3292021-12-15 11:47:01 +05305
6#include <phosphor-logging/elog-errors.hpp>
George Liu5b98f4d2022-06-20 13:31:14 +08007
Naveen Mosesa1af3292021-12-15 11:47:01 +05308#include <unordered_map>
9
10using buttonIfCreatorMethod = std::function<std::unique_ptr<ButtonIface>(
Delphine CC Chiuccd7db02023-02-09 14:48:53 +080011 sdbusplus::bus_t& bus, EventPtr& event, ButtonConfig& buttonCfg)>;
Naveen Mosesa1af3292021-12-15 11:47:01 +053012
13/**
14 * @brief This is abstract factory for the creating phosphor buttons objects
15 * based on the button / formfactor type given.
16 */
17
18class ButtonFactory
19{
Naveen Mosesa1af3292021-12-15 11:47:01 +053020 public:
21 static ButtonFactory& instance()
22 {
23 static ButtonFactory buttonFactoryObj;
24 return buttonFactoryObj;
25 }
26
27 /**
28 * @brief this method creates a key and value pair element
29 * for the given button interface where key is the form factor
30 * name and the value is lambda method to return
31 * the instance of the button interface.
32 * This key value pair is stored in the Map buttonIfaceRegistry.
33 */
34
35 template <typename T>
36 void addToRegistry()
37 {
Naveen Mosesa1af3292021-12-15 11:47:01 +053038 buttonIfaceRegistry[std::string(T::getFormFactorName())] =
Patrick Williams9a529a62022-07-22 19:26:54 -050039 [](sdbusplus::bus_t& bus, EventPtr& event,
Delphine CC Chiuccd7db02023-02-09 14:48:53 +080040 ButtonConfig& buttonCfg) {
Patrick Williamsd36b6b12024-08-16 15:20:34 -040041 return std::make_unique<T>(bus, T::getDbusObjectPath(), event,
42 buttonCfg);
43 };
Naveen Mosesa1af3292021-12-15 11:47:01 +053044 }
45 /**
46 * @brief this method returns the button interface object
47 * corresponding to the button formfactor name provided
48 */
Patrick Williamsd36b6b12024-08-16 15:20:34 -040049 std::unique_ptr<ButtonIface>
50 createInstance(const std::string& name, sdbusplus::bus_t& bus,
51 EventPtr& event, ButtonConfig& buttonCfg)
Naveen Mosesa1af3292021-12-15 11:47:01 +053052 {
Naveen Mosesa1af3292021-12-15 11:47:01 +053053 // find matching name in the registry and call factory method.
Naveen Moseseea8a4a2022-02-18 01:14:15 +053054 auto objectIter = buttonIfaceRegistry.find(name);
55 if (objectIter != buttonIfaceRegistry.end())
56 {
57 return objectIter->second(bus, event, buttonCfg);
58 }
59 else
60 {
61 return nullptr;
62 }
Naveen Mosesa1af3292021-12-15 11:47:01 +053063 }
64
65 private:
66 // This map is the registry for keeping supported button interface types.
67 std::unordered_map<std::string, buttonIfCreatorMethod> buttonIfaceRegistry;
68};
69
70template <class T>
71class ButtonIFRegister
72{
73 public:
74 ButtonIFRegister()
75 {
76 // register the class factory function
77 ButtonFactory::instance().addToRegistry<T>();
78 }
Patrick Williams0d038f52023-05-10 07:50:40 -050079};