summaryrefslogtreecommitdiffstats
path: root/device/hid/hid_service_linux.cc
diff options
context:
space:
mode:
authorygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 15:11:14 +0000
committerygorshenin@chromium.org <ygorshenin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 15:11:14 +0000
commitbca53b0d57b74ad40aca5b37f0223e7dcf3bc8f7 (patch)
treea183ab639b5ec545d77aef013a3f74f5e0414b48 /device/hid/hid_service_linux.cc
parentf84863d54810e5d4aaee26c4d9a2b57fadcb79a1 (diff)
downloadchromium_src-bca53b0d57b74ad40aca5b37f0223e7dcf3bc8f7.zip
chromium_src-bca53b0d57b74ad40aca5b37f0223e7dcf3bc8f7.tar.gz
chromium_src-bca53b0d57b74ad40aca5b37f0223e7dcf3bc8f7.tar.bz2
Udev-related methods are extracted from HidServiceLinux into an individual service.
BUG=357050 TEST=none Review URL: https://codereview.chromium.org/230503003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262993 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'device/hid/hid_service_linux.cc')
-rw-r--r--device/hid/hid_service_linux.cc126
1 files changed, 21 insertions, 105 deletions
diff --git a/device/hid/hid_service_linux.cc b/device/hid/hid_service_linux.cc
index 04a3c16..aeaeb19 100644
--- a/device/hid/hid_service_linux.cc
+++ b/device/hid/hid_service_linux.cc
@@ -8,6 +8,7 @@
#include <string>
#include <vector>
+#include "base/bind.h"
#include "base/logging.h"
#include "base/platform_file.h"
#include "base/stl_util.h"
@@ -17,14 +18,12 @@
#include "device/hid/hid_connection_linux.h"
#include "device/hid/hid_device_info.h"
#include "device/hid/hid_service_linux.h"
+#include "device/hid/udev_common.h"
namespace device {
namespace {
-const char kUdevName[] = "udev";
-const char kUdevActionAdd[] = "add";
-const char kUdevActionRemove[] = "remove";
const char kHIDSubSystem[] = "hid";
const char kHIDID[] = "HID_ID";
@@ -34,46 +33,10 @@ const char kHIDUnique[] = "HID_UNIQ";
} // namespace
HidServiceLinux::HidServiceLinux() {
- udev_.reset(udev_new());
- if (!udev_) {
- LOG(ERROR) << "Failed to create udev.";
- return;
- }
- monitor_.reset(udev_monitor_new_from_netlink(udev_.get(), kUdevName));
- if (!monitor_) {
- LOG(ERROR) << "Failed to create udev monitor.";
- return;
- }
- int ret = udev_monitor_filter_add_match_subsystem_devtype(
- monitor_.get(),
- kHIDSubSystem,
- NULL);
- if (ret != 0) {
- LOG(ERROR) << "Failed to add udev monitor filter.";
- return;
- }
-
- ret = udev_monitor_enable_receiving(monitor_.get());
- if (ret != 0) {
- LOG(ERROR) << "Failed to start udev monitoring.";
- return;
- }
-
- monitor_fd_ = udev_monitor_get_fd(monitor_.get());
- if (monitor_fd_ <= 0) {
- LOG(ERROR) << "Failed to start udev monitoring.";
- return;
- }
-
- if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
- monitor_fd_,
- true,
- base::MessageLoopForIO::WATCH_READ,
- &monitor_watcher_,
- this))
- return;
-
- Enumerate();
+ DeviceMonitorLinux* monitor = DeviceMonitorLinux::GetInstance();
+ monitor->AddObserver(this);
+ monitor->Enumerate(
+ base::Bind(&HidServiceLinux::OnDeviceAdded, base::Unretained(this)));
}
scoped_refptr<HidConnection> HidServiceLinux::Connect(
@@ -82,74 +45,29 @@ scoped_refptr<HidConnection> HidServiceLinux::Connect(
if (!GetDeviceInfo(device_id, &device_info))
return NULL;
- ScopedUdevDevicePtr hid_device(
- udev_device_new_from_syspath(udev_.get(), device_info.device_id.c_str()));
- if (hid_device) {
- return new HidConnectionLinux(device_info, hid_device.Pass());
- }
+ ScopedUdevDevicePtr device =
+ DeviceMonitorLinux::GetInstance()->GetDeviceFromPath(
+ device_info.device_id);
+ if (device)
+ return new HidConnectionLinux(device_info, device.Pass());
return NULL;
}
-void HidServiceLinux::OnFileCanReadWithoutBlocking(int fd) {
- DCHECK_EQ(monitor_fd_, fd);
-
- ScopedUdevDevicePtr dev(udev_monitor_receive_device(monitor_.get()));
- if (!dev)
- return;
-
- std::string action(udev_device_get_action(dev.get()));
- if (action == kUdevActionAdd) {
- PlatformAddDevice(dev.get());
- } else if (action == kUdevActionRemove) {
- PlatformRemoveDevice(dev.get());
- }
-}
-
-void HidServiceLinux::OnFileCanWriteWithoutBlocking(int fd) {}
-
HidServiceLinux::~HidServiceLinux() {
- monitor_watcher_.StopWatchingFileDescriptor();
- close(monitor_fd_);
+ if (DeviceMonitorLinux::HasInstance())
+ DeviceMonitorLinux::GetInstance()->RemoveObserver(this);
}
-void HidServiceLinux::Enumerate() {
- scoped_ptr<udev_enumerate, UdevEnumerateDeleter> enumerate(
- udev_enumerate_new(udev_.get()));
-
- if (!enumerate) {
- LOG(ERROR) << "Failed to enumerate devices.";
- return;
- }
-
- if (udev_enumerate_add_match_subsystem(enumerate.get(), kHIDSubSystem)) {
- LOG(ERROR) << "Failed to enumerate devices.";
- return;
- }
-
- if (udev_enumerate_scan_devices(enumerate.get()) != 0) {
- LOG(ERROR) << "Failed to enumerate devices.";
- return;
- }
-
- // This list is managed by |enumerate|.
- udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate.get());
- for (udev_list_entry* i = devices; i != NULL;
- i = udev_list_entry_get_next(i)) {
- ScopedUdevDevicePtr hid_dev(
- udev_device_new_from_syspath(udev_.get(), udev_list_entry_get_name(i)));
- if (hid_dev) {
- PlatformAddDevice(hid_dev.get());
- }
- }
-}
-
-void HidServiceLinux::PlatformAddDevice(udev_device* device) {
+void HidServiceLinux::OnDeviceAdded(udev_device* device) {
if (!device)
return;
const char* device_path = udev_device_get_syspath(device);
if (!device_path)
return;
+ const char* subsystem = udev_device_get_subsystem(device);
+ if (!subsystem || strcmp(subsystem, kHIDSubSystem) != 0)
+ return;
HidDeviceInfo device_info;
device_info.device_id = device_path;
@@ -186,12 +104,10 @@ void HidServiceLinux::PlatformAddDevice(udev_device* device) {
AddDevice(device_info);
}
-void HidServiceLinux::PlatformRemoveDevice(udev_device* raw_dev) {
- const char* device_path = NULL;
- device_path = udev_device_get_syspath(raw_dev);
- if (device_path == NULL)
- return;
- RemoveDevice(device_path);
+void HidServiceLinux::OnDeviceRemoved(udev_device* device) {
+ const char* device_path = udev_device_get_syspath(device);;
+ if (device_path)
+ RemoveDevice(device_path);
}
} // namespace dev