fix issue 145, signals are not filtered by sender

This commit is contained in:
riuriuriu
2021-03-30 11:42:58 +02:00
committed by Urs Ritzmann
parent b9723850b8
commit d47e9d1834
4 changed files with 19 additions and 11 deletions

View File

@ -289,7 +289,8 @@ void Connection::emitInterfacesRemovedSignal( const std::string& objectPath
SDBUS_THROW_ERROR_IF(r < 0, "Failed to emit InterfacesRemoved signal", -r); SDBUS_THROW_ERROR_IF(r < 0, "Failed to emit InterfacesRemoved signal", -r);
} }
SlotPtr Connection::registerSignalHandler( const std::string& objectPath SlotPtr Connection::registerSignalHandler( const std::string& sender
, const std::string& objectPath
, const std::string& interfaceName , const std::string& interfaceName
, const std::string& signalName , const std::string& signalName
, sd_bus_message_handler_t callback , sd_bus_message_handler_t callback
@ -297,7 +298,9 @@ SlotPtr Connection::registerSignalHandler( const std::string& objectPath
{ {
sd_bus_slot *slot{}; sd_bus_slot *slot{};
auto filter = composeSignalMatchFilter(objectPath, interfaceName, signalName); // alternatively to our own composeSignalMatchFilter() implementation, we could also use sd_bus_match_signal() from
// https://www.freedesktop.org/software/systemd/man/sd_bus_add_match.html#
auto filter = composeSignalMatchFilter(sender, objectPath, interfaceName, signalName);
auto r = iface_->sd_bus_add_match(bus_.get(), &slot, filter.c_str(), callback, userData); auto r = iface_->sd_bus_add_match(bus_.get(), &slot, filter.c_str(), callback, userData);
SDBUS_THROW_ERROR_IF(r < 0, "Failed to register signal handler", -r); SDBUS_THROW_ERROR_IF(r < 0, "Failed to register signal handler", -r);
@ -417,13 +420,15 @@ bool Connection::waitForNextRequest()
return true; return true;
} }
std::string Connection::composeSignalMatchFilter( const std::string& objectPath std::string Connection::composeSignalMatchFilter(const std::string &sender,
, const std::string& interfaceName const std::string &objectPath,
, const std::string& signalName ) const std::string &interfaceName,
const std::string &signalName)
{ {
std::string filter; std::string filter;
filter += "type='signal',"; filter += "type='signal',";
filter += "sender='" + sender + "',";
filter += "interface='" + interfaceName + "',"; filter += "interface='" + interfaceName + "',";
filter += "member='" + signalName + "',"; filter += "member='" + signalName + "',";
filter += "path='" + objectPath + "'"; filter += "path='" + objectPath + "'";

View File

@ -99,7 +99,8 @@ namespace sdbus::internal {
void emitInterfacesRemovedSignal( const std::string& objectPath void emitInterfacesRemovedSignal( const std::string& objectPath
, const std::vector<std::string>& interfaces ) override; , const std::vector<std::string>& interfaces ) override;
SlotPtr registerSignalHandler( const std::string& objectPath SlotPtr registerSignalHandler( const std::string& sender
, const std::string& objectPath
, const std::string& interfaceName , const std::string& interfaceName
, const std::string& signalName , const std::string& signalName
, sd_bus_message_handler_t callback , sd_bus_message_handler_t callback
@ -115,9 +116,9 @@ namespace sdbus::internal {
BusPtr openBus(const std::function<int(sd_bus**)>& busFactory); BusPtr openBus(const std::function<int(sd_bus**)>& busFactory);
void finishHandshake(sd_bus* bus); void finishHandshake(sd_bus* bus);
bool waitForNextRequest(); bool waitForNextRequest();
static std::string composeSignalMatchFilter( const std::string& objectPath static std::string composeSignalMatchFilter(const std::string &sender, const std::string &objectPath,
, const std::string& interfaceName const std::string &interfaceName,
, const std::string& signalName ); const std::string &signalName);
void notifyEventLoopToExit(); void notifyEventLoopToExit();
void clearExitNotification(); void clearExitNotification();
void joinWithEventLoop(); void joinWithEventLoop();

View File

@ -82,7 +82,8 @@ namespace sdbus::internal {
[[nodiscard]] virtual SlotPtr addObjectManager(const std::string& objectPath, void* /*dummy*/ = nullptr) = 0; [[nodiscard]] virtual SlotPtr addObjectManager(const std::string& objectPath, void* /*dummy*/ = nullptr) = 0;
[[nodiscard]] virtual SlotPtr registerSignalHandler( const std::string& objectPath [[nodiscard]] virtual SlotPtr registerSignalHandler( const std::string& sender
, const std::string& objectPath
, const std::string& interfaceName , const std::string& interfaceName
, const std::string& signalName , const std::string& signalName
, sd_bus_message_handler_t callback , sd_bus_message_handler_t callback

View File

@ -183,7 +183,8 @@ void Proxy::registerSignalHandlers(sdbus::internal::IConnection& connection)
{ {
const auto& signalName = signalItem.first; const auto& signalName = signalItem.first;
auto& slot = signalItem.second.slot_; auto& slot = signalItem.second.slot_;
slot = connection.registerSignalHandler( objectPath_ slot = connection.registerSignalHandler( destination_
, objectPath_
, interfaceName , interfaceName
, signalName , signalName
, &Proxy::sdbus_signal_handler , &Proxy::sdbus_signal_handler