| 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 |