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 f438460ddd828dae87a4c28ca2320c41c9e8660a..62d860b6bad809134e6f51e06ea8431b2eef9c2a 100644 |
--- a/device/devices_app/usb/device_manager_impl.cc |
+++ b/device/devices_app/usb/device_manager_impl.cc |
@@ -14,7 +14,6 @@ |
#include "base/thread_task_runner_handle.h" |
#include "device/core/device_client.h" |
#include "device/devices_app/usb/device_impl.h" |
-#include "device/devices_app/usb/public/cpp/device_manager_delegate.h" |
#include "device/devices_app/usb/public/interfaces/device.mojom.h" |
#include "device/devices_app/usb/type_converters.h" |
#include "device/usb/usb_device.h" |
@@ -108,6 +107,23 @@ void OpenDeviceOnServiceThread( |
callback_task_runner)); |
} |
+void FilterDeviceListAndThen( |
+ 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()); |
+ } |
+ |
+ callback.Run(allowed_devices.Pass()); |
+} |
+ |
} // namespace |
class DeviceManagerImpl::ServiceThreadHelper |
@@ -163,13 +179,12 @@ class DeviceManagerImpl::ServiceThreadHelper |
DeviceManagerImpl::DeviceManagerImpl( |
mojo::InterfaceRequest<DeviceManager> request, |
- scoped_ptr<DeviceManagerDelegate> delegate, |
+ PermissionProviderPtr permission_provider, |
scoped_refptr<base::SequencedTaskRunner> service_task_runner) |
: binding_(this, request.Pass()), |
- delegate_(delegate.Pass()), |
+ permission_provider_(permission_provider.Pass()), |
service_task_runner_(service_task_runner), |
- weak_factory_(this) { |
-} |
+ weak_factory_(this) {} |
DeviceManagerImpl::~DeviceManagerImpl() { |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
nit: I totally missed this before, but could you p
Reilly Grant (use Gerrit)
2015/09/02 23:58:18
Done.
|
if (helper_) { |
@@ -197,19 +212,18 @@ void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, |
void DeviceManagerImpl::GetDeviceChanges( |
const GetDeviceChangesCallback& callback) { |
+ device_change_callbacks_.push(callback); |
if (helper_) { |
- device_change_callbacks_.push(callback); |
MaybeRunDeviceChangesCallback(); |
} else { |
scoped_ptr<ServiceThreadHelper> helper(new ServiceThreadHelper( |
weak_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get())); |
helper_ = helper.get(); |
- auto get_devices_callback = |
- base::Bind(&DeviceManagerImpl::OnGetInitialDevices, |
- weak_factory_.GetWeakPtr(), callback); |
service_task_runner_->PostTask( |
- FROM_HERE, base::Bind(&ServiceThreadHelper::Start, |
- base::Passed(&helper), get_devices_callback)); |
+ FROM_HERE, |
+ base::Bind(&ServiceThreadHelper::Start, base::Passed(&helper), |
+ base::Bind(&DeviceManagerImpl::OnGetInitialDevices, |
+ weak_factory_.GetWeakPtr()))); |
} |
} |
@@ -225,25 +239,21 @@ void DeviceManagerImpl::OpenDevice( |
void DeviceManagerImpl::OnGetDevices(const GetDevicesCallback& callback, |
mojo::Array<DeviceInfoPtr> devices) { |
- mojo::Array<DeviceInfoPtr> allowed_devices(0); |
+ mojo::Array<mojo::String> requested_guids(devices.size()); |
for (size_t i = 0; i < devices.size(); ++i) { |
- if (delegate_->IsDeviceAllowed(*devices[i])) |
- allowed_devices.push_back(devices[i].Pass()); |
+ requested_guids[i] = devices[i]->guid; |
} |
- callback.Run(allowed_devices.Pass()); |
+ permission_provider_->HasDevicePermission( |
+ requested_guids.Pass(), |
+ base::Bind(&FilterDeviceListAndThen, callback, base::Passed(&devices))); |
} |
void DeviceManagerImpl::OnGetInitialDevices( |
- const GetDeviceChangesCallback& callback, |
mojo::Array<DeviceInfoPtr> devices) { |
- DeviceChangeNotificationPtr notification = DeviceChangeNotification::New(); |
- notification->devices_added = mojo::Array<DeviceInfoPtr>::New(0); |
- notification->devices_removed = mojo::Array<mojo::String>::New(0); |
- for (size_t i = 0; i < devices.size(); ++i) { |
- if (delegate_->IsDeviceAllowed(*devices[i])) |
- notification->devices_added.push_back(devices[i].Pass()); |
- } |
- callback.Run(notification.Pass()); |
+ DCHECK_EQ(0u, devices_added_.size()); |
+ DCHECK(devices_removed_.empty()); |
+ devices_added_.Swap(&devices); |
+ MaybeRunDeviceChangesCallback(); |
} |
void DeviceManagerImpl::OnDeviceAdded(DeviceInfoPtr device) { |
@@ -262,24 +272,70 @@ void DeviceManagerImpl::OnDeviceRemoved(std::string device_guid) { |
devices_added.push_back(devices_added_[i].Pass()); |
} |
devices_added.Swap(&devices_added_); |
- if (!found) |
+ if (!found) { |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
nit: eh, maybe no {}.
Reilly Grant (use Gerrit)
2015/09/02 23:58:19
Done.
|
devices_removed_.insert(device_guid); |
+ } |
MaybeRunDeviceChangesCallback(); |
} |
void DeviceManagerImpl::MaybeRunDeviceChangesCallback() { |
if (!device_change_callbacks_.empty()) { |
+ mojo::Array<DeviceInfoPtr> devices_added; |
+ devices_added.Swap(&devices_added_); |
+ std::set<std::string> devices_removed; |
+ devices_removed.swap(devices_removed_); |
+ |
+ mojo::Array<mojo::String> requested_guids(devices_added.size() + |
+ devices_removed.size()); |
+ size_t i; |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
nit: not a huge fan of a variable like |i| hanging
Reilly Grant (use Gerrit)
2015/09/02 23:58:18
Done.
|
+ 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; |
+ |
+ permission_request_pending_ = true; |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
this doesn't appear to have any logical effect; i'
Reilly Grant (use Gerrit)
2015/09/02 23:58:19
Done.
|
+ permission_provider_->HasDevicePermission( |
+ requested_guids.Pass(), |
+ base::Bind(&DeviceManagerImpl::OnPermissionCheckComplete, |
+ weak_factory_.GetWeakPtr(), base::Passed(&devices_added), |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
nit: No need to use a WeakPtr here. permission_pro
Reilly Grant (use Gerrit)
2015/09/02 23:58:19
Done.
|
+ devices_removed)); |
+ } |
+} |
+ |
+void DeviceManagerImpl::OnPermissionCheckComplete( |
+ mojo::Array<DeviceInfoPtr> devices_added, |
+ const std::set<std::string>& devices_removed, |
+ mojo::Array<mojo::String> allowed_guids) { |
+ permission_request_pending_ = false; |
+ |
+ if (allowed_guids.size() > 0 || first_notification_) { |
+ 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.Swap(&devices_added_); |
+ 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& device : devices_removed_) |
- notification->devices_removed.push_back(device); |
- devices_removed_.clear(); |
+ for (const std::string& guid : devices_removed) { |
+ if (ContainsKey(allowed_guid_set, guid)) |
+ notification->devices_removed.push_back(guid); |
Ken Rockot(use gerrit already)
2015/09/02 22:42:33
Should we also omit any guid that would otherwise
Reilly Grant (use Gerrit)
2015/09/02 23:58:19
We know that devices_added and devices_removed are
|
+ } |
+ DCHECK(!device_change_callbacks_.empty()); |
const GetDeviceChangesCallback& callback = device_change_callbacks_.front(); |
+ first_notification_ = false; |
callback.Run(notification.Pass()); |
device_change_callbacks_.pop(); |
} |
+ |
+ if (devices_added_.size() > 0 || !devices_removed_.empty()) { |
+ MaybeRunDeviceChangesCallback(); |
+ } |
} |
} // namespace usb |