1 #pragma once
2 
3 #include <map>
4 #include <memory>
5 #include <string>
6 #include <vector>
7 #include <sdbusplus/server.hpp>
8 #include "xyz/openbmc_project/Inventory/Manager/server.hpp"
9 #include "events.hpp"
10 #include "actions.hpp"
11 
12 namespace phosphor
13 {
14 namespace inventory
15 {
16 namespace manager
17 {
18 namespace details
19 {
20 
21 template <typename T>
22 using ServerObject = typename sdbusplus::server::object::object<T>;
23 
24 using ManagerIface =
25     sdbusplus::server::xyz::openbmc_project::Inventory::Manager;
26 
27 /** @struct MakeInterface
28  *  @brief Adapt an sdbusplus interface proxy.
29  *
30  *  Template instances are builder functions that create
31  *  adapted sdbusplus interface proxy interface objects.
32  *
33  *  @tparam T - The type of the interface being adapted.
34  */
35 template <typename T>
36 struct MakeInterface
37 {
38     static decltype(auto) make(sdbusplus::bus::bus &bus, const char *path)
39     {
40         using HolderType = holder::Holder<std::unique_ptr<T>>;
41         return static_cast<std::unique_ptr<holder::Base>>(
42             HolderType::template make_unique<HolderType>(
43                 std::forward<std::unique_ptr<T>>(
44                     std::make_unique<T>(
45                         std::forward<decltype(bus)>(bus),
46                         std::forward<decltype(path)>(path)))));
47     }
48 };
49 } // namespace details
50 
51 /** @class Manager
52  *  @brief OpenBMC inventory manager implementation.
53  *
54  *  A concrete implementation for the xyz.openbmc_project.Inventory.Manager
55  *  DBus API.
56  */
57 class Manager final :
58     public details::ServerObject<details::ManagerIface>
59 {
60     public:
61     Manager() = delete;
62     Manager(const Manager&) = delete;
63     Manager& operator=(const Manager&) = delete;
64     Manager(Manager&&) = default;
65     Manager& operator=(Manager&&) = default;
66     ~Manager() = default;
67 
68     /** @brief Construct an inventory manager.
69      *
70      *  @param[in] bus - An sdbusplus bus connection.
71      *  @param[in] busname - The DBus busname to own.
72      *  @param[in] root - The DBus path on which to implement
73      *      an inventory manager.
74      *  @param[in] iface - The DBus inventory interface to implement.
75      */
76     Manager(sdbusplus::bus::bus &&, const char *, const char*, const char*);
77 
78     using Object = std::map<
79         std::string, std::map<
80             std::string, sdbusplus::message::variant<std::string>>>;
81 
82     /** @brief Start processing DBus messages. */
83     void run() noexcept;
84 
85     /** @brief Provided for testing only. */
86     void shutdown() noexcept;
87 
88     /** @brief sd_bus Notify method implementation callback. */
89     void notify(std::string path, Object) override;
90 
91     /** @brief sd_bus signal callback. */
92     void signal(sdbusplus::message::message &, auto &);
93 
94     /** @brief Drop an object from DBus. */
95     void destroyObject(const char *);
96 
97     using Event = std::tuple<
98         const char *,
99         details::FilterBasePtr,
100         std::vector<details::ActionBasePtr>>;
101     using SigArgs = std::vector<
102         std::unique_ptr<
103             std::tuple<
104                 Manager *,
105                 const Event *>>>;
106     using SigArg = SigArgs::value_type::element_type;
107 
108     private:
109     using HolderPtr = std::unique_ptr<details::holder::Base>;
110     using InterfaceComposite = std::map<std::string, HolderPtr>;
111     using ObjectReferences = std::map<std::string, InterfaceComposite>;
112     using Events = std::map<const char *, Event>;
113     using MakerType = HolderPtr(*)(
114             sdbusplus::bus::bus &, const char *);
115     using Makers = std::map<std::string, MakerType>;
116 
117     /** @brief Provided for testing only. */
118     bool _shutdown;
119 
120     /** @brief Path prefix applied to any relative paths. */
121     const char * _root;
122 
123     /** @brief A container of sdbusplus server interface references. */
124     ObjectReferences _refs;
125 
126     /** @brief A container contexts for signal callbacks. */
127     SigArgs _sigargs;
128 
129     /** @brief A container of sdbusplus signal matches.  */
130     std::vector<sdbusplus::server::match::match> _matches;
131 
132     /** @brief Persistent sdbusplus DBus bus connection. */
133     sdbusplus::bus::bus _bus;
134 
135     /** @brief sdbusplus org.freedesktop.DBus.ObjectManager reference. */
136     sdbusplus::server::manager::manager _manager;
137 
138     /** @brief A container of pimgen generated events and responses.  */
139     static const Events _events;
140 
141     /** @brief A container of pimgen generated factory methods.  */
142     static const Makers _makers;
143 };
144 
145 } // namespace manager
146 } // namespace inventory
147 } // namespace phosphor
148 
149 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
150