aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlimport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r--src/qml/qml/qqmlimport.cpp110
1 files changed, 17 insertions, 93 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index 28f9764a06..6808de2262 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -242,10 +242,6 @@ public:
QQmlTypeLoader *typeLoader;
- static QQmlImports::LocalQmldirResult locateLocalQmldir(
- const QString &uri, QTypeRevision version, QQmlImportDatabase *database,
- QString *outQmldirFilePath, QString *outUrl);
-
static QTypeRevision matchingQmldirVersion(
const QQmlTypeLoaderQmldirContent &qmldir, const QString &uri,
QTypeRevision version, QList<QQmlError> *errors);
@@ -1155,92 +1151,22 @@ QString QQmlImportsPrivate::resolvedUri(const QString &dir_arg, QQmlImportDataba
return stableRelativePath;
}
-/*
-Locates the qmldir file for \a uri version \a vmaj.vmin. Returns true if found,
-and fills in outQmldirFilePath and outQmldirUrl appropriately. Otherwise returns
-false.
-*/
-QQmlImports::LocalQmldirResult QQmlImportsPrivate::locateLocalQmldir(
- const QString &uri, QTypeRevision version, QQmlImportDatabase *database,
- QString *outQmldirFilePath, QString *outQmldirPathUrl)
-{
- // Check cache first
-
- QQmlImportDatabase::QmldirCache *cacheHead = nullptr;
- {
- QQmlImportDatabase::QmldirCache **cachePtr = database->qmldirCache.value(uri);
- if (cachePtr) {
- cacheHead = *cachePtr;
- QQmlImportDatabase::QmldirCache *cache = cacheHead;
- while (cache) {
- if (cache->version == version) {
- *outQmldirFilePath = cache->qmldirFilePath;
- *outQmldirPathUrl = cache->qmldirPathUrl;
- return cache->qmldirFilePath.isEmpty() ? QQmlImports::QmldirNotFound
- : QQmlImports::QmldirFound;
- }
- cache = cache->next;
- }
- }
- }
-
- QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(database->engine);
- QQmlTypeLoader &typeLoader = enginePrivate->typeLoader;
- const bool hasInterceptors = !enginePrivate->urlInterceptors.isEmpty();
-
- // Interceptor might redirect remote files to local ones.
- QStringList localImportPaths = database->importPathList(
- hasInterceptors ? QQmlImportDatabase::LocalOrRemote : QQmlImportDatabase::Local);
-
- // Search local import paths for a matching version
- const QStringList qmlDirPaths = QQmlImports::completeQmldirPaths(
- uri, localImportPaths, version);
- bool pathTurnedRemote = false;
- for (QString qmldirPath : qmlDirPaths) {
- if (hasInterceptors) {
- const QUrl intercepted = database->engine->interceptUrl(
- QQmlImports::urlFromLocalFileOrQrcOrUrl(qmldirPath),
- QQmlAbstractUrlInterceptor::QmldirFile);
- qmldirPath = QQmlFile::urlToLocalFileOrQrc(intercepted);
- if (!pathTurnedRemote && qmldirPath.isEmpty() && !QQmlFile::isLocalFile(intercepted))
- pathTurnedRemote = true;
- }
-
- QString absoluteFilePath = typeLoader.absoluteFilePath(qmldirPath);
- if (!absoluteFilePath.isEmpty()) {
- QString url;
- const QStringView absolutePath = QStringView{absoluteFilePath}.left(absoluteFilePath.lastIndexOf(Slash) + 1);
- if (absolutePath.at(0) == Colon) {
- url = QLatin1String("qrc") + absolutePath;
- } else {
- url = QUrl::fromLocalFile(absolutePath.toString()).toString();
- // This handles the UNC path case as when the path is retrieved from the QUrl it
- // will convert the host name from upper case to lower case. So the absoluteFilePath
- // is changed at this point to make sure it will match later on in that case.
- if (absoluteFilePath.startsWith(QLatin1String("//")))
- absoluteFilePath = QUrl::fromLocalFile(absoluteFilePath).toString(QUrl::RemoveScheme);
- }
- QQmlImportDatabase::QmldirCache *cache = new QQmlImportDatabase::QmldirCache;
- cache->version = version;
- cache->qmldirFilePath = absoluteFilePath;
- cache->qmldirPathUrl = url;
- cache->next = cacheHead;
- database->qmldirCache.insert(uri, cache);
+/*!
+ \internal
- *outQmldirFilePath = absoluteFilePath;
- *outQmldirPathUrl = url;
+ \fn template<typename Callback>
+ QQmlImportDatabase::LocalQmldirResult QQmlImportDatabase::locateLocalQmldir(
+ const QString &uri, QTypeRevision version, const Callback &callback)
- return QQmlImports::QmldirFound;
- }
- }
+ Locates the qmldir files for \a uri version \a version. For each one, calls
+ the \a callback. If the \a callback returns \c true, returns QmldirFound.
- QQmlImportDatabase::QmldirCache *cache = new QQmlImportDatabase::QmldirCache;
- cache->version = version;
- cache->next = cacheHead;
- database->qmldirCache.insert(uri, cache);
+ If at least one callback invocation returned \c false and there are no qmldir
+ files left to check, returns QmldirRejected.
- return pathTurnedRemote ? QQmlImports::QmldirInterceptedToRemote : QQmlImports::QmldirNotFound;
-}
+ Otherwise, if interception redirects a previously local qmldir URL to a remote
+ one, returns QmldirInterceptedToRemote. Otherwise, returns QmldirNotFound.
+*/
QTypeRevision QQmlImportsPrivate::matchingQmldirVersion(
const QQmlTypeLoaderQmldirContent &qmldir, const QString &uri, QTypeRevision version,
@@ -1686,13 +1612,6 @@ QTypeRevision QQmlImports::updateQmldirContent(
return d->updateQmldirContent(uri, prefix, qmldirIdentifier, qmldirUrl, importDb, errors);
}
-QQmlImports::LocalQmldirResult QQmlImports::locateLocalQmldir(
- QQmlImportDatabase *importDb, const QString &uri, QTypeRevision version,
- QString *qmldirFilePath, QString *url)
-{
- return d->locateLocalQmldir(uri, version, importDb, qmldirFilePath, url);
-}
-
bool QQmlImports::isLocal(const QString &url)
{
return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
@@ -1821,6 +1740,11 @@ void QQmlImportDatabase::addPluginPath(const QString& path)
}
}
+QString QQmlImportDatabase::absoluteFilePath(const QString &path) const
+{
+ return QQmlEnginePrivate::get(engine)->typeLoader.absoluteFilePath(path);
+}
+
/*!
\internal
*/