mirror of
https://github.com/Kistler-Group/sdbus-cpp.git
synced 2025-07-30 10:07:16 +02:00
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:
@ -630,11 +630,14 @@ Slot Connection::registerSignalHandler( const std::string& sender
|
|||||||
{
|
{
|
||||||
sd_bus_slot *slot{};
|
sd_bus_slot *slot{};
|
||||||
|
|
||||||
// Alternatively to our own composeSignalMatchFilter() implementation, we could use sd_bus_match_signal() from
|
auto r = sdbus_->sd_bus_match_signal( bus_.get()
|
||||||
// https://www.freedesktop.org/software/systemd/man/sd_bus_add_match.html .
|
, &slot
|
||||||
// But this would require libsystemd v237 or higher.
|
, !sender.empty() ? sender.c_str() : nullptr
|
||||||
auto filter = composeSignalMatchFilter(sender, objectPath, interfaceName, signalName);
|
, !objectPath.empty() ? objectPath.c_str() : nullptr
|
||||||
auto r = sdbus_->sd_bus_add_match(bus_.get(), &slot, filter.c_str(), callback, userData);
|
, !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);
|
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());
|
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*> Connection::to_strv(const std::vector<std::string>& strings)
|
||||||
{
|
{
|
||||||
std::vector</*const */char*> strv;
|
std::vector</*const */char*> strv;
|
||||||
|
@ -153,10 +153,6 @@ namespace sdbus::internal {
|
|||||||
bool waitForNextEvent();
|
bool waitForNextEvent();
|
||||||
|
|
||||||
bool arePendingMessagesInReadQueue() const;
|
bool arePendingMessagesInReadQueue() const;
|
||||||
static std::string composeSignalMatchFilter( const std::string &sender
|
|
||||||
, const std::string &objectPath
|
|
||||||
, const std::string &interfaceName
|
|
||||||
, const std::string &signalName);
|
|
||||||
|
|
||||||
void notifyEventLoopToExit();
|
void notifyEventLoopToExit();
|
||||||
void notifyEventLoopToWakeUpFromPoll();
|
void notifyEventLoopToWakeUpFromPoll();
|
||||||
|
@ -81,6 +81,7 @@ namespace sdbus::internal {
|
|||||||
virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) = 0;
|
virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) = 0;
|
||||||
virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) = 0;
|
virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) = 0;
|
||||||
virtual int sd_bus_add_match_async(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata) = 0;
|
virtual int sd_bus_add_match_async(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata) = 0;
|
||||||
|
virtual int sd_bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t callback, void *userdata) = 0;
|
||||||
virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) = 0;
|
virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) = 0;
|
||||||
|
|
||||||
virtual int sd_bus_new(sd_bus **ret) = 0;
|
virtual int sd_bus_new(sd_bus **ret) = 0;
|
||||||
|
@ -358,6 +358,13 @@ int SdBus::sd_bus_add_match_async(sd_bus *bus, sd_bus_slot **slot, const char *m
|
|||||||
return ::sd_bus_add_match_async(bus, slot, match, callback, install_callback, userdata);
|
return ::sd_bus_add_match_async(bus, slot, match, callback, install_callback, userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SdBus::sd_bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t callback, void *userdata)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(sdbusMutex_);
|
||||||
|
|
||||||
|
return ::sd_bus_match_signal(bus, ret, sender, path, interface, member, callback, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
sd_bus_slot* SdBus::sd_bus_slot_unref(sd_bus_slot *slot)
|
sd_bus_slot* SdBus::sd_bus_slot_unref(sd_bus_slot *slot)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(sdbusMutex_);
|
std::lock_guard lock(sdbusMutex_);
|
||||||
|
@ -73,6 +73,7 @@ public:
|
|||||||
virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) override;
|
virtual int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path) override;
|
||||||
virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) override;
|
virtual int sd_bus_add_match(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata) override;
|
||||||
virtual int sd_bus_add_match_async(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata) override;
|
virtual int sd_bus_add_match_async(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata) override;
|
||||||
|
virtual int sd_bus_match_signal(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t callback, void *userdata) override;
|
||||||
virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) override;
|
virtual sd_bus_slot* sd_bus_slot_unref(sd_bus_slot *slot) override;
|
||||||
|
|
||||||
virtual int sd_bus_new(sd_bus **ret) override;
|
virtual int sd_bus_new(sd_bus **ret) override;
|
||||||
|
@ -72,6 +72,7 @@ public:
|
|||||||
MOCK_METHOD3(sd_bus_add_object_manager, int(sd_bus *bus, sd_bus_slot **slot, const char *path));
|
MOCK_METHOD3(sd_bus_add_object_manager, int(sd_bus *bus, sd_bus_slot **slot, const char *path));
|
||||||
MOCK_METHOD5(sd_bus_add_match, int(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata));
|
MOCK_METHOD5(sd_bus_add_match, int(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, void *userdata));
|
||||||
MOCK_METHOD6(sd_bus_add_match_async, int(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata));
|
MOCK_METHOD6(sd_bus_add_match_async, int(sd_bus *bus, sd_bus_slot **slot, const char *match, sd_bus_message_handler_t callback, sd_bus_message_handler_t install_callback, void *userdata));
|
||||||
|
MOCK_METHOD8(sd_bus_match_signal, int(sd_bus *bus, sd_bus_slot **ret, const char *sender, const char *path, const char *interface, const char *member, sd_bus_message_handler_t callback, void *userdata));
|
||||||
MOCK_METHOD1(sd_bus_slot_unref, sd_bus_slot*(sd_bus_slot *slot));
|
MOCK_METHOD1(sd_bus_slot_unref, sd_bus_slot*(sd_bus_slot *slot));
|
||||||
|
|
||||||
MOCK_METHOD1(sd_bus_new, int(sd_bus **ret));
|
MOCK_METHOD1(sd_bus_new, int(sd_bus **ret));
|
||||||
|
Reference in New Issue
Block a user