OSDN Git Service

service: Some fixes from end-to-end/user testing.
authorIan Coolidge <icoolidge@google.com>
Tue, 14 Jul 2015 01:22:46 +0000 (18:22 -0700)
committerIan Coolidge <icoolidge@google.com>
Tue, 14 Jul 2015 01:31:31 +0000 (18:31 -0700)
* 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
service/gatt_server.cpp

index 0b77b4a..5e63c36 100644 (file)
@@ -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<std::mutex> lock(mutex);
+  synchronize.notify_one();
 }
 
 void CallbackThreadCallback(bt_cb_thread_evt evt) {
index 98ed0fe..03aa545 100644 (file)
@@ -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) {}