Fix static plugin loading.
authorThiago Macieira <thiago.macieira@intel.com>
Mon, 9 Jul 2012 11:46:48 +0000 (13:46 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 12 Jul 2012 01:34:13 +0000 (03:34 +0200)
The QFactoryLoader::indexOf and keyMap functions expect to receive the
metadata that contains a "MetaData" entry, instead of the entry
itself.

Also, QFactoryLoader::metaData() skips static plugins with the wrong
IID, so we need to skip it too in QFactoryLoader::instance().

Change-Id: I8a453087feb88d0e8d1021054353f3600d5100a5
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
src/corelib/plugin/qfactoryloader.cpp

index 0b7b389..98b087e 100644 (file)
@@ -217,8 +217,7 @@ QList<QJsonObject> QFactoryLoader::metaData() const
         if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
             continue;
 
-        QJsonObject meta = object.value(QLatin1String("MetaData")).toObject();
-            metaData.append(meta);
+        metaData.append(object);
     }
     return metaData;
 }
@@ -246,8 +245,16 @@ QObject *QFactoryLoader::instance(int index) const
 
     index -= d->libraryList.size();
     QVector<QStaticPlugin> staticPlugins = QLibraryPrivate::staticPlugins();
-    if (index < staticPlugins.size())
-        return staticPlugins.at(index).instance();
+    for (int i = 0; i < staticPlugins.count(); ++i) {
+        const char *rawMetaData = staticPlugins.at(i).metaData();
+        QJsonObject object = QLibraryPrivate::fromRawMetaData(rawMetaData).object();
+        if (object.value(QLatin1String("IID")) != QLatin1String(d->iid.constData(), d->iid.size()))
+            continue;
+
+        if (index == 0)
+            return staticPlugins.at(i).instance();
+        --index;
+    }
 
     return 0;
 }