refactor: use sd_bus_match_signal() for signal registration (#372)

sd_bus_match_signal() is more convenient than more general sd_bus_add_match() for signal registration, and requires less code on our side. Plus, systemd of at least v238 is required for sdbus-c++ v2, and this version already ships with sd_bus_match_signal().
This commit is contained in:
Stanislav Angelovič
2023-10-31 13:41:08 +01:00
parent 20a13eeafb
commit c92f5722c7
6 changed files with 18 additions and 26 deletions

View File

@@ -630,11 +630,14 @@ Slot Connection::registerSignalHandler( const std::string& sender
{
sd_bus_slot *slot{};
// Alternatively to our own composeSignalMatchFilter() implementation, we could use sd_bus_match_signal() from
// https://www.freedesktop.org/software/systemd/man/sd_bus_add_match.html .
// But this would require libsystemd v237 or higher.
auto filter = composeSignalMatchFilter(sender, objectPath, interfaceName, signalName);
auto r = sdbus_->sd_bus_add_match(bus_.get(), &slot, filter.c_str(), callback, userData);
auto r = sdbus_->sd_bus_match_signal( bus_.get()
, &slot
, !sender.empty() ? sender.c_str() : nullptr
, !objectPath.empty() ? objectPath.c_str() : nullptr
, !interfaceName.empty() ? interfaceName.c_str() : nullptr
, !signalName.empty() ? signalName.c_str() : nullptr
, callback
, userData );
SDBUS_THROW_ERROR_IF(r < 0, "Failed to register signal handler", -r);
@@ -781,23 +784,6 @@ Message Connection::getCurrentlyProcessedMessage() const
return Message::Factory::create<Message>(sdbusMsg, sdbus_.get());
}
std::string Connection::composeSignalMatchFilter( const std::string &sender
, const std::string &objectPath
, const std::string &interfaceName
, const std::string &signalName )
{
std::string filter;
filter += "type='signal',";
if (!sender.empty())
filter += "sender='" + sender + "',";
filter += "interface='" + interfaceName + "',";
filter += "member='" + signalName + "',";
filter += "path='" + objectPath + "'";
return filter;
}
std::vector</*const */char*> Connection::to_strv(const std::vector<std::string>& strings)
{
std::vector</*const */char*> strv;