Chromium Code Reviews| Index: device/usb/usb_service_impl.cc |
| diff --git a/device/usb/usb_service_impl.cc b/device/usb/usb_service_impl.cc |
| index a23a4a1548b913efe763a5b140951f056b6d424c..66244d742e4c0479c5dcd10dca27f540fb47f79c 100644 |
| --- a/device/usb/usb_service_impl.cc |
| +++ b/device/usb/usb_service_impl.cc |
| @@ -173,21 +173,22 @@ void UsbServiceImpl::RefreshDevices() { |
| } |
| // Find disconnected devices. |
| - for (PlatformDeviceMap::iterator it = platform_devices_.begin(); |
| - it != platform_devices_.end(); |
| - ++it) { |
| - if (!ContainsKey(connected_devices, it->second.get())) { |
| - disconnected_devices.push_back(it->first); |
| - devices_.erase(it->second->unique_id()); |
| - it->second->OnDisconnect(); |
| + for (const auto& map_entry : platform_devices_) { |
| + PlatformUsbDevice platform_device = map_entry.first; |
| + scoped_refptr<UsbDeviceImpl> device = map_entry.second; |
| + if (!ContainsKey(connected_devices, device.get())) { |
| + disconnected_devices.push_back(platform_device); |
| + devices_.erase(device->unique_id()); |
| + NotifyDeviceRemoved(device); |
| + device->OnDisconnect(); |
|
asargent_no_longer_on_chrome
2015/01/05 22:01:58
I assume you've already thought about the ramifica
Reilly Grant (use Gerrit)
2015/01/05 22:10:34
I'm actually about to remove the observer list fro
|
| } |
| } |
| // Remove disconnected devices from platform_devices_. |
| - for (size_t i = 0; i < disconnected_devices.size(); ++i) { |
| + for (const PlatformUsbDevice& platform_device : disconnected_devices) { |
| // UsbDevice will be destroyed after this. The corresponding |
| // PlatformUsbDevice will be unref'ed during this process. |
| - platform_devices_.erase(disconnected_devices[i]); |
| + platform_devices_.erase(platform_device); |
| } |
| libusb_free_device_list(platform_devices, true); |
| @@ -208,6 +209,7 @@ scoped_refptr<UsbDeviceImpl> UsbServiceImpl::AddDevice( |
| descriptor.idProduct, unique_id)); |
| platform_devices_[platform_device] = new_device; |
| devices_[unique_id] = new_device; |
| + NotifyDeviceAdded(new_device); |
| return new_device; |
| } else { |
| VLOG(1) << "Failed to get device descriptor: " |
| @@ -274,6 +276,7 @@ void UsbServiceImpl::OnDeviceRemoved(PlatformUsbDevice platform_device) { |
| } else { |
| NOTREACHED(); |
| } |
| + NotifyDeviceRemoved(device); |
| device->OnDisconnect(); |
| platform_devices_.erase(it); |
| } else { |
| @@ -310,4 +313,26 @@ void UsbService::SetInstanceForTest(UsbService* instance) { |
| g_usb_service_instance.Get().reset(instance); |
| } |
| +UsbService::UsbService() { |
| +} |
| + |
| +UsbService::~UsbService() { |
|
asargent_no_longer_on_chrome
2015/01/05 22:01:58
Consider adding a DCHECK in the destructor here th
Reilly Grant (use Gerrit)
2015/01/05 22:10:34
There's a template flag I can pass to ObserverList
|
| +} |
| + |
| +void UsbService::AddObserver(Observer* observer) { |
| + observer_list_.AddObserver(observer); |
| +} |
| + |
| +void UsbService::RemoveObserver(Observer* observer) { |
| + observer_list_.RemoveObserver(observer); |
| +} |
| + |
| +void UsbService::NotifyDeviceAdded(scoped_refptr<UsbDevice> device) { |
| + FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(device)); |
| +} |
| + |
| +void UsbService::NotifyDeviceRemoved(scoped_refptr<UsbDevice> device) { |
| + FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device)); |
| +} |
| + |
| } // namespace device |