diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2017-03-03 08:11:44 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@qt.io> | 2017-03-30 05:51:23 +0000 |
commit | d09ec5d8f496b7e3b5bdfef52f48e2d301be99f1 (patch) | |
tree | 18ca5380240c73fef605c99bc9133557553a2047 | |
parent | dc124162efeabe90b9025789391d1f0e15cef0f1 (diff) |
QCanBusFactory: Restore binary compatibility to Qt 5.8
Added a new QCanBusFactoryV2 to load plugins with the
new virtual function availableDevices().
To be able to still load plugins compiled against Qt 5.8,
both factories have to be considered when loading plugins
and creating devices.
Change-Id: I843cdd0b82193e391699daa298454c8b9522e860
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r-- | src/plugins/canbus/peakcan/main.cpp | 5 | ||||
-rw-r--r-- | src/plugins/canbus/socketcan/main.cpp | 5 | ||||
-rw-r--r-- | src/plugins/canbus/systeccan/main.cpp | 4 | ||||
-rw-r--r-- | src/plugins/canbus/tinycan/main.cpp | 5 | ||||
-rw-r--r-- | src/plugins/canbus/vectorcan/main.cpp | 4 | ||||
-rw-r--r-- | src/serialbus/doc/src/qtcanbus-backends.qdoc | 2 | ||||
-rw-r--r-- | src/serialbus/qcanbus.cpp | 35 | ||||
-rw-r--r-- | src/serialbus/qcanbusfactory.cpp | 45 | ||||
-rw-r--r-- | src/serialbus/qcanbusfactory.h | 14 | ||||
-rw-r--r-- | tests/auto/plugins/genericcanbus/main.cpp | 4 |
10 files changed, 91 insertions, 32 deletions
diff --git a/src/plugins/canbus/peakcan/main.cpp b/src/plugins/canbus/peakcan/main.cpp index 453124b..0c1483d 100644 --- a/src/plugins/canbus/peakcan/main.cpp +++ b/src/plugins/canbus/peakcan/main.cpp @@ -43,12 +43,11 @@ QT_BEGIN_NAMESPACE -class PeakCanBusPlugin : public QObject, public QCanBusFactory +class PeakCanBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) - + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override diff --git a/src/plugins/canbus/socketcan/main.cpp b/src/plugins/canbus/socketcan/main.cpp index d1e9115..8a44c5e 100644 --- a/src/plugins/canbus/socketcan/main.cpp +++ b/src/plugins/canbus/socketcan/main.cpp @@ -45,12 +45,11 @@ QT_BEGIN_NAMESPACE //! [SocketCanFactory] -class SocketCanBusPlugin : public QObject, public QCanBusFactory +class SocketCanBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) - + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override diff --git a/src/plugins/canbus/systeccan/main.cpp b/src/plugins/canbus/systeccan/main.cpp index d81072d..fcb76a3 100644 --- a/src/plugins/canbus/systeccan/main.cpp +++ b/src/plugins/canbus/systeccan/main.cpp @@ -42,11 +42,11 @@ QT_BEGIN_NAMESPACE -class SystecCanBusPlugin : public QObject, public QCanBusFactory +class SystecCanBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override diff --git a/src/plugins/canbus/tinycan/main.cpp b/src/plugins/canbus/tinycan/main.cpp index 55c5590..d3fa070 100644 --- a/src/plugins/canbus/tinycan/main.cpp +++ b/src/plugins/canbus/tinycan/main.cpp @@ -43,12 +43,11 @@ QT_BEGIN_NAMESPACE -class TinyCanBusPlugin : public QObject, public QCanBusFactory +class TinyCanBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) - + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override diff --git a/src/plugins/canbus/vectorcan/main.cpp b/src/plugins/canbus/vectorcan/main.cpp index 4827c53..1d6844f 100644 --- a/src/plugins/canbus/vectorcan/main.cpp +++ b/src/plugins/canbus/vectorcan/main.cpp @@ -42,11 +42,11 @@ QT_BEGIN_NAMESPACE -class VectorCanBusPlugin : public QObject, public QCanBusFactory +class VectorCanBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override diff --git a/src/serialbus/doc/src/qtcanbus-backends.qdoc b/src/serialbus/doc/src/qtcanbus-backends.qdoc index 522c6f2..c04cdd1 100644 --- a/src/serialbus/doc/src/qtcanbus-backends.qdoc +++ b/src/serialbus/doc/src/qtcanbus-backends.qdoc @@ -95,7 +95,7 @@ \endcode This key must be passed to \l {QCanBus::createDevice()} together with the interface name of - the CAN bus adapter. QCanBus loads and instantiates the plugin using the QCanBusFactory + the CAN bus adapter. QCanBus loads and instantiates the plugin using the QCanBusFactoryV2 interface which each plugin must implement as central entry point. The interface acts as a factory and its sole purpose is to return a \l QCanBusDevice instance. The above mentioned interface name is passed on via the factory's \l QCanBusFactory::createDevice() method. diff --git a/src/serialbus/qcanbus.cpp b/src/serialbus/qcanbus.cpp index 3430f57..9a71bdd 100644 --- a/src/serialbus/qcanbus.cpp +++ b/src/serialbus/qcanbus.cpp @@ -56,7 +56,7 @@ public: QCanBusPrivate() { } QJsonObject meta; - QCanBusFactory *factory = nullptr; + QObject *factory = nullptr; int index = -1; }; @@ -121,7 +121,7 @@ static void setErrorMessage(QString *result, const QString &message) *result = message; } -static QCanBusFactory *canBusFactory(const QString &plugin, QString *errorMessage) +static QObject *canBusFactory(const QString &plugin, QString *errorMessage) { if (Q_UNLIKELY(!qCanBusPlugins()->contains(plugin))) { setErrorMessage(errorMessage, QCanBus::tr("No such plugin: '%1'").arg(plugin)); @@ -130,7 +130,7 @@ static QCanBusFactory *canBusFactory(const QString &plugin, QString *errorMessag QCanBusPrivate d = qCanBusPlugins()->value(plugin); if (!d.factory) { - d.factory = qobject_cast<QCanBusFactory *>(qFactoryLoader->instance(d.index)); + d.factory = qFactoryLoader->instance(d.index); if (d.factory) qCanBusPlugins()->insert(plugin, d); @@ -154,12 +154,19 @@ static QCanBusFactory *canBusFactory(const QString &plugin, QString *errorMessag */ QList<QCanBusDeviceInfo> QCanBus::availableDevices(const QString &plugin, QString *errorMessage) const { - const QCanBusFactory *factory = canBusFactory(plugin, errorMessage); - if (Q_UNLIKELY(!factory)) + const QObject *obj = canBusFactory(plugin, errorMessage); + if (Q_UNLIKELY(!obj)) return QList<QCanBusDeviceInfo>(); + const QCanBusFactoryV2 *factoryV2 = qobject_cast<QCanBusFactoryV2 *>(obj); + if (Q_UNLIKELY(!factoryV2)) { + setErrorMessage(errorMessage, + tr("The plugin '%1' does not provide this function.").arg(plugin)); + return QList<QCanBusDeviceInfo>(); + } + QString errorString; - QList<QCanBusDeviceInfo> result = factory->availableDevices(&errorString); + QList<QCanBusDeviceInfo> result = factoryV2->availableDevices(&errorString); setErrorMessage(errorMessage, errorString); return result; @@ -190,11 +197,21 @@ QList<QCanBusDeviceInfo> QCanBus::availableDevices(const QString &plugin, QStrin QCanBusDevice *QCanBus::createDevice(const QString &plugin, const QString &interfaceName, QString *errorMessage) const { - const QCanBusFactory *factory = canBusFactory(plugin, errorMessage); - if (Q_UNLIKELY(!factory)) + const QObject *obj = canBusFactory(plugin, errorMessage); + if (Q_UNLIKELY(!obj)) return nullptr; - return factory->createDevice(interfaceName, errorMessage); + const QCanBusFactoryV2 *factoryV2 = qobject_cast<QCanBusFactoryV2 *>(obj); + if (Q_LIKELY(factoryV2)) + return factoryV2->createDevice(interfaceName, errorMessage); + + const QCanBusFactory *factory = qobject_cast<QCanBusFactory *>(obj); + if (factory) + return factory->createDevice(interfaceName, errorMessage); + + setErrorMessage(errorMessage, + tr("The plugin '%1' does not provide this function.").arg(plugin)); + return nullptr; } QCanBus::QCanBus(QObject *parent) : diff --git a/src/serialbus/qcanbusfactory.cpp b/src/serialbus/qcanbusfactory.cpp index db6c294..0a0e9b7 100644 --- a/src/serialbus/qcanbusfactory.cpp +++ b/src/serialbus/qcanbusfactory.cpp @@ -42,39 +42,72 @@ QT_BEGIN_NAMESPACE \class QCanBusFactory \inmodule QtSerialBus \since 5.8 + \deprecated \brief The QCanBusFactory class is a factory class used as the plugin interface for CAN bus plugins. All plugins must implement the functions provided by this factory class. + + This class is deprecated, you should use QCanBusFactoryV2 instead. + + \sa QCanBusFactoryV2 */ /*! - \fn QList<QCanBusDeviceInfo> QCanBusFactory::availableDevices(QString *errorMessage) const + \fn QCanBusDevice *QCanBusFactory::createDevice(const QString &interfaceName, + QString *errorMessage) const - Returns the list of available devices and their capabilities for the QCanBusDevice. + Creates a new QCanBusDevice. The caller must take ownership of the returned pointer. + \a interfaceName is the CAN interface name and \a errorMessage contains an error description in case of failure. + If the factory cannot create a plugin, it returns \c nullptr. +*/ + +/*! + \internal + + \fn QCanBusFactory::~QCanBusFactory() +*/ + +/*! + \class QCanBusFactoryV2 + \inmodule QtSerialBus \since 5.9 + + \brief The QCanBusFactoryV2 class is a factory class used as the + plugin interface for CAN bus plugins. + + All plugins must implement the functions provided by this factory class. */ /*! - \fn QCanBusDevice *QCanBusFactory::createDevice(const QString &interfaceName, + \fn QCanBusDevice *QCanBusFactoryV2::createDevice(const QString &interfaceName, QString *errorMessage) const Creates a new QCanBusDevice. The caller must take ownership of the returned pointer. - \a interfaceName is the network/CAN interface name. + \a interfaceName is the CAN interface name and \a errorMessage contains an error description in case of failure. If the factory cannot create a plugin, it returns \c nullptr. */ /*! - \internal + \fn QList<QCanBusDeviceInfo> QCanBusFactoryV2::availableDevices(QString *errorMessage) const - \fn QCanBusFactory::~QCanBusFactory() + Returns the list of available devices and their capabilities for the QCanBusDevice. + + \a errorMessage contains an error description in case of failure. */ +/*! + * \internal + */ +QCanBusFactoryV2::~QCanBusFactoryV2() +{ +} + QT_END_NAMESPACE diff --git a/src/serialbus/qcanbusfactory.h b/src/serialbus/qcanbusfactory.h index 2ab9862..b6ddf38 100644 --- a/src/serialbus/qcanbusfactory.h +++ b/src/serialbus/qcanbusfactory.h @@ -47,7 +47,6 @@ QT_BEGIN_NAMESPACE class Q_SERIALBUS_EXPORT QCanBusFactory { public: - virtual QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const = 0; virtual QCanBusDevice *createDevice(const QString &interfaceName, QString *errorMessage) const = 0; protected: @@ -56,6 +55,19 @@ protected: Q_DECLARE_INTERFACE(QCanBusFactory, "org.qt-project.Qt.QCanBusFactory") +class Q_SERIALBUS_EXPORT QCanBusFactoryV2 : public QCanBusFactory +{ +public: + virtual QCanBusDevice *createDevice(const QString &interfaceName, + QString *errorMessage) const = 0; + virtual QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const = 0; + +protected: + virtual ~QCanBusFactoryV2(); +}; + +Q_DECLARE_INTERFACE(QCanBusFactoryV2, "org.qt-project.Qt.QCanBusFactoryV2") + QT_END_NAMESPACE #endif // QCANBUSFACTORY_H diff --git a/tests/auto/plugins/genericcanbus/main.cpp b/tests/auto/plugins/genericcanbus/main.cpp index c037313..20465e1 100644 --- a/tests/auto/plugins/genericcanbus/main.cpp +++ b/tests/auto/plugins/genericcanbus/main.cpp @@ -42,11 +42,11 @@ QT_BEGIN_NAMESPACE -class GenericBusPlugin : public QObject, public QCanBusFactory +class GenericBusPlugin : public QObject, public QCanBusFactoryV2 { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QCanBusFactory" FILE "plugin.json") - Q_INTERFACES(QCanBusFactory) + Q_INTERFACES(QCanBusFactoryV2) public: QList<QCanBusDeviceInfo> availableDevices(QString *errorMessage) const override |