1 #pragma once
2 
3 #include <sdbusplus/bus.hpp>
4 #include <sdbusplus/bus/match.hpp>
5 
6 namespace phosphor
7 {
8 namespace button
9 {
10 
11 /**
12  * @class Handler
13  *
14  * This class acts on the signals generated by the
15  * xyz.openbmc_project.Chassis.Buttons code when
16  * it detects button presses.
17  *
18  * There are 3 buttons supported - Power, ID, and Reset.
19  * As not all systems may implement each button, this class will
20  * check for that button on D-Bus before listening for its signals.
21  */
22 class Handler
23 {
24   public:
25     Handler() = delete;
26     ~Handler() = default;
27     Handler(const Handler&) = delete;
28     Handler& operator=(const Handler&) = delete;
29     Handler(Handler&&) = delete;
30     Handler& operator=(Handler&&) = delete;
31 
32     /**
33      * @brief Constructor
34      *
35      * @param[in] bus - sdbusplus connection object
36      */
37     Handler(sdbusplus::bus::bus& bus);
38 
39   private:
40     /**
41      * @brief The handler for a power button press
42      *
43      * It will power on the system if it's currently off,
44      * else it will soft power it off.
45      *
46      * @param[in] msg - sdbusplus message from signal
47      */
48     void powerPressed(sdbusplus::message::message& msg);
49 
50     /**
51      * @brief The handler for a long power button press
52      *
53      * If the system is currently powered on, it will
54      * perform an immediate power off.
55      *
56      * @param[in] msg - sdbusplus message from signal
57      */
58     void longPowerPressed(sdbusplus::message::message& msg);
59 
60     /**
61      * @brief Checks if system is powered on
62      *
63      * @return true if powered on, false else
64      */
65     bool poweredOn() const;
66 
67     /**
68      * @brief Returns the service name for an object
69      *
70      * @param[in] path - the object path
71      * @param[in] interface - the interface name
72      *
73      * @return std::string - the D-Bus service name if found, else
74      *                       an empty string
75      */
76     std::string getService(const std::string& path,
77                            const std::string& interface) const;
78 
79     /**
80      * @brief sdbusplus connection object
81      */
82     sdbusplus::bus::bus& bus;
83 
84     /**
85      * @brief Matches on the power button released signal
86      */
87     std::unique_ptr<sdbusplus::bus::match_t> powerButtonReleased;
88 
89     /**
90      * @brief Matches on the power button long press released signal
91      */
92     std::unique_ptr<sdbusplus::bus::match_t> powerButtonLongPressReleased;
93 };
94 
95 } // namespace button
96 } // namespace phosphor
97