Index: device/usb/usb_service_impl.h |
diff --git a/device/usb/usb_service_impl.h b/device/usb/usb_service_impl.h |
index 44fff41084c71235a583484befb306e9e285ef3e..e4c44438aab95a2c5badde26415cd45ff6353599 100644 |
--- a/device/usb/usb_service_impl.h |
+++ b/device/usb/usb_service_impl.h |
@@ -5,42 +5,92 @@ |
#include "device/usb/usb_service.h" |
#include <map> |
+#include <set> |
#include "base/memory/weak_ptr.h" |
-#include "base/single_thread_task_runner.h" |
+#include "base/message_loop/message_loop.h" |
#include "device/usb/usb_context.h" |
#include "device/usb/usb_device_impl.h" |
#include "third_party/libusb/src/libusb/libusb.h" |
+#if defined(OS_WIN) |
+#include "base/scoped_observer.h" |
+#include "device/core/device_monitor_win.h" |
+#endif // OS_WIN |
+ |
+struct libusb_device; |
+struct libusb_context; |
+ |
+namespace base { |
+class SequencedTaskRunner; |
+class SingleThreadTaskRunner; |
+} |
+ |
namespace device { |
typedef struct libusb_device* PlatformUsbDevice; |
typedef struct libusb_context* PlatformUsbContext; |
-class UsbServiceImpl : public UsbService { |
+class UsbServiceImpl : public UsbService, |
+#if defined(OS_WIN) |
+ public DeviceMonitorWin::Observer, |
+#endif // OS_WIN |
+ public base::MessageLoop::DestructionObserver { |
public: |
static UsbService* Create( |
- scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); |
private: |
explicit UsbServiceImpl( |
PlatformUsbContext context, |
- scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); |
~UsbServiceImpl() override; |
// device::UsbService implementation |
scoped_refptr<UsbDevice> GetDeviceById(uint32 unique_id) override; |
- void GetDevices(std::vector<scoped_refptr<UsbDevice>>* devices) override; |
- |
- // Enumerate USB devices from OS and update devices_ map. |
- void RefreshDevices(); |
+ void GetDevices(const GetDevicesCallback& callback) override; |
#if defined(OS_WIN) |
- void RefreshDevicesIfWinUsbDevice(const std::string& device_path); |
+ // device::DeviceMonitorWin::Observer implementation |
+ void OnDeviceAdded(const GUID& class_guid, |
+ const std::string& device_path) override; |
+ void OnDeviceRemoved(const GUID& class_guid, |
+ const std::string& device_path) override; |
#endif // OS_WIN |
+ // base::MessageLoop::DestructionObserver implementation |
+ void WillDestroyCurrentMessageLoop() override; |
+ |
+ // Enumerate USB devices from OS and update devices_ map. |new_device_path| is |
+ // an optional hint used on Windows to prevent enumerations before drivers for |
+ // a new device have been completely loaded. |
+ void RefreshDevices(const std::string& new_device_path); |
+ |
+ static void RefreshDevicesOnBlockingThread( |
+ base::WeakPtr<UsbServiceImpl> usb_service, |
+ const std::string& new_device_path, |
+ scoped_refptr<base::SequencedTaskRunner> task_runner, |
+ scoped_refptr<UsbContext> usb_context, |
+ const std::set<PlatformUsbDevice>& previous_devices); |
+ |
+ static void AddDeviceOnBlockingThread( |
+ base::WeakPtr<UsbServiceImpl> usb_service, |
+ scoped_refptr<base::SequencedTaskRunner> task_runner, |
+ PlatformUsbDevice platform_device); |
+ |
+ void RefreshDevicesComplete(libusb_device** platform_devices, |
+ ssize_t device_count); |
+ |
// Adds a new UsbDevice to the devices_ map based on the given libusb device. |
- scoped_refptr<UsbDeviceImpl> AddDevice(PlatformUsbDevice platform_device); |
+ void AddDevice(PlatformUsbDevice platform_device, |
+ uint16 vendor_id, |
+ uint16 product_id, |
+ base::string16 manufacturer_string, |
+ base::string16 product_string, |
+ base::string16 serial_number, |
+ std::string device_node); |
+ |
+ void RemoveDevice(scoped_refptr<UsbDeviceImpl> device); |
// Handle hotplug events from libusb. |
static int LIBUSB_CALL HotplugCallback(libusb_context* context, |
@@ -48,27 +98,26 @@ class UsbServiceImpl : public UsbService { |
libusb_hotplug_event event, |
void* user_data); |
// These functions release a reference to the provided platform device. |
- void OnDeviceAdded(PlatformUsbDevice platform_device); |
- void OnDeviceRemoved(PlatformUsbDevice platform_device); |
+ void OnPlatformDeviceAdded(PlatformUsbDevice platform_device); |
+ void OnPlatformDeviceRemoved(PlatformUsbDevice platform_device); |
scoped_refptr<UsbContext> context_; |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
- scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; |
- |
-#if defined(OS_WIN) |
- class UIThreadHelper; |
- UIThreadHelper* ui_thread_helper_; |
-#endif // OS_WIN |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; |
// TODO(reillyg): Figure out a better solution for device IDs. |
- uint32 next_unique_id_; |
+ uint32 next_unique_id_ = 0; |
// When available the device list will be updated when new devices are |
// connected instead of only when a full enumeration is requested. |
// TODO(reillyg): Support this on all platforms. crbug.com/411715 |
- bool hotplug_enabled_; |
+ bool hotplug_enabled_ = false; |
libusb_hotplug_callback_handle hotplug_handle_; |
+ // Enumeration callbacks are queued until an enumeration completes. |
+ bool enumeration_ready_ = false; |
+ std::vector<GetDevicesCallback> pending_enumerations_; |
+ |
// The map from unique IDs to UsbDevices. |
typedef std::map<uint32, scoped_refptr<UsbDeviceImpl>> DeviceMap; |
DeviceMap devices_; |
@@ -78,6 +127,10 @@ class UsbServiceImpl : public UsbService { |
PlatformDeviceMap; |
PlatformDeviceMap platform_devices_; |
+#if defined(OS_WIN) |
+ ScopedObserver<DeviceMonitorWin, DeviceMonitorWin::Observer> device_observer_; |
+#endif // OS_WIN |
+ |
base::WeakPtrFactory<UsbServiceImpl> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(UsbServiceImpl); |