summaryrefslogtreecommitdiffstats
path: root/device/hid
diff options
context:
space:
mode:
authorygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 13:51:07 +0000
committerygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 13:51:07 +0000
commit3779b3e169ae89170e7783119fd58fc5a2b47c11 (patch)
tree4b1b1c92a13efe7b29386c4a3e92fcedf5289eca /device/hid
parentad4d203fdfa512bf431459a0e526a67199ee4023 (diff)
downloadchromium_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.cc40
-rw-r--r--device/hid/input_service_linux_unittest.cc2
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 {