Chromium Code Reviews| Index: device/usb/device_manager_impl.cc |
| diff --git a/device/usb/device_manager_impl.cc b/device/usb/device_manager_impl.cc |
| index bf444a4aa737eed588891e6ba9944eaf0c2937eb..166c8a0d97682a65419a5f43955b394110d70fcb 100644 |
| --- a/device/usb/device_manager_impl.cc |
| +++ b/device/usb/device_manager_impl.cc |
| @@ -5,11 +5,13 @@ |
| #include "device/usb/device_manager_impl.h" |
| #include "base/bind.h" |
| +#include "base/location.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/sequenced_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "device/core/device_client.h" |
| #include "device/usb/device_impl.h" |
| #include "device/usb/public/cpp/device_manager_delegate.h" |
| -#include "device/usb/public/cpp/device_manager_factory.h" |
| #include "device/usb/public/interfaces/device.mojom.h" |
| #include "device/usb/type_converters.h" |
| #include "device/usb/usb_device.h" |
| @@ -21,64 +23,123 @@ |
| namespace device { |
| namespace usb { |
| -// static |
| -void DeviceManagerFactory::Build(mojo::InterfaceRequest<DeviceManager> request, |
| - scoped_ptr<DeviceManagerDelegate> delegate) { |
| +namespace { |
| + |
| +void OnGetDevicesOnServiceThread( |
| + const UsbService::GetDevicesCallback& callback, |
| + scoped_refptr<base::TaskRunner> callback_task_runner, |
| + const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| + callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, devices)); |
| +} |
| + |
| +void GetDevicesOnServiceThread( |
| + const UsbService::GetDevicesCallback& callback, |
| + scoped_refptr<base::TaskRunner> callback_task_runner) { |
| + DCHECK(DeviceClient::Get()); |
| + UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
| + if (!usb_service) { |
| + std::vector<scoped_refptr<UsbDevice>> no_devices; |
| + callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, no_devices)); |
| + return; |
| + } |
| + usb_service->GetDevices( |
| + base::Bind(&OnGetDevicesOnServiceThread, callback, callback_task_runner)); |
| +} |
| + |
| +void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback, |
| + OpenDeviceError error) { |
| + callback.Run(error); |
| +} |
| + |
| +void OnOpenDeviceOnServiceThread( |
| + mojo::InterfaceRequest<Device> device_request, |
| + const DeviceManager::OpenDeviceCallback& callback, |
| + scoped_refptr<base::TaskRunner> callback_task_runner, |
| + scoped_refptr<UsbDeviceHandle> device_handle) { |
| + if (!device_handle) { |
| + callback_task_runner->PostTask(FROM_HERE, |
| + base::Bind(&RunOpenDeviceCallback, callback, |
| + OPEN_DEVICE_ERROR_ACCESS_DENIED)); |
|
Reilly Grant (use Gerrit)
2015/06/10 20:02:47
Why not base::Bind(callback, OPEN_DEVICE_ERROR_ACC
Ken Rockot(use gerrit already)
2015/06/10 20:15:51
base::Bind unfortunately does not know how to rebi
Reilly Grant (use Gerrit)
2015/06/10 21:33:16
I'm going to put in a strong vote in favor of impo
|
| + return; |
| + } |
| + |
| // Owned by its MessagePipe. |
| - new DeviceManagerImpl(request.Pass(), delegate.Pass()); |
| + new DeviceImpl(device_handle, device_request.Pass()); |
| + |
| + callback_task_runner->PostTask( |
| + FROM_HERE, |
| + base::Bind(&RunOpenDeviceCallback, callback, OPEN_DEVICE_ERROR_OK)); |
| } |
| +void OpenDeviceOnServiceThread( |
| + const std::string& guid, |
| + mojo::InterfaceRequest<Device> device_request, |
| + const DeviceManager::OpenDeviceCallback& callback, |
| + scoped_refptr<base::TaskRunner> callback_task_runner) { |
| + DCHECK(DeviceClient::Get()); |
| + UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
| + if (!usb_service) { |
| + callback_task_runner->PostTask(FROM_HERE, |
| + base::Bind(&RunOpenDeviceCallback, callback, |
| + OPEN_DEVICE_ERROR_NOT_FOUND)); |
| + return; |
| + } |
| + scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid); |
| + if (!device) { |
| + callback_task_runner->PostTask(FROM_HERE, |
| + base::Bind(&RunOpenDeviceCallback, callback, |
| + OPEN_DEVICE_ERROR_NOT_FOUND)); |
| + return; |
| + } |
| + device->Open(base::Bind(&OnOpenDeviceOnServiceThread, |
| + base::Passed(&device_request), callback, |
| + callback_task_runner)); |
| +} |
| + |
| +} // namespace |
| + |
| DeviceManagerImpl::DeviceManagerImpl( |
| mojo::InterfaceRequest<DeviceManager> request, |
| - scoped_ptr<DeviceManagerDelegate> delegate) |
| + scoped_ptr<DeviceManagerDelegate> delegate, |
| + scoped_refptr<base::SequencedTaskRunner> service_task_runner) |
| : binding_(this, request.Pass()), |
| delegate_(delegate.Pass()), |
| + service_task_runner_(service_task_runner), |
| weak_factory_(this) { |
| } |
| DeviceManagerImpl::~DeviceManagerImpl() { |
| } |
| +void DeviceManagerImpl::set_error_handler(mojo::ErrorHandler* error_handler) { |
| + binding_.set_error_handler(error_handler); |
| +} |
| + |
| void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, |
| const GetDevicesCallback& callback) { |
| - DCHECK(DeviceClient::Get()); |
| - UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
| - if (!usb_service) { |
| - mojo::Array<DeviceInfoPtr> results(0); |
| - callback.Run(results.Pass()); |
| - return; |
| - } |
| - std::vector<UsbDeviceFilter> filters = |
| - options->filters.To<std::vector<UsbDeviceFilter>>(); |
| - usb_service->GetDevices(base::Bind(&DeviceManagerImpl::OnGetDevices, |
| - weak_factory_.GetWeakPtr(), callback, |
| - filters)); |
| + auto get_devices_callback = |
| + base::Bind(&DeviceManagerImpl::OnGetDevices, weak_factory_.GetWeakPtr(), |
| + base::Passed(&options), callback); |
| + service_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback, |
| + base::ThreadTaskRunnerHandle::Get())); |
| } |
| void DeviceManagerImpl::OpenDevice( |
| const mojo::String& guid, |
| mojo::InterfaceRequest<Device> device_request, |
| const OpenDeviceCallback& callback) { |
| - DCHECK(DeviceClient::Get()); |
| - UsbService* usb_service = DeviceClient::Get()->GetUsbService(); |
| - if (!usb_service) { |
| - callback.Run(OPEN_DEVICE_ERROR_NOT_FOUND); |
| - return; |
| - } |
| - scoped_refptr<UsbDevice> device = usb_service->GetDevice(guid); |
| - if (!device) { |
| - callback.Run(OPEN_DEVICE_ERROR_NOT_FOUND); |
| - return; |
| - } |
| - device->Open(base::Bind(&DeviceManagerImpl::OnOpenDevice, |
| - weak_factory_.GetWeakPtr(), callback, |
| - base::Passed(&device_request))); |
| + service_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&OpenDeviceOnServiceThread, guid, |
| + base::Passed(&device_request), callback, |
| + base::ThreadTaskRunnerHandle::Get())); |
| } |
| void DeviceManagerImpl::OnGetDevices( |
| + EnumerationOptionsPtr options, |
| const GetDevicesCallback& callback, |
| - const std::vector<UsbDeviceFilter>& filters, |
| const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| + auto filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
| mojo::Array<DeviceInfoPtr> device_infos(0); |
| for (size_t i = 0; i < devices.size(); ++i) { |
| DeviceInfoPtr device_info = DeviceInfo::From(*devices[i]); |
| @@ -94,20 +155,5 @@ void DeviceManagerImpl::OnGetDevices( |
| callback.Run(device_infos.Pass()); |
| } |
| -void DeviceManagerImpl::OnOpenDevice( |
| - const OpenDeviceCallback& callback, |
| - mojo::InterfaceRequest<Device> device_request, |
| - scoped_refptr<UsbDeviceHandle> device_handle) { |
| - if (!device_handle) { |
| - callback.Run(OPEN_DEVICE_ERROR_ACCESS_DENIED); |
| - return; |
| - } |
| - |
| - // Owned by its MessagePipe. |
| - new DeviceImpl(device_handle, device_request.Pass()); |
| - |
| - callback.Run(OPEN_DEVICE_ERROR_OK); |
| -} |
| - |
| } // namespace usb |
| } // namespace device |