14624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//
24624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  Copyright (C) 2015 Google, Inc.
34624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//
44624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  Licensed under the Apache License, Version 2.0 (the "License");
54624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  you may not use this file except in compliance with the License.
64624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  You may obtain a copy of the License at:
74624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//
84624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  http://www.apache.org/licenses/LICENSE-2.0
94624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//
104624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  Unless required by applicable law or agreed to in writing, software
114624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  distributed under the License is distributed on an "AS IS" BASIS,
124624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  See the License for the specific language governing permissions and
144624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//  limitations under the License.
154624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray//
164624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
174624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray#include "service/ipc/binder/bluetooth_gatt_server_binder_server.h"
184624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
194624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray#include <base/logging.h>
204624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
217b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray#include "service/adapter.h"
227b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray
23a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskiusing ::android::String8;
24a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskiusing ::android::String16;
25a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskiusing ::android::binder::Status;
26a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski
27a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskiusing ::android::bluetooth::IBluetoothGattServerCallback;
28a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski
294624e1a6d25a838dad2e72001e340dd77d68179eArman Uguraynamespace ipc {
304624e1a6d25a838dad2e72001e340dd77d68179eArman Uguraynamespace binder {
314624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
327b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguraynamespace {
33bb18c41ffa0370d4eb0c4a15904b114355606466Arman Ugurayconst int kInvalidInstanceId = -1;
347b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray}  // namespace
357b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray
364624e1a6d25a838dad2e72001e340dd77d68179eArman UgurayBluetoothGattServerBinderServer::BluetoothGattServerBinderServer(
37a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::Adapter* adapter)
38a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    : adapter_(adapter) {
394624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray  CHECK(adapter_);
404624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}
414624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
42a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub PawlowskiStatus BluetoothGattServerBinderServer::RegisterServer(
43a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    const ::android::sp<IBluetoothGattServerCallback>& callback,
44a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bool* _aidl_return) {
454624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray  VLOG(2) << __func__;
467b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray  bluetooth::GattServerFactory* gatt_server_factory =
477b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray      adapter_->GetGattServerFactory();
487b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray
49a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  *_aidl_return = RegisterInstanceBase(callback, gatt_server_factory);
50a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
514624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}
524624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
53a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub PawlowskiStatus BluetoothGattServerBinderServer::UnregisterServer(int server_id) {
544624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray  VLOG(2) << __func__;
55bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  UnregisterInstanceBase(server_id);
56a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
574624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}
584624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
59a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub PawlowskiStatus BluetoothGattServerBinderServer::UnregisterAll() {
604624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray  VLOG(2) << __func__;
617b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray  UnregisterAllBase();
62a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
637b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray}
647b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray
65a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub PawlowskiStatus BluetoothGattServerBinderServer::AddService(
66a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    int server_id, const android::bluetooth::BluetoothGattService& service,
67a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bool* _aidl_return) {
6891613743c9db02dbe05d93d2afa163b78068d054Arman Uguray  VLOG(2) << __func__;
693bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
703bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
71bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_server = GetGattServer(server_id);
723bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  if (!gatt_server) {
73bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    LOG(ERROR) << "Unknown server_id: " << server_id;
74a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    *_aidl_return = false;
75a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    return Status::ok();
763bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  }
773bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
783bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  // Create a weak pointer and pass that to the callback to prevent a potential
793bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  // use after free.
803bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  android::wp<BluetoothGattServerBinderServer> weak_ptr_to_this(this);
81a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  auto callback = [=](bluetooth::BLEStatus status,
82a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski                      const bluetooth::Service& service) {
833bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    auto sp_to_this = weak_ptr_to_this.promote();
843bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    if (!sp_to_this.get()) {
853bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray      VLOG(2) << "BluetoothLowEnergyBinderServer was deleted";
863bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray      return;
873bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    }
883bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
893bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    std::lock_guard<std::mutex> lock(*maps_lock());
903bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
91bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    auto gatt_cb = GetGattServerCallback(server_id);
923bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    if (!gatt_cb.get()) {
933bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray      VLOG(2) << "The callback was deleted";
943bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray      return;
953bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray    }
963bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
97a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    gatt_cb->OnServiceAdded(status, service);
983bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  };
993bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
100a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski  if (!gatt_server->AddService(service, callback)) {
101a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    LOG(ERROR) << "Failed to add service";
102a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    *_aidl_return = false;
103a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    return Status::ok();
1043bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  }
1053bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
106a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  *_aidl_return = true;
107a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
1083bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray}
1093bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
110a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub PawlowskiStatus BluetoothGattServerBinderServer::SendResponse(
111a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    int server_id, const String16& device_address, int request_id, int status,
112a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    int offset, const std::vector<uint8_t>& value, bool* _aidl_return) {
113514bf6087093375351784b287cb29c5f4603273cArman Uguray  VLOG(2) << __func__;
114514bf6087093375351784b287cb29c5f4603273cArman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
115514bf6087093375351784b287cb29c5f4603273cArman Uguray
116bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_server = GetGattServer(server_id);
117514bf6087093375351784b287cb29c5f4603273cArman Uguray  if (!gatt_server) {
118bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    LOG(ERROR) << "Unknown server_id: " << server_id;
119a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    *_aidl_return = false;
120a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    return Status::ok();
121514bf6087093375351784b287cb29c5f4603273cArman Uguray  }
122514bf6087093375351784b287cb29c5f4603273cArman Uguray
123a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  *_aidl_return = gatt_server->SendResponse(
124a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      std::string(String8(device_address).string()), request_id,
125a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      static_cast<bluetooth::GATTError>(status), offset, value);
126a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski
127a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
128514bf6087093375351784b287cb29c5f4603273cArman Uguray}
129514bf6087093375351784b287cb29c5f4603273cArman Uguray
130a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub PawlowskiStatus BluetoothGattServerBinderServer::SendNotification(
131a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    int server_id, const String16& device_address, int handle, bool confirm,
132a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    const std::vector<uint8_t>& value, bool* _aidl_return) {
133cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  VLOG(2) << __func__;
134cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
135cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
136bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_server = GetGattServer(server_id);
137cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  if (!gatt_server) {
138bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    LOG(ERROR) << "Unknown server_id: " << server_id;
139a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    *_aidl_return = false;
140a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    return Status::ok();
141cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  }
142cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
143cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  // Create a weak pointer and pass that to the callback to prevent a potential
144cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  // use after free.
145cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  android::wp<BluetoothGattServerBinderServer> weak_ptr_to_this(this);
146cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  auto callback = [=](bluetooth::GATTError error) {
147cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    auto sp_to_this = weak_ptr_to_this.promote();
148cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    if (!sp_to_this.get()) {
149cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray      VLOG(2) << "BluetoothLowEnergyBinderServer was deleted";
150cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray      return;
151cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    }
152cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
153cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    std::lock_guard<std::mutex> lock(*maps_lock());
154cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
155bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    auto gatt_cb = GetGattServerCallback(server_id);
156cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    if (!gatt_cb.get()) {
157cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray      VLOG(2) << "The callback was deleted";
158cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray      return;
159cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    }
160cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
161cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    gatt_cb->OnNotificationSent(device_address, error);
162cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  };
163cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
164a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  if (!gatt_server->SendNotification(
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          std::string(String8(device_address).string()), handle, confirm, value,
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          callback)) {
167cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray    LOG(ERROR) << "Failed to send notification";
168a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    *_aidl_return = false;
169a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    return Status::ok();
170cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray  }
171cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
172a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  *_aidl_return = true;
173a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  return Status::ok();
174cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray}
175cd644e3c54a4321b7626b52531c59f88e24e87beArman Uguray
176514bf6087093375351784b287cb29c5f4603273cArman Ugurayvoid BluetoothGattServerBinderServer::OnCharacteristicReadRequest(
177a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::GattServer* gatt_server, const std::string& device_address,
178a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    int request_id, int offset, bool is_long, uint16_t handle) {
1794ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  VLOG(2) << __func__;
180514bf6087093375351784b287cb29c5f4603273cArman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
181514bf6087093375351784b287cb29c5f4603273cArman Uguray
182bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
183514bf6087093375351784b287cb29c5f4603273cArman Uguray  if (!gatt_cb.get()) {
184514bf6087093375351784b287cb29c5f4603273cArman Uguray    LOG(WARNING) << "Callback for this GattServer was deleted.";
185514bf6087093375351784b287cb29c5f4603273cArman Uguray    return;
186514bf6087093375351784b287cb29c5f4603273cArman Uguray  }
187514bf6087093375351784b287cb29c5f4603273cArman Uguray
188514bf6087093375351784b287cb29c5f4603273cArman Uguray  gatt_cb->OnCharacteristicReadRequest(
189a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), request_id,
190a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski      offset, is_long, handle);
191514bf6087093375351784b287cb29c5f4603273cArman Uguray}
192514bf6087093375351784b287cb29c5f4603273cArman Uguray
193514bf6087093375351784b287cb29c5f4603273cArman Ugurayvoid BluetoothGattServerBinderServer::OnDescriptorReadRequest(
194a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::GattServer* gatt_server, const std::string& device_address,
195a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    int request_id, int offset, bool is_long, uint16_t handle) {
1964ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  VLOG(2) << __func__;
197514bf6087093375351784b287cb29c5f4603273cArman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
198514bf6087093375351784b287cb29c5f4603273cArman Uguray
199bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
200514bf6087093375351784b287cb29c5f4603273cArman Uguray  if (!gatt_cb.get()) {
201514bf6087093375351784b287cb29c5f4603273cArman Uguray    LOG(WARNING) << "Callback for this GattServer was deleted.";
202514bf6087093375351784b287cb29c5f4603273cArman Uguray    return;
203514bf6087093375351784b287cb29c5f4603273cArman Uguray  }
204514bf6087093375351784b287cb29c5f4603273cArman Uguray
205514bf6087093375351784b287cb29c5f4603273cArman Uguray  gatt_cb->OnDescriptorReadRequest(
206a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), request_id,
207a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski      offset, is_long, handle);
208514bf6087093375351784b287cb29c5f4603273cArman Uguray}
209514bf6087093375351784b287cb29c5f4603273cArman Uguray
2103bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Ugurayandroid::sp<IBluetoothGattServerCallback>
211bb18c41ffa0370d4eb0c4a15904b114355606466Arman UgurayBluetoothGattServerBinderServer::GetGattServerCallback(int server_id) {
212bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto cb = GetCallback(server_id);
2133bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  return android::sp<IBluetoothGattServerCallback>(
2143bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray      static_cast<IBluetoothGattServerCallback*>(cb.get()));
2153bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray}
2163bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
2173bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguraystd::shared_ptr<bluetooth::GattServer>
218bb18c41ffa0370d4eb0c4a15904b114355606466Arman UgurayBluetoothGattServerBinderServer::GetGattServer(int server_id) {
2193bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray  return std::static_pointer_cast<bluetooth::GattServer>(
220bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray      GetInstance(server_id));
2213bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray}
2223bdeebe14fa2285aaf1bb2eee0a5734538d9048bArman Uguray
223bb18c41ffa0370d4eb0c4a15904b114355606466Arman Ugurayvoid BluetoothGattServerBinderServer::OnRegisterInstanceImpl(
224a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::BLEStatus status, android::sp<IInterface> callback,
225bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray    bluetooth::BluetoothInstance* instance) {
226bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  VLOG(1) << __func__ << " instance ID: " << instance->GetInstanceId()
2277b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray          << " status: " << status;
228514bf6087093375351784b287cb29c5f4603273cArman Uguray  bluetooth::GattServer* gatt_server =
229bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray      static_cast<bluetooth::GattServer*>(instance);
230514bf6087093375351784b287cb29c5f4603273cArman Uguray  gatt_server->SetDelegate(this);
231514bf6087093375351784b287cb29c5f4603273cArman Uguray
2327b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray  android::sp<IBluetoothGattServerCallback> cb(
2337b54b0de26de5eb34579304e1ccf94e1d9b77701Arman Uguray      static_cast<IBluetoothGattServerCallback*>(callback.get()));
234a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  cb->OnServerRegistered(status, (status == bluetooth::BLE_STATUS_SUCCESS)
235a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski                                     ? instance->GetInstanceId()
236a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski                                     : kInvalidInstanceId);
2374624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}
2384624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray
2394ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Ugurayvoid BluetoothGattServerBinderServer::OnCharacteristicWriteRequest(
240a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::GattServer* gatt_server, const std::string& device_address,
2414ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    int request_id, int offset, bool is_prepare_write, bool need_response,
242a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    const std::vector<uint8_t>& value, uint16_t handle) {
2434ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  VLOG(2) << __func__;
2444ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
2454ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
246bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
2474ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  if (!gatt_cb.get()) {
2484ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    LOG(WARNING) << "Callback for this GattServer was deleted.";
2494ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    return;
2504ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  }
2514ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
2524ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  gatt_cb->OnCharacteristicWriteRequest(
253a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), request_id,
254a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski      offset, is_prepare_write, need_response, value, handle);
2554ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray}
2564ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
2574ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Ugurayvoid BluetoothGattServerBinderServer::OnDescriptorWriteRequest(
258a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::GattServer* gatt_server, const std::string& device_address,
2594ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    int request_id, int offset, bool is_prepare_write, bool need_response,
260a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski    const std::vector<uint8_t>& value, uint16_t handle) {
2614ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  VLOG(2) << __func__;
2624ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
2634ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
264bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
2654ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  if (!gatt_cb.get()) {
2664ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    LOG(WARNING) << "Callback for this GattServer was deleted.";
2674ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    return;
2684ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  }
2694ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
2704ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  gatt_cb->OnDescriptorWriteRequest(
271a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), request_id,
272a641b6fa2a25e1b5382945d13c4fa49d36084a78Jakub Pawlowski      offset, is_prepare_write, need_response, value, handle);
2734ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray}
2744ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
2754ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Ugurayvoid BluetoothGattServerBinderServer::OnExecuteWriteRequest(
276a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski    bluetooth::GattServer* gatt_server, const std::string& device_address,
2774ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    int request_id, bool is_execute) {
2784ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  VLOG(2) << __func__;
2794ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  std::lock_guard<std::mutex> lock(*maps_lock());
2804ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
281bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
2824ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  if (!gatt_cb.get()) {
2834ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    LOG(WARNING) << "Callback for this GattServer was deleted.";
2844ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray    return;
2854ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray  }
2864ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
287a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski  gatt_cb->OnExecuteWriteRequest(
288a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), request_id,
289a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski      is_execute);
2904ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray}
2914ebcbd9ede4006500c3ead0685befe0a8e4aadc2Arman Uguray
2927932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowskivoid BluetoothGattServerBinderServer::OnConnectionStateChanged(
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bluetooth::GattServer* gatt_server, const std::string& device_address,
294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bool connected) {
2957932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  VLOG(2) << __func__;
2967932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  std::lock_guard<std::mutex> lock(*maps_lock());
2977932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski
2987932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  auto gatt_cb = GetGattServerCallback(gatt_server->GetInstanceId());
2997932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  if (!gatt_cb.get()) {
3007932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski    LOG(WARNING) << "Callback for this GattServer was deleted.";
3017932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski    return;
3027932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  }
3037932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski
3047932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski  gatt_cb->OnConnectionStateChanged(
3057932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski      String16(device_address.c_str(), device_address.length()), connected);
3067932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski}
3077932727cbe07b4bc176b2d1c04f0bcf350973512Jakub Pawlowski
3084624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}  // namespace binder
3094624e1a6d25a838dad2e72001e340dd77d68179eArman Uguray}  // namespace ipc
310