aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlmetatype.cpp
diff options
context:
space:
mode:
authorAlan Alpert <416365416c@gmail.com>2013-05-17 15:32:19 -0700
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-20 01:09:05 +0200
commitfee79b70773ef26c5d45993c4618d302392b0782 (patch)
tree89c5a0c07eb0c8504ecb1e77ef78b7899d10ed7a /src/qml/qml/qqmlmetatype.cpp
parent8850e2eafaba8a6493d3ad5ab584b751eb9a8742 (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.cpp58
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.