From 4bdc46e25732f82b2f1fc8eb3ef4c132c17c3e2f Mon Sep 17 00:00:00 2001 From: Vibhav Pant Date: Mon, 11 Sep 2023 18:41:49 +0530 Subject: [PATCH] Make all calls to WriteValue synchronous for now. --- .../linux/bluez_gatt_characteristic_server.cc | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/internal/platform/implementation/linux/bluez_gatt_characteristic_server.cc b/internal/platform/implementation/linux/bluez_gatt_characteristic_server.cc index 4f104a82..f6404283 100644 --- a/internal/platform/implementation/linux/bluez_gatt_characteristic_server.cc +++ b/internal/platform/implementation/linux/bluez_gatt_characteristic_server.cc @@ -144,40 +144,41 @@ void GattCharacteristicServer::WriteValue( std::string data(value.begin(), value.end()); auto characteristic = characteristic_; - if (type != "command") { - server_cb_->on_characteristic_write_cb( - *device, characteristic, static_cast(offset), data, - [result = std::move(result)](absl::Status status) { - if (status.ok()) { - result.returnResults(); - } else if (absl::IsPermissionDenied(status)) { - result.returnError(sdbus::Error("org.bluez.Error.NotPermitted", - std::string(status.message()))); - } else if (absl::IsUnauthenticated(status)) { - result.returnError(sdbus::Error("org.bluez.Error.NotAuthorized", - std::string(status.message()))); - } else if (absl::IsOutOfRange(status)) { - result.returnError(sdbus::Error("org.bluez.Error.InvalidOffset", - std::string(status.message()))); - } else if (absl::IsUnimplemented(status)) { - result.returnError(sdbus::Error("org.bluez.Error.NotSupported", - std::string(status.message()))); - } else { - result.returnError(sdbus::Error("org.bluez.Error.Failed", - std::string(status.message()))); - } - }); - } else { - result.returnResults(); - } + // TODO: Support writes without response. + server_cb_->on_characteristic_write_cb( + *device, characteristic, static_cast(offset), data, + [result = std::move(result)](absl::Status status) { + if (status.ok()) { + result.returnResults(); + } else if (absl::IsPermissionDenied(status)) { + result.returnError(sdbus::Error("org.bluez.Error.NotPermitted", + std::string(status.message()))); + } else if (absl::IsUnauthenticated(status)) { + result.returnError(sdbus::Error("org.bluez.Error.NotAuthorized", + std::string(status.message()))); + } else if (absl::IsOutOfRange(status)) { + result.returnError(sdbus::Error("org.bluez.Error.InvalidOffset", + std::string(status.message()))); + } else if (absl::IsUnimplemented(status)) { + result.returnError(sdbus::Error("org.bluez.Error.NotSupported", + std::string(status.message()))); + } else { + result.returnError(sdbus::Error("org.bluez.Error.Failed", + std::string(status.message()))); + } + }); } void GattCharacteristicServer::StartNotify() { if ((characteristic_.property | api::ble_v2::GattCharacteristic::Property::kNotify) == api::ble_v2::GattCharacteristic::Property::kNotify) { - server_cb_->characteristic_subscription_cb(characteristic_); - notifying_ = true; + if (notify_sessions_.fetch_add(1) == 0) { + if (server_cb_->characteristic_subscription_cb != nullptr) { + server_cb_->characteristic_subscription_cb(characteristic_); + } + notifying_ = true; + } } else { throw(sdbus::Error("org.bluez.Error.NotSupported")); }