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 #ifndef DEVICE_USB_DEVICE_MANAGER_IMPL_H_ | 5 #ifndef DEVICE_USB_DEVICE_MANAGER_IMPL_H_ |
6 #define DEVICE_USB_DEVICE_MANAGER_IMPL_H_ | 6 #define DEVICE_USB_DEVICE_MANAGER_IMPL_H_ |
7 | 7 |
8 #include <queue> | 8 #include <queue> |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "base/containers/scoped_ptr_map.h" | 11 #include "base/containers/scoped_ptr_map.h" |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
16 #include "device/devices_app/usb/public/interfaces/device_manager.mojom.h" | 16 #include "device/devices_app/usb/public/interfaces/device_manager.mojom.h" |
| 17 #include "device/devices_app/usb/public/interfaces/permission_provider.mojom.h" |
17 #include "third_party/mojo/src/mojo/public/cpp/bindings/array.h" | 18 #include "third_party/mojo/src/mojo/public/cpp/bindings/array.h" |
| 19 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
18 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" | 20 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" |
19 #include "third_party/mojo/src/mojo/public/cpp/bindings/strong_binding.h" | |
20 | 21 |
21 namespace base { | 22 namespace base { |
22 class SequencedTaskRunner; | 23 class SequencedTaskRunner; |
23 } | 24 } |
24 | 25 |
25 namespace device { | 26 namespace device { |
26 | 27 |
27 class UsbDevice; | 28 class UsbDevice; |
28 class UsbDeviceFilter; | 29 class UsbDeviceFilter; |
29 class UsbDeviceHandle; | 30 class UsbDeviceHandle; |
30 | 31 |
31 namespace usb { | 32 namespace usb { |
32 | 33 |
33 class DeviceManagerDelegate; | 34 class DeviceManagerDelegate; |
34 | 35 |
35 // Implementation of the public DeviceManager interface. This interface can be | 36 // Implementation of the public DeviceManager interface. This interface can be |
36 // requested from the devices app located at "mojo:devices", if available. | 37 // requested from the devices app located at "mojo:devices", if available. |
37 class DeviceManagerImpl : public DeviceManager { | 38 class DeviceManagerImpl : public DeviceManager { |
38 public: | 39 public: |
39 DeviceManagerImpl( | 40 DeviceManagerImpl( |
40 mojo::InterfaceRequest<DeviceManager> request, | 41 mojo::InterfaceRequest<DeviceManager> request, |
41 scoped_ptr<DeviceManagerDelegate> delegate, | 42 PermissionProviderPtr permission_provider, |
42 scoped_refptr<base::SequencedTaskRunner> service_task_runner); | 43 scoped_refptr<base::SequencedTaskRunner> service_task_runner); |
43 ~DeviceManagerImpl() override; | 44 ~DeviceManagerImpl() override; |
44 | 45 |
45 void set_connection_error_handler(const mojo::Closure& error_handler); | 46 void set_connection_error_handler(const mojo::Closure& error_handler) { |
| 47 connection_error_handler_ = error_handler; |
| 48 } |
46 | 49 |
47 private: | 50 private: |
48 class ServiceThreadHelper; | 51 class ServiceThreadHelper; |
49 | 52 |
50 // DeviceManager implementation: | 53 // DeviceManager implementation: |
51 void GetDevices(EnumerationOptionsPtr options, | 54 void GetDevices(EnumerationOptionsPtr options, |
52 const GetDevicesCallback& callback) override; | 55 const GetDevicesCallback& callback) override; |
53 void GetDeviceChanges(const GetDeviceChangesCallback& callback) override; | 56 void GetDeviceChanges(const GetDeviceChangesCallback& callback) override; |
54 void OpenDevice(const mojo::String& guid, | 57 void OpenDevice(const mojo::String& guid, |
55 mojo::InterfaceRequest<Device> device_request, | 58 mojo::InterfaceRequest<Device> device_request, |
56 const OpenDeviceCallback& callback) override; | 59 const OpenDeviceCallback& callback) override; |
57 | 60 |
58 // Callbacks to handle the async responses from the underlying UsbService. | 61 // Callbacks to handle the async responses from the underlying UsbService. |
59 void OnGetDevices(const GetDevicesCallback& callback, | 62 void OnGetDevices(const GetDevicesCallback& callback, |
60 mojo::Array<DeviceInfoPtr> devices); | 63 mojo::Array<DeviceInfoPtr> devices); |
61 void OnGetInitialDevices(const GetDeviceChangesCallback& callback, | |
62 mojo::Array<DeviceInfoPtr> devices); | |
63 | 64 |
64 // Methods called by |helper_| when devices are added or removed. | 65 // Methods called by |helper_| when devices are added or removed. |
65 void OnDeviceAdded(DeviceInfoPtr device); | 66 void OnDeviceAdded(DeviceInfoPtr device); |
66 void OnDeviceRemoved(std::string device_guid); | 67 void OnDeviceRemoved(std::string device_guid); |
67 void MaybeRunDeviceChangesCallback(); | 68 void MaybeRunDeviceChangesCallback(); |
| 69 void OnPermissionCheckComplete(mojo::Array<DeviceInfoPtr> devices_added, |
| 70 const std::set<std::string>& devices_removed, |
| 71 mojo::Array<mojo::String> allowed_guids); |
68 | 72 |
69 mojo::StrongBinding<DeviceManager> binding_; | 73 PermissionProviderPtr permission_provider_; |
70 | |
71 scoped_ptr<DeviceManagerDelegate> delegate_; | |
72 scoped_refptr<base::SequencedTaskRunner> service_task_runner_; | 74 scoped_refptr<base::SequencedTaskRunner> service_task_runner_; |
73 | 75 |
74 // If there are unfinished calls to GetDeviceChanges their callbacks | 76 // If there are unfinished calls to GetDeviceChanges their callbacks |
75 // are stored in |device_change_callbacks_|. Otherwise device changes | 77 // are stored in |device_change_callbacks_|. Otherwise device changes |
76 // are collected in |devices_added_| and |devices_removed_| until the | 78 // are collected in |devices_added_| and |devices_removed_| until the |
77 // next call to GetDeviceChanges. | 79 // next call to GetDeviceChanges. |
78 std::queue<GetDeviceChangesCallback> device_change_callbacks_; | 80 std::queue<GetDeviceChangesCallback> device_change_callbacks_; |
79 mojo::Array<DeviceInfoPtr> devices_added_; | 81 mojo::Array<DeviceInfoPtr> devices_added_; |
80 std::set<std::string> devices_removed_; | 82 std::set<std::string> devices_removed_; |
| 83 // To ensure that GetDeviceChangesCallbacks are called in the correct order |
| 84 // only perform a single request to |permission_provider_| at a time. |
| 85 bool permission_request_pending_ = false; |
81 | 86 |
82 // |helper_| is owned by the service thread and holds a weak reference | 87 // |helper_| is owned by the service thread and holds a weak reference |
83 // back to the device manager that created it. | 88 // back to the device manager that created it. |
84 ServiceThreadHelper* helper_ = nullptr; | 89 ServiceThreadHelper* helper_; |
85 | 90 |
| 91 mojo::Closure connection_error_handler_; |
| 92 |
| 93 mojo::Binding<DeviceManager> binding_; |
86 base::WeakPtrFactory<DeviceManagerImpl> weak_factory_; | 94 base::WeakPtrFactory<DeviceManagerImpl> weak_factory_; |
87 | 95 |
88 DISALLOW_COPY_AND_ASSIGN(DeviceManagerImpl); | 96 DISALLOW_COPY_AND_ASSIGN(DeviceManagerImpl); |
89 }; | 97 }; |
90 | 98 |
91 } // namespace usb | 99 } // namespace usb |
92 } // namespace device | 100 } // namespace device |
93 | 101 |
94 #endif // DEVICE_USB_DEVICE_MANAGER_IMPL_H_ | 102 #endif // DEVICE_USB_DEVICE_MANAGER_IMPL_H_ |
OLD | NEW |