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