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