forked from Kistler-Group/sdbus-cpp
fix issue 145, signals are not filtered by sender
This commit is contained in:
@ -289,7 +289,8 @@ void Connection::emitInterfacesRemovedSignal( const std::string& objectPath
|
||||
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& signalName
|
||||
, sd_bus_message_handler_t callback
|
||||
@ -297,7 +298,9 @@ SlotPtr Connection::registerSignalHandler( const std::string& objectPath
|
||||
{
|
||||
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);
|
||||
|
||||
SDBUS_THROW_ERROR_IF(r < 0, "Failed to register signal handler", -r);
|
||||
@ -417,13 +420,15 @@ bool Connection::waitForNextRequest()
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string Connection::composeSignalMatchFilter( const std::string& objectPath
|
||||
, const std::string& interfaceName
|
||||
, const std::string& signalName )
|
||||
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',";
|
||||
filter += "sender='" + sender + "',";
|
||||
filter += "interface='" + interfaceName + "',";
|
||||
filter += "member='" + signalName + "',";
|
||||
filter += "path='" + objectPath + "'";
|
||||
|
@ -99,7 +99,8 @@ namespace sdbus::internal {
|
||||
void emitInterfacesRemovedSignal( const std::string& objectPath
|
||||
, 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& signalName
|
||||
, sd_bus_message_handler_t callback
|
||||
@ -115,9 +116,9 @@ namespace sdbus::internal {
|
||||
BusPtr openBus(const std::function<int(sd_bus**)>& busFactory);
|
||||
void finishHandshake(sd_bus* bus);
|
||||
bool waitForNextRequest();
|
||||
static std::string composeSignalMatchFilter( const std::string& objectPath
|
||||
, const std::string& interfaceName
|
||||
, const std::string& signalName );
|
||||
static std::string composeSignalMatchFilter(const std::string &sender, const std::string &objectPath,
|
||||
const std::string &interfaceName,
|
||||
const std::string &signalName);
|
||||
void notifyEventLoopToExit();
|
||||
void clearExitNotification();
|
||||
void joinWithEventLoop();
|
||||
|
@ -82,7 +82,8 @@ namespace sdbus::internal {
|
||||
|
||||
[[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& signalName
|
||||
, sd_bus_message_handler_t callback
|
||||
|
@ -183,7 +183,8 @@ void Proxy::registerSignalHandlers(sdbus::internal::IConnection& connection)
|
||||
{
|
||||
const auto& signalName = signalItem.first;
|
||||
auto& slot = signalItem.second.slot_;
|
||||
slot = connection.registerSignalHandler( objectPath_
|
||||
slot = connection.registerSignalHandler( destination_
|
||||
, objectPath_
|
||||
, interfaceName
|
||||
, signalName
|
||||
, &Proxy::sdbus_signal_handler
|
||||
|
Reference in New Issue
Block a user