| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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_win.h" | 5 #include "device/bluetooth/bluetooth_adapter_win.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 for (auto& observer : observers_) | 220 for (auto& observer : observers_) |
| 221 observer.AdapterPoweredChanged(this, powered_); | 221 observer.AdapterPoweredChanged(this, powered_); |
| 222 } | 222 } |
| 223 if (!initialized_) { | 223 if (!initialized_) { |
| 224 initialized_ = true; | 224 initialized_ = true; |
| 225 init_callback_.Run(); | 225 init_callback_.Run(); |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 void BluetoothAdapterWin::DevicesPolled( | 229 void BluetoothAdapterWin::DevicesPolled( |
| 230 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) { | 230 const std::vector<std::unique_ptr<BluetoothTaskManagerWin::DeviceState>>& |
| 231 devices) { |
| 231 DCHECK(thread_checker_.CalledOnValidThread()); | 232 DCHECK(thread_checker_.CalledOnValidThread()); |
| 232 | 233 |
| 233 // We are receiving a new list of all devices known to the system. Merge this | 234 // We are receiving a new list of all devices known to the system. Merge this |
| 234 // new list with the list we know of (|devices_|) and raise corresponding | 235 // new list with the list we know of (|devices_|) and raise corresponding |
| 235 // DeviceAdded, DeviceRemoved and DeviceChanged events. | 236 // DeviceAdded, DeviceRemoved and DeviceChanged events. |
| 236 | 237 |
| 237 typedef std::set<std::string> DeviceAddressSet; | 238 typedef std::set<std::string> DeviceAddressSet; |
| 238 DeviceAddressSet known_devices; | 239 DeviceAddressSet known_devices; |
| 239 for (DevicesMap::const_iterator iter = devices_.begin(); | 240 for (DevicesMap::const_iterator iter = devices_.begin(); |
| 240 iter != devices_.end(); | 241 iter != devices_.end(); |
| 241 ++iter) { | 242 ++iter) { |
| 242 known_devices.insert((*iter).first); | 243 known_devices.insert((*iter).first); |
| 243 } | 244 } |
| 244 | 245 |
| 245 DeviceAddressSet new_devices; | 246 DeviceAddressSet new_devices; |
| 246 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = | 247 for (auto& device : devices) { |
| 247 devices.begin(); | 248 new_devices.insert(device->address); |
| 248 iter != devices.end(); | |
| 249 ++iter) { | |
| 250 new_devices.insert((*iter)->address); | |
| 251 } | 249 } |
| 252 | 250 |
| 253 // Process device removal first | 251 // Process device removal first |
| 254 DeviceAddressSet removed_devices = | 252 DeviceAddressSet removed_devices = |
| 255 base::STLSetDifference<DeviceAddressSet>(known_devices, new_devices); | 253 base::STLSetDifference<DeviceAddressSet>(known_devices, new_devices); |
| 256 for (DeviceAddressSet::const_iterator iter = removed_devices.begin(); | 254 for (DeviceAddressSet::const_iterator iter = removed_devices.begin(); |
| 257 iter != removed_devices.end(); | 255 iter != removed_devices.end(); |
| 258 ++iter) { | 256 ++iter) { |
| 259 std::unique_ptr<BluetoothDevice> device_win = | 257 std::unique_ptr<BluetoothDevice> device_win = |
| 260 devices_.take_and_erase(*iter); | 258 devices_.take_and_erase(*iter); |
| 261 for (auto& observer : observers_) | 259 for (auto& observer : observers_) |
| 262 observer.DeviceRemoved(this, device_win.get()); | 260 observer.DeviceRemoved(this, device_win.get()); |
| 263 } | 261 } |
| 264 | 262 |
| 265 // Process added and (maybe) changed devices in one pass | 263 // Process added and (maybe) changed devices in one pass |
| 266 DeviceAddressSet added_devices = | 264 DeviceAddressSet added_devices = |
| 267 base::STLSetDifference<DeviceAddressSet>(new_devices, known_devices); | 265 base::STLSetDifference<DeviceAddressSet>(new_devices, known_devices); |
| 268 DeviceAddressSet changed_devices = | 266 DeviceAddressSet changed_devices = |
| 269 base::STLSetIntersection<DeviceAddressSet>(known_devices, new_devices); | 267 base::STLSetIntersection<DeviceAddressSet>(known_devices, new_devices); |
| 270 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = | 268 for (auto& device : devices) { |
| 271 devices.begin(); | 269 if (added_devices.find(device->address) != added_devices.end()) { |
| 272 iter != devices.end(); | |
| 273 ++iter) { | |
| 274 BluetoothTaskManagerWin::DeviceState* device_state = (*iter); | |
| 275 if (added_devices.find(device_state->address) != added_devices.end()) { | |
| 276 BluetoothDeviceWin* device_win = | 270 BluetoothDeviceWin* device_win = |
| 277 new BluetoothDeviceWin(this, *device_state, ui_task_runner_, | 271 new BluetoothDeviceWin(this, device, ui_task_runner_, socket_thread_, |
| 278 socket_thread_, NULL, net::NetLogSource()); | 272 NULL, net::NetLogSource()); |
| 279 devices_.set(device_state->address, | 273 devices_.set(device->address, |
| 280 std::unique_ptr<BluetoothDevice>(device_win)); | 274 std::unique_ptr<BluetoothDevice>(device_win)); |
| 281 for (auto& observer : observers_) | 275 for (auto& observer : observers_) |
| 282 observer.DeviceAdded(this, device_win); | 276 observer.DeviceAdded(this, device_win); |
| 283 } else if (changed_devices.find(device_state->address) != | 277 } else if (changed_devices.find(device->address) != changed_devices.end()) { |
| 284 changed_devices.end()) { | 278 DevicesMap::const_iterator iter = devices_.find(device->address); |
| 285 DevicesMap::const_iterator iter = devices_.find(device_state->address); | |
| 286 DCHECK(iter != devices_.end()); | 279 DCHECK(iter != devices_.end()); |
| 287 BluetoothDeviceWin* device_win = | 280 BluetoothDeviceWin* device_win = |
| 288 static_cast<BluetoothDeviceWin*>(iter->second); | 281 static_cast<BluetoothDeviceWin*>(iter->second); |
| 289 if (!device_win->IsEqual(*device_state)) { | 282 if (!device_win->IsEqual(*device)) { |
| 290 device_win->Update(*device_state); | 283 device_win->Update(*device); |
| 291 for (auto& observer : observers_) | 284 for (auto& observer : observers_) |
| 292 observer.DeviceChanged(this, device_win); | 285 observer.DeviceChanged(this, device_win); |
| 293 } | 286 } |
| 294 // Above IsEqual returns true if device name, address, status and services | 287 // Above IsEqual returns true if device name, address, status and services |
| 295 // (primary services of BLE device) are the same. However, in BLE tests, | 288 // (primary services of BLE device) are the same. However, in BLE tests, |
| 296 // we may simulate characteristic, descriptor and secondary GATT service | 289 // we may simulate characteristic, descriptor and secondary GATT service |
| 297 // after device has been initialized. | 290 // after device has been initialized. |
| 298 if (force_update_device_for_test_) | 291 if (force_update_device_for_test_) |
| 299 device_win->Update(*device_state); | 292 device_win->Update(*device); |
| 300 } | 293 } |
| 301 } | 294 } |
| 302 } | 295 } |
| 303 | 296 |
| 304 // If the method is called when |discovery_status_| is DISCOVERY_STOPPING, | 297 // If the method is called when |discovery_status_| is DISCOVERY_STOPPING, |
| 305 // starting again is handled by BluetoothAdapterWin::DiscoveryStopped(). | 298 // starting again is handled by BluetoothAdapterWin::DiscoveryStopped(). |
| 306 void BluetoothAdapterWin::AddDiscoverySession( | 299 void BluetoothAdapterWin::AddDiscoverySession( |
| 307 BluetoothDiscoveryFilter* discovery_filter, | 300 BluetoothDiscoveryFilter* discovery_filter, |
| 308 const base::Closure& callback, | 301 const base::Closure& callback, |
| 309 const DiscoverySessionErrorCallback& error_callback) { | 302 const DiscoverySessionErrorCallback& error_callback) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 num_discovery_listeners_ -= on_stop_discovery_callbacks_.size(); | 373 num_discovery_listeners_ -= on_stop_discovery_callbacks_.size(); |
| 381 on_stop_discovery_callbacks_.clear(); | 374 on_stop_discovery_callbacks_.clear(); |
| 382 return; | 375 return; |
| 383 } | 376 } |
| 384 | 377 |
| 385 discovery_status_ = DISCOVERY_STOPPING; | 378 discovery_status_ = DISCOVERY_STOPPING; |
| 386 task_manager_->PostStopDiscoveryTask(); | 379 task_manager_->PostStopDiscoveryTask(); |
| 387 } | 380 } |
| 388 | 381 |
| 389 } // namespace device | 382 } // namespace device |
| OLD | NEW |