usb_service_win.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_
  5. #define SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_
  6. #include "services/device/usb/usb_service.h"
  7. #include <list>
  8. #include <string>
  9. #include <unordered_map>
  10. #include "base/containers/flat_map.h"
  11. #include "base/memory/weak_ptr.h"
  12. #include "base/scoped_observation.h"
  13. #include "base/task/sequenced_task_runner.h"
  14. #include "base/threading/sequence_bound.h"
  15. #include "device/base/device_monitor_win.h"
  16. #include "services/device/usb/usb_device_win.h"
  17. namespace device {
  18. class UsbServiceWin final : public DeviceMonitorWin::Observer,
  19. public UsbService {
  20. public:
  21. UsbServiceWin();
  22. UsbServiceWin(const UsbServiceWin&) = delete;
  23. UsbServiceWin& operator=(const UsbServiceWin&) = delete;
  24. ~UsbServiceWin() override;
  25. private:
  26. class BlockingTaskRunnerHelper;
  27. // device::UsbService implementation
  28. void GetDevices(GetDevicesCallback callback) override;
  29. // device::DeviceMonitorWin::Observer implementation
  30. void OnDeviceAdded(const GUID& class_guid,
  31. const std::wstring& device_path) override;
  32. void OnDeviceRemoved(const GUID& class_guid,
  33. const std::wstring& device_path) override;
  34. // Methods called by BlockingThreadHelper
  35. void HelperStarted();
  36. void CreateDeviceObject(
  37. const std::wstring& device_path,
  38. const std::wstring& hub_path,
  39. const base::flat_map<int, UsbDeviceWin::FunctionInfo>& functions,
  40. uint32_t bus_number,
  41. uint32_t port_number,
  42. UsbDeviceWin::DriverType driver_type,
  43. const std::wstring& driver_name);
  44. void UpdateFunction(const std::wstring& device_path,
  45. int interface_number,
  46. const UsbDeviceWin::FunctionInfo& function_info);
  47. void DeviceReady(scoped_refptr<UsbDeviceWin> device,
  48. const std::wstring& driver_name,
  49. bool success);
  50. bool enumeration_ready() {
  51. return helper_started_ && first_enumeration_countdown_ == 0;
  52. }
  53. // Enumeration callbacks are queued until an enumeration completes.
  54. bool helper_started_ = false;
  55. uint32_t first_enumeration_countdown_ = 0;
  56. std::list<GetDevicesCallback> enumeration_callbacks_;
  57. scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
  58. base::SequenceBound<BlockingTaskRunnerHelper> helper_;
  59. std::unordered_map<std::wstring, scoped_refptr<UsbDeviceWin>>
  60. devices_by_path_;
  61. base::ScopedObservation<DeviceMonitorWin, DeviceMonitorWin::Observer>
  62. device_observation_{this};
  63. base::WeakPtrFactory<UsbServiceWin> weak_factory_{this};
  64. };
  65. } // namespace device
  66. #endif // SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_