Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 445e3bed authored by Ian Coolidge's avatar Ian Coolidge
Browse files

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
parent 77d6f591
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ bool instantiated = false;


void AdapterStateChangedCallback(bt_state_t state) {
void AdapterStateChangedCallback(bt_state_t state) {
  LOG_INFO(LOG_TAG, "Bluetooth state:%s", BtStateText(state));
  LOG_INFO(LOG_TAG, "Bluetooth state:%s", BtStateText(state));
  if (state == BT_STATE_ON)
  std::lock_guard<std::mutex> lock(mutex);
  synchronize.notify_one();
  synchronize.notify_one();
}
}


+12 −0
Original line number Original line Diff line number Diff line
@@ -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.offset = attribute_offset;
  response.attr_value.len = length;
  response.attr_value.len = length;
  response.attr_value.auth_req = 0;
  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);
  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__,
  LOG_INFO(LOG_TAG, "%s: connection:%d (%s:trans:%d) exec_write:%d", __func__,
      conn_id, addr.c_str(), trans_id, exec_write);
      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)
  if (!exec_write)
    return;
    return;


@@ -476,6 +484,10 @@ ServerInternals::~ServerInternals() {
    close(pipefd[0]);
    close(pipefd[0]);
  if (pipefd[1] != INVALID_FD)
  if (pipefd[1] != INVALID_FD)
    close(pipefd[1]);
    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) {}
Server::Server() : internal_(nullptr) {}