Reorganize devicediscovery header
As pointed out in 13b939c7f4 the approach
qdevicediscovery_p.h takes is just wrong. The defines it relies on will
often be missing when the header is included from random places in qtbase.
This results in different class layouts. It was working only because the
interface of the class is very limited and the public part was matching
regardless of having the macro defined.
This is now corrected by introducing subclasses and a common, non-variated
base class. QDEVICEDISCOVERY_UDEV is removed completely.
Change-Id: I9c83b5b041440a3a6ea3a604eee4a325d4d74439
Reviewed-by: Louai Al-Khanji <louai.al-khanji@theqtcompany.com>
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
bb10
parent
a7dcc661d5
commit
421f78a65f
|
|
@ -3,14 +3,15 @@ HEADERS += $$PWD/qdevicediscovery_p.h
|
|||
linux {
|
||||
contains(QT_CONFIG, libudev) {
|
||||
SOURCES += $$PWD/qdevicediscovery_udev.cpp
|
||||
HEADERS += $$PWD/qdevicediscovery_udev_p.h
|
||||
INCLUDEPATH += $$QMAKE_INCDIR_LIBUDEV
|
||||
LIBS_PRIVATE += $$QMAKE_LIBS_LIBUDEV
|
||||
# Use our own define. QT_NO_LIBUDEV may not be set on non-Linux systems.
|
||||
DEFINES += QDEVICEDISCOVERY_UDEV
|
||||
} else: contains(QT_CONFIG, evdev) {
|
||||
SOURCES += $$PWD/qdevicediscovery_static.cpp
|
||||
HEADERS += $$PWD/qdevicediscovery_static_p.h
|
||||
} else {
|
||||
SOURCES += $$PWD/qdevicediscovery_dummy.cpp
|
||||
HEADERS += $$PWD/qdevicediscovery_dummy_p.h
|
||||
}
|
||||
} else {
|
||||
SOURCES += $$PWD/qdevicediscovery_dummy.cpp
|
||||
|
|
|
|||
|
|
@ -31,34 +31,23 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
#include "qdevicediscovery_dummy_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QDeviceDiscovery *QDeviceDiscovery::create(QDeviceTypes types, QObject *parent)
|
||||
{
|
||||
return new QDeviceDiscovery(types, parent);
|
||||
return new QDeviceDiscoveryDummy(types, parent);
|
||||
}
|
||||
|
||||
QDeviceDiscovery::QDeviceDiscovery(QDeviceTypes types, QObject *parent)
|
||||
: QObject(parent),
|
||||
m_types(types)
|
||||
QDeviceDiscoveryDummy::QDeviceDiscoveryDummy(QDeviceTypes types, QObject *parent)
|
||||
: QDeviceDiscovery(types, parent)
|
||||
{
|
||||
}
|
||||
|
||||
QDeviceDiscovery::~QDeviceDiscovery()
|
||||
{
|
||||
}
|
||||
|
||||
QStringList QDeviceDiscovery::scanConnectedDevices()
|
||||
QStringList QDeviceDiscoveryDummy::scanConnectedDevices()
|
||||
{
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
bool QDeviceDiscovery::checkDeviceType(const QString &device)
|
||||
{
|
||||
Q_UNUSED(device);
|
||||
return false;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL21$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 or version 3 as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
** following information to ensure the GNU Lesser General Public License
|
||||
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDEVICEDISCOVERY_DUMMY_H
|
||||
#define QDEVICEDISCOVERY_DUMMY_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDeviceDiscoveryDummy : public QDeviceDiscovery
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QDeviceDiscoveryDummy(QDeviceTypes types, QObject *parent = 0);
|
||||
QStringList scanConnectedDevices() Q_DECL_OVERRIDE;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QDEVICEDISCOVERY_DUMMY_H
|
||||
|
|
@ -49,10 +49,6 @@
|
|||
#include <QSocketNotifier>
|
||||
#include <QStringList>
|
||||
|
||||
#ifdef QDEVICEDISCOVERY_UDEV
|
||||
#include <libudev.h>
|
||||
#endif
|
||||
|
||||
#define QT_EVDEV_DEVICE_PATH "/dev/input/"
|
||||
#define QT_EVDEV_DEVICE_PREFIX "event"
|
||||
#define QT_EVDEV_DEVICE QT_EVDEV_DEVICE_PATH QT_EVDEV_DEVICE_PREFIX
|
||||
|
|
@ -84,39 +80,18 @@ public:
|
|||
Q_DECLARE_FLAGS(QDeviceTypes, QDeviceType)
|
||||
|
||||
static QDeviceDiscovery *create(QDeviceTypes type, QObject *parent = 0);
|
||||
~QDeviceDiscovery();
|
||||
|
||||
QStringList scanConnectedDevices();
|
||||
virtual QStringList scanConnectedDevices() = 0;
|
||||
|
||||
signals:
|
||||
void deviceDetected(const QString &deviceNode);
|
||||
void deviceRemoved(const QString &deviceNode);
|
||||
|
||||
#ifdef QDEVICEDISCOVERY_UDEV
|
||||
private slots:
|
||||
void handleUDevNotification();
|
||||
#endif
|
||||
|
||||
private:
|
||||
#ifdef QDEVICEDISCOVERY_UDEV
|
||||
QDeviceDiscovery(QDeviceTypes types, struct udev *udev, QObject *parent = 0);
|
||||
bool checkDeviceType(struct udev_device *dev);
|
||||
#else
|
||||
QDeviceDiscovery(QDeviceTypes types, QObject *parent = 0);
|
||||
bool checkDeviceType(const QString &device);
|
||||
#endif
|
||||
protected:
|
||||
QDeviceDiscovery(QDeviceTypes types, QObject *parent) : QObject(parent), m_types(types) { }
|
||||
Q_DISABLE_COPY(QDeviceDiscovery)
|
||||
|
||||
QDeviceTypes m_types;
|
||||
|
||||
#ifdef QDEVICEDISCOVERY_UDEV
|
||||
void startWatching();
|
||||
void stopWatching();
|
||||
|
||||
struct udev *m_udev;
|
||||
struct udev_monitor *m_udevMonitor;
|
||||
int m_udevMonitorFileDescriptor;
|
||||
QSocketNotifier *m_udevSocketNotifier;
|
||||
#endif
|
||||
};
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QDeviceDiscovery::QDeviceTypes)
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
#include "qdevicediscovery_static_p.h"
|
||||
|
||||
#include <QStringList>
|
||||
#include <QCoreApplication>
|
||||
|
|
@ -75,23 +75,18 @@ QT_BEGIN_NAMESPACE
|
|||
|
||||
QDeviceDiscovery *QDeviceDiscovery::create(QDeviceTypes types, QObject *parent)
|
||||
{
|
||||
return new QDeviceDiscovery(types, parent);
|
||||
return new QDeviceDiscoveryStatic(types, parent);
|
||||
}
|
||||
|
||||
QDeviceDiscovery::QDeviceDiscovery(QDeviceTypes types, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_types(types)
|
||||
QDeviceDiscoveryStatic::QDeviceDiscoveryStatic(QDeviceTypes types, QObject *parent)
|
||||
: QDeviceDiscovery(types, parent)
|
||||
{
|
||||
#ifdef QT_QPA_DEVICE_DISCOVERY_DEBUG
|
||||
qWarning() << "New DeviceDiscovery created for type" << types;
|
||||
#endif
|
||||
}
|
||||
|
||||
QDeviceDiscovery::~QDeviceDiscovery()
|
||||
{
|
||||
}
|
||||
|
||||
QStringList QDeviceDiscovery::scanConnectedDevices()
|
||||
QStringList QDeviceDiscoveryStatic::scanConnectedDevices()
|
||||
{
|
||||
QStringList devices;
|
||||
QDir dir;
|
||||
|
|
@ -124,7 +119,7 @@ QStringList QDeviceDiscovery::scanConnectedDevices()
|
|||
return devices;
|
||||
}
|
||||
|
||||
bool QDeviceDiscovery::checkDeviceType(const QString &device)
|
||||
bool QDeviceDiscoveryStatic::checkDeviceType(const QString &device)
|
||||
{
|
||||
bool ret = false;
|
||||
int fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,66 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL21$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 or version 3 as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
** following information to ensure the GNU Lesser General Public License
|
||||
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDEVICEDISCOVERY_STATIC_H
|
||||
#define QDEVICEDISCOVERY_STATIC_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDeviceDiscoveryStatic : public QDeviceDiscovery
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QDeviceDiscoveryStatic(QDeviceTypes types, QObject *parent = 0);
|
||||
QStringList scanConnectedDevices() Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
bool checkDeviceType(const QString &device);
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QDEVICEDISCOVERY_STATIC_H
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
#include "qdevicediscovery_udev_p.h"
|
||||
|
||||
#include <QStringList>
|
||||
#include <QCoreApplication>
|
||||
|
|
@ -60,7 +60,7 @@ QDeviceDiscovery *QDeviceDiscovery::create(QDeviceTypes types, QObject *parent)
|
|||
|
||||
udev = udev_new();
|
||||
if (udev) {
|
||||
helper = new QDeviceDiscovery(types, udev, parent);
|
||||
helper = new QDeviceDiscoveryUDev(types, udev, parent);
|
||||
} else {
|
||||
qWarning("Failed to get udev library context.");
|
||||
}
|
||||
|
|
@ -68,9 +68,9 @@ QDeviceDiscovery *QDeviceDiscovery::create(QDeviceTypes types, QObject *parent)
|
|||
return helper;
|
||||
}
|
||||
|
||||
QDeviceDiscovery::QDeviceDiscovery(QDeviceTypes types, struct udev *udev, QObject *parent) :
|
||||
QObject(parent),
|
||||
m_types(types), m_udev(udev), m_udevMonitor(0), m_udevMonitorFileDescriptor(-1), m_udevSocketNotifier(0)
|
||||
QDeviceDiscoveryUDev::QDeviceDiscoveryUDev(QDeviceTypes types, struct udev *udev, QObject *parent) :
|
||||
QDeviceDiscovery(types, parent),
|
||||
m_udev(udev), m_udevMonitor(0), m_udevMonitorFileDescriptor(-1), m_udevSocketNotifier(0)
|
||||
{
|
||||
#ifdef QT_QPA_DEVICE_DISCOVERY_DEBUG
|
||||
qWarning() << "New UDeviceHelper created for type" << types;
|
||||
|
|
@ -96,7 +96,7 @@ QDeviceDiscovery::QDeviceDiscovery(QDeviceTypes types, struct udev *udev, QObjec
|
|||
connect(m_udevSocketNotifier, SIGNAL(activated(int)), this, SLOT(handleUDevNotification()));
|
||||
}
|
||||
|
||||
QDeviceDiscovery::~QDeviceDiscovery()
|
||||
QDeviceDiscoveryUDev::~QDeviceDiscoveryUDev()
|
||||
{
|
||||
if (m_udevMonitor)
|
||||
udev_monitor_unref(m_udevMonitor);
|
||||
|
|
@ -105,7 +105,7 @@ QDeviceDiscovery::~QDeviceDiscovery()
|
|||
udev_unref(m_udev);
|
||||
}
|
||||
|
||||
QStringList QDeviceDiscovery::scanConnectedDevices()
|
||||
QStringList QDeviceDiscoveryUDev::scanConnectedDevices()
|
||||
{
|
||||
QStringList devices;
|
||||
|
||||
|
|
@ -165,7 +165,7 @@ QStringList QDeviceDiscovery::scanConnectedDevices()
|
|||
return devices;
|
||||
}
|
||||
|
||||
void QDeviceDiscovery::handleUDevNotification()
|
||||
void QDeviceDiscoveryUDev::handleUDevNotification()
|
||||
{
|
||||
if (!m_udevMonitor)
|
||||
return;
|
||||
|
|
@ -216,7 +216,7 @@ cleanup:
|
|||
udev_device_unref(dev);
|
||||
}
|
||||
|
||||
bool QDeviceDiscovery::checkDeviceType(udev_device *dev)
|
||||
bool QDeviceDiscoveryUDev::checkDeviceType(udev_device *dev)
|
||||
{
|
||||
if (!dev)
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,79 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the plugins of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL21$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 or version 3 as published by the Free
|
||||
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
||||
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
||||
** following information to ensure the GNU Lesser General Public License
|
||||
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QDEVICEDISCOVERY_UDEV_H
|
||||
#define QDEVICEDISCOVERY_UDEV_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qdevicediscovery_p.h"
|
||||
#include <libudev.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDeviceDiscoveryUDev : public QDeviceDiscovery
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QDeviceDiscoveryUDev(QDeviceTypes types, struct udev *udev, QObject *parent = 0);
|
||||
~QDeviceDiscoveryUDev();
|
||||
QStringList scanConnectedDevices() Q_DECL_OVERRIDE;
|
||||
|
||||
private slots:
|
||||
void handleUDevNotification();
|
||||
|
||||
private:
|
||||
bool checkDeviceType(struct udev_device *dev);
|
||||
|
||||
void startWatching();
|
||||
void stopWatching();
|
||||
|
||||
struct udev *m_udev;
|
||||
struct udev_monitor *m_udevMonitor;
|
||||
int m_udevMonitorFileDescriptor;
|
||||
QSocketNotifier *m_udevSocketNotifier;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QDEVICEDISCOVERY_UDEV_H
|
||||
|
|
@ -29,8 +29,6 @@ HEADERS = qdirectfbintegration.h \
|
|||
qdirectfbscreen.h \
|
||||
qdirectfbeglhooks.h
|
||||
|
||||
contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV
|
||||
|
||||
# ### port the GL context
|
||||
contains(QT_CONFIG, directfb_egl) {
|
||||
HEADERS += qdirectfb_egl.h
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ QT += core-private gui-private platformsupport-private
|
|||
qtHaveModule(opengl):QT += opengl-private
|
||||
|
||||
DEFINES += MESA_EGL_NO_X11_HEADERS __GBM__
|
||||
contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV
|
||||
|
||||
CONFIG += link_pkgconfig egl qpa/genericunixfontdatabase
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ QT += core-private gui-private platformsupport-private
|
|||
|
||||
SOURCES = main.cpp qlinuxfbintegration.cpp qlinuxfbscreen.cpp
|
||||
HEADERS = qlinuxfbintegration.h qlinuxfbscreen.h
|
||||
contains(QT_CONFIG, libudev): DEFINES += QDEVICEDISCOVERY_UDEV
|
||||
|
||||
CONFIG += qpa/genericunixfontdatabase
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue