| 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 |