summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp38
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h24
-rw-r--r--src/corelib/plugin/qplugin.h1
-rw-r--r--src/gui/image/qimagereaderwriterhelpers.cpp11
-rw-r--r--src/plugins/platforms/ios/qiosfiledialog.mm3
-rw-r--r--src/plugins/platforms/ios/qiosintegration.mm3
6 files changed, 52 insertions, 28 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 824bf60f7d..a315daa199 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -334,22 +334,24 @@ QFactoryLoader::QFactoryLoader(const char *iid,
#endif
}
-QList<QJsonObject> QFactoryLoader::metaData() const
+QFactoryLoader::MetaDataList QFactoryLoader::metaData() const
{
Q_D(const QFactoryLoader);
- QList<QJsonObject> metaData;
+ QList<QPluginParsedMetaData> metaData;
#if QT_CONFIG(library)
QMutexLocker locker(&d->mutex);
for (int i = 0; i < d->libraryList.size(); ++i)
- metaData.append(d->libraryList.at(i)->metaData.toJson());
+ metaData.append(d->libraryList.at(i)->metaData);
#endif
+ QLatin1String iid(d->iid.constData(), d->iid.size());
const auto staticPlugins = QPluginLoader::staticPlugins();
for (const QStaticPlugin &plugin : staticPlugins) {
- const QJsonObject object = plugin.metaData();
- if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
+ QByteArrayView pluginData(static_cast<const char *>(plugin.rawMetaData), plugin.rawMetaDataSize);
+ QPluginParsedMetaData parsed(pluginData);
+ if (parsed.isError() || parsed.value(QtPluginMetaDataKeys::IID) != iid)
continue;
- metaData.append(object);
+ metaData.append(std::move(parsed));
}
return metaData;
}
@@ -375,14 +377,16 @@ QObject *QFactoryLoader::instance(int index) const
lock.unlock();
#endif
- QList<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
- for (int i = 0; i < staticPlugins.count(); ++i) {
- const QJsonObject object = staticPlugins.at(i).metaData();
- if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
+ QLatin1String iid(d->iid.constData(), d->iid.size());
+ const QList<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
+ for (QStaticPlugin plugin : staticPlugins) {
+ QByteArrayView pluginData(static_cast<const char *>(plugin.rawMetaData), plugin.rawMetaDataSize);
+ QPluginParsedMetaData parsed(pluginData);
+ if (parsed.isError() || parsed.value(QtPluginMetaDataKeys::IID) != iid)
continue;
if (index == 0)
- return staticPlugins.at(i).instance();
+ return plugin.instance();
--index;
}
@@ -392,10 +396,10 @@ QObject *QFactoryLoader::instance(int index) const
QMultiMap<int, QString> QFactoryLoader::keyMap() const
{
QMultiMap<int, QString> result;
- const QList<QJsonObject> metaDataList = metaData();
+ const QList<QPluginParsedMetaData> metaDataList = metaData();
for (int i = 0; i < metaDataList.size(); ++i) {
- const QJsonObject metaData = metaDataList.at(i).value(QLatin1String("MetaData")).toObject();
- const QJsonArray keys = metaData.value(QLatin1String("Keys")).toArray();
+ const QCborMap metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
+ const QCborArray keys = metaData.value(QLatin1String("Keys")).toArray();
const int keyCount = keys.size();
for (int k = 0; k < keyCount; ++k)
result.insert(i, keys.at(k).toString());
@@ -405,10 +409,10 @@ QMultiMap<int, QString> QFactoryLoader::keyMap() const
int QFactoryLoader::indexOf(const QString &needle) const
{
- const QList<QJsonObject> metaDataList = metaData();
+ const QList<QPluginParsedMetaData> metaDataList = metaData();
for (int i = 0; i < metaDataList.size(); ++i) {
- const QJsonObject metaData = metaDataList.at(i).value(QLatin1String("MetaData")).toObject();
- const QJsonArray keys = metaData.value(QLatin1String("Keys")).toArray();
+ const QCborMap metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
+ const QCborArray keys = metaData.value(QLatin1String("Keys")).toArray();
const int keyCount = keys.size();
for (int k = 0; k < keyCount; ++k) {
if (!keys.at(k).toString().compare(needle, Qt::CaseInsensitive))
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index b7536d0349..2cfbcfaa65 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -58,6 +58,7 @@
#include "QtCore/private/qplugin_p.h"
#include "QtCore/qcbormap.h"
#include "QtCore/qcborvalue.h"
+#include "QtCore/qjsonobject.h"
#include "QtCore/qmap.h"
#include "QtCore/qobject.h"
#include "QtCore/qplugin.h"
@@ -65,7 +66,6 @@
QT_BEGIN_NAMESPACE
class QJsonDocument;
-class QJsonObject;
class QLibraryPrivate;
class QPluginParsedMetaData
@@ -87,7 +87,7 @@ public:
bool parse(QPluginMetaData metaData)
{ return parse(QByteArrayView(reinterpret_cast<const char *>(metaData.data), metaData.size)); }
- QJsonObject toJson() const;
+ Q_CORE_EXPORT QJsonObject toJson() const;
// if data is not a map, toMap() returns empty, so shall these functions
QCborMap toCbor() const { return data.toMap(); }
@@ -119,7 +119,25 @@ public:
QMultiMap<int, QString> keyMap() const;
int indexOf(const QString &needle) const;
- QList<QJsonObject> metaData() const;
+ // this is a temporary gimmick to convert other Qt modules
+ struct TemporaryHolder {
+ QList<QPluginParsedMetaData> metaData;
+ TemporaryHolder(QList<QPluginParsedMetaData> &&md) : metaData(std::move(md)) {}
+ operator QList<QPluginParsedMetaData>() const { return std::move(metaData); }
+
+ Q_DECL_DEPRECATED_X("Update caller to use QList<QPluginParsedMetaData>()")
+ operator QList<QJsonObject>() const
+ {
+ QList<QJsonObject> result;
+ result.reserve(metaData.size());
+ for (const QPluginParsedMetaData &pmd : metaData)
+ result.append(pmd.toJson());
+ return result;
+ }
+ };
+ using MetaDataList = TemporaryHolder;
+
+ MetaDataList metaData() const;
QObject *instance(int index) const;
};
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 408e22f37d..5f4ef81bb6 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -150,6 +150,7 @@ public:
private:
qsizetype rawMetaDataSize;
const void *rawMetaData;
+ friend class QFactoryLoader;
};
Q_DECLARE_TYPEINFO(QStaticPlugin, Q_PRIMITIVE_TYPE);
diff --git a/src/gui/image/qimagereaderwriterhelpers.cpp b/src/gui/image/qimagereaderwriterhelpers.cpp
index dd56d887a7..dd4886b412 100644
--- a/src/gui/image/qimagereaderwriterhelpers.cpp
+++ b/src/gui/image/qimagereaderwriterhelpers.cpp
@@ -39,7 +39,7 @@
#include "private/qimagereaderwriterhelpers_p.h"
-#include <qjsonarray.h>
+#include <qcborarray.h>
#include <qmutex.h>
#include <private/qfactoryloader_p.h>
@@ -81,13 +81,12 @@ static void appendImagePluginMimeTypes(QFactoryLoader *loader,
QList<QByteArray> *result,
QList<QByteArray> *resultKeys = nullptr)
{
- QList<QJsonObject> metaDataList = loader->metaData();
-
+ QList<QPluginParsedMetaData> metaDataList = loader->metaData();
const int pluginCount = metaDataList.size();
for (int i = 0; i < pluginCount; ++i) {
- const QJsonObject metaData = metaDataList.at(i).value(QLatin1String("MetaData")).toObject();
- const QJsonArray keys = metaData.value(QLatin1String("Keys")).toArray();
- const QJsonArray mimeTypes = metaData.value(QLatin1String("MimeTypes")).toArray();
+ const QCborMap metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
+ const QCborArray keys = metaData.value(QLatin1String("Keys")).toArray();
+ const QCborArray mimeTypes = metaData.value(QLatin1String("MimeTypes")).toArray();
QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(loader->instance(i));
const int keyCount = keys.size();
for (int k = 0; k < keyCount; ++k) {
diff --git a/src/plugins/platforms/ios/qiosfiledialog.mm b/src/plugins/platforms/ios/qiosfiledialog.mm
index edf04016fd..a56bf25c16 100644
--- a/src/plugins/platforms/ios/qiosfiledialog.mm
+++ b/src/plugins/platforms/ios/qiosfiledialog.mm
@@ -87,7 +87,8 @@ bool QIOSFileDialog::showImagePickerDialog(QWindow *parent)
{
if (!m_viewController) {
QFactoryLoader *plugins = QIOSIntegration::instance()->optionalPlugins();
- for (int i = 0; i < plugins->metaData().size(); ++i) {
+ qsizetype size = QList<QPluginParsedMetaData>(plugins->metaData()).size();
+ for (qsizetype i = 0; i < size; ++i) {
QIosOptionalPluginInterface *plugin = qobject_cast<QIosOptionalPluginInterface *>(plugins->instance(i));
m_viewController = [plugin->createImagePickerController(this) retain];
if (m_viewController)
diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm
index 725c280129..8938f97ae5 100644
--- a/src/plugins/platforms/ios/qiosintegration.mm
+++ b/src/plugins/platforms/ios/qiosintegration.mm
@@ -125,7 +125,8 @@ void QIOSIntegration::initialize()
#endif
QMacInternalPasteboardMime::initializeMimeTypes();
- for (int i = 0; i < m_optionalPlugins->metaData().size(); ++i)
+ qsizetype size = QList<QPluginParsedMetaData>(m_optionalPlugins->metaData()).size();
+ for (qsizetype i = 0; i < size; ++i)
qobject_cast<QIosOptionalPluginInterface *>(m_optionalPlugins->instance(i))->initPlugin();
}