Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1515)

Unified Diff: device/devices_app/usb/device_manager_impl.cc

Issue 1342663003: Pass full Mojo USB DeviceInfo object with removal notifications. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/devices_app/usb/device_manager_impl.cc
diff --git a/device/devices_app/usb/device_manager_impl.cc b/device/devices_app/usb/device_manager_impl.cc
index cfc45b668c08487978f05fc3254befdae95fd457..32f140723e1264357e6293d06b6a3dc8270ad11b 100644
--- a/device/devices_app/usb/device_manager_impl.cc
+++ b/device/devices_app/usb/device_manager_impl.cc
@@ -27,34 +27,28 @@ namespace usb {
namespace {
+typedef std::vector<scoped_refptr<UsbDevice>> DeviceList;
Ken Rockot(use gerrit already) 2015/09/15 18:09:25 nit: Maybe just axe these and use DeviceManagerImp
Reilly Grant (use Gerrit) 2015/09/15 19:46:48 Done.
+typedef std::map<std::string, scoped_refptr<device::UsbDevice>> DeviceMap;
+
void OnGetDevicesOnServiceThread(
- const std::vector<UsbDeviceFilter>& filters,
- const base::Callback<void(mojo::Array<DeviceInfoPtr>)>& callback,
+ const base::Callback<void(const DeviceList&)>& callback,
scoped_refptr<base::TaskRunner> callback_task_runner,
- const std::vector<scoped_refptr<UsbDevice>>& devices) {
- mojo::Array<DeviceInfoPtr> mojo_devices(0);
- for (size_t i = 0; i < devices.size(); ++i) {
- if (UsbDeviceFilter::MatchesAny(devices[i], filters) || filters.empty())
- mojo_devices.push_back(DeviceInfo::From(*devices[i]));
- }
- callback_task_runner->PostTask(
- FROM_HERE, base::Bind(callback, base::Passed(&mojo_devices)));
+ const DeviceList& devices) {
+ callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, devices));
}
void GetDevicesOnServiceThread(
- const std::vector<UsbDeviceFilter>& filters,
- const base::Callback<void(mojo::Array<DeviceInfoPtr>)>& callback,
+ const base::Callback<void(const DeviceList&)>& callback,
scoped_refptr<base::TaskRunner> callback_task_runner) {
DCHECK(DeviceClient::Get());
UsbService* usb_service = DeviceClient::Get()->GetUsbService();
- if (!usb_service) {
- mojo::Array<DeviceInfoPtr> no_devices(0);
- callback_task_runner->PostTask(
- FROM_HERE, base::Bind(callback, base::Passed(&no_devices)));
- return;
+ if (usb_service) {
+ usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback,
+ callback_task_runner));
+ } else {
+ callback_task_runner->PostTask(FROM_HERE,
+ base::Bind(callback, DeviceList()));
}
- usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, filters,
- callback, callback_task_runner));
}
void RunOpenDeviceCallback(const DeviceManager::OpenDeviceCallback& callback,
@@ -107,18 +101,15 @@ void OpenDeviceOnServiceThread(
callback_task_runner));
}
-void FilterDeviceListAndThen(
+void FilterAndConvertDevicesAndThen(
+ const DeviceMap& devices,
const DeviceManagerImpl::GetDevicesCallback& callback,
- mojo::Array<DeviceInfoPtr> devices,
mojo::Array<mojo::String> allowed_guids) {
- std::set<std::string> allowed_guid_set;
- for (size_t i = 0; i < allowed_guids.size(); ++i)
- allowed_guid_set.insert(allowed_guids[i]);
-
- mojo::Array<DeviceInfoPtr> allowed_devices(0);
- for (size_t i = 0; i < devices.size(); ++i) {
- if (ContainsKey(allowed_guid_set, devices[i]->guid))
- allowed_devices.push_back(devices[i].Pass());
+ mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size());
+ for (size_t i = 0; i < allowed_guids.size(); ++i) {
+ const auto it = devices.find(allowed_guids[i]);
+ DCHECK(it != devices.end());
+ allowed_devices[i] = DeviceInfo::From(*it->second);
}
callback.Run(allowed_devices.Pass());
@@ -150,16 +141,15 @@ class DeviceManagerImpl::ServiceThreadHelper
private:
// UsbService::Observer
void OnDeviceAdded(scoped_refptr<UsbDevice> device) override {
- DeviceInfoPtr mojo_device(DeviceInfo::From(*device));
task_runner_->PostTask(
- FROM_HERE, base::Bind(&DeviceManagerImpl::OnDeviceAdded, manager_,
- base::Passed(&mojo_device)));
+ FROM_HERE,
+ base::Bind(&DeviceManagerImpl::OnDeviceAdded, manager_, device));
}
void OnDeviceRemoved(scoped_refptr<UsbDevice> device) override {
task_runner_->PostTask(
- FROM_HERE, base::Bind(&DeviceManagerImpl::OnDeviceRemoved, manager_,
- device->guid()));
+ FROM_HERE,
+ base::Bind(&DeviceManagerImpl::OnDeviceRemoved, manager_, device));
}
void WillDestroyUsbService() override { observer_.RemoveAll(); }
@@ -203,15 +193,12 @@ DeviceManagerImpl::~DeviceManagerImpl() {
void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options,
const GetDevicesCallback& callback) {
- std::vector<UsbDeviceFilter> filters;
- if (options)
- filters = options->filters.To<std::vector<UsbDeviceFilter>>();
- auto get_devices_callback = base::Bind(&DeviceManagerImpl::OnGetDevices,
- weak_factory_.GetWeakPtr(), callback);
+ auto get_devices_callback =
+ base::Bind(&DeviceManagerImpl::OnGetDevices, weak_factory_.GetWeakPtr(),
+ base::Passed(&options), callback);
service_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&GetDevicesOnServiceThread, filters, get_devices_callback,
- base::ThreadTaskRunnerHandle::Get()));
+ FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback,
+ base::ThreadTaskRunnerHandle::Get()));
}
void DeviceManagerImpl::GetDeviceChanges(
@@ -249,86 +236,86 @@ void DeviceManagerImpl::OnOpenDevicePermissionCheckComplete(
base::ThreadTaskRunnerHandle::Get()));
}
-void DeviceManagerImpl::OnGetDevices(const GetDevicesCallback& callback,
- mojo::Array<DeviceInfoPtr> devices) {
- mojo::Array<mojo::String> requested_guids(devices.size());
- for (size_t i = 0; i < devices.size(); ++i)
- requested_guids[i] = devices[i]->guid;
+void DeviceManagerImpl::OnGetDevices(EnumerationOptionsPtr options,
+ const GetDevicesCallback& callback,
+ const DeviceList& devices) {
+ std::vector<UsbDeviceFilter> filters;
+ if (options)
+ filters = options->filters.To<std::vector<UsbDeviceFilter>>();
+
+ std::map<std::string, scoped_refptr<UsbDevice>> device_map;
+ mojo::Array<mojo::String> requested_guids(0);
+ for (const auto& device : devices) {
+ if (filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) {
+ device_map[device->guid()] = device;
+ requested_guids.push_back(device->guid());
+ }
+ }
permission_provider_->HasDevicePermission(
requested_guids.Pass(),
- base::Bind(&FilterDeviceListAndThen, callback, base::Passed(&devices)));
+ base::Bind(&FilterAndConvertDevicesAndThen, device_map, callback));
}
-void DeviceManagerImpl::OnDeviceAdded(DeviceInfoPtr device) {
- DCHECK(!ContainsKey(devices_removed_, device->guid));
- devices_added_.push_back(device.Pass());
+void DeviceManagerImpl::OnDeviceAdded(scoped_refptr<UsbDevice> device) {
+ DCHECK(!ContainsKey(devices_removed_, device->guid()));
+ devices_added_[device->guid()] = device;
MaybeRunDeviceChangesCallback();
}
-void DeviceManagerImpl::OnDeviceRemoved(std::string device_guid) {
- bool found = false;
- mojo::Array<DeviceInfoPtr> devices_added;
- for (size_t i = 0; i < devices_added_.size(); ++i) {
- if (devices_added_[i]->guid == device_guid)
- found = true;
- else
- devices_added.push_back(devices_added_[i].Pass());
- }
- devices_added.Swap(&devices_added_);
- if (!found)
- devices_removed_.insert(device_guid);
+void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
+ if (devices_added_.erase(device->guid()) == 0)
+ devices_removed_[device->guid()] = device;
MaybeRunDeviceChangesCallback();
}
void DeviceManagerImpl::MaybeRunDeviceChangesCallback() {
if (!permission_request_pending_ && !device_change_callbacks_.empty()) {
- mojo::Array<DeviceInfoPtr> devices_added;
- devices_added.Swap(&devices_added_);
- std::set<std::string> devices_removed;
+ DeviceMap devices_added;
+ devices_added.swap(devices_added_);
+ DeviceMap devices_removed;
devices_removed.swap(devices_removed_);
mojo::Array<mojo::String> requested_guids(devices_added.size() +
devices_removed.size());
{
- size_t i;
- for (i = 0; i < devices_added.size(); ++i)
- requested_guids[i] = devices_added[i]->guid;
- for (const std::string& guid : devices_removed)
- requested_guids[i++] = guid;
+ size_t i = 0;
+ for (const auto& map_entry : devices_added)
+ requested_guids[i++] = map_entry.first;
+ for (const auto& map_entry : devices_removed)
+ requested_guids[i++] = map_entry.first;
}
permission_request_pending_ = true;
permission_provider_->HasDevicePermission(
requested_guids.Pass(),
base::Bind(&DeviceManagerImpl::OnEnumerationPermissionCheckComplete,
- base::Unretained(this), base::Passed(&devices_added),
- devices_removed));
+ base::Unretained(this), devices_added, devices_removed));
}
}
void DeviceManagerImpl::OnEnumerationPermissionCheckComplete(
- mojo::Array<DeviceInfoPtr> devices_added,
- const std::set<std::string>& devices_removed,
+ const DeviceMap& devices_added,
+ const DeviceMap& devices_removed,
mojo::Array<mojo::String> allowed_guids) {
permission_request_pending_ = false;
if (allowed_guids.size() > 0) {
- std::set<std::string> allowed_guid_set;
- for (size_t i = 0; i < allowed_guids.size(); ++i)
- allowed_guid_set.insert(allowed_guids[i]);
-
DeviceChangeNotificationPtr notification = DeviceChangeNotification::New();
notification->devices_added.resize(0);
- for (size_t i = 0; i < devices_added.size(); ++i) {
- if (ContainsKey(allowed_guid_set, devices_added[i]->guid))
- notification->devices_added.push_back(devices_added[i].Pass());
- }
-
notification->devices_removed.resize(0);
- for (const std::string& guid : devices_removed) {
- if (ContainsKey(allowed_guid_set, guid))
- notification->devices_removed.push_back(guid);
+
+ for (size_t i = 0; i < allowed_guids.size(); ++i) {
+ const mojo::String& guid = allowed_guids[i];
+ auto it = devices_added.find(guid);
+ if (it != devices_added.end()) {
+ DCHECK(!ContainsKey(devices_removed, guid));
+ notification->devices_added.push_back(DeviceInfo::From(*it->second));
+ } else {
+ it = devices_removed.find(guid);
+ DCHECK(it != devices_removed.end());
+ notification->devices_removed.push_back(DeviceInfo::From(*it->second));
+ }
}
DCHECK(!device_change_callbacks_.empty());

Powered by Google App Engine
This is Rietveld 408576698