summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qcanbus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialbus/qcanbus.cpp')
-rw-r--r--src/serialbus/qcanbus.cpp35
1 files changed, 26 insertions, 9 deletions
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) :