diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index 3c8e00519b..a3e809a266 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -235,13 +235,10 @@ QList QFactoryLoader::metaData() const for (int i = 0; i < d->libraryList.size(); ++i) metaData.append(d->libraryList.at(i)->metaData); - QVector staticPlugins = QLibraryPrivate::staticPlugins(); - for (int i = 0; i < staticPlugins.count(); ++i) { - const char *rawMetaData = staticPlugins.at(i).metaData(); - QJsonObject object = QLibraryPrivate::fromRawMetaData(rawMetaData).object(); + foreach (const QStaticPlugin &plugin, QPluginLoader::staticPlugins()) { + const QJsonObject object = plugin.metaData(); if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size())) continue; - metaData.append(object); } return metaData; @@ -269,10 +266,9 @@ QObject *QFactoryLoader::instance(int index) const } index -= d->libraryList.size(); - QVector staticPlugins = QLibraryPrivate::staticPlugins(); + QVector staticPlugins = QPluginLoader::staticPlugins(); for (int i = 0; i < staticPlugins.count(); ++i) { - const char *rawMetaData = staticPlugins.at(i).metaData(); - QJsonObject object = QLibraryPrivate::fromRawMetaData(rawMetaData).object(); + const QJsonObject object = staticPlugins.at(i).metaData(); if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size())) continue; diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h index abf11be9f7..20b0c7e20f 100644 --- a/src/corelib/plugin/qlibrary_p.h +++ b/src/corelib/plugin/qlibrary_p.h @@ -98,9 +98,6 @@ public: static QStringList suffixes_sys(const QString &fullVersion); static QStringList prefixes_sys(); - static QVector staticPlugins(); - - QPointer inst; QtPluginInstanceFunction instance; QJsonObject metaData; diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h index b91a0e9900..1ec9325e5e 100644 --- a/src/corelib/plugin/qplugin.h +++ b/src/corelib/plugin/qplugin.h @@ -44,6 +44,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -59,11 +60,22 @@ QT_BEGIN_NAMESPACE typedef QObject *(*QtPluginInstanceFunction)(); typedef const char *(*QtPluginMetaDataFunction)(); -struct QStaticPlugin +struct Q_CORE_EXPORT QStaticPlugin { + // Note: This struct is initialized using an initializer list. + // As such, it cannot have any new constructors or variables. +#ifndef Q_QDOC QtPluginInstanceFunction instance; - QtPluginMetaDataFunction metaData; + QtPluginMetaDataFunction rawMetaData; +#else + // Since qdoc gets confused by the use of function + // pointers, we add these dummes for it to parse instead: + QObject *instance(); + const char *rawMetaData(); +#endif + QJsonObject metaData() const; }; +Q_DECLARE_TYPEINFO(QStaticPlugin, Q_PRIMITIVE_TYPE); void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin); diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index 5a59942aad..46844acb01 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -106,6 +106,33 @@ QT_BEGIN_NAMESPACE \sa QLibrary, {Plug & Paint Example} */ +/*! + \class QStaticPlugin + \inmodule QtCore + \since 5.2 + + \brief QStaticPlugin is a struct containing a reference to a + static plugin instance together with its meta data. + + \sa QPluginLoader, {How to Create Qt Plugins} +*/ + +/*! + \fn QObject *QStaticPlugin::instance() + + Returns the plugin instance. + + \sa QPluginLoader::staticInstances() +*/ + +/*! + \fn const char *QStaticPlugin::rawMetaData() + + Returns the raw meta data for the plugin. + + \sa metaData(), Q_PLUGIN_METADATA() +*/ + /*! Constructs a plugin loader with the given \a parent. */ @@ -407,6 +434,7 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin plugin) /*! Returns a list of static plugin instances (root components) held by the plugin loader. + \sa staticPlugins() */ QObjectList QPluginLoader::staticInstances() { @@ -419,8 +447,14 @@ QObjectList QPluginLoader::staticInstances() return instances; } - -QVector QLibraryPrivate::staticPlugins() +/*! + Returns a list of QStaticPlugins held by the plugin + loader. The function is similar to \l staticInstances() + with the addition that a QStaticPlugin also contains + meta data information. + \sa staticInstances() +*/ +QVector QPluginLoader::staticPlugins() { StaticPluginList *plugins = staticPluginList(); if (plugins) @@ -428,6 +462,16 @@ QVector QLibraryPrivate::staticPlugins() return QVector(); } +/*! + Returns a the meta data for the plugin as a QJsonObject. + + \sa rawMetaData() +*/ +QJsonObject QStaticPlugin::metaData() const +{ + return QLibraryPrivate::fromRawMetaData(rawMetaData()).object(); +} + QT_END_NAMESPACE #endif // QT_NO_LIBRARY diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h index 8f8833e839..88c8ba4fa0 100644 --- a/src/corelib/plugin/qpluginloader.h +++ b/src/corelib/plugin/qpluginloader.h @@ -43,6 +43,7 @@ #define QPLUGINLOADER_H #include +#include #ifndef QT_NO_LIBRARY @@ -65,6 +66,7 @@ public: QJsonObject metaData() const; static QObjectList staticInstances(); + static QVector staticPlugins(); bool load(); bool unload(); diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp index 663f664d94..0f224c4909 100644 --- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp +++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp @@ -765,7 +765,7 @@ void tst_QGuiApplication::genericPluginsAndWindowSystemEvents() QStaticPlugin testPluginInfo; testPluginInfo.instance = qt_plugin_instance; - testPluginInfo.metaData = qt_plugin_query_metadata; + testPluginInfo.rawMetaData = qt_plugin_query_metadata; qRegisterStaticPluginFunction(testPluginInfo); int argc = 3; char *argv[] = { const_cast("tst_qguiapplication"), const_cast("-plugin"), const_cast("testplugin") };