| 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 <hash_set> | 7 #include <hash_set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 powered_ = state.powered; | 202 powered_ = state.powered; |
| 203 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | 203 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, |
| 204 AdapterPoweredChanged(this, powered_)); | 204 AdapterPoweredChanged(this, powered_)); |
| 205 } | 205 } |
| 206 if (!initialized_) { | 206 if (!initialized_) { |
| 207 initialized_ = true; | 207 initialized_ = true; |
| 208 init_callback_.Run(); | 208 init_callback_.Run(); |
| 209 } | 209 } |
| 210 } | 210 } |
| 211 | 211 |
| 212 void BluetoothAdapterWin::DevicesDiscovered( | 212 void BluetoothAdapterWin::DevicesPolled( |
| 213 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) { | 213 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) { |
| 214 DCHECK(thread_checker_.CalledOnValidThread()); | 214 DCHECK(thread_checker_.CalledOnValidThread()); |
| 215 |
| 216 // We are receiving a new list of all devices known to the system. Merge this |
| 217 // new list with the list we know of (|devices_|) and raise corresponding |
| 218 // DeviceAdded, DeviceRemoved and DeviceChanged events. |
| 219 |
| 220 typedef std::set<std::string> DeviceAddressSet; |
| 221 DeviceAddressSet known_devices; |
| 222 for (DevicesMap::const_iterator iter = devices_.begin(); |
| 223 iter != devices_.end(); |
| 224 ++iter) { |
| 225 known_devices.insert((*iter).first); |
| 226 } |
| 227 |
| 228 DeviceAddressSet new_devices; |
| 215 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = | 229 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = |
| 216 devices.begin(); | 230 devices.begin(); |
| 217 iter != devices.end(); | 231 iter != devices.end(); |
| 218 ++iter) { | 232 ++iter) { |
| 219 if (discovered_devices_.find((*iter)->address) == | 233 new_devices.insert((*iter)->address); |
| 220 discovered_devices_.end()) { | 234 } |
| 221 BluetoothDeviceWin device_win( | 235 |
| 222 **iter, ui_task_runner_, socket_thread_, NULL, net::NetLog::Source()); | 236 // Process device removal first |
| 223 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, | 237 DeviceAddressSet removed_devices = |
| 224 DeviceAdded(this, &device_win)); | 238 base::STLSetDifference<DeviceAddressSet>(known_devices, new_devices); |
| 225 discovered_devices_.insert((*iter)->address); | 239 for (DeviceAddressSet::const_iterator iter = removed_devices.begin(); |
| 240 iter != removed_devices.end(); |
| 241 ++iter) { |
| 242 BluetoothDevice* device_win = devices_[(*iter)]; |
| 243 devices_.erase(*iter); |
| 244 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, |
| 245 observers_, |
| 246 DeviceRemoved(this, device_win)); |
| 247 delete device_win; |
| 248 } |
| 249 |
| 250 // Process added and (maybe) changed devices in one pass |
| 251 DeviceAddressSet added_devices = |
| 252 base::STLSetDifference<DeviceAddressSet>(new_devices, known_devices); |
| 253 DeviceAddressSet changed_devices = |
| 254 base::STLSetIntersection<DeviceAddressSet>(known_devices, new_devices); |
| 255 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = |
| 256 devices.begin(); |
| 257 iter != devices.end(); |
| 258 ++iter) { |
| 259 BluetoothTaskManagerWin::DeviceState* device_state = (*iter); |
| 260 if (added_devices.find(device_state->address) != added_devices.end()) { |
| 261 BluetoothDeviceWin* device_win = |
| 262 new BluetoothDeviceWin(*device_state, |
| 263 ui_task_runner_, |
| 264 socket_thread_, |
| 265 NULL, |
| 266 net::NetLog::Source()); |
| 267 devices_[device_state->address] = device_win; |
| 268 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, |
| 269 observers_, |
| 270 DeviceAdded(this, device_win)); |
| 271 } else if (changed_devices.find(device_state->address) != |
| 272 changed_devices.end()) { |
| 273 BluetoothDeviceWin* device_win = |
| 274 static_cast<BluetoothDeviceWin*>(devices_[device_state->address]); |
| 275 if (!device_win->IsEqual(*device_state)) { |
| 276 device_win->Update(*device_state); |
| 277 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, |
| 278 observers_, |
| 279 DeviceChanged(this, device_win)); |
| 280 } |
| 226 } | 281 } |
| 227 } | 282 } |
| 228 } | 283 } |
| 229 | 284 |
| 230 void BluetoothAdapterWin::DevicesUpdated( | |
| 231 const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) { | |
| 232 STLDeleteValues(&devices_); | |
| 233 for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter = | |
| 234 devices.begin(); | |
| 235 iter != devices.end(); | |
| 236 ++iter) { | |
| 237 devices_[(*iter)->address] = new BluetoothDeviceWin( | |
| 238 **iter, ui_task_runner_, socket_thread_, NULL, net::NetLog::Source()); | |
| 239 } | |
| 240 } | |
| 241 | |
| 242 // If the method is called when |discovery_status_| is DISCOVERY_STOPPING, | 285 // If the method is called when |discovery_status_| is DISCOVERY_STOPPING, |
| 243 // starting again is handled by BluetoothAdapterWin::DiscoveryStopped(). | 286 // starting again is handled by BluetoothAdapterWin::DiscoveryStopped(). |
| 244 void BluetoothAdapterWin::AddDiscoverySession( | 287 void BluetoothAdapterWin::AddDiscoverySession( |
| 245 const base::Closure& callback, | 288 const base::Closure& callback, |
| 246 const ErrorCallback& error_callback) { | 289 const ErrorCallback& error_callback) { |
| 247 if (discovery_status_ == DISCOVERING) { | 290 if (discovery_status_ == DISCOVERING) { |
| 248 num_discovery_listeners_++; | 291 num_discovery_listeners_++; |
| 249 callback.Run(); | 292 callback.Run(); |
| 250 return; | 293 return; |
| 251 } | 294 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 num_discovery_listeners_ -= on_stop_discovery_callbacks_.size(); | 349 num_discovery_listeners_ -= on_stop_discovery_callbacks_.size(); |
| 307 on_stop_discovery_callbacks_.clear(); | 350 on_stop_discovery_callbacks_.clear(); |
| 308 return; | 351 return; |
| 309 } | 352 } |
| 310 | 353 |
| 311 discovery_status_ = DISCOVERY_STOPPING; | 354 discovery_status_ = DISCOVERY_STOPPING; |
| 312 task_manager_->PostStopDiscoveryTask(); | 355 task_manager_->PostStopDiscoveryTask(); |
| 313 } | 356 } |
| 314 | 357 |
| 315 } // namespace device | 358 } // namespace device |
| OLD | NEW |