diff options
author | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 13:51:07 +0000 |
---|---|---|
committer | ygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 13:51:07 +0000 |
commit | 3779b3e169ae89170e7783119fd58fc5a2b47c11 (patch) | |
tree | 4b1b1c92a13efe7b29386c4a3e92fcedf5289eca /device/hid | |
parent | ad4d203fdfa512bf431459a0e526a67199ee4023 (diff) | |
download | chromium_src-3779b3e169ae89170e7783119fd58fc5a2b47c11.zip chromium_src-3779b3e169ae89170e7783119fd58fc5a2b47c11.tar.gz chromium_src-3779b3e169ae89170e7783119fd58fc5a2b47c11.tar.bz2 |
Devices without devnode are filtered out.
BUG=127016
TEST=manual
R=rockot@chromium.org
Review URL: https://codereview.chromium.org/250803005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266546 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'device/hid')
-rw-r--r-- | device/hid/input_service_linux.cc | 40 | ||||
-rw-r--r-- | device/hid/input_service_linux_unittest.cc | 2 |
2 files changed, 27 insertions, 15 deletions
diff --git a/device/hid/input_service_linux.cc b/device/hid/input_service_linux.cc index 299d7a4..90132e9 100644 --- a/device/hid/input_service_linux.cc +++ b/device/hid/input_service_linux.cc @@ -8,6 +8,7 @@ #include "base/lazy_instance.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/threading/thread_restrictions.h" #include "device/hid/input_service_linux.h" @@ -59,6 +60,19 @@ InputServiceLinux::InputDeviceInfo::Type GetDeviceType(udev_device* device) { return InputServiceLinux::InputDeviceInfo::TYPE_UNKNOWN; } +std::string GetParentDeviceName(udev_device* device, const char* subsystem) { + udev_device* parent = + udev_device_get_parent_with_subsystem_devtype(device, subsystem, NULL); + if (!parent) + return std::string(); + const char* name = udev_device_get_property_value(parent, "NAME"); + if (!name) + return std::string(); + std::string result; + base::TrimString(name, "\"", &result); + return result; +} + class InputServiceLinuxImpl : public InputServiceLinux, public DeviceMonitorLinux::Observer { public: @@ -90,26 +104,25 @@ void InputServiceLinuxImpl::OnDeviceAdded(udev_device* device) { DCHECK(CalledOnValidThread()); if (!device) return; - const char* path = udev_device_get_syspath(device); - if (!path) + const char* devnode = udev_device_get_devnode(device); + if (!devnode) return; InputDeviceInfo info; - info.id = path; - - const char* name = udev_device_get_property_value(device, "NAME"); - if (name) - info.name = name; + info.id = devnode; const char* subsystem = udev_device_get_subsystem(device); if (!subsystem) return; - else if (strcmp(subsystem, kSubsystemHid) == 0) + if (strcmp(subsystem, kSubsystemHid) == 0) { info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_HID; - else if (strcmp(subsystem, kSubsystemInput) == 0) + info.name = GetParentDeviceName(device, kSubsystemHid); + } else if (strcmp(subsystem, kSubsystemInput) == 0) { info.subsystem = InputServiceLinux::InputDeviceInfo::SUBSYSTEM_INPUT; - else + info.name = GetParentDeviceName(device, kSubsystemInput); + } else { return; + } info.type = GetDeviceType(device); @@ -129,10 +142,9 @@ void InputServiceLinuxImpl::OnDeviceRemoved(udev_device* device) { DCHECK(CalledOnValidThread()); if (!device) return; - const char* path = udev_device_get_syspath(device); - if (!path) - return; - RemoveDevice(path); + const char* devnode = udev_device_get_devnode(device); + if (devnode) + RemoveDevice(devnode); } } // namespace diff --git a/device/hid/input_service_linux_unittest.cc b/device/hid/input_service_linux_unittest.cc index 9a8563a..9825c06 100644 --- a/device/hid/input_service_linux_unittest.cc +++ b/device/hid/input_service_linux_unittest.cc @@ -5,7 +5,7 @@ #include <vector> #include "base/message_loop/message_loop.h" -#include "device/hid/input_service_linux.cc" +#include "device/hid/input_service_linux.h" #include "testing/gtest/include/gtest/gtest.h" namespace device { |