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
3 // found in the LICENSE file.
11 #include "base/bind.h"
12 #include "base/logging.h"
13 #include "base/platform_file.h"
14 #include "base/stl_util.h"
15 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/string_piece.h"
17 #include "base/strings/string_split.h"
18 #include "device/hid/hid_connection_linux.h"
19 #include "device/hid/hid_device_info.h"
20 #include "device/hid/hid_service_linux.h"
21 #include "device/hid/udev_common.h"
27 const char kHIDSubSystem
[] = "hid";
29 const char kHIDID
[] = "HID_ID";
30 const char kHIDName
[] = "HID_NAME";
31 const char kHIDUnique
[] = "HID_UNIQ";
35 HidServiceLinux::HidServiceLinux() {
36 DeviceMonitorLinux
* monitor
= DeviceMonitorLinux::GetInstance();
37 monitor
->AddObserver(this);
39 base::Bind(&HidServiceLinux::OnDeviceAdded
, base::Unretained(this)));
42 scoped_refptr
<HidConnection
> HidServiceLinux::Connect(
43 const HidDeviceId
& device_id
) {
44 HidDeviceInfo device_info
;
45 if (!GetDeviceInfo(device_id
, &device_info
))
48 ScopedUdevDevicePtr device
=
49 DeviceMonitorLinux::GetInstance()->GetDeviceFromPath(
50 device_info
.device_id
);
52 return new HidConnectionLinux(device_info
, device
.Pass());
56 HidServiceLinux::~HidServiceLinux() {
57 if (DeviceMonitorLinux::HasInstance())
58 DeviceMonitorLinux::GetInstance()->RemoveObserver(this);
61 void HidServiceLinux::OnDeviceAdded(udev_device
* device
) {
65 const char* device_path
= udev_device_get_syspath(device
);
68 const char* subsystem
= udev_device_get_subsystem(device
);
69 if (!subsystem
|| strcmp(subsystem
, kHIDSubSystem
) != 0)
72 HidDeviceInfo device_info
;
73 device_info
.device_id
= device_path
;
75 uint32_t int_property
= 0;
76 const char* str_property
= NULL
;
78 const char* hid_id
= udev_device_get_property_value(device
, kHIDID
);
82 std::vector
<std::string
> parts
;
83 base::SplitString(hid_id
, ':', &parts
);
84 if (parts
.size() != 3) {
88 if (HexStringToUInt(base::StringPiece(parts
[1]), &int_property
)) {
89 device_info
.vendor_id
= int_property
;
92 if (HexStringToUInt(base::StringPiece(parts
[2]), &int_property
)) {
93 device_info
.product_id
= int_property
;
96 str_property
= udev_device_get_property_value(device
, kHIDUnique
);
97 if (str_property
!= NULL
)
98 device_info
.serial_number
= str_property
;
100 str_property
= udev_device_get_property_value(device
, kHIDName
);
101 if (str_property
!= NULL
)
102 device_info
.product_name
= str_property
;
104 AddDevice(device_info
);
107 void HidServiceLinux::OnDeviceRemoved(udev_device
* device
) {
108 const char* device_path
= udev_device_get_syspath(device
);;
110 RemoveDevice(device_path
);