From 053576e88045642a0d34003d57a2d087cc5d903f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 4 May 2012 15:57:21 +0200 Subject: QFactoryLoader: Add API for supporting the metadata containing keys. - Add a method returning a QMultiMap to QFactoryLoader, determined from metadata(), correctly reflecting the data structure ('Keys' being a list) - Add convenience templates to create plugins via factory interfaces Change-Id: I247749aa3245f635e476605db1c4cd9c74b74dea Reviewed-by: Lars Knoll --- src/corelib/plugin/qfactoryloader.cpp | 33 +++++++++++++++++++++++++++++++++ src/corelib/plugin/qfactoryloader_p.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) (limited to 'src/corelib') diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index fc9e94037f..67b59f96ec 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -370,6 +370,39 @@ void QFactoryLoader::refreshAll() } } +QMultiMap QFactoryLoader::keyMap() const +{ + QMultiMap result; + const QString metaDataKey = QStringLiteral("MetaData"); + const QString keysKey = QStringLiteral("Keys"); + const QList metaDataList = metaData(); + for (int i = 0; i < metaDataList.size(); ++i) { + const QJsonObject metaData = metaDataList.at(i).value(metaDataKey).toObject(); + const QJsonArray keys = metaData.value(keysKey).toArray(); + const int keyCount = keys.size(); + for (int k = 0; k < keyCount; ++k) + result.insert(i, keys.at(k).toString()); + } + return result; +} + +int QFactoryLoader::indexOf(const QString &needle) const +{ + const QString metaDataKey = QStringLiteral("MetaData"); + const QString keysKey = QStringLiteral("Keys"); + const QList metaDataList = metaData(); + for (int i = 0; i < metaDataList.size(); ++i) { + const QJsonObject metaData = metaDataList.at(i).value(metaDataKey).toObject(); + const QJsonArray keys = metaData.value(keysKey).toArray(); + const int keyCount = keys.size(); + for (int k = 0; k < keyCount; ++k) { + if (!keys.at(k).toString().compare(needle, Qt::CaseInsensitive)) + return i; + } + } + return -1; +} + QT_END_NAMESPACE #endif // QT_NO_LIBRARY diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h index ee7a68d6f8..66ded8074b 100644 --- a/src/corelib/plugin/qfactoryloader_p.h +++ b/src/corelib/plugin/qfactoryloader_p.h @@ -56,6 +56,7 @@ #include "QtCore/qobject.h" #include "QtCore/qstringlist.h" #include "QtCore/qjsonobject.h" +#include "QtCore/qmap.h" #include "private/qlibrary_p.h" #ifndef QT_NO_LIBRARY @@ -84,11 +85,42 @@ public: QLibraryPrivate *library(const QString &key) const; #endif + QMultiMap keyMap() const; + int indexOf(const QString &needle) const; + void update(); static void refreshAll(); }; +template + PluginInterface *qLoadPlugin(const QFactoryLoader *loader, const QString &key) +{ + const int index = loader->indexOf(key); + if (index != -1) { + QObject *factoryObject = loader->instance(index); + if (FactoryInterface *factory = qobject_cast(factoryObject)) + if (PluginInterface *result = factory->create(key)) + return result; + } + return 0; +} + +template +PluginInterface *qLoadPlugin1(const QFactoryLoader *loader, + const QString &key, + const Parameter1 ¶meter1) +{ + const int index = loader->indexOf(key); + if (index != -1) { + QObject *factoryObject = loader->instance(index); + if (FactoryInterface *factory = qobject_cast(factoryObject)) + if (PluginInterface *result = factory->create(key, parameter1)) + return result; + } + return 0; +} + QT_END_NAMESPACE #endif // QT_NO_LIBRARY -- cgit v1.2.3