diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-10-20 09:07:14 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-10-20 09:15:50 +0200 |
| commit | 100ca4f3cd27b98a3ffd9bbc51ff2d3433a0d69c (patch) | |
| tree | f5d7ec0d67a5230b52e45a0cf7eb0d0364f079af /src/bt.cc | |
| parent | 5c28de350264afbc7747c9b78cae4ac498a1211a (diff) | |
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.
Diffstat (limited to 'src/bt.cc')
| -rw-r--r-- | src/bt.cc | 39 |
1 files changed, 29 insertions, 10 deletions
@@ -21,11 +21,30 @@ #include <sdbus-c++/ProxyInterfaces.h> #include <sdbus-c++/StandardInterfaces.h> #include <sdbus-c++/Types.h> +#include <sdbus-c++/TypeTraits.h> #include <sdbus-c++/VTableItems.h> #include <string> #include <utility> #include <vector> +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<Void> : sdbus::signature_of<void> {}; + namespace bt { namespace { @@ -629,8 +648,8 @@ class AgentObject { }), sdbus::registerMethod("RequestConfirmation") .withInputParamNames("device", "passkey") - .withOutputParamNames("result") - .implementedAs([this](sdbus::Result<sdbus::Variant>&& result, + .withNoReply() + .implementedAs([this](sdbus::Result<Void>&& 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<sdbus::Variant>&& result, + .withNoReply() + .implementedAs([this](sdbus::Result<Void>&& 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<sdbus::Variant>&& result, + .withNoReply() + .implementedAs([this](sdbus::Result<Void>&& 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<sdbus::Result<std::string>> pending_pincode_; std::optional<sdbus::Result<uint32_t>> pending_passkey_; - std::optional<sdbus::Result<sdbus::Variant>> pending_confirm_; + std::optional<sdbus::Result<Void>> pending_confirm_; }; class ManagerImpl : public Manager, public IManager, looper::Hook { |
