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

Side by Side Diff: device/devices_app/usb/device_manager_impl.cc

Issue 1382383002: Revert of Provide the DeviceManager service to the renderer directly, no app. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@interface_permission
Patch Set: Created 5 years, 2 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 unified diff | Download patch
OLDNEW
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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/scoped_observer.h"
12 #include "base/sequenced_task_runner.h"
10 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/thread_task_runner_handle.h"
11 #include "device/core/device_client.h" 15 #include "device/core/device_client.h"
12 #include "device/devices_app/usb/device_impl.h" 16 #include "device/devices_app/usb/device_impl.h"
13 #include "device/devices_app/usb/public/interfaces/device.mojom.h" 17 #include "device/devices_app/usb/public/interfaces/device.mojom.h"
14 #include "device/devices_app/usb/type_converters.h" 18 #include "device/devices_app/usb/type_converters.h"
15 #include "device/usb/usb_device.h" 19 #include "device/usb/usb_device.h"
16 #include "device/usb/usb_device_filter.h" 20 #include "device/usb/usb_device_filter.h"
17 #include "device/usb/usb_service.h" 21 #include "device/usb/usb_service.h"
18 #include "third_party/mojo/src/mojo/public/cpp/bindings/array.h" 22 #include "third_party/mojo/src/mojo/public/cpp/bindings/array.h"
19 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" 23 #include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h"
20 24
21 namespace device { 25 namespace device {
22 namespace usb { 26 namespace usb {
23 27
24 namespace { 28 namespace {
25 29
26 using DeviceList = DeviceManagerImpl::DeviceList; 30 using DeviceList = DeviceManagerImpl::DeviceList;
27 using DeviceMap = DeviceManagerImpl::DeviceMap; 31 using DeviceMap = DeviceManagerImpl::DeviceMap;
28 32
33 void OnGetDevicesOnServiceThread(
34 const base::Callback<void(const DeviceList&)>& callback,
35 scoped_refptr<base::TaskRunner> callback_task_runner,
36 const DeviceList& devices) {
37 callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, devices));
38 }
39
40 void GetDevicesOnServiceThread(
41 const base::Callback<void(const DeviceList&)>& callback,
42 scoped_refptr<base::TaskRunner> callback_task_runner) {
43 DCHECK(DeviceClient::Get());
44 UsbService* usb_service = DeviceClient::Get()->GetUsbService();
45 if (usb_service) {
46 usb_service->GetDevices(base::Bind(&OnGetDevicesOnServiceThread, callback,
47 callback_task_runner));
48 } else {
49 callback_task_runner->PostTask(FROM_HERE,
50 base::Bind(callback, DeviceList()));
51 }
52 }
53
54 void GetDeviceOnServiceThread(
55 const mojo::String& guid,
56 const base::Callback<void(scoped_refptr<UsbDevice>)>& callback,
57 scoped_refptr<base::TaskRunner> callback_task_runner) {
58 DCHECK(DeviceClient::Get());
59 scoped_refptr<UsbDevice> device;
60 UsbService* usb_service = DeviceClient::Get()->GetUsbService();
61 if (usb_service)
62 device = usb_service->GetDevice(guid);
63 callback_task_runner->PostTask(FROM_HERE, base::Bind(callback, device));
64 }
65
29 void FilterAndConvertDevicesAndThen( 66 void FilterAndConvertDevicesAndThen(
30 const DeviceMap& devices, 67 const DeviceMap& devices,
31 const DeviceManagerImpl::GetDevicesCallback& callback, 68 const DeviceManagerImpl::GetDevicesCallback& callback,
32 mojo::Array<mojo::String> allowed_guids) { 69 mojo::Array<mojo::String> allowed_guids) {
33 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size()); 70 mojo::Array<DeviceInfoPtr> allowed_devices(allowed_guids.size());
34 for (size_t i = 0; i < allowed_guids.size(); ++i) { 71 for (size_t i = 0; i < allowed_guids.size(); ++i) {
35 const auto it = devices.find(allowed_guids[i]); 72 const auto it = devices.find(allowed_guids[i]);
36 DCHECK(it != devices.end()); 73 DCHECK(it != devices.end());
37 allowed_devices[i] = DeviceInfo::From(*it->second); 74 allowed_devices[i] = DeviceInfo::From(*it->second);
38 } 75 }
39 76
40 callback.Run(allowed_devices.Pass()); 77 callback.Run(allowed_devices.Pass());
41 } 78 }
42 79
43 } // namespace 80 } // namespace
44 81
45 // static 82 class DeviceManagerImpl::ServiceThreadHelper
46 void DeviceManagerImpl::Create(PermissionProviderPtr permission_provider, 83 : public UsbService::Observer,
47 mojo::InterfaceRequest<DeviceManager> request) { 84 public base::MessageLoop::DestructionObserver {
48 // The created object is owned by its binding. 85 public:
49 new DeviceManagerImpl(permission_provider.Pass(), request.Pass()); 86 ServiceThreadHelper(base::WeakPtr<DeviceManagerImpl> manager,
50 } 87 scoped_refptr<base::TaskRunner> task_runner)
88 : observer_(this), manager_(manager), task_runner_(task_runner) {}
89
90 ~ServiceThreadHelper() override {
91 base::MessageLoop::current()->RemoveDestructionObserver(this);
92 }
93
94 static void Start(scoped_ptr<ServiceThreadHelper> self) {
95 UsbService* usb_service = DeviceClient::Get()->GetUsbService();
96 if (usb_service)
97 self->observer_.Add(usb_service);
98
99 // |self| now owned by the current message loop.
100 base::MessageLoop::current()->AddDestructionObserver(self.release());
101 }
102
103 private:
104 // UsbService::Observer
105 void OnDeviceAdded(scoped_refptr<UsbDevice> device) override {
106 task_runner_->PostTask(
107 FROM_HERE,
108 base::Bind(&DeviceManagerImpl::OnDeviceAdded, manager_, device));
109 }
110
111 void OnDeviceRemoved(scoped_refptr<UsbDevice> device) override {
112 task_runner_->PostTask(
113 FROM_HERE,
114 base::Bind(&DeviceManagerImpl::OnDeviceRemoved, manager_, device));
115 }
116
117 void WillDestroyUsbService() override { observer_.RemoveAll(); }
118
119 // base::MessageLoop::DestructionObserver
120 void WillDestroyCurrentMessageLoop() override { delete this; }
121
122 ScopedObserver<UsbService, UsbService::Observer> observer_;
123 base::WeakPtr<DeviceManagerImpl> manager_;
124 scoped_refptr<base::TaskRunner> task_runner_;
125 };
51 126
52 DeviceManagerImpl::DeviceManagerImpl( 127 DeviceManagerImpl::DeviceManagerImpl(
128 mojo::InterfaceRequest<DeviceManager> request,
53 PermissionProviderPtr permission_provider, 129 PermissionProviderPtr permission_provider,
54 mojo::InterfaceRequest<DeviceManager> request) 130 scoped_refptr<base::SequencedTaskRunner> service_task_runner)
55 : permission_provider_(permission_provider.Pass()), 131 : permission_provider_(permission_provider.Pass()),
56 observer_(this), 132 service_task_runner_(service_task_runner),
57 binding_(this, request.Pass()), 133 binding_(this, request.Pass()),
58 weak_factory_(this) { 134 weak_factory_(this) {
59 // This object owns itself and will be destroyed if either the message pipe 135 // This object owns itself and will be destroyed if either the message pipe
60 // it is bound to is closed or the PermissionProvider it depends on is 136 // it is bound to is closed or the PermissionProvider it depends on is
61 // unavailable. 137 // unavailable.
62 binding_.set_connection_error_handler([this]() { delete this; }); 138 binding_.set_connection_error_handler([this]() { delete this; });
63 permission_provider_.set_connection_error_handler([this]() { delete this; }); 139 permission_provider_.set_connection_error_handler([this]() { delete this; });
64 140
65 DCHECK(DeviceClient::Get()); 141 scoped_ptr<ServiceThreadHelper> helper(new ServiceThreadHelper(
66 usb_service_ = DeviceClient::Get()->GetUsbService(); 142 weak_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get()));
67 if (usb_service_) 143 helper_ = helper.get();
68 observer_.Add(usb_service_); 144 service_task_runner_->PostTask(
145 FROM_HERE,
146 base::Bind(&ServiceThreadHelper::Start, base::Passed(&helper)));
69 } 147 }
70 148
71 DeviceManagerImpl::~DeviceManagerImpl() { 149 DeviceManagerImpl::~DeviceManagerImpl() {
150 // It is safe to call this if |helper_| was already destroyed when
151 // |service_task_runner_| exited as the task will never execute.
152 service_task_runner_->DeleteSoon(FROM_HERE, helper_);
72 connection_error_handler_.Run(); 153 connection_error_handler_.Run();
73 } 154 }
74 155
75 void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options, 156 void DeviceManagerImpl::GetDevices(EnumerationOptionsPtr options,
76 const GetDevicesCallback& callback) { 157 const GetDevicesCallback& callback) {
77 if (!usb_service_) { 158 auto get_devices_callback =
78 mojo::Array<DeviceInfoPtr> no_devices; 159 base::Bind(&DeviceManagerImpl::OnGetDevices, weak_factory_.GetWeakPtr(),
79 callback.Run(no_devices.Pass()); 160 base::Passed(&options), callback);
80 return; 161 service_task_runner_->PostTask(
81 } 162 FROM_HERE, base::Bind(&GetDevicesOnServiceThread, get_devices_callback,
82 163 base::ThreadTaskRunnerHandle::Get()));
83 usb_service_->GetDevices(base::Bind(&DeviceManagerImpl::OnGetDevices,
84 weak_factory_.GetWeakPtr(),
85 base::Passed(&options), callback));
86 } 164 }
87 165
88 void DeviceManagerImpl::GetDeviceChanges( 166 void DeviceManagerImpl::GetDeviceChanges(
89 const GetDeviceChangesCallback& callback) { 167 const GetDeviceChangesCallback& callback) {
90 device_change_callbacks_.push(callback); 168 device_change_callbacks_.push(callback);
91 MaybeRunDeviceChangesCallback(); 169 MaybeRunDeviceChangesCallback();
92 } 170 }
93 171
94 void DeviceManagerImpl::GetDevice( 172 void DeviceManagerImpl::GetDevice(
95 const mojo::String& guid, 173 const mojo::String& guid,
96 mojo::InterfaceRequest<Device> device_request) { 174 mojo::InterfaceRequest<Device> device_request) {
97 if (!usb_service_) 175 auto get_device_callback =
98 return; 176 base::Bind(&DeviceManagerImpl::OnGetDevice, weak_factory_.GetWeakPtr(),
177 base::Passed(&device_request));
178 service_task_runner_->PostTask(
179 FROM_HERE,
180 base::Bind(&GetDeviceOnServiceThread, guid, get_device_callback,
181 base::ThreadTaskRunnerHandle::Get()));
182 }
99 183
100 scoped_refptr<UsbDevice> device = usb_service_->GetDevice(guid); 184 void DeviceManagerImpl::OnGetDevice(
185 mojo::InterfaceRequest<Device> device_request,
186 scoped_refptr<UsbDevice> device) {
101 if (!device) 187 if (!device)
102 return; 188 return;
103 189
104 mojo::Array<DeviceInfoPtr> requested_devices(1); 190 mojo::Array<DeviceInfoPtr> requested_devices(1);
105 requested_devices[0] = DeviceInfo::From(*device); 191 requested_devices[0] = DeviceInfo::From(*device);
106 permission_provider_->HasDevicePermission( 192 permission_provider_->HasDevicePermission(
107 requested_devices.Pass(), 193 requested_devices.Pass(),
108 base::Bind(&DeviceManagerImpl::OnGetDevicePermissionCheckComplete, 194 base::Bind(&DeviceManagerImpl::OnGetDevicePermissionCheckComplete,
109 base::Unretained(this), device, 195 base::Unretained(this), device,
110 base::Passed(&device_request))); 196 base::Passed(&device_request)));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 devices_added_[device->guid()] = device; 235 devices_added_[device->guid()] = device;
150 MaybeRunDeviceChangesCallback(); 236 MaybeRunDeviceChangesCallback();
151 } 237 }
152 238
153 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) { 239 void DeviceManagerImpl::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
154 if (devices_added_.erase(device->guid()) == 0) 240 if (devices_added_.erase(device->guid()) == 0)
155 devices_removed_[device->guid()] = device; 241 devices_removed_[device->guid()] = device;
156 MaybeRunDeviceChangesCallback(); 242 MaybeRunDeviceChangesCallback();
157 } 243 }
158 244
159 void DeviceManagerImpl::WillDestroyUsbService() {
160 observer_.RemoveAll();
161 usb_service_ = nullptr;
162 }
163
164 void DeviceManagerImpl::MaybeRunDeviceChangesCallback() { 245 void DeviceManagerImpl::MaybeRunDeviceChangesCallback() {
165 if (!permission_request_pending_ && !device_change_callbacks_.empty()) { 246 if (!permission_request_pending_ && !device_change_callbacks_.empty()) {
166 DeviceMap devices_added; 247 DeviceMap devices_added;
167 devices_added.swap(devices_added_); 248 devices_added.swap(devices_added_);
168 DeviceMap devices_removed; 249 DeviceMap devices_removed;
169 devices_removed.swap(devices_removed_); 250 devices_removed.swap(devices_removed_);
170 251
171 mojo::Array<DeviceInfoPtr> requested_devices(devices_added.size() + 252 mojo::Array<DeviceInfoPtr> requested_devices(devices_added.size() +
172 devices_removed.size()); 253 devices_removed.size());
173 { 254 {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 callback.Run(notification.Pass()); 296 callback.Run(notification.Pass());
216 device_change_callbacks_.pop(); 297 device_change_callbacks_.pop();
217 } 298 }
218 299
219 if (devices_added_.size() > 0 || !devices_removed_.empty()) 300 if (devices_added_.size() > 0 || !devices_removed_.empty())
220 MaybeRunDeviceChangesCallback(); 301 MaybeRunDeviceChangesCallback();
221 } 302 }
222 303
223 } // namespace usb 304 } // namespace usb
224 } // namespace device 305 } // namespace device
OLDNEW
« no previous file with comments | « device/devices_app/usb/device_manager_impl.h ('k') | device/devices_app/usb/device_manager_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698