OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/hid/hid_service_linux.h" | 5 #include "device/hid/hid_service_linux.h" |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <limits> | 9 #include <limits> |
10 #include <string> | 10 #include <string> |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 scoped_refptr<HidDeviceInfoLinux> device_info = | 234 scoped_refptr<HidDeviceInfoLinux> device_info = |
235 static_cast<HidDeviceInfoLinux*>(map_entry->second.get()); | 235 static_cast<HidDeviceInfoLinux*>(map_entry->second.get()); |
236 | 236 |
237 scoped_ptr<ConnectParams> params(new ConnectParams( | 237 scoped_ptr<ConnectParams> params(new ConnectParams( |
238 device_info, callback, task_runner_, file_task_runner_)); | 238 device_info, callback, task_runner_, file_task_runner_)); |
239 | 239 |
240 #if defined(OS_CHROMEOS) | 240 #if defined(OS_CHROMEOS) |
241 chromeos::PermissionBrokerClient* client = | 241 chromeos::PermissionBrokerClient* client = |
242 chromeos::DBusThreadManager::Get()->GetPermissionBrokerClient(); | 242 chromeos::DBusThreadManager::Get()->GetPermissionBrokerClient(); |
243 DCHECK(client) << "Could not get permission broker client."; | 243 DCHECK(client) << "Could not get permission broker client."; |
| 244 chromeos::PermissionBrokerClient::ErrorCallback error_callback = |
| 245 base::Bind(&HidServiceLinux::OnPathOpenError, |
| 246 params->device_info->device_node(), params->callback); |
244 client->OpenPath( | 247 client->OpenPath( |
245 device_info->device_node(), | 248 device_info->device_node(), |
246 base::Bind(&HidServiceLinux::OnPathOpened, base::Passed(¶ms))); | 249 base::Bind(&HidServiceLinux::OnPathOpenComplete, base::Passed(¶ms)), |
| 250 error_callback); |
247 #else | 251 #else |
248 file_task_runner_->PostTask(FROM_HERE, | 252 file_task_runner_->PostTask(FROM_HERE, |
249 base::Bind(&HidServiceLinux::OpenOnBlockingThread, | 253 base::Bind(&HidServiceLinux::OpenOnBlockingThread, |
250 base::Passed(¶ms))); | 254 base::Passed(¶ms))); |
251 #endif // defined(OS_CHROMEOS) | 255 #endif // defined(OS_CHROMEOS) |
252 } | 256 } |
253 | 257 |
254 #if defined(OS_CHROMEOS) | 258 #if defined(OS_CHROMEOS) |
255 | 259 |
256 // static | 260 // static |
257 void HidServiceLinux::OnPathOpened(scoped_ptr<ConnectParams> params, | 261 void HidServiceLinux::OnPathOpenComplete(scoped_ptr<ConnectParams> params, |
258 dbus::FileDescriptor fd) { | 262 dbus::FileDescriptor fd) { |
259 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner = | 263 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner = |
260 params->file_task_runner; | 264 params->file_task_runner; |
261 file_task_runner->PostTask( | 265 file_task_runner->PostTask( |
262 FROM_HERE, base::Bind(&HidServiceLinux::ValidateFdOnBlockingThread, | 266 FROM_HERE, base::Bind(&HidServiceLinux::ValidateFdOnBlockingThread, |
263 base::Passed(¶ms), base::Passed(&fd))); | 267 base::Passed(¶ms), base::Passed(&fd))); |
264 } | 268 } |
265 | 269 |
266 // static | 270 // static |
| 271 void HidServiceLinux::OnPathOpenError(const std::string& device_path, |
| 272 const ConnectCallback& callback, |
| 273 const std::string& error_name, |
| 274 const std::string& error_message) { |
| 275 HID_LOG(EVENT) << "Permission broker failed to open '" << device_path |
| 276 << "': " << error_name << ": " << error_message; |
| 277 callback.Run(nullptr); |
| 278 } |
| 279 |
| 280 // static |
267 void HidServiceLinux::ValidateFdOnBlockingThread( | 281 void HidServiceLinux::ValidateFdOnBlockingThread( |
268 scoped_ptr<ConnectParams> params, | 282 scoped_ptr<ConnectParams> params, |
269 dbus::FileDescriptor fd) { | 283 dbus::FileDescriptor fd) { |
270 base::ThreadRestrictions::AssertIOAllowed(); | 284 base::ThreadRestrictions::AssertIOAllowed(); |
271 | |
272 fd.CheckValidity(); | 285 fd.CheckValidity(); |
273 if (fd.is_valid()) { | 286 DCHECK(fd.is_valid()); |
274 params->device_file = base::File(fd.TakeValue()); | 287 params->device_file = base::File(fd.TakeValue()); |
275 FinishOpen(std::move(params)); | 288 FinishOpen(std::move(params)); |
276 } else { | |
277 HID_LOG(EVENT) << "Permission broker denied access to '" | |
278 << params->device_info->device_node() << "'."; | |
279 params->task_runner->PostTask(FROM_HERE, | |
280 base::Bind(params->callback, nullptr)); | |
281 } | |
282 } | 289 } |
283 | 290 |
284 #else | 291 #else |
285 | 292 |
286 // static | 293 // static |
287 void HidServiceLinux::OpenOnBlockingThread(scoped_ptr<ConnectParams> params) { | 294 void HidServiceLinux::OpenOnBlockingThread(scoped_ptr<ConnectParams> params) { |
288 base::ThreadRestrictions::AssertIOAllowed(); | 295 base::ThreadRestrictions::AssertIOAllowed(); |
289 scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner; | 296 scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner; |
290 | 297 |
291 base::FilePath device_path(params->device_info->device_node()); | 298 base::FilePath device_path(params->device_info->device_node()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 | 341 |
335 // static | 342 // static |
336 void HidServiceLinux::CreateConnection(scoped_ptr<ConnectParams> params) { | 343 void HidServiceLinux::CreateConnection(scoped_ptr<ConnectParams> params) { |
337 DCHECK(params->device_file.IsValid()); | 344 DCHECK(params->device_file.IsValid()); |
338 params->callback.Run(make_scoped_refptr(new HidConnectionLinux( | 345 params->callback.Run(make_scoped_refptr(new HidConnectionLinux( |
339 params->device_info, std::move(params->device_file), | 346 params->device_info, std::move(params->device_file), |
340 params->file_task_runner))); | 347 params->file_task_runner))); |
341 } | 348 } |
342 | 349 |
343 } // namespace device | 350 } // namespace device |
OLD | NEW |