1c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 2c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Copyright (C) 2016 The Android Open Source Project 3c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 4c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Licensed under the Apache License, Version 2.0 (the "License"); 5c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// you may not use this file except in compliance with the License. 6c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// You may obtain a copy of the License at: 7c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 8c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// http://www.apache.org/licenses/LICENSE-2.0 9c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 10c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Unless required by applicable law or agreed to in writing, software 11c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// distributed under the License is distributed on an "AS IS" BASIS, 12c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// See the License for the specific language governing permissions and 14c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// limitations under the License. 15c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 16c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 17c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/ipc/binder/bluetooth_le_scanner_binder_server.h" 18c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 19c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <base/logging.h> 20c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 21c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/adapter.h" 22c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 23c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::String8; 24c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::String16; 25c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::binder::Status; 26c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 27c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace ipc { 28c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace binder { 29c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 30c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace { 31c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiconst int kInvalidInstanceId = -1; 32c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} // namespace 33c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 34c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::BluetoothLeScannerBinderServer( 35c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::Adapter* adapter) 36c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski : adapter_(adapter) { 37c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski CHECK(adapter_); 38c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 39c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 40c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::~BluetoothLeScannerBinderServer() {} 41c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 42c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::RegisterScanner( 43c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const android::sp<IBluetoothLeScannerCallback>& callback, 44c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bool* _aidl_return) { 45c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__; 46c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::LowEnergyScannerFactory* ble_factory = 47c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski adapter_->GetLeScannerFactory(); 48c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 49c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski *_aidl_return = RegisterInstanceBase(callback, ble_factory); 50c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 51c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 52c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 53c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::UnregisterScanner(int scanner_id) { 54c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__; 55c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski UnregisterInstanceBase(scanner_id); 56c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 57c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 58c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 59c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::UnregisterAll() { 60c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__; 61c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski UnregisterAllBase(); 62c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 63c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 64c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 65c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::StartScan( 66c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scanner_id, const android::bluetooth::ScanSettings& settings, 67c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const std::vector<android::bluetooth::ScanFilter>& filters, 68c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bool* _aidl_return) { 69c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__ << " scanner_id: " << scanner_id; 70c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::lock_guard<std::mutex> lock(*maps_lock()); 71c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 72c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski auto scanner = GetLEScanner(scanner_id); 73c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (!scanner) { 74c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LOG(ERROR) << "Unknown scanner_id: " << scanner_id; 75c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski *_aidl_return = false; 76c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 77c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 78c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 79c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::vector<bluetooth::ScanFilter> flt; 80c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski for (const auto& filter : filters) { 81c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski flt.push_back(filter); 82c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 83c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 84c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski *_aidl_return = scanner->StartScan(settings, flt); 85c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 86c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 87c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 88c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::StopScan(int scanner_id, 89c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bool* _aidl_return) { 90c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__ << " scanner_id: " << scanner_id; 91c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::lock_guard<std::mutex> lock(*maps_lock()); 92c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 93c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski auto scanner = GetLEScanner(scanner_id); 94c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (!scanner) { 95c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LOG(ERROR) << "Unknown scanner_id: " << scanner_id; 96c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski *_aidl_return = false; 97c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 98c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 99c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 100c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski *_aidl_return = scanner->StopScan(); 101c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return Status::ok(); 102c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 103c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 104c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid BluetoothLeScannerBinderServer::OnScanResult( 105c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::LowEnergyScanner* scanner, const bluetooth::ScanResult& result) { 106c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << __func__; 107c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::lock_guard<std::mutex> lock(*maps_lock()); 108c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 109c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scanner_id = scanner->GetInstanceId(); 110c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski auto cb = GetLECallback(scanner->GetInstanceId()); 111c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (!cb.get()) { 112c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(2) << "Scanner was unregistered - scanner_id: " << scanner_id; 113c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return; 114c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 115c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 116c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski cb->OnScanResult(result); 117c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 118c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 119c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiandroid::sp<IBluetoothLeScannerCallback> 120c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::GetLECallback(int scanner_id) { 121c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski auto cb = GetCallback(scanner_id); 122c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return android::sp<IBluetoothLeScannerCallback>( 123c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski static_cast<IBluetoothLeScannerCallback*>(cb.get())); 124c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 125c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 126c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskistd::shared_ptr<bluetooth::LowEnergyScanner> 127c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::GetLEScanner(int scanner_id) { 128c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return std::static_pointer_cast<bluetooth::LowEnergyScanner>( 129c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski GetInstance(scanner_id)); 130c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 131c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 132c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid BluetoothLeScannerBinderServer::OnRegisterInstanceImpl( 133c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::BLEStatus status, android::sp<IInterface> callback, 134c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::BluetoothInstance* instance) { 135c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski VLOG(1) << __func__ << " status: " << status; 136c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bluetooth::LowEnergyScanner* le_scanner = 137c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski static_cast<bluetooth::LowEnergyScanner*>(instance); 138c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski le_scanner->SetDelegate(this); 139c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 140c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski android::sp<IBluetoothLeScannerCallback> cb( 141c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski static_cast<IBluetoothLeScannerCallback*>(callback.get())); 142c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski cb->OnScannerRegistered(status, (status == bluetooth::BLE_STATUS_SUCCESS) 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? instance->GetInstanceId() 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : kInvalidInstanceId); 145c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 146c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 147c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} // namespace binder 148c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} // namespace ipc 149