• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ServiceOptions()14 BluetoothAdapter::ServiceOptions::ServiceOptions() {
15 }
~ServiceOptions()16 BluetoothAdapter::ServiceOptions::~ServiceOptions() {
17 }
18 
19 #if !defined(OS_CHROMEOS) && !defined(OS_WIN) && !defined(OS_MACOSX)
20 //static
CreateAdapter(const InitCallback & init_callback)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 
BluetoothAdapter()27 BluetoothAdapter::BluetoothAdapter()
28     : weak_ptr_factory_(this) {
29 }
30 
~BluetoothAdapter()31 BluetoothAdapter::~BluetoothAdapter() {
32   STLDeleteValues(&devices_);
33 }
34 
GetWeakPtrForTesting()35 base::WeakPtr<BluetoothAdapter> BluetoothAdapter::GetWeakPtrForTesting() {
36   return weak_ptr_factory_.GetWeakPtr();
37 }
38 
StartDiscoverySession(const DiscoverySessionCallback & callback,const ErrorCallback & error_callback)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 
GetDevices()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 
GetDevices() const61 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 
GetDevice(const std::string & address)71 BluetoothDevice* BluetoothAdapter::GetDevice(const std::string& address) {
72   return const_cast<BluetoothDevice *>(
73       const_cast<const BluetoothAdapter *>(this)->GetDevice(address));
74 }
75 
GetDevice(const std::string & address) const76 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 
AddPairingDelegate(BluetoothDevice::PairingDelegate * pairing_delegate,PairingDelegatePriority priority)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 
RemovePairingDelegate(BluetoothDevice::PairingDelegate * pairing_delegate)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 
DefaultPairingDelegate()117 BluetoothDevice::PairingDelegate* BluetoothAdapter::DefaultPairingDelegate() {
118   if (pairing_delegates_.empty())
119     return NULL;
120 
121   return pairing_delegates_.front().first;
122 }
123 
OnStartDiscoverySession(const DiscoverySessionCallback & callback)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 
MarkDiscoverySessionsAsInactive()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 
DiscoverySessionBecameInactive(BluetoothDiscoverySession * discovery_session)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