| 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 <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/files/file.h" | 12 #include "base/files/file.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/location.h" | 15 #include "base/location.h" |
| 16 #include "base/logging.h" | |
| 17 #include "base/scoped_observer.h" | 16 #include "base/scoped_observer.h" |
| 18 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_split.h" | 18 #include "base/strings/string_split.h" |
| 20 #include "base/thread_task_runner_handle.h" | 19 #include "base/thread_task_runner_handle.h" |
| 21 #include "base/threading/thread_restrictions.h" | 20 #include "base/threading/thread_restrictions.h" |
| 21 #include "components/device_event_log/device_event_log.h" |
| 22 #include "device/hid/device_monitor_linux.h" | 22 #include "device/hid/device_monitor_linux.h" |
| 23 #include "device/hid/hid_connection_linux.h" | 23 #include "device/hid/hid_connection_linux.h" |
| 24 #include "device/hid/hid_device_info_linux.h" | 24 #include "device/hid/hid_device_info_linux.h" |
| 25 #include "device/udev_linux/scoped_udev.h" | 25 #include "device/udev_linux/scoped_udev.h" |
| 26 | 26 |
| 27 #if defined(OS_CHROMEOS) | 27 #if defined(OS_CHROMEOS) |
| 28 #include "base/sys_info.h" | 28 #include "base/sys_info.h" |
| 29 #include "chromeos/dbus/dbus_thread_manager.h" | 29 #include "chromeos/dbus/dbus_thread_manager.h" |
| 30 #include "chromeos/dbus/permission_broker_client.h" | 30 #include "chromeos/dbus/permission_broker_client.h" |
| 31 #endif // defined(OS_CHROMEOS) | 31 #endif // defined(OS_CHROMEOS) |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner; | 275 scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner; |
| 276 base::FilePath device_path(params->device_info->device_node()); | 276 base::FilePath device_path(params->device_info->device_node()); |
| 277 base::File& device_file = params->device_file; | 277 base::File& device_file = params->device_file; |
| 278 int flags = | 278 int flags = |
| 279 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE; | 279 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE; |
| 280 device_file.Initialize(device_path, flags); | 280 device_file.Initialize(device_path, flags); |
| 281 if (!device_file.IsValid()) { | 281 if (!device_file.IsValid()) { |
| 282 base::File::Error file_error = device_file.error_details(); | 282 base::File::Error file_error = device_file.error_details(); |
| 283 | 283 |
| 284 if (file_error == base::File::FILE_ERROR_ACCESS_DENIED) { | 284 if (file_error == base::File::FILE_ERROR_ACCESS_DENIED) { |
| 285 VLOG(1) << "Access denied opening device read-write, trying read-only."; | 285 HID_LOG(EVENT) |
| 286 << "Access denied opening device read-write, trying read-only."; |
| 286 flags = base::File::FLAG_OPEN | base::File::FLAG_READ; | 287 flags = base::File::FLAG_OPEN | base::File::FLAG_READ; |
| 287 device_file.Initialize(device_path, flags); | 288 device_file.Initialize(device_path, flags); |
| 288 } | 289 } |
| 289 } | 290 } |
| 290 if (!device_file.IsValid()) { | 291 if (!device_file.IsValid()) { |
| 291 LOG(ERROR) << "Failed to open '" << params->device_info->device_node() | 292 HID_LOG(EVENT) << "Failed to open '" << params->device_info->device_node() |
| 292 << "': " | 293 << "': " |
| 293 << base::File::ErrorToString(device_file.error_details()); | 294 << base::File::ErrorToString(device_file.error_details()); |
| 294 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); | 295 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); |
| 295 return; | 296 return; |
| 296 } | 297 } |
| 297 | 298 |
| 298 int result = fcntl(device_file.GetPlatformFile(), F_GETFL); | 299 int result = fcntl(device_file.GetPlatformFile(), F_GETFL); |
| 299 if (result == -1) { | 300 if (result == -1) { |
| 300 PLOG(ERROR) << "Failed to get flags from the device file descriptor"; | 301 HID_PLOG(ERROR) << "Failed to get flags from the device file descriptor"; |
| 301 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); | 302 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); |
| 302 return; | 303 return; |
| 303 } | 304 } |
| 304 | 305 |
| 305 result = fcntl(device_file.GetPlatformFile(), F_SETFL, result | O_NONBLOCK); | 306 result = fcntl(device_file.GetPlatformFile(), F_SETFL, result | O_NONBLOCK); |
| 306 if (result == -1) { | 307 if (result == -1) { |
| 307 PLOG(ERROR) << "Failed to set the non-blocking flag on the device fd"; | 308 HID_PLOG(ERROR) << "Failed to set the non-blocking flag on the device fd"; |
| 308 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); | 309 task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr)); |
| 309 return; | 310 return; |
| 310 } | 311 } |
| 311 | 312 |
| 312 task_runner->PostTask(FROM_HERE, base::Bind(&HidServiceLinux::ConnectImpl, | 313 task_runner->PostTask(FROM_HERE, base::Bind(&HidServiceLinux::ConnectImpl, |
| 313 base::Passed(¶ms))); | 314 base::Passed(¶ms))); |
| 314 } | 315 } |
| 315 | 316 |
| 316 // static | 317 // static |
| 317 void HidServiceLinux::ConnectImpl(scoped_ptr<ConnectParams> params) { | 318 void HidServiceLinux::ConnectImpl(scoped_ptr<ConnectParams> params) { |
| 318 DCHECK(params->device_file.IsValid()); | 319 DCHECK(params->device_file.IsValid()); |
| 319 params->callback.Run(make_scoped_refptr( | 320 params->callback.Run(make_scoped_refptr( |
| 320 new HidConnectionLinux(params->device_info, params->device_file.Pass(), | 321 new HidConnectionLinux(params->device_info, params->device_file.Pass(), |
| 321 params->file_task_runner))); | 322 params->file_task_runner))); |
| 322 } | 323 } |
| 323 | 324 |
| 324 } // namespace device | 325 } // namespace device |
| OLD | NEW |