diff options
-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 |