diff options
author | Thiago Macieira <[email protected]> | 2021-09-11 20:00:08 -0500 |
---|---|---|
committer | Thiago Macieira <[email protected]> | 2021-10-20 22:04:03 -0700 |
commit | a0d66b60b75cfe3d7580c7016959890693b2a132 (patch) | |
tree | 63734889c4f98bb767162051018cb304a7b208f2 | |
parent | 2bea9b74ba4894c372b0587c0c5433b713b53e3a (diff) |
QFactoryLoader: continue the port from JSON to CBOR
This continues the effort from the previous commit, by not passing
through the JSON conversion at all, and simply using CBOR directly.
The port in qtbase is complete, but in order to support the conversion
in other modules without introducing breakages, there's a temporary
class used for converting to QPluginParsedMetaData from
QJsonObject. It'll be removed once all other modules have finished
converting.
Change-Id: I2de1b4dfacd443148279fffd16a3ed4ddaf34afc
Reviewed-by: Lars Knoll <[email protected]>
-rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 38 | ||||
-rw-r--r-- | src/corelib/plugin/qfactoryloader_p.h | 24 | ||||
-rw-r--r-- | src/corelib/plugin/qplugin.h | 1 | ||||
-rw-r--r-- | src/gui/image/qimagereaderwriterhelpers.cpp | 11 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosfiledialog.mm | 3 | ||||
-rw-r--r-- | src/plugins/platforms/ios/qiosintegration.mm | 3 |
6 files changed, 52 insertions, 28 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index 824bf60f7d4..a315daa199d 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 b7536d03497..2cfbcfaa659 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 408e22f37df..5f4ef81bb65 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 dd56d887a71..dd4886b412f 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 edf04016fdb..a56bf25c16e 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 725c2801299..8938f97ae56 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(); } |