| #include <sdbusplus/bus.hpp> |
| #include <sdbusplus/exception.hpp> |
| |
| namespace sdbusplus::bus |
| { |
| |
| void bus::emit_interfaces_added(const char* path, |
| const std::vector<std::string>& ifaces) |
| { |
| details::Strv s{ifaces}; |
| _intf->sd_bus_emit_interfaces_added_strv(_bus.get(), path, |
| static_cast<char**>(s)); |
| } |
| |
| void bus::emit_interfaces_removed(const char* path, |
| const std::vector<std::string>& ifaces) |
| { |
| details::Strv s{ifaces}; |
| _intf->sd_bus_emit_interfaces_removed_strv(_bus.get(), path, |
| static_cast<char**>(s)); |
| } |
| |
| /* Create a new default connection: system bus if root, session bus if user. */ |
| bus new_default() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_default(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| return bus(b, std::false_type()); |
| } |
| |
| /* Create a new default connection to the session bus. */ |
| bus new_default_user() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_default_user(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| return bus(b, std::false_type()); |
| } |
| |
| /* Create a new default connection to the system bus. */ |
| bus new_default_system() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_default_system(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| return bus(b, std::false_type()); |
| } |
| |
| /* Create a new connection: system bus if root, session bus if user. */ |
| bus new_bus() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_open(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| bus bus(b, std::false_type()); |
| bus.set_should_close(true); |
| return bus; |
| } |
| |
| /* Create a new connection to the session bus. */ |
| bus new_user() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_open_user(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| bus bus(b, std::false_type()); |
| bus.set_should_close(true); |
| return bus; |
| } |
| |
| /* Create a new connection to the system bus. */ |
| bus new_system() |
| { |
| sd_bus* b = nullptr; |
| auto rc = sd_bus_open_system(&b); |
| if (rc < 0) |
| { |
| throw exception::SdBusError(-rc, __PRETTY_FUNCTION__); |
| } |
| bus bus(b, std::false_type()); |
| bus.set_should_close(true); |
| return bus; |
| } |
| |
| bus::bus(busp_t b, sdbusplus::SdBusInterface* intf) : |
| _intf(intf), _bus(_intf->sd_bus_ref(b), details::BusDeleter(intf)) |
| { |
| // Emitting object added causes a message to get the properties |
| // which can trigger a 'transaction' in the server bindings. If |
| // the bus isn't up far enough, this causes an assert deep in |
| // sd-bus code. Get the 'unique_name' to ensure the bus is up far |
| // enough to avoid the assert. |
| if (b != nullptr) |
| { |
| get_unique_name(); |
| } |
| } |
| |
| bus::bus(busp_t b) : |
| _intf(&sdbus_impl), |
| _bus(_intf->sd_bus_ref(b), details::BusDeleter(&sdbus_impl)) |
| { |
| // Emitting object added causes a message to get the properties |
| // which can trigger a 'transaction' in the server bindings. If |
| // the bus isn't up far enough, this causes an assert deep in |
| // sd-bus code. Get the 'unique_name' to ensure the bus is up far |
| // enough to avoid the assert. |
| if (b != nullptr) |
| { |
| get_unique_name(); |
| } |
| } |
| |
| bus::bus(busp_t b, std::false_type) : |
| _intf(&sdbus_impl), _bus(b, details::BusDeleter(&sdbus_impl)) |
| { |
| // Emitting object added causes a message to get the properties |
| // which can trigger a 'transaction' in the server bindings. If |
| // the bus isn't up far enough, this causes an assert deep in |
| // sd-bus code. Get the 'unique_name' to ensure the bus is up far |
| // enough to avoid the assert. |
| if (b != nullptr) |
| { |
| get_unique_name(); |
| } |
| } |
| |
| } // namespace sdbusplus::bus |