OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/devices_app/usb/device_manager_impl.h" | 5 #include "device/devices_app/usb/device_manager_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback, | 46 usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback, |
47 callback_task_runner)); | 47 callback_task_runner)); |
48 } else { | 48 } else { |
49 callback_task_runner->PostTask(FROM_HERE, | 49 callback_task_runner->PostTask(FROM_HERE, |
50 base::Bind(callback, DeviceList())); | 50 base::Bind(callback, DeviceList())); |
51 } | 51 } |
52 } | 52 } |
53 | 53 |
54 void GetDeviceOnServiceThread( | 54 void GetDeviceOnServiceThread( |
55 const mojo::String& guid, | 55 const mojo::String& guid, |
56 const base::Callback<void(DeviceInfoPtr)>& callback, | 56 const base::Callback<void(scoped_refptr<UsbDevice>)>& callback, |
57 scoped_refptr<base::TaskRunner> callback_task_runner) { | |
58 DeviceInfoPtr device_info; | |
59 DCHECK(DeviceClient::Get()); | |
60 UsbService* usb_service = DeviceClient::Get()->GetUsbService(); | |
61 if (usb_service) { | |
62 scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid); | |
63 if (device) | |
64 device_info = DeviceInfo::From(*device); | |
65 } | |
66 | |
67 callback_task_runner->PostTask( | |
68 FROM_HERE, base::Bind(callback, base::Passed(&device_info))); | |
69 } | |
70 | |
71 void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback, | |
72 OpenDeviceError error) { | |
73 callback.Run(error); | |
74 } | |
75 | |
76 void OnOpenDeviceOnServiceThread( | |
77 mojo::InterfaceRequest<Device> device_request, | |
78 const DeviceManager::OpenDeviceCallback& callback, | |
79 scoped_refptr<base::TaskRunner> callback_task_runner, | |
80 scoped_refptr<UsbDeviceHandle> device_handle) { | |
81 if (!device_handle) { | |
82 callback_task_runner->PostTask(FROM_HERE, | |
83 base::Bind(&RunOpenDeviceCallback, callback, | |
84 OPEN_DEVICE_ERROR_ACCESS_DENIED)); | |
85 return; | |
86 } | |
87 | |
88 // Owned by its MessagePipe. | |
89 new DeviceImpl(device_handle, device_request.Pass()); | |
90 | |
91 callback_task_runner->PostTask( | |
92 FROM_HERE, | |
93 base::Bind(&RunOpenDeviceCallback, callback, OPEN_DEVICE_ERROR_OK)); | |
94 } | |
95 | |
96 void OpenDeviceOnServiceThread( | |
97 const std::string& guid, | |
98 mojo::InterfaceRequest<Device> device_request, | |
99 const DeviceManager::OpenDeviceCallback& callback, | |
100 scoped_refptr<base::TaskRunner> callback_task_runner) { | 57 scoped_refptr<base::TaskRunner> callback_task_runner) { |
101 DCHECK(DeviceClient::Get()); | 58 DCHECK(DeviceClient::Get()); |
| 59 scoped_refptr<UsbDevice> device; |
102 UsbService* usb_service = DeviceClient::Get()->GetUsbService(); | 60 UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
103 if (!usb_service) { | 61 if (usb_service) |
104 callback_task_runner->PostTask(FROM_HERE, | 62 device = usb_service->GetDevice(guid); |
105 base::Bind(&RunOpenDeviceCallback, callback, | 63 callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, device)); |
106 OPEN_DEVICE_ERROR_NOT_FOUND)); | |
107 return; | |
108 } | |
109 scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid); | |
110 if (!device) { | |
111 callback_task_runner->PostTask(FROM_HERE, | |
112 base::Bind(&RunOpenDeviceCallback, callback, | |
113 OPEN_DEVICE_ERROR_NOT_FOUND)); | |
114 return; | |
115 } | |
116 device->Open(base::Bind(&OnOpenDeviceOnServiceThread, | |
117 base::Passed(&device_request), callback, | |
118 callback_task_runner)); | |
119 } | 64 } |
120 | 65 |
121 void FilterAndConvertDevicesAndThen( | 66 void FilterAndConvertDevicesAndThen( |
122 const DeviceMap& devices, | 67 const DeviceMap& devices, |
123 const DeviceManagerImpl::GetDevicesCallback& callback, | 68 const DeviceManagerImpl::GetDevicesCallback& callback, |
124 mojo::Array<mojo::String> allowed_guids) { | 69 mojo::Array<mojo::String> allowed_guids) { |
125 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); | 70 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); |
126 for (size_t i = 0; i < allowed_guids.size(); ++i) { | 71 for (size_t i = 0; i < allowed_guids.size(); ++i) { |
127 const auto it = devices.find(allowed_guids[i]); | 72 const auto it = devices.find(allowed_guids[i]); |
128 DCHECK(it != devices.end()); | 73 DCHECK(it != devices.end()); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback, | 162 FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback, |
218 base::ThreadTaskRunnerHandle::Get())); | 163 base::ThreadTaskRunnerHandle::Get())); |
219 } | 164 } |
220 | 165 |
221 void DeviceManagerImpl::GetDeviceChanges( | 166 void DeviceManagerImpl::GetDeviceChanges( |
222 const GetDeviceChangesCallback& callback) { | 167 const GetDeviceChangesCallback& callback) { |
223 device_change_callbacks_.push(callback); | 168 device_change_callbacks_.push(callback); |
224 MaybeRunDeviceChangesCallback(); | 169 MaybeRunDeviceChangesCallback(); |
225 } | 170 } |
226 | 171 |
227 void DeviceManagerImpl::OpenDevice( | 172 void DeviceManagerImpl::GetDevice( |
228 const mojo::String& guid, | 173 const mojo::String& guid, |
229 mojo::InterfaceRequest<Device> device_request, | 174 mojo::InterfaceRequest<Device> device_request) { |
230 const OpenDeviceCallback& callback) { | 175 auto get_device_callback = |
231 auto has_permission_callback = base::Bind( | 176 base::Bind(&DeviceManagerImpl::OnGetDevice, weak_factory_.GetWeakPtr(), |
232 &DeviceManagerImpl::OnGotDeviceInfoForOpen, weak_factory_.GetWeakPtr(), | 177 base::Passed(&device_request)); |
233 base::Passed(&device_request), callback); | |
234 service_task_runner_->PostTask( | 178 service_task_runner_->PostTask( |
235 FROM_HERE, | 179 FROM_HERE, |
236 base::Bind(&GetDeviceOnServiceThread, guid, has_permission_callback, | 180 base::Bind(&GetDeviceOnServiceThread, guid, get_device_callback, |
237 base::ThreadTaskRunnerHandle::Get())); | 181 base::ThreadTaskRunnerHandle::Get())); |
238 } | 182 } |
239 | 183 |
240 void DeviceManagerImpl::OnGotDeviceInfoForOpen( | 184 void DeviceManagerImpl::OnGetDevice( |
241 mojo::InterfaceRequest<Device> device_request, | 185 mojo::InterfaceRequest<Device> device_request, |
242 const OpenDeviceCallback& callback, | 186 scoped_refptr<UsbDevice> device) { |
243 DeviceInfoPtr device_info) { | 187 if (!device) |
244 if (!device_info) { | |
245 callback.Run(OPEN_DEVICE_ERROR_NOT_FOUND); | |
246 return; | 188 return; |
247 } | |
248 | 189 |
249 mojo::Array<DeviceInfoPtr> requested_devices(1); | 190 mojo::Array<DeviceInfoPtr> requested_devices(1); |
250 requested_devices[0] = device_info.Pass(); | 191 requested_devices[0] = DeviceInfo::From(*device); |
251 permission_provider_->HasDevicePermission( | 192 permission_provider_->HasDevicePermission( |
252 requested_devices.Pass(), | 193 requested_devices.Pass(), |
253 base::Bind(&DeviceManagerImpl::OnOpenDevicePermissionCheckComplete, | 194 base::Bind(&DeviceManagerImpl::OnGetDevicePermissionCheckComplete, |
254 base::Unretained(this), base::Passed(&device_request), | 195 base::Unretained(this), device, |
255 callback)); | 196 base::Passed(&device_request))); |
256 } | 197 } |
257 | 198 |
258 void DeviceManagerImpl::OnOpenDevicePermissionCheckComplete( | 199 void DeviceManagerImpl::OnGetDevicePermissionCheckComplete( |
| 200 scoped_refptr<UsbDevice> device, |
259 mojo::InterfaceRequest<Device> device_request, | 201 mojo::InterfaceRequest<Device> device_request, |
260 const OpenDeviceCallback& callback, | |
261 mojo::Array<mojo::String> allowed_guids) { | 202 mojo::Array<mojo::String> allowed_guids) { |
262 if (allowed_guids.size() == 0) { | 203 if (allowed_guids.size() == 0) |
263 callback.Run(OPEN_DEVICE_ERROR_ACCESS_DENIED); | |
264 return; | 204 return; |
265 } | |
266 | 205 |
267 DCHECK(allowed_guids.size() == 1); | 206 DCHECK(allowed_guids.size() == 1); |
268 service_task_runner_->PostTask( | 207 new DeviceImpl(device, device_request.Pass()); |
269 FROM_HERE, base::Bind(&OpenDeviceOnServiceThread, allowed_guids[0], | |
270 base::Passed(&device_request), callback, | |
271 base::ThreadTaskRunnerHandle::Get())); | |
272 } | 208 } |
273 | 209 |
274 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, | 210 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, |
275 const GetDevicesCallback& callback, | 211 const GetDevicesCallback& callback, |
276 const DeviceList& devices) { | 212 const DeviceList& devices) { |
277 std::vector<UsbDeviceFilter> filters; | 213 std::vector<UsbDeviceFilter> filters; |
278 if (options) | 214 if (options) |
279 filters = options->filters.To<std::vector<UsbDeviceFilter>>(); | 215 filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
280 | 216 |
281 std::map<std::string, scoped_refptr<UsbDevice>> device_map; | 217 std::map<std::string, scoped_refptr<UsbDevice>> device_map; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 callback.Run(notification.Pass()); | 294 callback.Run(notification.Pass()); |
359 device_change_callbacks_.pop(); | 295 device_change_callbacks_.pop(); |
360 } | 296 } |
361 | 297 |
362 if (devices_added_.size() > 0 || !devices_removed_.empty()) | 298 if (devices_added_.size() > 0 || !devices_removed_.empty()) |
363 MaybeRunDeviceChangesCallback(); | 299 MaybeRunDeviceChangesCallback(); |
364 } | 300 } |
365 | 301 |
366 } // namespace usb | 302 } // namespace usb |
367 } // namespace device | 303 } // namespace device |
OLD | NEW |