Don't pass a null ServiceWorker registration with OK status code.
[chromium-blink-merge.git] / device / hid / hid_service_linux.cc
blobaeaeb19aeae31a0f8957b46afdf9a10accccde45
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.
5 #include <libudev.h>
6 #include <stdint.h>
8 #include <string>
9 #include <vector>
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"
23 namespace device {
25 namespace {
27 const char kHIDSubSystem[] = "hid";
29 const char kHIDID[] = "HID_ID";
30 const char kHIDName[] = "HID_NAME";
31 const char kHIDUnique[] = "HID_UNIQ";
33 } // namespace
35 HidServiceLinux::HidServiceLinux() {
36 DeviceMonitorLinux* monitor = DeviceMonitorLinux::GetInstance();
37 monitor->AddObserver(this);
38 monitor->Enumerate(
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))
46 return NULL;
48 ScopedUdevDevicePtr device =
49 DeviceMonitorLinux::GetInstance()->GetDeviceFromPath(
50 device_info.device_id);
51 if (device)
52 return new HidConnectionLinux(device_info, device.Pass());
53 return NULL;
56 HidServiceLinux::~HidServiceLinux() {
57 if (DeviceMonitorLinux::HasInstance())
58 DeviceMonitorLinux::GetInstance()->RemoveObserver(this);
61 void HidServiceLinux::OnDeviceAdded(udev_device* device) {
62 if (!device)
63 return;
65 const char* device_path = udev_device_get_syspath(device);
66 if (!device_path)
67 return;
68 const char* subsystem = udev_device_get_subsystem(device);
69 if (!subsystem || strcmp(subsystem, kHIDSubSystem) != 0)
70 return;
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);
79 if (!hid_id)
80 return;
82 std::vector<std::string> parts;
83 base::SplitString(hid_id, ':', &parts);
84 if (parts.size() != 3) {
85 return;
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);;
109 if (device_path)
110 RemoveDevice(device_path);
113 } // namespace dev