blob: e6c08bf4f5f77e6547772ee0f6d59c229f13aece [file] [log] [blame]
Brad Bishop49aefb32016-10-19 11:54:14 -04001#pragma once
2
3#include <map>
4#include <memory>
5#include <string>
6#include <vector>
7#include <sdbusplus/server.hpp>
Brad Bishope30dd772016-11-12 21:39:28 -05008#include "xyz/openbmc_project/Inventory/Manager/server.hpp"
Brad Bishop67b788d2016-11-29 13:09:01 -05009#include "events.hpp"
Brad Bishopc038e012016-10-19 13:02:24 -040010#include "actions.hpp"
Brad Bishop1157af12017-01-22 01:03:02 -050011#include "types.hpp"
Brad Bishop49aefb32016-10-19 11:54:14 -040012
13namespace phosphor
14{
15namespace inventory
16{
17namespace manager
18{
19namespace details
20{
Brad Bishop451f8d92016-11-21 14:15:19 -050021
22template <typename T>
23using ServerObject = typename sdbusplus::server::object::object<T>;
24
25using ManagerIface =
Brad Bishop9aa5e2f2017-01-15 19:45:40 -050026 sdbusplus::xyz::openbmc_project::Inventory::server::Manager;
Brad Bishop451f8d92016-11-21 14:15:19 -050027
Brad Bishop65ffffa2016-11-29 12:31:31 -050028/** @struct MakeInterface
29 * @brief Adapt an sdbusplus interface proxy.
30 *
31 * Template instances are builder functions that create
32 * adapted sdbusplus interface proxy interface objects.
33 *
34 * @tparam T - The type of the interface being adapted.
35 */
36template <typename T>
37struct MakeInterface
38{
Brad Bishop90c30bc2017-01-22 16:40:47 -050039 static std::unique_ptr<details::holder::Base> make(
40 sdbusplus::bus::bus& bus,
41 const char* path,
42 const Interface& props,
43 bool deferSignals)
Brad Bishop65ffffa2016-11-29 12:31:31 -050044 {
Brad Bishop90c30bc2017-01-22 16:40:47 -050045 // TODO: pass props to import constructor...
Brad Bishop65ffffa2016-11-29 12:31:31 -050046 using HolderType = holder::Holder<std::unique_ptr<T>>;
Brad Bishop90c30bc2017-01-22 16:40:47 -050047 return HolderType::template make_unique<HolderType>(
48 std::forward<std::unique_ptr<T>>(
49 std::make_unique<T>(
50 std::forward<decltype(bus)>(bus),
51 std::forward<decltype(path)>(path),
52 std::forward<decltype(deferSignals)>(deferSignals))));
Brad Bishop65ffffa2016-11-29 12:31:31 -050053 }
54};
Brad Bishop49aefb32016-10-19 11:54:14 -040055} // namespace details
56
57/** @class Manager
58 * @brief OpenBMC inventory manager implementation.
59 *
60 * A concrete implementation for the xyz.openbmc_project.Inventory.Manager
61 * DBus API.
62 */
63class Manager final :
Brad Bishop451f8d92016-11-21 14:15:19 -050064 public details::ServerObject<details::ManagerIface>
Brad Bishop49aefb32016-10-19 11:54:14 -040065{
66 public:
Brad Bishop7b337772017-01-12 16:11:24 -050067 Manager() = delete;
68 Manager(const Manager&) = delete;
69 Manager& operator=(const Manager&) = delete;
70 Manager(Manager&&) = default;
71 Manager& operator=(Manager&&) = default;
72 ~Manager() = default;
Brad Bishop49aefb32016-10-19 11:54:14 -040073
Brad Bishop7b337772017-01-12 16:11:24 -050074 /** @brief Construct an inventory manager.
75 *
76 * @param[in] bus - An sdbusplus bus connection.
77 * @param[in] busname - The DBus busname to own.
78 * @param[in] root - The DBus path on which to implement
79 * an inventory manager.
80 * @param[in] iface - The DBus inventory interface to implement.
81 */
82 Manager(sdbusplus::bus::bus&&, const char*, const char*, const char*);
Brad Bishop49aefb32016-10-19 11:54:14 -040083
Brad Bishop7b337772017-01-12 16:11:24 -050084 using EventInfo = std::tuple <
85 std::vector<details::EventBasePtr>,
86 std::vector<details::ActionBasePtr >>;
Brad Bishop49aefb32016-10-19 11:54:14 -040087
Brad Bishop7b337772017-01-12 16:11:24 -050088 /** @brief Start processing DBus messages. */
89 void run() noexcept;
Brad Bishop49aefb32016-10-19 11:54:14 -040090
Brad Bishop7b337772017-01-12 16:11:24 -050091 /** @brief Provided for testing only. */
92 void shutdown() noexcept;
Brad Bishop49aefb32016-10-19 11:54:14 -040093
Brad Bishop7b337772017-01-12 16:11:24 -050094 /** @brief sd_bus Notify method implementation callback. */
Brad Bishop9aa5e2f2017-01-15 19:45:40 -050095 void notify(sdbusplus::message::object_path, Object) override;
Brad Bishop49aefb32016-10-19 11:54:14 -040096
Brad Bishop48547a82017-01-19 15:12:50 -050097 /** @brief Event processing entry point. */
98 void handleEvent(sdbusplus::message::message&,
99 const details::Event& event,
100 const EventInfo& info);
Brad Bishop49aefb32016-10-19 11:54:14 -0400101
Brad Bishop7b7e7122017-01-21 21:21:46 -0500102 /** @brief Drop one or more objects from DBus. */
103 void destroyObjects(
104 const std::vector<const char*>& paths);
Brad Bishop656a7d02016-10-19 22:20:02 -0400105
Brad Bishopeb68a682017-01-22 00:58:54 -0500106 /** @brief Add objects to DBus. */
107 void createObjects(
108 const std::map<sdbusplus::message::object_path, Object>& objs);
109
Brad Bishop7b337772017-01-12 16:11:24 -0500110 /** @brief Invoke an sdbusplus server binding method.
111 *
112 * Invoke the requested method with a reference to the requested
113 * sdbusplus server binding interface as a parameter.
114 *
115 * @tparam T - The sdbusplus server binding interface type.
116 * @tparam U - The type of the sdbusplus server binding member.
117 * @tparam Args - Argument types of the binding member.
118 *
119 * @param[in] path - The DBus path on which the method should
120 * be invoked.
121 * @param[in] interface - The DBus interface hosting the method.
122 * @param[in] member - Pointer to sdbusplus server binding member.
123 * @param[in] args - Arguments to forward to the binding member.
124 *
125 * @returns - The return/value type of the binding method being
126 * called.
127 */
128 template<typename T, typename U, typename ...Args>
129 decltype(auto) invokeMethod(const char* path, const char* interface,
130 U&& member, Args&& ...args)
131 {
132 auto& holder = getInterface<std::unique_ptr<T>>(path, interface);
133 auto& iface = *holder.get();
134 return (iface.*member)(std::forward<Args>(args)...);
135 }
Brad Bishopda649b12016-11-30 14:35:02 -0500136
Brad Bishop7b337772017-01-12 16:11:24 -0500137 using SigArgs = std::vector <
138 std::unique_ptr <
139 std::tuple <
140 Manager*,
141 const details::DbusSignal*,
142 const EventInfo* >>>;
143 using SigArg = SigArgs::value_type::element_type;
Brad Bishop49aefb32016-10-19 11:54:14 -0400144
145 private:
Brad Bishop7b337772017-01-12 16:11:24 -0500146 using HolderPtr = std::unique_ptr<details::holder::Base>;
147 using InterfaceComposite = std::map<std::string, HolderPtr>;
148 using ObjectReferences = std::map<std::string, InterfaceComposite>;
149 using Events = std::vector<EventInfo>;
Brad Bishop90c30bc2017-01-22 16:40:47 -0500150
151 // The int instantiation is safe since the signature of these
152 // functions don't change from one instantiation to the next.
153 using MakerType = std::add_pointer_t <
154 decltype(details::MakeInterface<int>::make) >;
155 using Makers = std::map<std::string, std::tuple<MakerType>>;
Brad Bishop49aefb32016-10-19 11:54:14 -0400156
Brad Bishop7b337772017-01-12 16:11:24 -0500157 /** @brief Provides weak references to interface holders.
158 *
159 * Common code for all types for the templated getInterface
160 * methods.
161 *
162 * @param[in] path - The DBus path for which the interface
163 * holder instance should be provided.
164 * @param[in] interface - The DBus interface for which the
165 * holder instance should be provided.
166 *
167 * @returns A weak reference to the holder instance.
168 */
169 details::holder::Base& getInterfaceHolder(
170 const char*, const char*) const;
171 details::holder::Base& getInterfaceHolder(
172 const char*, const char*);
Brad Bishopb83a21e2016-11-30 13:43:37 -0500173
Brad Bishop7b337772017-01-12 16:11:24 -0500174 /** @brief Provides weak references to interface holders.
175 *
176 * @tparam T - The sdbusplus server binding interface type.
177 *
178 * @param[in] path - The DBus path for which the interface
179 * should be provided.
180 * @param[in] interface - The DBus interface to obtain.
181 *
182 * @returns A weak reference to the interface holder.
183 */
184 template<typename T>
185 auto& getInterface(const char* path, const char* interface)
186 {
187 auto& holder = getInterfaceHolder(path, interface);
188 return static_cast <
189 details::holder::Holder<T>& >(holder);
190 }
191 template<typename T>
192 auto& getInterface(const char* path, const char* interface) const
193 {
194 auto& holder = getInterfaceHolder(path, interface);
195 return static_cast <
196 const details::holder::Holder<T>& >(holder);
197 }
Brad Bishopb83a21e2016-11-30 13:43:37 -0500198
Brad Bishop7b337772017-01-12 16:11:24 -0500199 /** @brief Provided for testing only. */
Brad Bishopb9b929b2017-01-13 16:33:06 -0500200 volatile bool _shutdown;
Brad Bishop49aefb32016-10-19 11:54:14 -0400201
Brad Bishop7b337772017-01-12 16:11:24 -0500202 /** @brief Path prefix applied to any relative paths. */
203 const char* _root;
Brad Bishop49aefb32016-10-19 11:54:14 -0400204
Brad Bishop7b337772017-01-12 16:11:24 -0500205 /** @brief A container of sdbusplus server interface references. */
206 ObjectReferences _refs;
Brad Bishop49aefb32016-10-19 11:54:14 -0400207
Brad Bishop7b337772017-01-12 16:11:24 -0500208 /** @brief A container contexts for signal callbacks. */
209 SigArgs _sigargs;
Brad Bishop49aefb32016-10-19 11:54:14 -0400210
Brad Bishop7b337772017-01-12 16:11:24 -0500211 /** @brief A container of sdbusplus signal matches. */
212 std::vector<sdbusplus::server::match::match> _matches;
Brad Bishop49aefb32016-10-19 11:54:14 -0400213
Brad Bishop7b337772017-01-12 16:11:24 -0500214 /** @brief Persistent sdbusplus DBus bus connection. */
215 sdbusplus::bus::bus _bus;
Brad Bishop49aefb32016-10-19 11:54:14 -0400216
Brad Bishop7b337772017-01-12 16:11:24 -0500217 /** @brief sdbusplus org.freedesktop.DBus.ObjectManager reference. */
218 sdbusplus::server::manager::manager _manager;
Brad Bishop49aefb32016-10-19 11:54:14 -0400219
Brad Bishop7b337772017-01-12 16:11:24 -0500220 /** @brief A container of pimgen generated events and responses. */
221 static const Events _events;
Brad Bishop5fbaa7f2016-10-31 10:42:41 -0500222
Brad Bishop7b337772017-01-12 16:11:24 -0500223 /** @brief A container of pimgen generated factory methods. */
224 static const Makers _makers;
Brad Bishop49aefb32016-10-19 11:54:14 -0400225};
226
227} // namespace manager
228} // namespace inventory
229} // namespace phosphor
230
231// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4