qdevicediscovery_udev.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the plugins of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qdevicediscovery_udev_p.h"-
35-
36#include <QStringList>-
37#include <QCoreApplication>-
38#include <QObject>-
39#include <QHash>-
40#include <QSocketNotifier>-
41#include <QLoggingCategory>-
42-
43#include <linux/input.h>-
44-
45QT_BEGIN_NAMESPACE-
46-
47Q_LOGGING_CATEGORY(lcDD, "qt.qpa.input")
never executed: return category;
0
48-
49QDeviceDiscovery *QDeviceDiscovery::create(QDeviceTypes types, QObject *parent)-
50{-
51 qCDebug(lcDD) << "udev device discovery for type" << types;
never executed: QMessageLogger(__FILE__, 51, __PRETTY_FUNCTION__, lcDD().categoryName()).debug() << "udev device discovery for type" << types;
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
52-
53 QDeviceDiscovery *helper = 0;-
54 struct udev *udev;-
55-
56 udev = udev_new();-
57 if (udev) {
udevDescription
TRUEnever evaluated
FALSEnever evaluated
0
58 helper = new QDeviceDiscoveryUDev(types, udev, parent);-
59 } else {
never executed: end of block
0
60 qWarning("Failed to get udev library context");-
61 }
never executed: end of block
0
62-
63 return helper;
never executed: return helper;
0
64}-
65-
66QDeviceDiscoveryUDev::QDeviceDiscoveryUDev(QDeviceTypes types, struct udev *udev, QObject *parent) :-
67 QDeviceDiscovery(types, parent),-
68 m_udev(udev), m_udevMonitor(0), m_udevMonitorFileDescriptor(-1), m_udevSocketNotifier(0)-
69{-
70 if (!m_udev)
!m_udevDescription
TRUEnever evaluated
FALSEnever evaluated
0
71 return;
never executed: return;
0
72-
73 m_udevMonitor = udev_monitor_new_from_netlink(m_udev, "udev");-
74 if (!m_udevMonitor) {
!m_udevMonitorDescription
TRUEnever evaluated
FALSEnever evaluated
0
75 qWarning("Unable to create an udev monitor. No devices can be detected.");-
76 return;
never executed: return;
0
77 }-
78-
79 udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "input", 0);-
80 udev_monitor_filter_add_match_subsystem_devtype(m_udevMonitor, "drm", 0);-
81 udev_monitor_enable_receiving(m_udevMonitor);-
82 m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor);-
83-
84 m_udevSocketNotifier = new QSocketNotifier(m_udevMonitorFileDescriptor, QSocketNotifier::Read, this);-
85 connect(m_udevSocketNotifier, SIGNAL(activated(int)), this, SLOT(handleUDevNotification()));-
86}
never executed: end of block
0
87-
88QDeviceDiscoveryUDev::~QDeviceDiscoveryUDev()-
89{-
90 if (m_udevMonitor)
m_udevMonitorDescription
TRUEnever evaluated
FALSEnever evaluated
0
91 udev_monitor_unref(m_udevMonitor);
never executed: udev_monitor_unref(m_udevMonitor);
0
92-
93 if (m_udev)
m_udevDescription
TRUEnever evaluated
FALSEnever evaluated
0
94 udev_unref(m_udev);
never executed: udev_unref(m_udev);
0
95}
never executed: end of block
0
96-
97QStringList QDeviceDiscoveryUDev::scanConnectedDevices()-
98{-
99 QStringList devices;-
100-
101 if (!m_udev)
!m_udevDescription
TRUEnever evaluated
FALSEnever evaluated
0
102 return devices;
never executed: return devices;
0
103-
104 udev_enumerate *ue = udev_enumerate_new(m_udev);-
105 udev_enumerate_add_match_subsystem(ue, "input");-
106 udev_enumerate_add_match_subsystem(ue, "drm");-
107-
108 if (m_types & Device_Mouse)
m_types & Device_MouseDescription
TRUEnever evaluated
FALSEnever evaluated
0
109 udev_enumerate_add_match_property(ue, "ID_INPUT_MOUSE", "1");
never executed: udev_enumerate_add_match_property(ue, "ID_INPUT_MOUSE", "1");
0
110 if (m_types & Device_Touchpad)
m_types & Device_TouchpadDescription
TRUEnever evaluated
FALSEnever evaluated
0
111 udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
never executed: udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHPAD", "1");
0
112 if (m_types & Device_Touchscreen)
m_types & Device_TouchscreenDescription
TRUEnever evaluated
FALSEnever evaluated
0
113 udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHSCREEN", "1");
never executed: udev_enumerate_add_match_property(ue, "ID_INPUT_TOUCHSCREEN", "1");
0
114 if (m_types & Device_Keyboard) {
m_types & Device_KeyboardDescription
TRUEnever evaluated
FALSEnever evaluated
0
115 udev_enumerate_add_match_property(ue, "ID_INPUT_KEYBOARD", "1");-
116 udev_enumerate_add_match_property(ue, "ID_INPUT_KEY", "1");-
117 }
never executed: end of block
0
118 if (m_types & Device_Tablet)
m_types & Device_TabletDescription
TRUEnever evaluated
FALSEnever evaluated
0
119 udev_enumerate_add_match_property(ue, "ID_INPUT_TABLET", "1");
never executed: udev_enumerate_add_match_property(ue, "ID_INPUT_TABLET", "1");
0
120 if (m_types & Device_Joystick)
m_types & Device_JoystickDescription
TRUEnever evaluated
FALSEnever evaluated
0
121 udev_enumerate_add_match_property(ue, "ID_INPUT_JOYSTICK", "1");
never executed: udev_enumerate_add_match_property(ue, "ID_INPUT_JOYSTICK", "1");
0
122-
123 if (udev_enumerate_scan_devices(ue) != 0) {
udev_enumerate...vices(ue) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
124 qWarning("Failed to scan devices");-
125 return devices;
never executed: return devices;
0
126 }-
127-
128 udev_list_entry *entry;-
129 udev_list_entry_foreach (entry, udev_enumerate_get_list_entry(ue)) {
entry != __nullDescription
TRUEnever evaluated
FALSEnever evaluated
0
130 const char *syspath = udev_list_entry_get_name(entry);-
131 udev_device *udevice = udev_device_new_from_syspath(m_udev, syspath);-
132 QString candidate = QString::fromUtf8(udev_device_get_devnode(udevice));-
133 if ((m_types & Device_InputMask) && candidate.startsWith(QLatin1String(QT_EVDEV_DEVICE)))
(m_types & Device_InputMask)Description
TRUEnever evaluated
FALSEnever evaluated
candidate.star...ut/" "event"))Description
TRUEnever evaluated
FALSEnever evaluated
0
134 devices << candidate;
never executed: devices << candidate;
0
135 if ((m_types & Device_VideoMask) && candidate.startsWith(QLatin1String(QT_DRM_DEVICE))) {
(m_types & Device_VideoMask)Description
TRUEnever evaluated
FALSEnever evaluated
candidate.star...dri/" "card"))Description
TRUEnever evaluated
FALSEnever evaluated
0
136 if (m_types & Device_DRM_PrimaryGPU) {
m_types & Devi...DRM_PrimaryGPUDescription
TRUEnever evaluated
FALSEnever evaluated
0
137 udev_device *pci = udev_device_get_parent_with_subsystem_devtype(udevice, "pci", 0);-
138 if (pci) {
pciDescription
TRUEnever evaluated
FALSEnever evaluated
0
139 if (qstrcmp(udev_device_get_sysattr_value(pci, "boot_vga"), "1") == 0)
qstrcmp(udev_d...a"), "1") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
140 devices << candidate;
never executed: devices << candidate;
0
141 }
never executed: end of block
0
142 } else
never executed: end of block
0
143 devices << candidate;
never executed: devices << candidate;
0
144 }-
145-
146 udev_device_unref(udevice);-
147 }
never executed: end of block
0
148 udev_enumerate_unref(ue);-
149-
150 qCDebug(lcDD) << "Found matching devices" << devices;
never executed: QMessageLogger(__FILE__, 150, __PRETTY_FUNCTION__, lcDD().categoryName()).debug() << "Found matching devices" << devices;
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
151-
152 return devices;
never executed: return devices;
0
153}-
154-
155void QDeviceDiscoveryUDev::handleUDevNotification()-
156{-
157 if (!m_udevMonitor)
!m_udevMonitorDescription
TRUEnever evaluated
FALSEnever evaluated
0
158 return;
never executed: return;
0
159-
160 struct udev_device *dev;-
161 QString devNode;-
162-
163 dev = udev_monitor_receive_device(m_udevMonitor);-
164 if (!dev)
!devDescription
TRUEnever evaluated
FALSEnever evaluated
0
165 goto cleanup;
never executed: goto cleanup;
0
166-
167 const char *action;-
168 action = udev_device_get_action(dev);-
169 if (!action)
!actionDescription
TRUEnever evaluated
FALSEnever evaluated
0
170 goto cleanup;
never executed: goto cleanup;
0
171-
172 const char *str;-
173 str = udev_device_get_devnode(dev);-
174 if (!str)
!strDescription
TRUEnever evaluated
FALSEnever evaluated
0
175 goto cleanup;
never executed: goto cleanup;
0
176-
177 const char *subsystem;-
178 devNode = QString::fromUtf8(str);-
179 if (devNode.startsWith(QLatin1String(QT_EVDEV_DEVICE)))
devNode.starts...ut/" "event"))Description
TRUEnever evaluated
FALSEnever evaluated
0
180 subsystem = "input";
never executed: subsystem = "input";
0
181 else if (devNode.startsWith(QLatin1String(QT_DRM_DEVICE)))
devNode.starts...dri/" "card"))Description
TRUEnever evaluated
FALSEnever evaluated
0
182 subsystem = "drm";
never executed: subsystem = "drm";
0
183 else goto cleanup;
never executed: goto cleanup;
0
184-
185 // if we cannot determine a type, walk up the device tree-
186 if (!checkDeviceType(dev)) {
!checkDeviceType(dev)Description
TRUEnever evaluated
FALSEnever evaluated
0
187 // does not increase the refcount-
188 dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);-
189 if (!dev)
!devDescription
TRUEnever evaluated
FALSEnever evaluated
0
190 goto cleanup;
never executed: goto cleanup;
0
191-
192 if (!checkDeviceType(dev))
!checkDeviceType(dev)Description
TRUEnever evaluated
FALSEnever evaluated
0
193 goto cleanup;
never executed: goto cleanup;
0
194 }
never executed: end of block
0
195-
196 if (qstrcmp(action, "add") == 0)
qstrcmp(action, "add") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
197 emit deviceDetected(devNode);
never executed: deviceDetected(devNode);
0
198-
199 if (qstrcmp(action, "remove") == 0)
qstrcmp(action, "remove") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
200 emit deviceRemoved(devNode);
never executed: deviceRemoved(devNode);
0
201-
202cleanup:
code before this statement never executed: cleanup:
0
203 udev_device_unref(dev);-
204}
never executed: end of block
0
205-
206bool QDeviceDiscoveryUDev::checkDeviceType(udev_device *dev)-
207{-
208 if (!dev)
!devDescription
TRUEnever evaluated
FALSEnever evaluated
0
209 return false;
never executed: return false;
0
210-
211 if ((m_types & Device_Keyboard) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_KEYBOARD"), "1") == 0 )) {
(m_types & Device_Keyboard)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_...), "1") == 0 )Description
TRUEnever evaluated
FALSEnever evaluated
0
212 const char *capabilities_key = udev_device_get_sysattr_value(dev, "capabilities/key");-
213 QStringList val = QString::fromUtf8(capabilities_key).split(QLatin1Char(' '), QString::SkipEmptyParts);-
214 if (!val.isEmpty()) {
!val.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
0
215 bool ok;-
216 unsigned long long keys = val.last().toULongLong(&ok, 16);-
217 if (ok) {
okDescription
TRUEnever evaluated
FALSEnever evaluated
0
218 // Tests if the letter Q is valid for the device. We may want to alter this test, but it seems mostly reliable.-
219 bool test = (keys >> KEY_Q) & 1;-
220 if (test)
testDescription
TRUEnever evaluated
FALSEnever evaluated
0
221 return true;
never executed: return true;
0
222 }
never executed: end of block
0
223 }
never executed: end of block
0
224 }
never executed: end of block
0
225-
226 if ((m_types & Device_Keyboard) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_KEY"), "1") == 0 ))
(m_types & Device_Keyboard)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_...), "1") == 0 )Description
TRUEnever evaluated
FALSEnever evaluated
0
227 return true;
never executed: return true;
0
228-
229 if ((m_types & Device_Mouse) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_MOUSE"), "1") == 0))
(m_types & Device_Mouse)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..."), "1") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
230 return true;
never executed: return true;
0
231-
232 if ((m_types & Device_Touchpad) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD"), "1") == 0))
(m_types & Device_Touchpad)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..."), "1") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
233 return true;
never executed: return true;
0
234-
235 if ((m_types & Device_Touchscreen) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"), "1") == 0))
(m_types & Device_Touchscreen)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..."), "1") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
236 return true;
never executed: return true;
0
237-
238 if ((m_types & Device_Tablet) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_TABLET"), "1") == 0))
(m_types & Device_Tablet)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..."), "1") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
239 return true;
never executed: return true;
0
240-
241 if ((m_types & Device_Joystick) && (qstrcmp(udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK"), "1") == 0))
(m_types & Device_Joystick)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..."), "1") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
242 return true;
never executed: return true;
0
243-
244 if ((m_types & Device_DRM) && (qstrcmp(udev_device_get_subsystem(dev), "drm") == 0))
(m_types & Device_DRM)Description
TRUEnever evaluated
FALSEnever evaluated
(qstrcmp(udev_..., "drm") == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
245 return true;
never executed: return true;
0
246-
247 return false;
never executed: return false;
0
248}-
249-
250QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9