From 100ca4f3cd27b98a3ffd9bbc51ff2d3433a0d69c Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Mon, 20 Oct 2025 09:07:14 +0200 Subject: bt: Fix adapter methods Took a while to figure out how to return an empty value for these methods. Combination of withNoReply() and our own Void instance did it. --- src/bt.cc | 39 +++++++++++++++++++++++++++++---------- src/main.cc | 3 ++- 2 files changed, 31 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/bt.cc b/src/bt.cc index 0881859..b8879c6 100644 --- a/src/bt.cc +++ b/src/bt.cc @@ -21,11 +21,30 @@ #include #include #include +#include #include #include #include #include +namespace { + +// Cannot get sdbus::Result to work with void, so this is the workaround. +struct Void { + static Void const kInstance; +}; + +Void const Void::kInstance; + +sdbus::Message& operator<<(sdbus::Message& msg, const Void& /* ignored */) { + return msg; +} + +} // namespace + +template <> +struct sdbus::signature_of : sdbus::signature_of {}; + namespace bt { namespace { @@ -629,8 +648,8 @@ class AgentObject { }), sdbus::registerMethod("RequestConfirmation") .withInputParamNames("device", "passkey") - .withOutputParamNames("result") - .implementedAs([this](sdbus::Result&& result, + .withNoReply() + .implementedAs([this](sdbus::Result&& result, sdbus::ObjectPath const& device, uint32_t passkey) { cancel_pending(); @@ -640,7 +659,7 @@ class AgentObject { if (!pending_confirm_.has_value()) return; if (ok) { - pending_confirm_->returnResults({}); + pending_confirm_->returnResults(Void::kInstance); } else { pending_confirm_->returnError( sdbus::Error{kErrorRejected}); @@ -650,8 +669,8 @@ class AgentObject { }), sdbus::registerMethod("RequestAuthorization") .withInputParamNames("device") - .withOutputParamNames("result") - .implementedAs([this](sdbus::Result&& result, + .withNoReply() + .implementedAs([this](sdbus::Result&& result, sdbus::ObjectPath const& device) { cancel_pending(); pending_confirm_ = std::move(result); @@ -659,7 +678,7 @@ class AgentObject { if (!pending_confirm_.has_value()) return; if (ok) { - pending_confirm_->returnResults({}); + pending_confirm_->returnResults(Void::kInstance); } else { pending_confirm_->returnError( sdbus::Error{kErrorRejected}); @@ -669,8 +688,8 @@ class AgentObject { }), sdbus::registerMethod("AuthorizeService") .withInputParamNames("device", "uuid") - .withOutputParamNames("result") - .implementedAs([this](sdbus::Result&& result, + .withNoReply() + .implementedAs([this](sdbus::Result&& result, sdbus::ObjectPath const& device, std::string const& uuid) { cancel_pending(); @@ -680,7 +699,7 @@ class AgentObject { if (!pending_confirm_.has_value()) return; if (ok) { - pending_confirm_->returnResults({}); + pending_confirm_->returnResults(Void::kInstance); } else { pending_confirm_->returnError( sdbus::Error{kErrorRejected}); @@ -722,7 +741,7 @@ class AgentObject { std::optional> pending_pincode_; std::optional> pending_passkey_; - std::optional> pending_confirm_; + std::optional> pending_confirm_; }; class ManagerImpl : public Manager, public IManager, looper::Hook { diff --git a/src/main.cc b/src/main.cc index 4555473..b98d06a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -237,7 +237,8 @@ class BluetoothManagerDelegate : public bt::Manager::Delegate, public Api { std::function callback) override { logger_.info(std::format("Device request confirmation: {} {}", device.name(), passkey)); - callback(false); + // Confirm all + callback(true); } void agent_request_authorization( -- cgit v1.2.3-70-g09d2