summaryrefslogtreecommitdiff
path: root/src/bt.cc
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-10-20 09:07:14 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-10-20 09:15:50 +0200
commit100ca4f3cd27b98a3ffd9bbc51ff2d3433a0d69c (patch)
treef5d7ec0d67a5230b52e45a0cf7eb0d0364f079af /src/bt.cc
parent5c28de350264afbc7747c9b78cae4ac498a1211a (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.cc39
1 files changed, 29 insertions, 10 deletions
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 <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 {