Home | History | Annotate | Download | only in bluetooth
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "device/bluetooth/bluetooth_adapter.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/stl_util.h"
      9 #include "device/bluetooth/bluetooth_device.h"
     10 #include "device/bluetooth/bluetooth_discovery_session.h"
     11 
     12 namespace device {
     13 
     14 BluetoothAdapter::ServiceOptions::ServiceOptions() {
     15 }
     16 BluetoothAdapter::ServiceOptions::~ServiceOptions() {
     17 }
     18 
     19 #if !defined(OS_CHROMEOS) && !defined(OS_WIN) && !defined(OS_MACOSX)
     20 //static
     21 base::WeakPtr<BluetoothAdapter> BluetoothAdapter::CreateAdapter(
     22     const InitCallback& init_callback) {
     23   return base::WeakPtr<BluetoothAdapter>();
     24 }
     25 #endif  // !defined(OS_CHROMEOS) && !defined(OS_WIN) && !defined(OS_MACOSX)
     26 
     27 BluetoothAdapter::BluetoothAdapter()
     28     : weak_ptr_factory_(this) {
     29 }
     30 
     31 BluetoothAdapter::~BluetoothAdapter() {
     32   STLDeleteValues(&devices_);
     33 }
     34 
     35 base::WeakPtr<BluetoothAdapter> BluetoothAdapter::GetWeakPtrForTesting() {
     36   return weak_ptr_factory_.GetWeakPtr();
     37 }
     38 
     39 void BluetoothAdapter::StartDiscoverySession(
     40     const DiscoverySessionCallback& callback,
     41     const ErrorCallback& error_callback) {
     42   AddDiscoverySession(
     43       base::Bind(&BluetoothAdapter::OnStartDiscoverySession,
     44                  weak_ptr_factory_.GetWeakPtr(),
     45                  callback),
     46       error_callback);
     47 }
     48 
     49 BluetoothAdapter::DeviceList BluetoothAdapter::GetDevices() {
     50   ConstDeviceList const_devices =
     51     const_cast<const BluetoothAdapter *>(this)->GetDevices();
     52 
     53   DeviceList devices;
     54   for (ConstDeviceList::const_iterator i = const_devices.begin();
     55        i != const_devices.end(); ++i)
     56     devices.push_back(const_cast<BluetoothDevice *>(*i));
     57 
     58   return devices;
     59 }
     60 
     61 BluetoothAdapter::ConstDeviceList BluetoothAdapter::GetDevices() const {
     62   ConstDeviceList devices;
     63   for (DevicesMap::const_iterator iter = devices_.begin();
     64        iter != devices_.end();
     65        ++iter)
     66     devices.push_back(iter->second);
     67 
     68   return devices;
     69 }
     70 
     71 BluetoothDevice* BluetoothAdapter::GetDevice(const std::string& address) {
     72   return const_cast<BluetoothDevice *>(
     73       const_cast<const BluetoothAdapter *>(this)->GetDevice(address));
     74 }
     75 
     76 const BluetoothDevice* BluetoothAdapter::GetDevice(
     77     const std::string& address) const {
     78   std::string canonicalized_address =
     79       BluetoothDevice::CanonicalizeAddress(address);
     80   if (canonicalized_address.empty())
     81     return NULL;
     82 
     83   DevicesMap::const_iterator iter = devices_.find(canonicalized_address);
     84   if (iter != devices_.end())
     85     return iter->second;
     86 
     87   return NULL;
     88 }
     89 
     90 void BluetoothAdapter::AddPairingDelegate(
     91     BluetoothDevice::PairingDelegate* pairing_delegate,
     92     PairingDelegatePriority priority) {
     93   // Remove the delegate, if it already exists, before inserting to allow a
     94   // change of priority.
     95   RemovePairingDelegate(pairing_delegate);
     96 
     97   // Find the first point with a lower priority, or the end of the list.
     98   std::list<PairingDelegatePair>::iterator iter = pairing_delegates_.begin();
     99   while (iter != pairing_delegates_.end() && iter->second >= priority)
    100     ++iter;
    101 
    102   pairing_delegates_.insert(iter, std::make_pair(pairing_delegate, priority));
    103 }
    104 
    105 void BluetoothAdapter::RemovePairingDelegate(
    106     BluetoothDevice::PairingDelegate* pairing_delegate) {
    107   for (std::list<PairingDelegatePair>::iterator iter =
    108        pairing_delegates_.begin(); iter != pairing_delegates_.end(); ++iter) {
    109     if (iter->first == pairing_delegate) {
    110       RemovePairingDelegateInternal(pairing_delegate);
    111       pairing_delegates_.erase(iter);
    112       return;
    113     }
    114   }
    115 }
    116 
    117 BluetoothDevice::PairingDelegate* BluetoothAdapter::DefaultPairingDelegate() {
    118   if (pairing_delegates_.empty())
    119     return NULL;
    120 
    121   return pairing_delegates_.front().first;
    122 }
    123 
    124 void BluetoothAdapter::OnStartDiscoverySession(
    125     const DiscoverySessionCallback& callback) {
    126   VLOG(1) << "Discovery session started!";
    127   scoped_ptr<BluetoothDiscoverySession> discovery_session(
    128       new BluetoothDiscoverySession(scoped_refptr<BluetoothAdapter>(this)));
    129   discovery_sessions_.insert(discovery_session.get());
    130   callback.Run(discovery_session.Pass());
    131 }
    132 
    133 void BluetoothAdapter::MarkDiscoverySessionsAsInactive() {
    134   // As sessions are marked as inactive they will notify the adapter that they
    135   // have become inactive, upon which the adapter will remove them from
    136   // |discovery_sessions_|. To avoid invalidating the iterator, make a copy
    137   // here.
    138   std::set<BluetoothDiscoverySession*> temp(discovery_sessions_);
    139   for (std::set<BluetoothDiscoverySession*>::iterator
    140           iter = temp.begin();
    141        iter != temp.end(); ++iter) {
    142     (*iter)->MarkAsInactive();
    143   }
    144 }
    145 
    146 void BluetoothAdapter::DiscoverySessionBecameInactive(
    147     BluetoothDiscoverySession* discovery_session) {
    148   DCHECK(!discovery_session->IsActive());
    149   discovery_sessions_.erase(discovery_session);
    150 }
    151 
    152 }  // namespace device
    153