diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-01-07 15:19:29 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2015-01-08 11:12:56 +0100 |
commit | 5cb8ca29c3815405d41d035f5f4ebb2af326a8ef (patch) | |
tree | a31bab609599cab55437c218775a20dae5677a3d /src/qml | |
parent | bf10bf0331cb3d26e7f5f0bc9333acea1077273e (diff) |
Allow importing protected modules with different major versions
This allows QtQuick.Controls 1.x and 2.x imports to co-exist even
if they are two different plugins with the same module directive.
Change-Id: Idee302439e3c2fd6813ba2f41b69144fbae7902c
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 16 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport_p.h | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype_p.h | 2 |
5 files changed, 15 insertions, 15 deletions
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 8f2c554a7e..f8469cce14 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -1999,7 +1999,7 @@ void QQmlEngine::setPluginPathList(const QStringList &paths) bool QQmlEngine::importPlugin(const QString &filePath, const QString &uri, QList<QQmlError> *errors) { Q_D(QQmlEngine); - return d->importDatabase.importDynamicPlugin(filePath, uri, QString(), errors); + return d->importDatabase.importDynamicPlugin(filePath, uri, QString(), -1, errors); } /*! diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index cb8764e773..20bc28d886 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -926,7 +926,7 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath, QString resolvedFilePath = database->resolvePlugin(typeLoader, qmldirPath, plugin.path, plugin.name); if (!resolvedFilePath.isEmpty()) { dynamicPluginsFound++; - if (!database->importDynamicPlugin(resolvedFilePath, uri, typeNamespace, errors)) { + if (!database->importDynamicPlugin(resolvedFilePath, uri, typeNamespace, vmaj, errors)) { if (errors) { // XXX TODO: should we leave the import plugin error alone? // Here, we pop it off the top and coalesce it into this error's message. @@ -962,7 +962,7 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath, if (versionUri == metaTagUri.toString()) { staticPluginsFound++; QObject *instance = pair.first.instance(); - if (!database->importStaticPlugin(instance, basePath, uri, typeNamespace, errors)) { + if (!database->importStaticPlugin(instance, basePath, uri, typeNamespace, vmaj, errors)) { if (errors) { QQmlError poppedError = errors->takeFirst(); QQmlError error; @@ -1811,7 +1811,7 @@ void QQmlImportDatabase::setImportPathList(const QStringList &paths) \internal */ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &basePath, - const QString &uri, const QString &typeNamespace, QList<QQmlError> *errors) + const QString &uri, const QString &typeNamespace, int vmaj, QList<QQmlError> *errors) { if (qmlImportTrace()) qDebug().nospace() << "QQmlImportDatabase::registerPluginTypes: " << uri << " from " << basePath; @@ -1847,7 +1847,7 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b return false; } - if (QQmlMetaType::namespaceContainsRegistrations(typeNamespace)) { + if (QQmlMetaType::namespaceContainsRegistrations(typeNamespace, vmaj)) { // Other modules have already installed to this namespace if (errors) { QQmlError error; @@ -1894,7 +1894,7 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b \internal */ bool QQmlImportDatabase::importStaticPlugin(QObject *instance, const QString &basePath, - const QString &uri, const QString &typeNamespace, QList<QQmlError> *errors) + const QString &uri, const QString &typeNamespace, int vmaj, QList<QQmlError> *errors) { #ifndef QT_NO_LIBRARY // Dynamic plugins are differentiated by their filepath. For static plugins we @@ -1918,7 +1918,7 @@ bool QQmlImportDatabase::importStaticPlugin(QObject *instance, const QString &ba plugin.loader = 0; plugins->insert(uniquePluginID, plugin); - if (!registerPluginTypes(instance, basePath, uri, typeNamespace, errors)) + if (!registerPluginTypes(instance, basePath, uri, typeNamespace, vmaj, errors)) return false; } @@ -1941,7 +1941,7 @@ bool QQmlImportDatabase::importStaticPlugin(QObject *instance, const QString &ba \internal */ bool QQmlImportDatabase::importDynamicPlugin(const QString &filePath, const QString &uri, - const QString &typeNamespace, QList<QQmlError> *errors) + const QString &typeNamespace, int vmaj, QList<QQmlError> *errors) { #ifndef QT_NO_LIBRARY QFileInfo fileInfo(filePath); @@ -1995,7 +1995,7 @@ bool QQmlImportDatabase::importDynamicPlugin(const QString &filePath, const QStr plugins->insert(absoluteFilePath, plugin); // Continue with shared code path for dynamic and static plugins: - if (!registerPluginTypes(instance, fileInfo.absolutePath(), uri, typeNamespace, errors)) + if (!registerPluginTypes(instance, fileInfo.absolutePath(), uri, typeNamespace, vmaj, errors)) return false; } diff --git a/src/qml/qml/qqmlimport_p.h b/src/qml/qml/qqmlimport_p.h index 26eab669bc..353349182e 100644 --- a/src/qml/qml/qqmlimport_p.h +++ b/src/qml/qml/qqmlimport_p.h @@ -145,7 +145,7 @@ public: QQmlImportDatabase(QQmlEngine *); ~QQmlImportDatabase(); - bool importDynamicPlugin(const QString &filePath, const QString &uri, const QString &importNamespace, QList<QQmlError> *errors); + bool importDynamicPlugin(const QString &filePath, const QString &uri, const QString &importNamespace, int vmaj, QList<QQmlError> *errors); QStringList importPathList(PathType type = LocalOrRemote) const; void setImportPathList(const QStringList &paths); @@ -165,9 +165,9 @@ private: const QString &qmldirPath, const QString &qmldirPluginPath, const QString &baseName); bool importStaticPlugin(QObject *instance, const QString &basePath, const QString &uri, - const QString &typeNamespace, QList<QQmlError> *errors); + const QString &typeNamespace, int vmaj, QList<QQmlError> *errors); bool registerPluginTypes(QObject *instance, const QString &basePath, - const QString &uri, const QString &typeNamespace, QList<QQmlError> *errors); + const QString &uri, const QString &typeNamespace, int vmaj, QList<QQmlError> *errors); void clearDirCache(); struct QmldirCache { diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index d20fe72d09..00fe233124 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -1391,14 +1391,14 @@ bool qmlProtectModule(const char *uri, int majVersion) return false; } -bool QQmlMetaType::namespaceContainsRegistrations(const QString &uri) +bool QQmlMetaType::namespaceContainsRegistrations(const QString &uri, int majorVersion) { QQmlMetaTypeData *data = metaTypeData(); // Has any type previously been installed to this namespace? QHashedString nameSpace(uri); foreach (const QQmlType *type, data->types) - if (type->module() == nameSpace) + if (type->module() == nameSpace && type->majorVersion() == majorVersion) return true; return false; diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h index ac408836fa..2fcd113183 100644 --- a/src/qml/qml/qqmlmetatype_p.h +++ b/src/qml/qml/qqmlmetatype_p.h @@ -114,7 +114,7 @@ public: static const QQmlPrivate::CachedQmlUnit *findCachedCompilationUnit(const QUrl &uri); - static bool namespaceContainsRegistrations(const QString &); + static bool namespaceContainsRegistrations(const QString &, int majorVersion); static void protectNamespace(const QString &); |