OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/bluetooth/bluetooth_adapter_mac.h" | 5 #include "device/bluetooth/bluetooth_adapter_mac.h" |
6 | 6 |
7 #import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h> | 7 #import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h> |
8 #import <IOBluetooth/objc/IOBluetoothDevice.h> | 8 #import <IOBluetooth/objc/IOBluetoothDevice.h> |
9 #import <IOBluetooth/objc/IOBluetoothHostController.h> | 9 #import <IOBluetooth/objc/IOBluetoothHostController.h> |
10 | 10 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 92 |
93 BluetoothAdapterMac::BluetoothAdapterMac() | 93 BluetoothAdapterMac::BluetoothAdapterMac() |
94 : BluetoothAdapter(), | 94 : BluetoothAdapter(), |
95 powered_(false), | 95 powered_(false), |
96 discovery_status_(NOT_DISCOVERING), | 96 discovery_status_(NOT_DISCOVERING), |
97 adapter_delegate_( | 97 adapter_delegate_( |
98 [[BluetoothAdapterMacDelegate alloc] initWithAdapter:this]), | 98 [[BluetoothAdapterMacDelegate alloc] initWithAdapter:this]), |
99 device_inquiry_( | 99 device_inquiry_( |
100 [[IOBluetoothDeviceInquiry | 100 [[IOBluetoothDeviceInquiry |
101 inquiryWithDelegate:adapter_delegate_] retain]), | 101 inquiryWithDelegate:adapter_delegate_] retain]), |
| 102 recently_accessed_device_timestamp_(nil), |
102 weak_ptr_factory_(this) { | 103 weak_ptr_factory_(this) { |
103 } | 104 } |
104 | 105 |
105 BluetoothAdapterMac::~BluetoothAdapterMac() { | 106 BluetoothAdapterMac::~BluetoothAdapterMac() { |
106 [device_inquiry_ release]; | 107 [device_inquiry_ release]; |
107 [adapter_delegate_ release]; | 108 [adapter_delegate_ release]; |
| 109 [recently_accessed_device_timestamp_ release]; |
108 } | 110 } |
109 | 111 |
110 void BluetoothAdapterMac::AddObserver(BluetoothAdapter::Observer* observer) { | 112 void BluetoothAdapterMac::AddObserver(BluetoothAdapter::Observer* observer) { |
111 DCHECK(observer); | 113 DCHECK(observer); |
112 observers_.AddObserver(observer); | 114 observers_.AddObserver(observer); |
113 } | 115 } |
114 | 116 |
115 void BluetoothAdapterMac::RemoveObserver(BluetoothAdapter::Observer* observer) { | 117 void BluetoothAdapterMac::RemoveObserver(BluetoothAdapter::Observer* observer) { |
116 DCHECK(observer); | 118 DCHECK(observer); |
117 observers_.RemoveObserver(observer); | 119 observers_.RemoveObserver(observer); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 if (was_present != is_present) { | 210 if (was_present != is_present) { |
209 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | 211 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, |
210 AdapterPresentChanged(this, is_present)); | 212 AdapterPresentChanged(this, is_present)); |
211 } | 213 } |
212 if (powered_ != powered) { | 214 if (powered_ != powered) { |
213 powered_ = powered; | 215 powered_ = powered; |
214 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | 216 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, |
215 AdapterPoweredChanged(this, powered_)); | 217 AdapterPoweredChanged(this, powered_)); |
216 } | 218 } |
217 | 219 |
218 NSArray* paired_devices = [IOBluetoothDevice pairedDevices]; | 220 IOBluetoothDevice* recent_device = |
219 AddDevices(paired_devices); | 221 [[IOBluetoothDevice recentDevices:1] lastObject]; |
220 RemoveUnpairedDevices(paired_devices); | 222 NSDate* access_timestamp = [recent_device recentAccessDate]; |
| 223 if (recently_accessed_device_timestamp_ == nil || |
| 224 access_timestamp == nil || |
| 225 [recently_accessed_device_timestamp_ compare:access_timestamp] == |
| 226 NSOrderedAscending) { |
| 227 UpdateDevices([IOBluetoothDevice pairedDevices]); |
| 228 [recently_accessed_device_timestamp_ release]; |
| 229 recently_accessed_device_timestamp_ = [access_timestamp copy]; |
| 230 } |
221 | 231 |
222 ui_task_runner_->PostDelayedTask( | 232 ui_task_runner_->PostDelayedTask( |
223 FROM_HERE, | 233 FROM_HERE, |
224 base::Bind(&BluetoothAdapterMac::PollAdapter, | 234 base::Bind(&BluetoothAdapterMac::PollAdapter, |
225 weak_ptr_factory_.GetWeakPtr()), | 235 weak_ptr_factory_.GetWeakPtr()), |
226 base::TimeDelta::FromMilliseconds(kPollIntervalMs)); | 236 base::TimeDelta::FromMilliseconds(kPollIntervalMs)); |
227 } | 237 } |
228 | 238 |
229 void BluetoothAdapterMac::AddDevices(NSArray* devices) { | 239 void BluetoothAdapterMac::UpdateDevices(NSArray* devices) { |
| 240 STLDeleteValues(&devices_); |
230 for (IOBluetoothDevice* device in devices) { | 241 for (IOBluetoothDevice* device in devices) { |
231 std::string device_address = | 242 std::string device_address = |
232 base::SysNSStringToUTF8([device addressString]); | 243 base::SysNSStringToUTF8([device addressString]); |
233 DevicesMap::iterator found_device_iter = devices_.find(device_address); | 244 devices_[device_address] = new BluetoothDeviceMac(device); |
234 | |
235 if (found_device_iter == devices_.end()) { | |
236 devices_[device_address] = new BluetoothDeviceMac(device); | |
237 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | |
238 DeviceAdded(this, devices_[device_address])); | |
239 continue; | |
240 } | |
241 BluetoothDeviceMac* device_mac = | |
242 static_cast<BluetoothDeviceMac*>(found_device_iter->second); | |
243 if (device_mac->device_fingerprint() != | |
244 BluetoothDeviceMac::ComputeDeviceFingerprint(device)) { | |
245 devices_[device_address] = new BluetoothDeviceMac(device); | |
246 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | |
247 DeviceChanged(this, devices_[device_address])); | |
248 delete device_mac; | |
249 } | |
250 } | 245 } |
251 } | 246 } |
252 | 247 |
253 void BluetoothAdapterMac::RemoveUnpairedDevices(NSArray* paired_devices) { | |
254 base::hash_set<std::string> paired_device_address_list; | |
255 for (IOBluetoothDevice* device in paired_devices) { | |
256 paired_device_address_list.insert( | |
257 base::SysNSStringToUTF8([device addressString])); | |
258 } | |
259 | |
260 DevicesMap::iterator iter = devices_.begin(); | |
261 while (iter != devices_.end()) { | |
262 DevicesMap::iterator device_iter = iter; | |
263 ++iter; | |
264 | |
265 if (paired_device_address_list.find(device_iter->first) != | |
266 paired_device_address_list.end()) | |
267 continue; | |
268 | |
269 if (device_iter->second->IsPaired()) { | |
270 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | |
271 DeviceRemoved(this, device_iter->second)); | |
272 delete device_iter->second; | |
273 devices_.erase(device_iter); | |
274 } | |
275 } | |
276 } | |
277 | |
278 void BluetoothAdapterMac::DeviceInquiryStarted( | 248 void BluetoothAdapterMac::DeviceInquiryStarted( |
279 IOBluetoothDeviceInquiry* inquiry) { | 249 IOBluetoothDeviceInquiry* inquiry) { |
280 DCHECK(device_inquiry_ == inquiry); | 250 DCHECK(device_inquiry_ == inquiry); |
281 if (discovery_status_ == DISCOVERING) | 251 if (discovery_status_ == DISCOVERING) |
282 return; | 252 return; |
283 | 253 |
284 discovery_status_ = DISCOVERING; | 254 discovery_status_ = DISCOVERING; |
285 RunCallbacks(on_start_discovery_callbacks_, true); | 255 RunCallbacks(on_start_discovery_callbacks_, true); |
286 num_discovery_listeners_ = on_start_discovery_callbacks_.size(); | 256 num_discovery_listeners_ = on_start_discovery_callbacks_.size(); |
287 on_start_discovery_callbacks_.clear(); | 257 on_start_discovery_callbacks_.clear(); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 iter != callback_list.end(); | 330 iter != callback_list.end(); |
361 ++iter) { | 331 ++iter) { |
362 if (success) | 332 if (success) |
363 ui_task_runner_->PostTask(FROM_HERE, iter->first); | 333 ui_task_runner_->PostTask(FROM_HERE, iter->first); |
364 else | 334 else |
365 ui_task_runner_->PostTask(FROM_HERE, iter->second); | 335 ui_task_runner_->PostTask(FROM_HERE, iter->second); |
366 } | 336 } |
367 } | 337 } |
368 | 338 |
369 } // namespace device | 339 } // namespace device |
OLD | NEW |