Chromium Code Reviews| Index: device/devices_app/usb/device_manager_impl.cc |
| diff --git a/device/devices_app/usb/device_manager_impl.cc b/device/devices_app/usb/device_manager_impl.cc |
| index cfc45b668c08487978f05fc3254befdae95fd457..32f140723e1264357e6293d06b6a3dc8270ad11b 100644 |
| --- a/device/devices_app/usb/device_manager_impl.cc |
| +++ b/device/devices_app/usb/device_manager_impl.cc |
| @@ -27,34 +27,28 @@ namespace usb { |
| namespace { |
| +typedef std::vector<scoped_refptr<UsbDevice>> DeviceList; |
|
Ken Rockot(use gerrit already)
2015/09/15 18:09:25
nit: Maybe just axe these and use DeviceManagerImp
Reilly Grant (use Gerrit)
2015/09/15 19:46:48
Done.
|
| +typedef std::map<std::string, scoped_refptr<device::UsbDevice>> DeviceMap; |
| + |
| void OnGetDevicesOnServiceThread( |
| - const std::vector<UsbDeviceFilter>& filters, |
| - const base::Callback<void(mojo::Array<DeviceInfoPtr>)>& callback, |
| + const base::Callback<void(const DeviceList&)>& callback, |
| scoped_refptr<base::TaskRunner> callback_task_runner, |
| - const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| - mojo::Array<DeviceInfoPtr> mojo_devices(0); |
| - for (size_t i = 0; i < devices.size(); ++i) { |
| - if (UsbDeviceFilter::MatchesAny(devices[i], filters) || filters.empty()) |
| - mojo_devices.push_back(DeviceInfo::From(*devices[i])); |
| - } |
| - callback_task_runner->PostTask( |
| - FROM_HERE, base::Bind(callback, base::Passed(&mojo_devices))); |
| + const DeviceList& devices) { |
| + callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, devices)); |
| } |
| void GetDevicesOnServiceThread( |
| - const std::vector<UsbDeviceFilter>& filters, |
| - const base::Callback<void(mojo::Array<DeviceInfoPtr>)>& callback, |
| + const base::Callback<void(const DeviceList&)>& callback, |
| scoped_refptr<base::TaskRunner> callback_task_runner) { |
| DCHECK(DeviceClient::Get()); |
| UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
| - if (!usb_service) { |
| - mojo::Array<DeviceInfoPtr> no_devices(0); |
| - callback_task_runner->PostTask( |
| - FROM_HERE, base::Bind(callback, base::Passed(&no_devices))); |
| - return; |
| + if (usb_service) { |
| + usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback, |
| + callback_task_runner)); |
| + } else { |
| + callback_task_runner->PostTask(FROM_HERE, |
| + base::Bind(callback, DeviceList())); |
| } |
| - usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, filters, |
| - callback, callback_task_runner)); |
| } |
| void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback, |
| @@ -107,18 +101,15 @@ void OpenDeviceOnServiceThread( |
| callback_task_runner)); |
| } |
| -void FilterDeviceListAndThen( |
| +void FilterAndConvertDevicesAndThen( |
| + const DeviceMap& devices, |
| const DeviceManagerImpl::GetDevicesCallback& callback, |
| - mojo::Array<DeviceInfoPtr> devices, |
| mojo::Array<mojo::String> allowed_guids) { |
| - std::set<std::string> allowed_guid_set; |
| - for (size_t i = 0; i < allowed_guids.size(); ++i) |
| - allowed_guid_set.insert(allowed_guids[i]); |
| - |
| - mojo::Array<DeviceInfoPtr> allowed_devices(0); |
| - for (size_t i = 0; i < devices.size(); ++i) { |
| - if (ContainsKey(allowed_guid_set, devices[i]->guid)) |
| - allowed_devices.push_back(devices[i].Pass()); |
| + mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); |
| + for (size_t i = 0; i < allowed_guids.size(); ++i) { |
| + const auto it = devices.find(allowed_guids[i]); |
| + DCHECK(it != devices.end()); |
| + allowed_devices[i] = DeviceInfo::From(*it->second); |
| } |
| callback.Run(allowed_devices.Pass()); |
| @@ -150,16 +141,15 @@ class DeviceManagerImpl::ServiceThreadHelper |
| private: |
| // UsbService::Observer |
| void OnDeviceAdded(scoped_refptr<UsbDevice> device) override { |
| - DeviceInfoPtr mojo_device(DeviceInfo::From(*device)); |
| task_runner_->PostTask( |
| - FROM_HERE, base::Bind(&DeviceManagerImpl::OnDeviceAdded, manager_, |
| - base::Passed(&mojo_device))); |
| + FROM_HERE, |
| + base::Bind(&DeviceManagerImpl::OnDeviceAdded, manager_, device)); |
| } |
| void OnDeviceRemoved(scoped_refptr<UsbDevice> device) override { |
| task_runner_->PostTask( |
| - FROM_HERE, base::Bind(&DeviceManagerImpl::OnDeviceRemoved, manager_, |
| - device->guid())); |
| + FROM_HERE, |
| + base::Bind(&DeviceManagerImpl::OnDeviceRemoved, manager_, device)); |
| } |
| void WillDestroyUsbService() override { observer_.RemoveAll(); } |
| @@ -203,15 +193,12 @@ DeviceManagerImpl::~DeviceManagerImpl() { |
| void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, |
| const GetDevicesCallback& callback) { |
| - std::vector<UsbDeviceFilter> filters; |
| - if (options) |
| - filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
| - auto get_devices_callback = base::Bind(&DeviceManagerImpl::OnGetDevices, |
| - weak_factory_.GetWeakPtr(), callback); |
| + auto get_devices_callback = |
| + base::Bind(&DeviceManagerImpl::OnGetDevices, weak_factory_.GetWeakPtr(), |
| + base::Passed(&options), callback); |
| service_task_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&GetDevicesOnServiceThread, filters, get_devices_callback, |
| - base::ThreadTaskRunnerHandle::Get())); |
| + FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback, |
| + base::ThreadTaskRunnerHandle::Get())); |
| } |
| void DeviceManagerImpl::GetDeviceChanges( |
| @@ -249,86 +236,86 @@ void DeviceManagerImpl::OnOpenDevicePermissionCheckComplete( |
| base::ThreadTaskRunnerHandle::Get())); |
| } |
| -void DeviceManagerImpl::OnGetDevices(const GetDevicesCallback& callback, |
| - mojo::Array<DeviceInfoPtr> devices) { |
| - mojo::Array<mojo::String> requested_guids(devices.size()); |
| - for (size_t i = 0; i < devices.size(); ++i) |
| - requested_guids[i] = devices[i]->guid; |
| +void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, |
| + const GetDevicesCallback& callback, |
| + const DeviceList& devices) { |
| + std::vector<UsbDeviceFilter> filters; |
| + if (options) |
| + filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
| + |
| + std::map<std::string, scoped_refptr<UsbDevice>> device_map; |
| + mojo::Array<mojo::String> requested_guids(0); |
| + for (const auto& device : devices) { |
| + if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) { |
| + device_map[device->guid()] = device; |
| + requested_guids.push_back(device->guid()); |
| + } |
| + } |
| permission_provider_->HasDevicePermission( |
| requested_guids.Pass(), |
| - base::Bind(&FilterDeviceListAndThen, callback, base::Passed(&devices))); |
| + base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback)); |
| } |
| -void DeviceManagerImpl::OnDeviceAdded(DeviceInfoPtr device) { |
| - DCHECK(!ContainsKey(devices_removed_, device->guid)); |
| - devices_added_.push_back(device.Pass()); |
| +void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) { |
| + DCHECK(!ContainsKey(devices_removed_, device->guid())); |
| + devices_added_[device->guid()] = device; |
| MaybeRunDeviceChangesCallback(); |
| } |
| -void DeviceManagerImpl::OnDeviceRemoved(std::string device_guid) { |
| - bool found = false; |
| - mojo::Array<DeviceInfoPtr> devices_added; |
| - for (size_t i = 0; i < devices_added_.size(); ++i) { |
| - if (devices_added_[i]->guid == device_guid) |
| - found = true; |
| - else |
| - devices_added.push_back(devices_added_[i].Pass()); |
| - } |
| - devices_added.Swap(&devices_added_); |
| - if (!found) |
| - devices_removed_.insert(device_guid); |
| +void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { |
| + if (devices_added_.erase(device->guid()) == 0) |
| + devices_removed_[device->guid()] = device; |
| MaybeRunDeviceChangesCallback(); |
| } |
| void DeviceManagerImpl::MaybeRunDeviceChangesCallback() { |
| if (!permission_request_pending_ && !device_change_callbacks_.empty()) { |
| - mojo::Array<DeviceInfoPtr> devices_added; |
| - devices_added.Swap(&devices_added_); |
| - std::set<std::string> devices_removed; |
| + DeviceMap devices_added; |
| + devices_added.swap(devices_added_); |
| + DeviceMap devices_removed; |
| devices_removed.swap(devices_removed_); |
| mojo::Array<mojo::String> requested_guids(devices_added.size() + |
| devices_removed.size()); |
| { |
| - size_t i; |
| - for (i = 0; i < devices_added.size(); ++i) |
| - requested_guids[i] = devices_added[i]->guid; |
| - for (const std::string& guid : devices_removed) |
| - requested_guids[i++] = guid; |
| + size_t i = 0; |
| + for (const auto& map_entry : devices_added) |
| + requested_guids[i++] = map_entry.first; |
| + for (const auto& map_entry : devices_removed) |
| + requested_guids[i++] = map_entry.first; |
| } |
| permission_request_pending_ = true; |
| permission_provider_->HasDevicePermission( |
| requested_guids.Pass(), |
| base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete, |
| - base::Unretained(this), base::Passed(&devices_added), |
| - devices_removed)); |
| + base::Unretained(this), devices_added, devices_removed)); |
| } |
| } |
| void DeviceManagerImpl::OnEnumerationPermissionCheckComplete( |
| - mojo::Array<DeviceInfoPtr> devices_added, |
| - const std::set<std::string>& devices_removed, |
| + const DeviceMap& devices_added, |
| + const DeviceMap& devices_removed, |
| mojo::Array<mojo::String> allowed_guids) { |
| permission_request_pending_ = false; |
| if (allowed_guids.size() > 0) { |
| - std::set<std::string> allowed_guid_set; |
| - for (size_t i = 0; i < allowed_guids.size(); ++i) |
| - allowed_guid_set.insert(allowed_guids[i]); |
| - |
| DeviceChangeNotificationPtr notification = DeviceChangeNotification::New(); |
| notification->devices_added.resize(0); |
| - for (size_t i = 0; i < devices_added.size(); ++i) { |
| - if (ContainsKey(allowed_guid_set, devices_added[i]->guid)) |
| - notification->devices_added.push_back(devices_added[i].Pass()); |
| - } |
| - |
| notification->devices_removed.resize(0); |
| - for (const std::string& guid : devices_removed) { |
| - if (ContainsKey(allowed_guid_set, guid)) |
| - notification->devices_removed.push_back(guid); |
| + |
| + for (size_t i = 0; i < allowed_guids.size(); ++i) { |
| + const mojo::String& guid = allowed_guids[i]; |
| + auto it = devices_added.find(guid); |
| + if (it != devices_added.end()) { |
| + DCHECK(!ContainsKey(devices_removed, guid)); |
| + notification->devices_added.push_back(DeviceInfo::From(*it->second)); |
| + } else { |
| + it = devices_removed.find(guid); |
| + DCHECK(it != devices_removed.end()); |
| + notification->devices_removed.push_back(DeviceInfo::From(*it->second)); |
| + } |
| } |
| DCHECK(!device_change_callbacks_.empty()); |