diff options
author | Alan Alpert <416365416c@gmail.com> | 2013-05-17 15:32:19 -0700 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-20 01:09:05 +0200 |
commit | fee79b70773ef26c5d45993c4618d302392b0782 (patch) | |
tree | 89c5a0c07eb0c8504ecb1e77ef78b7899d10ed7a /src/qml/qml/qqmlmetatype.cpp | |
parent | 8850e2eafaba8a6493d3ad5ab584b751eb9a8742 (diff) |
Add qmlProtectModule
A C++ analog to the protected qmldir syntax, this is also a potential
performance improvement because we can avoid some file system accesses.
Change-Id: I41781a6cc72aa65bd2d397800345ea16ef442e90
Reviewed-by: Antti Piira <apiira@blackberry.com>
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index f3b4d6b1e5..f9583e7a59 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -112,12 +112,15 @@ class QQmlTypeModulePrivate { public: QQmlTypeModulePrivate() - : minMinorVersion(INT_MAX), maxMinorVersion(0) {} + : minMinorVersion(INT_MAX), maxMinorVersion(0), locked(false) {} + + static QQmlTypeModulePrivate* get(QQmlTypeModule* q) { return q->d; } QQmlMetaTypeData::VersionedUri uri; int minMinorVersion; int maxMinorVersion; + bool locked; void add(QQmlType *); @@ -1126,7 +1129,7 @@ QString registrationTypeString(QQmlType::RegistrationType typeType) } // NOTE: caller must hold a QWriteLocker on "data" -bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *data, const char *uri, const QString &typeName) +bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *data, const char *uri, const QString &typeName, int majorVersion = -1) { if (!typeName.isEmpty()) { int typeNameLen = typeName.length(); @@ -1158,6 +1161,18 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace)); return false; } + } else if (majorVersion >= 0) { + QQmlMetaTypeData::VersionedUri versionedUri; + versionedUri.uri = nameSpace; + versionedUri.majorVersion = majorVersion; + if (QQmlTypeModule* qqtm = data->uriToModule.value(versionedUri, 0)){ + if (QQmlTypeModulePrivate::get(qqtm)->locked){ + QString failure(QCoreApplication::translate("qmlRegisterType", + "Cannot install %1 '%2' into protected module '%3' version '%4'")); + data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace).arg(majorVersion)); + return false; + } + } } } @@ -1206,7 +1221,7 @@ int registerType(const QQmlPrivate::RegisterType &type) QWriteLocker lock(metaTypeDataLock()); QQmlMetaTypeData *data = metaTypeData(); QString elementName = QString::fromUtf8(type.elementName); - if (!checkRegistration(QQmlType::CppType, data, type.uri, elementName)) + if (!checkRegistration(QQmlType::CppType, data, type.uri, elementName, type.versionMajor)) return -1; int index = data->types.count(); @@ -1226,7 +1241,7 @@ int registerSingletonType(const QQmlPrivate::RegisterSingletonType &type) QWriteLocker lock(metaTypeDataLock()); QQmlMetaTypeData *data = metaTypeData(); QString typeName = QString::fromUtf8(type.typeName); - if (!checkRegistration(QQmlType::SingletonType, data, type.uri, typeName)) + if (!checkRegistration(QQmlType::SingletonType, data, type.uri, typeName, type.versionMajor)) return -1; int index = data->types.count(); @@ -1248,7 +1263,7 @@ int registerCompositeType(const QQmlPrivate::RegisterCompositeType &type) bool fileImport = false; if (*(type.uri) == '\0') fileImport = true; - if (!checkRegistration(QQmlType::CompositeType, data, fileImport?0:type.uri, typeName)) + if (!checkRegistration(QQmlType::CompositeType, data, fileImport?0:type.uri, typeName, type.versionMajor)) return -1; int index = data->types.count(); @@ -1284,6 +1299,23 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) return -1; } +//From qqml.h +bool qmlProtectModule(const char *uri, int majVersion) +{ + QWriteLocker lock(metaTypeDataLock()); + QQmlMetaTypeData *data = metaTypeData(); + + QQmlMetaTypeData::VersionedUri versionedUri; + versionedUri.uri = QString::fromUtf8(uri); + versionedUri.majorVersion = majVersion; + + if (QQmlTypeModule* qqtm = data->uriToModule.value(versionedUri, 0)) { + QQmlTypeModulePrivate::get(qqtm)->locked = true; + return true; + } + return false; +} + bool QQmlMetaType::namespaceContainsRegistrations(const QString &uri) { QQmlMetaTypeData *data = metaTypeData(); @@ -1342,6 +1374,22 @@ bool QQmlMetaType::isAnyModule(const QString &uri) } /* + Returns true if a module \a uri of this version is installed and locked; +*/ +bool QQmlMetaType::isLockedModule(const QString &uri, int majVersion) +{ + QReadLocker lock(metaTypeDataLock()); + QQmlMetaTypeData *data = metaTypeData(); + + QQmlMetaTypeData::VersionedUri versionedUri; + versionedUri.uri = uri; + versionedUri.majorVersion = majVersion; + if (QQmlTypeModule* qqtm = data->uriToModule.value(versionedUri, 0)) + return QQmlTypeModulePrivate::get(qqtm)->locked; + return false; +} + +/* Returns true if any type or API has been registered for the given \a module with at least versionMajor.versionMinor, or if types have been registered for \a module with at most versionMajor.versionMinor. |