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

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

Issue 1316203006: Convert DeviceManagerDelegate to PermissionProvider mojo interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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 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

Powered by Google App Engine
This is Rietveld 408576698