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 #include "device/devices_app/usb/device_manager_impl.h" | 5 #include "device/devices_app/usb/device_manager_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> |
8 | 9 |
9 #include "base/bind.h" | 10 #include "base/bind.h" |
10 #include "base/location.h" | 11 #include "base/location.h" |
11 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
12 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
13 #include "device/core/device_client.h" | 14 #include "device/core/device_client.h" |
14 #include "device/devices_app/usb/device_impl.h" | 15 #include "device/devices_app/usb/device_impl.h" |
15 #include "device/devices_app/usb/public/interfaces/device.mojom.h" | 16 #include "device/devices_app/usb/public/interfaces/device.mojom.h" |
16 #include "device/devices_app/usb/type_converters.h" | 17 #include "device/devices_app/usb/type_converters.h" |
17 #include "device/usb/usb_device.h" | 18 #include "device/usb/usb_device.h" |
(...skipping 14 matching lines...) Expand all Loading... |
32 const DeviceMap& devices, | 33 const DeviceMap& devices, |
33 const DeviceManagerImpl::GetDevicesCallback& callback, | 34 const DeviceManagerImpl::GetDevicesCallback& callback, |
34 mojo::Array<mojo::String> allowed_guids) { | 35 mojo::Array<mojo::String> allowed_guids) { |
35 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); | 36 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); |
36 for (size_t i = 0; i < allowed_guids.size(); ++i) { | 37 for (size_t i = 0; i < allowed_guids.size(); ++i) { |
37 const auto it = devices.find(allowed_guids[i]); | 38 const auto it = devices.find(allowed_guids[i]); |
38 DCHECK(it != devices.end()); | 39 DCHECK(it != devices.end()); |
39 allowed_devices[i] = DeviceInfo::From(*it->second); | 40 allowed_devices[i] = DeviceInfo::From(*it->second); |
40 } | 41 } |
41 | 42 |
42 callback.Run(allowed_devices.Pass()); | 43 callback.Run(std::move(allowed_devices)); |
43 } | 44 } |
44 | 45 |
45 } // namespace | 46 } // namespace |
46 | 47 |
47 // static | 48 // static |
48 void DeviceManagerImpl::Create(PermissionProviderPtr permission_provider, | 49 void DeviceManagerImpl::Create(PermissionProviderPtr permission_provider, |
49 mojo::InterfaceRequest<DeviceManager> request) { | 50 mojo::InterfaceRequest<DeviceManager> request) { |
50 // The created object is owned by its binding. | 51 // The created object is owned by its binding. |
51 new DeviceManagerImpl(permission_provider.Pass(), request.Pass()); | 52 new DeviceManagerImpl(std::move(permission_provider), std::move(request)); |
52 } | 53 } |
53 | 54 |
54 DeviceManagerImpl::DeviceManagerImpl( | 55 DeviceManagerImpl::DeviceManagerImpl( |
55 PermissionProviderPtr permission_provider, | 56 PermissionProviderPtr permission_provider, |
56 mojo::InterfaceRequest<DeviceManager> request) | 57 mojo::InterfaceRequest<DeviceManager> request) |
57 : permission_provider_(permission_provider.Pass()), | 58 : permission_provider_(std::move(permission_provider)), |
58 observer_(this), | 59 observer_(this), |
59 binding_(this, request.Pass()), | 60 binding_(this, std::move(request)), |
60 weak_factory_(this) { | 61 weak_factory_(this) { |
61 // This object owns itself and will be destroyed if either the message pipe | 62 // This object owns itself and will be destroyed if either the message pipe |
62 // it is bound to is closed or the PermissionProvider it depends on is | 63 // it is bound to is closed or the PermissionProvider it depends on is |
63 // unavailable. | 64 // unavailable. |
64 binding_.set_connection_error_handler([this]() { delete this; }); | 65 binding_.set_connection_error_handler([this]() { delete this; }); |
65 permission_provider_.set_connection_error_handler([this]() { delete this; }); | 66 permission_provider_.set_connection_error_handler([this]() { delete this; }); |
66 | 67 |
67 DCHECK(DeviceClient::Get()); | 68 DCHECK(DeviceClient::Get()); |
68 usb_service_ = DeviceClient::Get()->GetUsbService(); | 69 usb_service_ = DeviceClient::Get()->GetUsbService(); |
69 if (usb_service_) | 70 if (usb_service_) |
70 observer_.Add(usb_service_); | 71 observer_.Add(usb_service_); |
71 } | 72 } |
72 | 73 |
73 DeviceManagerImpl::~DeviceManagerImpl() { | 74 DeviceManagerImpl::~DeviceManagerImpl() { |
74 connection_error_handler_.Run(); | 75 connection_error_handler_.Run(); |
75 } | 76 } |
76 | 77 |
77 void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, | 78 void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, |
78 const GetDevicesCallback& callback) { | 79 const GetDevicesCallback& callback) { |
79 if (!usb_service_) { | 80 if (!usb_service_) { |
80 mojo::Array<DeviceInfoPtr> no_devices; | 81 mojo::Array<DeviceInfoPtr> no_devices; |
81 callback.Run(no_devices.Pass()); | 82 callback.Run(std::move(no_devices)); |
82 return; | 83 return; |
83 } | 84 } |
84 | 85 |
85 usb_service_->GetDevices(base::Bind(&DeviceManagerImpl::OnGetDevices, | 86 usb_service_->GetDevices(base::Bind(&DeviceManagerImpl::OnGetDevices, |
86 weak_factory_.GetWeakPtr(), | 87 weak_factory_.GetWeakPtr(), |
87 base::Passed(&options), callback)); | 88 base::Passed(&options), callback)); |
88 } | 89 } |
89 | 90 |
90 void DeviceManagerImpl::GetDeviceChanges( | 91 void DeviceManagerImpl::GetDeviceChanges( |
91 const GetDeviceChangesCallback& callback) { | 92 const GetDeviceChangesCallback& callback) { |
92 device_change_callbacks_.push(callback); | 93 device_change_callbacks_.push(callback); |
93 MaybeRunDeviceChangesCallback(); | 94 MaybeRunDeviceChangesCallback(); |
94 } | 95 } |
95 | 96 |
96 void DeviceManagerImpl::GetDevice( | 97 void DeviceManagerImpl::GetDevice( |
97 const mojo::String& guid, | 98 const mojo::String& guid, |
98 mojo::InterfaceRequest<Device> device_request) { | 99 mojo::InterfaceRequest<Device> device_request) { |
99 if (!usb_service_) | 100 if (!usb_service_) |
100 return; | 101 return; |
101 | 102 |
102 scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid); | 103 scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid); |
103 if (!device) | 104 if (!device) |
104 return; | 105 return; |
105 | 106 |
106 mojo::Array<DeviceInfoPtr> requested_devices(1); | 107 mojo::Array<DeviceInfoPtr> requested_devices(1); |
107 requested_devices[0] = DeviceInfo::From(*device); | 108 requested_devices[0] = DeviceInfo::From(*device); |
108 permission_provider_->HasDevicePermission( | 109 permission_provider_->HasDevicePermission( |
109 requested_devices.Pass(), | 110 std::move(requested_devices), |
110 base::Bind(&DeviceManagerImpl::OnGetDevicePermissionCheckComplete, | 111 base::Bind(&DeviceManagerImpl::OnGetDevicePermissionCheckComplete, |
111 base::Unretained(this), device, | 112 base::Unretained(this), device, |
112 base::Passed(&device_request))); | 113 base::Passed(&device_request))); |
113 } | 114 } |
114 | 115 |
115 void DeviceManagerImpl::OnGetDevicePermissionCheckComplete( | 116 void DeviceManagerImpl::OnGetDevicePermissionCheckComplete( |
116 scoped_refptr<UsbDevice> device, | 117 scoped_refptr<UsbDevice> device, |
117 mojo::InterfaceRequest<Device> device_request, | 118 mojo::InterfaceRequest<Device> device_request, |
118 mojo::Array<mojo::String> allowed_guids) { | 119 mojo::Array<mojo::String> allowed_guids) { |
119 if (allowed_guids.size() == 0) | 120 if (allowed_guids.size() == 0) |
120 return; | 121 return; |
121 | 122 |
122 DCHECK(allowed_guids.size() == 1); | 123 DCHECK(allowed_guids.size() == 1); |
123 PermissionProviderPtr permission_provider; | 124 PermissionProviderPtr permission_provider; |
124 permission_provider_->Bind(mojo::GetProxy(&permission_provider)); | 125 permission_provider_->Bind(mojo::GetProxy(&permission_provider)); |
125 new DeviceImpl(device, permission_provider.Pass(), device_request.Pass()); | 126 new DeviceImpl(device, std::move(permission_provider), |
| 127 std::move(device_request)); |
126 } | 128 } |
127 | 129 |
128 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, | 130 void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options, |
129 const GetDevicesCallback& callback, | 131 const GetDevicesCallback& callback, |
130 const DeviceList& devices) { | 132 const DeviceList& devices) { |
131 std::vector<UsbDeviceFilter> filters; | 133 std::vector<UsbDeviceFilter> filters; |
132 if (options) | 134 if (options) |
133 filters = options->filters.To<std::vector<UsbDeviceFilter>>(); | 135 filters = options->filters.To<std::vector<UsbDeviceFilter>>(); |
134 | 136 |
135 std::map<std::string, scoped_refptr<UsbDevice>> device_map; | 137 std::map<std::string, scoped_refptr<UsbDevice>> device_map; |
136 mojo::Array<DeviceInfoPtr> requested_devices(0); | 138 mojo::Array<DeviceInfoPtr> requested_devices(0); |
137 for (const auto& device : devices) { | 139 for (const auto& device : devices) { |
138 if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) { | 140 if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) { |
139 device_map[device->guid()] = device; | 141 device_map[device->guid()] = device; |
140 requested_devices.push_back(DeviceInfo::From(*device)); | 142 requested_devices.push_back(DeviceInfo::From(*device)); |
141 } | 143 } |
142 } | 144 } |
143 | 145 |
144 permission_provider_->HasDevicePermission( | 146 permission_provider_->HasDevicePermission( |
145 requested_devices.Pass(), | 147 std::move(requested_devices), |
146 base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback)); | 148 base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback)); |
147 } | 149 } |
148 | 150 |
149 void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) { | 151 void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) { |
150 DCHECK(!ContainsKey(devices_removed_, device->guid())); | 152 DCHECK(!ContainsKey(devices_removed_, device->guid())); |
151 devices_added_[device->guid()] = device; | 153 devices_added_[device->guid()] = device; |
152 MaybeRunDeviceChangesCallback(); | 154 MaybeRunDeviceChangesCallback(); |
153 } | 155 } |
154 | 156 |
155 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { | 157 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { |
(...skipping 19 matching lines...) Expand all Loading... |
175 { | 177 { |
176 size_t i = 0; | 178 size_t i = 0; |
177 for (const auto& map_entry : devices_added) | 179 for (const auto& map_entry : devices_added) |
178 requested_devices[i++] = DeviceInfo::From(*map_entry.second); | 180 requested_devices[i++] = DeviceInfo::From(*map_entry.second); |
179 for (const auto& map_entry : devices_removed) | 181 for (const auto& map_entry : devices_removed) |
180 requested_devices[i++] = DeviceInfo::From(*map_entry.second); | 182 requested_devices[i++] = DeviceInfo::From(*map_entry.second); |
181 } | 183 } |
182 | 184 |
183 permission_request_pending_ = true; | 185 permission_request_pending_ = true; |
184 permission_provider_->HasDevicePermission( | 186 permission_provider_->HasDevicePermission( |
185 requested_devices.Pass(), | 187 std::move(requested_devices), |
186 base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete, | 188 base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete, |
187 base::Unretained(this), devices_added, devices_removed)); | 189 base::Unretained(this), devices_added, devices_removed)); |
188 } | 190 } |
189 } | 191 } |
190 | 192 |
191 void DeviceManagerImpl::OnEnumerationPermissionCheckComplete( | 193 void DeviceManagerImpl::OnEnumerationPermissionCheckComplete( |
192 const DeviceMap& devices_added, | 194 const DeviceMap& devices_added, |
193 const DeviceMap& devices_removed, | 195 const DeviceMap& devices_removed, |
194 mojo::Array<mojo::String> allowed_guids) { | 196 mojo::Array<mojo::String> allowed_guids) { |
195 permission_request_pending_ = false; | 197 permission_request_pending_ = false; |
(...skipping 11 matching lines...) Expand all Loading... |
207 notification->devices_added.push_back(DeviceInfo::From(*it->second)); | 209 notification->devices_added.push_back(DeviceInfo::From(*it->second)); |
208 } else { | 210 } else { |
209 it = devices_removed.find(guid); | 211 it = devices_removed.find(guid); |
210 DCHECK(it != devices_removed.end()); | 212 DCHECK(it != devices_removed.end()); |
211 notification->devices_removed.push_back(DeviceInfo::From(*it->second)); | 213 notification->devices_removed.push_back(DeviceInfo::From(*it->second)); |
212 } | 214 } |
213 } | 215 } |
214 | 216 |
215 DCHECK(!device_change_callbacks_.empty()); | 217 DCHECK(!device_change_callbacks_.empty()); |
216 const GetDeviceChangesCallback& callback = device_change_callbacks_.front(); | 218 const GetDeviceChangesCallback& callback = device_change_callbacks_.front(); |
217 callback.Run(notification.Pass()); | 219 callback.Run(std::move(notification)); |
218 device_change_callbacks_.pop(); | 220 device_change_callbacks_.pop(); |
219 } | 221 } |
220 | 222 |
221 if (devices_added_.size() > 0 || !devices_removed_.empty()) | 223 if (devices_added_.size() > 0 || !devices_removed_.empty()) |
222 MaybeRunDeviceChangesCallback(); | 224 MaybeRunDeviceChangesCallback(); |
223 } | 225 } |
224 | 226 |
225 } // namespace usb | 227 } // namespace usb |
226 } // namespace device | 228 } // namespace device |
OLD | NEW |