aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlimport.cpp
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@pelagicore.com>2013-06-27 09:42:39 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-05 10:05:29 +0200
commit8c5c5b05f96026c20efa890faf506d29148cb9a4 (patch)
tree3bd483a9a851ffa195f393c3b5efba5de291f987 /src/qml/qml/qqmlimport.cpp
parentbb6916dc5f52020229fd76c851fa5669f9b9ccf9 (diff)
Fix qmlClearEnginePlugins() to clear engine plugins.
Task-number: QTBUG-32078 Change-Id: I2d3aeb6b91ffdb9b8c70ad93d1e43daada84fb7f Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r--src/qml/qml/qqmlimport.cpp54
1 files changed, 38 insertions, 16 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index 2fbb614605..cb0863b680 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -161,13 +161,20 @@ QQmlType *getTypeForUrl(const QString &urlString, const QHashedStringRef& typeNa
}
-typedef QMap<QString, QString> StringStringMap;
-Q_GLOBAL_STATIC(StringStringMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri
+struct RegisteredPlugin {
+ QString uri;
+ QPluginLoader* loader;
+};
+
+typedef QMap<QString, RegisteredPlugin> StringRegisteredPluginMap;
+Q_GLOBAL_STATIC(StringRegisteredPluginMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri and the PluginLoaders
void qmlClearEnginePlugins()
{
- foreach (const QString &s, qmlEnginePluginsWithRegisteredTypes()->values()) {
- QPluginLoader loader(s);
- loader.unload(); // ### Always returns false, worth doing?
+ foreach (RegisteredPlugin plugin, qmlEnginePluginsWithRegisteredTypes()->values()) {
+ QPluginLoader* loader = plugin.loader;
+ if (!loader->unload())
+ qWarning("Unloading %s failed: %s", qPrintable(plugin.uri), qPrintable(loader->errorString()));
+ delete loader;
}
qmlEnginePluginsWithRegisteredTypes()->clear();
}
@@ -1634,7 +1641,7 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur
bool typesRegistered = qmlEnginePluginsWithRegisteredTypes()->contains(absoluteFilePath);
if (typesRegistered) {
- Q_ASSERT_X(qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath) == uri,
+ Q_ASSERT_X(qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).uri == uri,
"QQmlImportDatabase::importPlugin",
"Internal error: Plugin imported previously with different uri");
}
@@ -1648,25 +1655,37 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur
}
return false;
}
- QPluginLoader loader(absoluteFilePath);
- if (!loader.load()) {
- if (errors) {
- QQmlError error;
- error.setDescription(loader.errorString());
- errors->prepend(error);
+ QPluginLoader* loader = 0;
+ if (!typesRegistered) {
+ loader = new QPluginLoader(absoluteFilePath);
+
+ if (!loader->load()) {
+ if (errors) {
+ QQmlError error;
+ error.setDescription(loader->errorString());
+ errors->prepend(error);
+
+ delete loader;
+ }
+ return false;
}
- return false;
+ } else {
+ loader = qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).loader;
}
- QObject *instance = loader.instance();
+ QObject *instance = loader->instance();
if (QQmlTypesExtensionInterface *iface = qobject_cast<QQmlExtensionInterface *>(instance)) {
const QByteArray bytes = uri.toUtf8();
const char *moduleId = bytes.constData();
if (!typesRegistered) {
- qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, uri);
+ RegisteredPlugin plugin;
+ plugin.uri = uri;
+ plugin.loader = loader;
+
+ qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, plugin);
QStringList registrationFailures;
@@ -1734,8 +1753,11 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur
} else {
if (errors) {
QQmlError error;
- error.setDescription(loader.errorString());
+ error.setDescription(loader->errorString());
errors->prepend(error);
+
+ if (!typesRegistered)
+ delete loader;
}
return false;
}