Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: device/usb/device_manager_impl.cc

Issue 1165223004: Introduce the devices Mojo app (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698