summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2017-03-03 08:11:44 +0100
committerAlex Blasche <alexander.blasche@qt.io>2017-03-30 05:51:23 +0000
commitd09ec5d8f496b7e3b5bdfef52f48e2d301be99f1 (patch)
tree18ca5380240c73fef605c99bc9133557553a2047
parentdc124162efeabe90b9025789391d1f0e15cef0f1 (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.cpp5
-rw-r--r--src/plugins/canbus/socketcan/main.cpp5
-rw-r--r--src/plugins/canbus/systeccan/main.cpp4
-rw-r--r--src/plugins/canbus/tinycan/main.cpp5
-rw-r--r--src/plugins/canbus/vectorcan/main.cpp4
-rw-r--r--src/serialbus/doc/src/qtcanbus-backends.qdoc2
-rw-r--r--src/serialbus/qcanbus.cpp35
-rw-r--r--src/serialbus/qcanbusfactory.cpp45
-rw-r--r--src/serialbus/qcanbusfactory.h14
-rw-r--r--tests/auto/plugins/genericcanbus/main.cpp4
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