1 #pragma once
2 
3 #include "physical.hpp"
4 
5 #include <phosphor-logging/lg2.hpp>
6 #include <sdbusplus/bus.hpp>
7 #include <sdbusplus/server/interface.hpp>
8 #include <sdbusplus/vtable.hpp>
9 
10 #include <unordered_map>
11 
12 static constexpr auto busName = "xyz.openbmc_project.LED.Controller";
13 static constexpr auto ledPath = "/xyz/openbmc_project/led";
14 static constexpr auto physParent = "/xyz/openbmc_project/led/physical";
15 static constexpr auto internalInterface =
16     "xyz.openbmc_project.Led.Sysfs.Internal";
17 static constexpr auto ledAddMethod = "AddLED";
18 
19 namespace phosphor
20 {
21 namespace led
22 {
23 namespace sysfs
24 {
25 namespace interface
26 {
27 
28 class InternalInterface
29 {
30   public:
31     InternalInterface() = delete;
32     InternalInterface(const InternalInterface&) = delete;
33     InternalInterface& operator=(const InternalInterface&) = delete;
34     InternalInterface(InternalInterface&&) = delete;
35     InternalInterface& operator=(InternalInterface&&) = delete;
36     virtual ~InternalInterface() = default;
37 
38     /**
39      *  @brief Construct a class to put object onto bus at a dbus path.
40      *
41      *  @param[in] bus  - D-Bus object.
42      *  @param[in] path - D-Bus Path.
43      */
44 
45     InternalInterface(sdbusplus::bus_t& bus, const char* path);
46 
47     /**
48      *  @brief Implementation for the AddLed method to add
49      *  the LED name to dbus path.
50      *
51      *  @param[in] name - LED name to add.
52      */
53 
54     void addLED(const std::string& name);
55 
56     /**
57      *  @brief Implementation for the RemoveLed method to remove
58      *  the LED name to dbus path.
59      *
60      *  @param[in] name - LED name to remove.
61      */
62 
63     void removeLED(const std::string& name);
64 
65     /** @brief Generates LED DBus name from LED description
66      *
67      *  @param[in] name      - LED description
68      *  @return              - DBus LED name
69      */
70 
71     static std::string getDbusName(const LedDescr& ledDescr);
72 
73   private:
74     /**
75      *  @brief  Unordered map to declare the sysfs LEDs
76      */
77 
78     std::unordered_map<std::string, std::unique_ptr<phosphor::led::Physical>>
79         leds;
80 
81     /**
82      *  @brief sdbusplus D-Bus connection.
83      */
84 
85     sdbusplus::bus_t& bus;
86 
87     /**
88      *  @brief Systemd bus callback for the AddLed method.
89      */
90 
91     static int addLedConfigure(sd_bus_message* msg, void* context,
92                                sd_bus_error* error);
93 
94     /**
95      *  @brief Systemd bus callback for the RemoveLed method.
96      */
97 
98     static int removeLedConfigure(sd_bus_message* msg, void* context,
99                                   sd_bus_error* error);
100 
101     /**
102      *  @brief Systemd vtable structure that contains all the
103      *  methods, signals, and properties of this interface with their
104      *  respective systemd attributes
105      */
106 
107     static const std::array<sdbusplus::vtable::vtable_t, 4> vtable;
108 
109     /**
110      *  @brief Support for the dbus based instance of this interface.
111      */
112 
113     sdbusplus::server::interface_t serverInterface;
114 
115     /**
116      *   @brief Implementation to create a dbus path for LED.
117      *
118      *   @param[in] name - LED name.
119      */
120 
121     void createLEDPath(const std::string& ledName);
122 };
123 
124 } // namespace interface
125 } // namespace sysfs
126 } // namespace led
127 } // namespace phosphor
128