From fd4745ec554a95ea98230fcede779421ad89e363 Mon Sep 17 00:00:00 2001 From: Ian Coolidge Date: Mon, 13 Jul 2015 18:22:46 -0700 Subject: [PATCH] service: Some fixes from end-to-end/user testing. * Send responses to ExecWrite requests. * Provide valid data on write responses. * Properly destruct Gatt::Server objects. * Synchronize CoreStack 'enable' calls properly. Change-Id: I4e9eed1979b10abccc7ae487e2c7d90d491e38d9 --- service/core_stack.cpp | 4 ++-- service/gatt_server.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/service/core_stack.cpp b/service/core_stack.cpp index 0b77b4a4b..5e63c36d4 100644 --- a/service/core_stack.cpp +++ b/service/core_stack.cpp @@ -39,8 +39,8 @@ bool instantiated = false; void AdapterStateChangedCallback(bt_state_t state) { LOG_INFO(LOG_TAG, "Bluetooth state:%s", BtStateText(state)); - if (state == BT_STATE_ON) - synchronize.notify_one(); + std::lock_guard lock(mutex); + synchronize.notify_one(); } void CallbackThreadCallback(bt_cb_thread_evt evt) { diff --git a/service/gatt_server.cpp b/service/gatt_server.cpp index 98ed0fe3c..03aa54573 100644 --- a/service/gatt_server.cpp +++ b/service/gatt_server.cpp @@ -219,6 +219,9 @@ void RequestWriteCallback(int conn_id, int trans_id, bt_bdaddr_t *bda, response.attr_value.offset = attribute_offset; response.attr_value.len = length; response.attr_value.auth_req = 0; + // Provide written data back to sender for the response. + // Remote stacks use this to validate the success of the write. + std::copy(value, value + length, response.attr_value.value); internal->gatt->server->send_response(conn_id, trans_id, 0, &response); } @@ -228,6 +231,11 @@ void RequestExecWriteCallback(int conn_id, int trans_id, bt_bdaddr_t *bda, LOG_INFO(LOG_TAG, "%s: connection:%d (%s:trans:%d) exec_write:%d", __func__, conn_id, addr.c_str(), trans_id, exec_write); + // This 'response' data is unused for ExecWriteResponses. + // It is only used to pass BlueDroid argument validation. + btgatt_response_t response = {}; + internal->gatt->server->send_response(conn_id, trans_id, 0, &response); + if (!exec_write) return; @@ -476,6 +484,10 @@ ServerInternals::~ServerInternals() { close(pipefd[0]); if (pipefd[1] != INVALID_FD) close(pipefd[1]); + + gatt->server->delete_service(server_if, service_handle); + gatt->server->unregister_server(server_if); + gatt->client->unregister_client(client_if); } Server::Server() : internal_(nullptr) {} -- 2.11.0