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 fb4f9c2210130a7d2df7bfafbaba33cb7e4c359e..48c9361b69ca23a64321f2b3ae8b58949d8e117a 100644 |
--- a/device/devices_app/usb/device_manager_impl.cc |
+++ b/device/devices_app/usb/device_manager_impl.cc |
@@ -51,6 +51,23 @@ void GetDevicesOnServiceThread( |
} |
} |
+void GetDeviceOnServiceThread( |
+ const mojo::String& guid, |
+ const base::Callback<void(DeviceInfoPtr)>& callback, |
+ scoped_refptr<base::TaskRunner> callback_task_runner) { |
+ DeviceInfoPtr device_info; |
+ DCHECK(DeviceClient::Get()); |
+ UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
+ if (usb_service) { |
+ scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid); |
+ if (device) |
+ device_info = DeviceInfo::From(*device); |
+ } |
+ |
+ callback_task_runner->PostTask( |
+ FROM_HERE, base::Bind(callback, base::Passed(&device_info))); |
+} |
+ |
void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback, |
OpenDeviceError error) { |
callback.Run(error); |
@@ -211,10 +228,28 @@ void DeviceManagerImpl::OpenDevice( |
const mojo::String& guid, |
mojo::InterfaceRequest<Device> device_request, |
const OpenDeviceCallback& callback) { |
- mojo::Array<mojo::String> requested_guids(1); |
- requested_guids[0] = guid; |
+ auto has_permission_callback = base::Bind( |
+ &DeviceManagerImpl::OnGotDeviceInfoForOpen, weak_factory_.GetWeakPtr(), |
+ base::Passed(&device_request), callback); |
+ service_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GetDeviceOnServiceThread, guid, has_permission_callback, |
+ base::ThreadTaskRunnerHandle::Get())); |
+} |
+ |
+void DeviceManagerImpl::OnGotDeviceInfoForOpen( |
+ mojo::InterfaceRequest<Device> device_request, |
+ const OpenDeviceCallback& callback, |
+ DeviceInfoPtr device_info) { |
+ if (!device_info) { |
+ callback.Run(OPEN_DEVICE_ERROR_NOT_FOUND); |
+ return; |
+ } |
+ |
+ mojo::Array<DeviceInfoPtr> requested_devices(1); |
+ requested_devices[0] = device_info.Pass(); |
permission_provider_->HasDevicePermission( |
- requested_guids.Pass(), |
+ requested_devices.Pass(), |
base::Bind(&DeviceManagerImpl::OnOpenDevicePermissionCheckComplete, |
base::Unretained(this), base::Passed(&device_request), |
callback)); |
@@ -244,16 +279,16 @@ void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, |
filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
std::map<std::string, scoped_refptr<UsbDevice>> device_map; |
- mojo::Array<mojo::String> requested_guids(0); |
+ mojo::Array<DeviceInfoPtr> requested_devices(0); |
for (const auto& device : devices) { |
if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) { |
device_map[device->guid()] = device; |
- requested_guids.push_back(device->guid()); |
+ requested_devices.push_back(DeviceInfo::From(*device)); |
} |
} |
permission_provider_->HasDevicePermission( |
- requested_guids.Pass(), |
+ requested_devices.Pass(), |
base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback)); |
} |
@@ -276,19 +311,19 @@ void DeviceManagerImpl::MaybeRunDeviceChangesCallback() { |
DeviceMap devices_removed; |
devices_removed.swap(devices_removed_); |
- mojo::Array<mojo::String> requested_guids(devices_added.size() + |
- devices_removed.size()); |
+ mojo::Array<DeviceInfoPtr> requested_devices(devices_added.size() + |
+ devices_removed.size()); |
{ |
size_t i = 0; |
for (const auto& map_entry : devices_added) |
- requested_guids[i++] = map_entry.first; |
+ requested_devices[i++] = DeviceInfo::From(*map_entry.second); |
for (const auto& map_entry : devices_removed) |
- requested_guids[i++] = map_entry.first; |
+ requested_devices[i++] = DeviceInfo::From(*map_entry.second); |
} |
permission_request_pending_ = true; |
permission_provider_->HasDevicePermission( |
- requested_guids.Pass(), |
+ requested_devices.Pass(), |
base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete, |
base::Unretained(this), devices_added, devices_removed)); |
} |