• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //  Copyright 2015 Google, Inc.
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/adapter.h"
18 
19 #include <atomic>
20 #include <mutex>
21 #include <string>
22 #include <unordered_set>
23 
24 #include <base/logging.h>
25 #include <base/observer_list.h>
26 
27 #include "abstract_observer_list.h"
28 #include "service/a2dp_sink.h"
29 #include "service/a2dp_source.h"
30 #include "service/avrcp_control.h"
31 #include "service/avrcp_target.h"
32 #include "service/common/bluetooth/util/atomic_string.h"
33 #include "service/gatt_client.h"
34 #include "service/gatt_server.h"
35 #include "service/hal/bluetooth_interface.h"
36 #include "service/logging_helpers.h"
37 #include "service/low_energy_advertiser.h"
38 #include "service/low_energy_client.h"
39 #include "service/low_energy_scanner.h"
40 
41 using std::lock_guard;
42 using std::mutex;
43 
44 namespace bluetooth {
45 
46 namespace {
47 
ParseRemoteDeviceProps(int num_properties,bt_property_t * properties)48 RemoteDeviceProps ParseRemoteDeviceProps(int num_properties,
49                                          bt_property_t* properties) {
50   std::string name;
51   std::string address;
52   std::vector<Uuid> service_uuids;
53   int32_t device_class = 0;
54   int32_t device_type = 0;
55   int32_t rssi = 0;
56 
57   for (int i = 0; i < num_properties; ++i) {
58     bt_property_t* property = properties + i;
59     switch (property->type) {
60       case BT_PROPERTY_BDNAME: {
61         if (property->len < 0) {
62           NOTREACHED() << "Invalid length for BT_PROPERTY_BDNAME";
63           break;
64         }
65         bt_bdname_t* hal_name = reinterpret_cast<bt_bdname_t*>(property->val);
66         name = reinterpret_cast<char*>(hal_name->name);
67         break;
68       }
69       case BT_PROPERTY_BDADDR: {
70         if (property->len != sizeof(RawAddress)) {
71           NOTREACHED() << "Invalid length for BT_PROPERTY_BDADDR";
72           break;
73         }
74         address = BtAddrString(reinterpret_cast<RawAddress*>(property->val));
75         break;
76       }
77       case BT_PROPERTY_UUIDS: {
78         if (property->len < 0) {
79           NOTREACHED() << "Negative length on BT_PROPERTY_UUIDS:";
80           break;
81         }
82         if (property->len % sizeof(Uuid) != 0) {
83           NOTREACHED() << "Trailing bytes on BT_PROPERTY_UUIDS:";
84         }
85         auto uuids = static_cast<const Uuid*>(property->val);
86 
87         for (size_t i = 0; i < property->len / sizeof(Uuid); ++i) {
88           service_uuids.push_back(uuids[i]);
89         }
90         break;
91       }
92       case BT_PROPERTY_CLASS_OF_DEVICE: {
93         if (property->len != sizeof(int32_t)) {
94           NOTREACHED() << "Invalid length for BT_PROPERTY_CLASS_OF_DEVICE";
95           break;
96         }
97         device_class = *reinterpret_cast<const int32_t*>(property->val);
98         break;
99       }
100       case BT_PROPERTY_TYPE_OF_DEVICE: {
101         if (property->len != sizeof(int32_t)) {
102           NOTREACHED() << "Invalid length for BT_PROPERTY_TYPE_OF_DEVICE";
103           break;
104         }
105         device_type = *reinterpret_cast<const int32_t*>(property->val);
106         break;
107       }
108       case BT_PROPERTY_REMOTE_RSSI: {
109         if (property->len != sizeof(int8_t)) {
110           NOTREACHED() << "Invalid length for BT_PROPERTY_REMOTE_RSSI";
111           break;
112         }
113         rssi = *reinterpret_cast<const int8_t*>(property->val);
114         break;
115       }
116       default:
117         VLOG(1) << "Unhandled adapter property: "
118                 << BtPropertyText(property->type);
119         break;
120     }
121   }
122 
123   return RemoteDeviceProps(name, address, service_uuids, device_class,
124                            device_type, rssi);
125 }
126 
127 }  // namespace
128 
129 // static
130 const char Adapter::kDefaultAddress[] = "00:00:00:00:00:00";
131 // static
132 const char Adapter::kDefaultName[] = "not-initialized";
133 
134 // TODO(armansito): The following constants come straight from
135 // packages/apps/Bluetooth/src/c/a/b/btservice/AdapterService.java. It would be
136 // nice to know if there were a way to obtain these values from the stack
137 // instead of hardcoding them here.
138 
139 // The minimum number of advertising instances required for multi-advertisement
140 // support.
141 const int kMinAdvInstancesForMultiAdv = 5;
142 
143 // Used when determining if offloaded scan filtering is supported.
144 const int kMinOffloadedFilters = 10;
145 
146 // Used when determining if offloaded scan batching is supported.
147 const int kMinOffloadedScanStorageBytes = 1024;
148 
OnAdapterStateChanged(Adapter * adapter,AdapterState prev_state,AdapterState new_state)149 void Adapter::Observer::OnAdapterStateChanged(Adapter* adapter,
150                                               AdapterState prev_state,
151                                               AdapterState new_state) {
152   // Default implementation does nothing
153 }
154 
OnDeviceConnectionStateChanged(Adapter * adapter,const std::string & device_address,bool connected)155 void Adapter::Observer::OnDeviceConnectionStateChanged(
156     Adapter* adapter, const std::string& device_address, bool connected) {
157   // Default implementation does nothing
158 }
159 
OnScanEnableChanged(Adapter * adapter,bool scan_enabled)160 void Adapter::Observer::OnScanEnableChanged(Adapter* adapter,
161                                             bool scan_enabled) {
162   // Default implementation does nothing
163 }
164 
OnSspRequest(Adapter * adapter,const std::string & device_address,const std::string & device_name,int cod,int pairing_variant,int pass_key)165 void Adapter::Observer::OnSspRequest(Adapter* adapter,
166                                      const std::string& device_address,
167                                      const std::string& device_name, int cod,
168                                      int pairing_variant, int pass_key) {
169   // Default implementation does nothing
170 }
171 
OnBondStateChanged(Adapter * adapter,int status,const std::string & device_address,int state)172 void Adapter::Observer::OnBondStateChanged(Adapter* adapter, int status,
173                                            const std::string& device_address,
174                                            int state) {
175   // Default implementation does nothing
176 }
177 
OnGetBondedDevices(Adapter * adapter,int status,const std::vector<std::string> & bonded_devices)178 void Adapter::Observer::OnGetBondedDevices(
179     Adapter* adapter, int status,
180     const std::vector<std::string>& bonded_devices) {
181   // Default implementation does nothing
182 }
183 
OnGetRemoteDeviceProperties(Adapter * adapter,int status,const std::string & device_address,const RemoteDeviceProps & properties)184 void Adapter::Observer::OnGetRemoteDeviceProperties(
185     Adapter* adapter, int status, const std::string& device_address,
186     const RemoteDeviceProps& properties) {
187   // Default implementation does nothing
188 }
189 
OnDeviceFound(Adapter * adapter,const RemoteDeviceProps & properties)190 void Adapter::Observer::OnDeviceFound(Adapter* adapter,
191                                       const RemoteDeviceProps& properties) {
192   // Default implementation does nothing
193 }
194 
195 // The real Adapter implementation used in production.
196 class AdapterImpl : public Adapter, public hal::BluetoothInterface::Observer {
197  public:
AdapterImpl()198   AdapterImpl()
199       : state_(ADAPTER_STATE_OFF),
200         address_(kDefaultAddress),
201         name_(kDefaultName) {
202     memset(&local_le_features_, 0, sizeof(local_le_features_));
203     hal::BluetoothInterface::Get()->AddObserver(this);
204     a2dp_sink_factory_.reset(new A2dpSinkFactory);
205     a2dp_source_factory_.reset(new A2dpSourceFactory);
206     avrcp_control_factory_.reset(new AvrcpControlFactory);
207     avrcp_target_factory_.reset(new AvrcpTargetFactory);
208     ble_client_factory_.reset(new LowEnergyClientFactory(*this));
209     ble_advertiser_factory_.reset(new LowEnergyAdvertiserFactory());
210     ble_scanner_factory_.reset(new LowEnergyScannerFactory(*this));
211     gatt_client_factory_.reset(new GattClientFactory());
212     gatt_server_factory_.reset(new GattServerFactory());
213     hal::BluetoothInterface::Get()->GetHALInterface()->get_adapter_properties();
214   }
215 
~AdapterImpl()216   ~AdapterImpl() override {
217     hal::BluetoothInterface::Get()->RemoveObserver(this);
218   }
219 
AddObserver(Adapter::Observer * observer)220   void AddObserver(Adapter::Observer* observer) override {
221     lock_guard<mutex> lock(observers_lock_);
222     observers_.AddObserver(observer);
223   }
224 
RemoveObserver(Adapter::Observer * observer)225   void RemoveObserver(Adapter::Observer* observer) override {
226     lock_guard<mutex> lock(observers_lock_);
227     observers_.RemoveObserver(observer);
228   }
229 
GetState() const230   AdapterState GetState() const override { return state_.load(); }
231 
IsEnabled() const232   bool IsEnabled() const override { return state_.load() == ADAPTER_STATE_ON; }
233 
Enable()234   bool Enable() override {
235     AdapterState current_state = GetState();
236     if (current_state != ADAPTER_STATE_OFF) {
237       LOG(INFO) << "Adapter not disabled - state: "
238                 << AdapterStateToString(current_state);
239       return false;
240     }
241 
242     // Set the state before calling enable() as there might be a race between
243     // here and the AdapterStateChangedCallback.
244     state_ = ADAPTER_STATE_TURNING_ON;
245     NotifyAdapterStateChanged(current_state, state_);
246 
247     int status = hal::BluetoothInterface::Get()->GetHALInterface()->enable();
248     if (status != BT_STATUS_SUCCESS) {
249       LOG(ERROR) << "Failed to enable Bluetooth - status: "
250                  << BtStatusText((const bt_status_t)status);
251       state_ = ADAPTER_STATE_OFF;
252       NotifyAdapterStateChanged(ADAPTER_STATE_TURNING_ON, state_);
253       return false;
254     }
255 
256     return true;
257   }
258 
Disable()259   bool Disable() override {
260     if (!IsEnabled()) {
261       LOG(INFO) << "Adapter is not enabled";
262       return false;
263     }
264 
265     AdapterState current_state = GetState();
266 
267     // Set the state before calling enable() as there might be a race between
268     // here and the AdapterStateChangedCallback.
269     state_ = ADAPTER_STATE_TURNING_OFF;
270     NotifyAdapterStateChanged(current_state, state_);
271 
272     int status = hal::BluetoothInterface::Get()->GetHALInterface()->disable();
273     if (status != BT_STATUS_SUCCESS) {
274       LOG(ERROR) << "Failed to disable Bluetooth - status: "
275                  << BtStatusText((const bt_status_t)status);
276       state_ = current_state;
277       NotifyAdapterStateChanged(ADAPTER_STATE_TURNING_OFF, state_);
278       return false;
279     }
280 
281     return true;
282   }
283 
GetName() const284   std::string GetName() const override { return name_.Get(); }
285 
SetName(const std::string & name)286   bool SetName(const std::string& name) override {
287     bt_bdname_t hal_name;
288     size_t max_name_len = sizeof(hal_name.name);
289 
290     // Include the \0 byte in size measurement.
291     if (name.length() >= max_name_len) {
292       LOG(ERROR) << "Given name \"" << name << "\" is larger than maximum"
293                  << " allowed size: " << max_name_len;
294       return false;
295     }
296 
297     strncpy(reinterpret_cast<char*>(hal_name.name), name.c_str(),
298             name.length() + 1);
299 
300     VLOG(1) << "Setting adapter name: " << name;
301 
302     if (!SetAdapterProperty(BT_PROPERTY_BDNAME, &hal_name, sizeof(hal_name))) {
303       LOG(ERROR) << "Failed to set adapter name: " << name;
304       return false;
305     }
306 
307     return true;
308   }
309 
GetAddress() const310   std::string GetAddress() const override { return address_.Get(); }
311 
SetScanMode(int scan_mode)312   bool SetScanMode(int scan_mode) override {
313     switch (scan_mode) {
314       case BT_SCAN_MODE_NONE:
315       case BT_SCAN_MODE_CONNECTABLE:
316       case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE:
317         break;
318       default:
319         LOG(ERROR) << "Unknown scan mode: " << scan_mode;
320         return false;
321     }
322 
323     auto bd_scanmode = static_cast<bt_scan_mode_t>(scan_mode);
324 
325     if (!SetAdapterProperty(BT_PROPERTY_ADAPTER_SCAN_MODE, &bd_scanmode,
326                             sizeof(bd_scanmode))) {
327       LOG(ERROR) << "Failed to set scan mode to : " << scan_mode;
328       return false;
329     }
330 
331     return true;
332   }
333 
SetScanEnable(bool scan_enable)334   bool SetScanEnable(bool scan_enable) override {
335     if (scan_enable) {
336       int status =
337           hal::BluetoothInterface::Get()->GetHALInterface()->start_discovery();
338       if (status != BT_STATUS_SUCCESS) {
339         LOG(ERROR) << "Failed to enable scanning";
340         return false;
341       }
342     } else {
343       int status =
344           hal::BluetoothInterface::Get()->GetHALInterface()->cancel_discovery();
345       if (status != BT_STATUS_SUCCESS) {
346         LOG(ERROR) << "Failed to disable scanning";
347         return false;
348       }
349     }
350     return true;
351   }
352 
SspReply(const std::string & device_address,int variant,bool accept,int32_t pass_key)353   bool SspReply(const std::string& device_address, int variant, bool accept,
354                 int32_t pass_key) override {
355     RawAddress addr;
356     if (!RawAddress::FromString(device_address, addr)) {
357       LOG(ERROR) << "Invalid device address given: " << device_address;
358       return false;
359     }
360 
361     int status = hal::BluetoothInterface::Get()->GetHALInterface()->ssp_reply(
362         &addr, static_cast<bt_ssp_variant_t>(variant), accept, pass_key);
363     if (status != BT_STATUS_SUCCESS) {
364       LOG(ERROR) << "Failed to send SSP response - status: "
365                  << BtStatusText((const bt_status_t)status);
366       return false;
367     }
368 
369     return true;
370   }
371 
CreateBond(const std::string & device_address,int transport)372   bool CreateBond(const std::string& device_address, int transport) override {
373     RawAddress addr;
374     if (!RawAddress::FromString(device_address, addr)) {
375       LOG(ERROR) << "Invalid device address given: " << device_address;
376       return false;
377     }
378 
379     int status = hal::BluetoothInterface::Get()->GetHALInterface()->create_bond(
380         &addr, transport);
381     if (status != BT_STATUS_SUCCESS) {
382       LOG(ERROR) << "Failed to create bond - status: "
383                  << BtStatusText((const bt_status_t)status);
384       return false;
385     }
386 
387     return true;
388   }
389 
IsMultiAdvertisementSupported()390   bool IsMultiAdvertisementSupported() override {
391     lock_guard<mutex> lock(local_le_features_lock_);
392     return local_le_features_.max_adv_instance >= kMinAdvInstancesForMultiAdv;
393   }
394 
IsDeviceConnected(const std::string & device_address)395   bool IsDeviceConnected(const std::string& device_address) override {
396     lock_guard<mutex> lock(connected_devices_lock_);
397     return connected_devices_.find(device_address) != connected_devices_.end();
398   }
399 
GetTotalNumberOfTrackableAdvertisements()400   int GetTotalNumberOfTrackableAdvertisements() override {
401     lock_guard<mutex> lock(local_le_features_lock_);
402     return local_le_features_.total_trackable_advertisers;
403   }
404 
IsOffloadedFilteringSupported()405   bool IsOffloadedFilteringSupported() override {
406     lock_guard<mutex> lock(local_le_features_lock_);
407     return local_le_features_.max_adv_filter_supported >= kMinOffloadedFilters;
408   }
409 
IsOffloadedScanBatchingSupported()410   bool IsOffloadedScanBatchingSupported() override {
411     lock_guard<mutex> lock(local_le_features_lock_);
412     return local_le_features_.scan_result_storage_size >=
413            kMinOffloadedScanStorageBytes;
414   }
415 
GetBondedDevices()416   bool GetBondedDevices() override {
417     int status =
418         hal::BluetoothInterface::Get()->GetHALInterface()->get_adapter_property(
419             BT_PROPERTY_ADAPTER_BONDED_DEVICES);
420     if (status != BT_STATUS_SUCCESS) {
421       LOG(ERROR) << "Failed to get bonded devices. Status: "
422                  << BtStatusText(static_cast<bt_status_t>(status));
423       return false;
424     }
425 
426     return true;
427   }
428 
RemoveBond(const std::string & device_address)429   bool RemoveBond(const std::string& device_address) override {
430     RawAddress addr;
431     if (!RawAddress::FromString(device_address, addr)) {
432       LOG(ERROR) << "Invalid device address given: " << device_address;
433       return false;
434     }
435 
436     int status =
437         hal::BluetoothInterface::Get()->GetHALInterface()->remove_bond(&addr);
438     if (status != BT_STATUS_SUCCESS) {
439       LOG(ERROR) << "Failed to send remove bond - status: "
440                  << BtStatusText(static_cast<bt_status_t>(status));
441       return false;
442     }
443 
444     return true;
445   }
446 
GetRemoteDeviceProperties(const std::string & device_address)447   bool GetRemoteDeviceProperties(const std::string& device_address) override {
448     RawAddress addr;
449     if (!RawAddress::FromString(device_address, addr)) {
450       LOG(ERROR) << "Invalid device address given: " << device_address;
451       return false;
452     }
453 
454     int status = hal::BluetoothInterface::Get()
455                      ->GetHALInterface()
456                      ->get_remote_device_properties(&addr);
457     if (status != BT_STATUS_SUCCESS) {
458       LOG(ERROR) << "Failed to send GetRemoteDeviceProperties - status: "
459                  << BtStatusText((const bt_status_t)status);
460       return false;
461     }
462 
463     return true;
464   }
465 
GetA2dpSinkFactory() const466   A2dpSinkFactory* GetA2dpSinkFactory() const override {
467     return a2dp_sink_factory_.get();
468   }
469 
GetA2dpSourceFactory() const470   A2dpSourceFactory* GetA2dpSourceFactory() const override {
471     return a2dp_source_factory_.get();
472   }
473 
GetAvrcpControlFactory() const474   AvrcpControlFactory* GetAvrcpControlFactory() const override {
475     return avrcp_control_factory_.get();
476   }
477 
GetAvrcpTargetFactory() const478   AvrcpTargetFactory* GetAvrcpTargetFactory() const override {
479     return avrcp_target_factory_.get();
480   }
481 
GetLowEnergyClientFactory() const482   LowEnergyClientFactory* GetLowEnergyClientFactory() const override {
483     return ble_client_factory_.get();
484   }
485 
GetLeAdvertiserFactory() const486   LowEnergyAdvertiserFactory* GetLeAdvertiserFactory() const override {
487     return ble_advertiser_factory_.get();
488   }
489 
GetLeScannerFactory() const490   LowEnergyScannerFactory* GetLeScannerFactory() const override {
491     return ble_scanner_factory_.get();
492   }
493 
GetGattClientFactory() const494   GattClientFactory* GetGattClientFactory() const override {
495     return gatt_client_factory_.get();
496   }
497 
GetGattServerFactory() const498   GattServerFactory* GetGattServerFactory() const override {
499     return gatt_server_factory_.get();
500   }
501 
502   // hal::BluetoothInterface::Observer overrides.
AdapterStateChangedCallback(bt_state_t state)503   void AdapterStateChangedCallback(bt_state_t state) override {
504     LOG(INFO) << "Adapter state changed: " << BtStateText(state);
505 
506     AdapterState prev_state = GetState();
507 
508     switch (state) {
509       case BT_STATE_OFF:
510         state_ = ADAPTER_STATE_OFF;
511         break;
512 
513       case BT_STATE_ON:
514         state_ = ADAPTER_STATE_ON;
515         break;
516 
517       default:
518         NOTREACHED();
519     }
520 
521     NotifyAdapterStateChanged(prev_state, GetState());
522   }
523 
AdapterPropertiesCallback(bt_status_t status,int num_properties,bt_property_t * properties)524   void AdapterPropertiesCallback(bt_status_t status, int num_properties,
525                                  bt_property_t* properties) override {
526     LOG(INFO) << "Adapter properties changed";
527 
528     if (status != BT_STATUS_SUCCESS) {
529       LOG(ERROR) << "status: " << BtStatusText(status);
530 
531       for (int i = 0; i < num_properties; ++i) {
532         bt_property_t* property = properties + i;
533         if (property->type == BT_PROPERTY_ADAPTER_BONDED_DEVICES) {
534           lock_guard<mutex> lock(observers_lock_);
535           for (auto& observer : observers_) {
536             observer.OnGetBondedDevices(this, status, {});
537           }
538         }
539       }
540       return;
541     }
542 
543     for (int i = 0; i < num_properties; i++) {
544       bt_property_t* property = properties + i;
545       switch (property->type) {
546         case BT_PROPERTY_BDADDR: {
547           std::string address =
548               BtAddrString(reinterpret_cast<RawAddress*>(property->val));
549           LOG(INFO) << "Adapter address changed: " << address;
550           address_.Set(address);
551           break;
552         }
553         case BT_PROPERTY_BDNAME: {
554           bt_bdname_t* hal_name = reinterpret_cast<bt_bdname_t*>(property->val);
555           if (hal_name) {
556             std::string name = reinterpret_cast<char*>(hal_name->name);
557             LOG(INFO) << "Adapter name changed: " << name;
558             name_.Set(name);
559           }
560           break;
561         }
562         case BT_PROPERTY_LOCAL_LE_FEATURES: {
563           lock_guard<mutex> lock(local_le_features_lock_);
564           if (property->len != sizeof(bt_local_le_features_t)) {
565             LOG(WARNING) << "Malformed value received for property: "
566                          << "BT_PROPERTY_LOCAL_LE_FEATURES";
567             break;
568           }
569           bt_local_le_features_t* features =
570               reinterpret_cast<bt_local_le_features_t*>(property->val);
571           memcpy(&local_le_features_, features, sizeof(*features));
572           LOG(INFO) << "Supported LE features updated";
573           break;
574         }
575         case BT_PROPERTY_ADAPTER_BONDED_DEVICES: {
576           if (property->len < 0) {
577             NOTREACHED() << "Negative property length";
578             break;
579           }
580           auto addrs = reinterpret_cast<const RawAddress*>(property->val);
581           if (property->len % sizeof(addrs[0]) != 0) {
582             LOG(ERROR) << "Invalid property length: " << property->len;
583             // TODO(bcf): Seems to be a bug where we hit this somewhat
584             // frequently.
585             break;
586           }
587           std::vector<std::string> str_addrs;
588 
589           for (size_t i = 0; i < property->len / sizeof(addrs[0]); ++i)
590             str_addrs.push_back(BtAddrString(addrs + i));
591 
592           lock_guard<mutex> lock(observers_lock_);
593           for (auto& observer : observers_) {
594             observer.OnGetBondedDevices(this, status, str_addrs);
595           }
596           break;
597         }
598         default:
599           VLOG(1) << "Unhandled adapter property: "
600                   << BtPropertyText(property->type);
601           break;
602       }
603 
604       // TODO(armansito): notify others of the updated properties
605     }
606   }
607 
RemoteDevicePropertiesCallback(bt_status_t status,RawAddress * remote_bdaddr,int num_properties,bt_property_t * properties)608   void RemoteDevicePropertiesCallback(bt_status_t status,
609                                       RawAddress* remote_bdaddr,
610                                       int num_properties,
611                                       bt_property_t* properties) override {
612     std::string device_address = BtAddrString(remote_bdaddr);
613     if (status != BT_STATUS_SUCCESS) {
614       lock_guard<mutex> lock(observers_lock_);
615       for (auto& observer : observers_) {
616         observer.OnGetRemoteDeviceProperties(this, status, device_address,
617                                              RemoteDeviceProps());
618       }
619       return;
620     }
621 
622     RemoteDeviceProps props =
623         ParseRemoteDeviceProps(num_properties, properties);
624 
625     std::string address = BtAddrString(remote_bdaddr);
626     props.set_address(address);
627 
628     lock_guard<mutex> lock(observers_lock_);
629     for (auto& observer : observers_) {
630       observer.OnGetRemoteDeviceProperties(this, status, device_address, props);
631     }
632   }
633 
DeviceFoundCallback(int num_properties,bt_property_t * properties)634   void DeviceFoundCallback(int num_properties,
635                            bt_property_t* properties) override {
636     RemoteDeviceProps props =
637         ParseRemoteDeviceProps(num_properties, properties);
638 
639     lock_guard<mutex> lock(observers_lock_);
640     for (auto& observer : observers_) {
641       observer.OnDeviceFound(this, props);
642     }
643   }
644 
DiscoveryStateChangedCallback(bt_discovery_state_t state)645   void DiscoveryStateChangedCallback(bt_discovery_state_t state) override {
646     bool enabled = false;
647     switch (state) {
648       case BT_DISCOVERY_STOPPED:
649         enabled = false;
650         break;
651       case BT_DISCOVERY_STARTED:
652         enabled = true;
653         break;
654       default:
655         NOTREACHED();
656     }
657 
658     for (auto& observer : observers_) {
659       observer.OnScanEnableChanged(this, enabled);
660     }
661   }
662 
SSPRequestCallback(RawAddress * remote_bdaddr,bt_bdname_t * bd_name,uint32_t cod,bt_ssp_variant_t pairing_variant,uint32_t pass_key)663   void SSPRequestCallback(RawAddress* remote_bdaddr, bt_bdname_t* bd_name,
664                           uint32_t cod, bt_ssp_variant_t pairing_variant,
665                           uint32_t pass_key) override {
666     std::string device_address = BtAddrString(remote_bdaddr);
667     std::string name = reinterpret_cast<char*>(bd_name->name);
668 
669     lock_guard<mutex> lock(observers_lock_);
670     for (auto& observer : observers_) {
671       observer.OnSspRequest(this, device_address, name, cod, pairing_variant,
672                             pass_key);
673     }
674   }
675 
BondStateChangedCallback(bt_status_t status,RawAddress * remote_bdaddr,bt_bond_state_t state)676   void BondStateChangedCallback(bt_status_t status, RawAddress* remote_bdaddr,
677                                 bt_bond_state_t state) override {
678     std::string device_address = BtAddrString(remote_bdaddr);
679 
680     lock_guard<mutex> lock(observers_lock_);
681     for (auto& observer : observers_) {
682       observer.OnBondStateChanged(this, status, device_address, state);
683     }
684   }
685 
AclStateChangedCallback(bt_status_t status,const RawAddress & remote_bdaddr,bt_acl_state_t state,bt_hci_error_code_t hci_reason)686   void AclStateChangedCallback(bt_status_t status,
687                                const RawAddress& remote_bdaddr,
688                                bt_acl_state_t state,
689                                bt_hci_error_code_t hci_reason) override {
690     std::string device_address = BtAddrString(&remote_bdaddr);
691     bool connected = (state == BT_ACL_STATE_CONNECTED);
692     LOG(INFO) << "ACL state changed: " << device_address
693               << " - connected: " << (connected ? "true" : "false");
694 
695     // If this is reported with an error status, I suppose the best thing we can
696     // do is to log it and ignore the event.
697     if (status != BT_STATUS_SUCCESS) {
698       LOG(ERROR) << "status: " << BtStatusText(status);
699       return;
700     }
701 
702     // Introduce a scope to manage |connected_devices_lock_| with RAII.
703     {
704       lock_guard<mutex> lock(connected_devices_lock_);
705       if (connected)
706         connected_devices_.insert(device_address);
707       else
708         connected_devices_.erase(device_address);
709     }
710 
711     lock_guard<mutex> lock(observers_lock_);
712     for (auto& observer : observers_) {
713       observer.OnDeviceConnectionStateChanged(this, device_address, connected);
714     }
715   }
716 
717   // Sends a request to set the given HAL adapter property type and value.
SetAdapterProperty(bt_property_type_t type,void * value,int length)718   bool SetAdapterProperty(bt_property_type_t type, void* value, int length) {
719     CHECK(length > 0);
720     CHECK(value);
721 
722     bt_property_t property;
723     property.len = length;
724     property.val = value;
725     property.type = type;
726 
727     int status =
728         hal::BluetoothInterface::Get()->GetHALInterface()->set_adapter_property(
729             &property);
730     if (status != BT_STATUS_SUCCESS) {
731       VLOG(1) << "Failed to set property";
732       return false;
733     }
734 
735     return true;
736   }
737 
738   // Helper for invoking the AdapterStateChanged observer method.
NotifyAdapterStateChanged(AdapterState prev_state,AdapterState new_state)739   void NotifyAdapterStateChanged(AdapterState prev_state,
740                                  AdapterState new_state) {
741     if (prev_state == new_state) return;
742 
743     lock_guard<mutex> lock(observers_lock_);
744     for (auto& observer : observers_) {
745       observer.OnAdapterStateChanged(this, prev_state, new_state);
746     }
747   }
748 
749  private:
750   // The current adapter state.
751   std::atomic<AdapterState> state_;
752 
753   // The Bluetooth device address of the local adapter in string from
754   // (i.e.. XX:XX:XX:XX:XX:XX)
755   util::AtomicString address_;
756 
757   // The current local adapter name.
758   util::AtomicString name_;
759 
760   // The current set of supported LE features as obtained from the stack. The
761   // values here are all initially set to 0 and updated when the corresponding
762   // adapter property has been received from the stack.
763   std::mutex local_le_features_lock_;
764   bt_local_le_features_t local_le_features_;
765 
766   // List of observers that are interested in notifications from us.
767   std::mutex observers_lock_;
768   btbase::AbstractObserverList<Adapter::Observer> observers_;
769 
770   // List of devices addresses that are currently connected.
771   std::mutex connected_devices_lock_;
772   std::unordered_set<std::string> connected_devices_;
773 
774   // Factory used to create per-app A2dpSink instances.
775   std::unique_ptr<A2dpSinkFactory> a2dp_sink_factory_;
776 
777   // Factory used to create per-app A2dpSource instances.
778   std::unique_ptr<A2dpSourceFactory> a2dp_source_factory_;
779 
780   // Factory used to create per-app AvrcpControl instances.
781   std::unique_ptr<AvrcpControlFactory> avrcp_control_factory_;
782 
783   // Factory used to create per-app AvrcpTarget instances.
784   std::unique_ptr<AvrcpTargetFactory> avrcp_target_factory_;
785 
786   // Factory used to create per-app LowEnergyClient instances.
787   std::unique_ptr<LowEnergyClientFactory> ble_client_factory_;
788 
789   // Factory used to create per-app LeAdvertiser instances.
790   std::unique_ptr<LowEnergyAdvertiserFactory> ble_advertiser_factory_;
791 
792   // Factory used to create per-app LeScanner instances.
793   std::unique_ptr<LowEnergyScannerFactory> ble_scanner_factory_;
794 
795   // Factory used to create per-app GattClient instances.
796   std::unique_ptr<GattClientFactory> gatt_client_factory_;
797 
798   // Factory used to create per-app GattServer instances.
799   std::unique_ptr<GattServerFactory> gatt_server_factory_;
800 
801   DISALLOW_COPY_AND_ASSIGN(AdapterImpl);
802 };
803 
804 // static
Create()805 std::unique_ptr<Adapter> Adapter::Create() {
806   return std::unique_ptr<Adapter>(new AdapterImpl());
807 }
808 
809 }  // namespace bluetooth
810