xref: /openbmc/sdbusplus/src/bus/match.cpp (revision 9d8ba9473a5f118e854d0ec326a4275ce57b1e7b)
1fc73b395SWillam A. Kennington III #include <systemd/sd-bus.h>
2fc73b395SWillam A. Kennington III 
3fc73b395SWillam A. Kennington III #include <sdbusplus/bus/match.hpp>
4fc73b395SWillam A. Kennington III #include <sdbusplus/exception.hpp>
5fc73b395SWillam A. Kennington III #include <sdbusplus/message.hpp>
6fc73b395SWillam A. Kennington III 
7fc73b395SWillam A. Kennington III namespace sdbusplus::bus::match
8fc73b395SWillam A. Kennington III {
9fc73b395SWillam A. Kennington III 
makeMatch(SdBusInterface * intf,sd_bus * bus,const char * _match,sd_bus_message_handler_t handler,void * context)10*9d8ba947SWilliam A. Kennington III static slot_t makeMatch(SdBusInterface* intf, sd_bus* bus, const char* _match,
11fc73b395SWillam A. Kennington III                         sd_bus_message_handler_t handler, void* context)
12fc73b395SWillam A. Kennington III {
13fc73b395SWillam A. Kennington III     sd_bus_slot* slot;
14*9d8ba947SWilliam A. Kennington III     int r = intf->sd_bus_add_match(bus, &slot, _match, handler, context);
15fc73b395SWillam A. Kennington III     if (r < 0)
16fc73b395SWillam A. Kennington III     {
17fc73b395SWillam A. Kennington III         throw exception::SdBusError(-r, "sd_bus_match");
18fc73b395SWillam A. Kennington III     }
19*9d8ba947SWilliam A. Kennington III     return slot_t{slot, intf};
20fc73b395SWillam A. Kennington III }
21fc73b395SWillam A. Kennington III 
match(sdbusplus::bus_t & bus,const char * _match,sd_bus_message_handler_t handler,void * context)22fc73b395SWillam A. Kennington III match::match(sdbusplus::bus_t& bus, const char* _match,
23fc73b395SWillam A. Kennington III              sd_bus_message_handler_t handler, void* context) :
24*9d8ba947SWilliam A. Kennington III     _slot(
25*9d8ba947SWilliam A. Kennington III         makeMatch(bus.getInterface(), get_busp(bus), _match, handler, context))
26fc73b395SWillam A. Kennington III {}
27fc73b395SWillam A. Kennington III 
28fc73b395SWillam A. Kennington III // The callback is 'noexcept' because it is called from C code (sd-bus).
matchCallback(sd_bus_message * m,void * context,sd_bus_error *)29fc73b395SWillam A. Kennington III static int matchCallback(sd_bus_message* m, void* context,
30fc73b395SWillam A. Kennington III                          sd_bus_error* /*e*/) noexcept
31fc73b395SWillam A. Kennington III {
32fc73b395SWillam A. Kennington III     auto c = static_cast<match::callback_t*>(context);
33fc73b395SWillam A. Kennington III     message_t message{m};
34fc73b395SWillam A. Kennington III     (*c)(message);
35fc73b395SWillam A. Kennington III     return 0;
36fc73b395SWillam A. Kennington III }
37fc73b395SWillam A. Kennington III 
match(sdbusplus::bus_t & bus,const char * _match,callback_t callback)38fc73b395SWillam A. Kennington III match::match(sdbusplus::bus_t& bus, const char* _match, callback_t callback) :
39fc73b395SWillam A. Kennington III     _callback(std::make_unique<callback_t>(std::move(callback))),
40*9d8ba947SWilliam A. Kennington III     _slot(makeMatch(bus.getInterface(), get_busp(bus), _match, matchCallback,
41*9d8ba947SWilliam A. Kennington III                     _callback.get()))
42fc73b395SWillam A. Kennington III {}
43fc73b395SWillam A. Kennington III 
44fc73b395SWillam A. Kennington III } // namespace sdbusplus::bus::match
45