summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp144
-rw-r--r--src/declarative/qml/qdeclarativeengine.h6
-rw-r--r--src/declarative/qml/qdeclarativeengine_p.h5
3 files changed, 120 insertions, 35 deletions
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index 1bcadf2..68ce953 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -188,6 +188,8 @@ QDeclarativeEnginePrivate::QDeclarativeEnginePrivate(QDeclarativeEngine *e)
fileImportPath += builtinPath;
#endif
+ filePluginPath += QLatin1String(".");
+
}
QUrl QDeclarativeScriptEngine::resolvedUrl(QScriptContext *context, const QUrl& url)
@@ -1497,19 +1499,13 @@ public:
foreach (const QDeclarativeDirParser::Plugin &plugin, qmldirParser.plugins()) {
- QDir pluginDir = dir.absoluteFilePath(plugin.path);
-
- // hack for resources, should probably go away
- if (absoluteFilePath.startsWith(QLatin1Char(':')))
- pluginDir = QDir(QCoreApplication::applicationDirPath());
-
QString resolvedFilePath =
QDeclarativeEnginePrivate::get(engine)
- ->resolvePlugin(pluginDir,
+ ->resolvePlugin(dir, plugin.path,
plugin.name);
if (!resolvedFilePath.isEmpty()) {
- engine->importExtension(resolvedFilePath, uri);
+ engine->importPlugin(resolvedFilePath, uri);
}
}
}
@@ -1804,8 +1800,8 @@ QUrl QDeclarativeEnginePrivate::Imports::baseUrl() const
}
/*!
- Adds \a path as a directory where installed QML components are
- defined in a URL-based directory structure.
+ Adds \a path as a directory where the engine searches for
+ installed modules in a URL-based directory structure.
The newly added \a path will be first in the importPathList().
@@ -1828,7 +1824,7 @@ void QDeclarativeEngine::addImportPath(const QString& path)
/*!
Returns the list of directories where the engine searches for
- installed modules.
+ installed modules in a URL-based directory structure.
For example, if \c /opt/MyApp/lib/imports is in the path, then QML that
imports \c com.mycompany.Feature will cause the QDeclarativeEngine to look
@@ -1849,7 +1845,7 @@ QStringList QDeclarativeEngine::importPathList() const
/*!
Sets the list of directories where the engine searches for
- installed modules.
+ installed modules in a URL-based directory structure.
By default, the list contains the paths specified in the \c QML_IMPORT_PATH environment
variable, then the builtin \c ImportsPath from QLibraryInfo.
@@ -1862,15 +1858,73 @@ void QDeclarativeEngine::setImportPathList(const QStringList &paths)
d->fileImportPath = paths;
}
+
+/*!
+ Adds \a path as a directory where the engine searches for
+ native plugins for imported modules (referenced in the \c qmldir file).
+
+ By default, the list contains only \c ., i.e. the engine searches
+ in the directory of the \c qmldir file itself.
+
+ The newly added \a path will be first in the pluginPathList().
+
+ \sa setPluginPathList()
+*/
+void QDeclarativeEngine::addPluginPath(const QString& path)
+{
+ if (qmlImportTrace())
+ qDebug() << "QDeclarativeEngine::addPluginPath" << path;
+ Q_D(QDeclarativeEngine);
+ QUrl url = QUrl(path);
+ if (url.isRelative() || url.scheme() == QString::fromLocal8Bit("file")) {
+ QDir dir = QDir(path);
+ d->filePluginPath.prepend(dir.canonicalPath());
+ } else {
+ d->filePluginPath.prepend(path);
+ }
+}
+
+
+/*!
+ Returns the list of directories where the engine searches for
+ native plugins for imported modules (referenced in the \c qmldir file).
+
+ By default, the list contains only \c ., i.e. the engine searches
+ in the directory of the \c qmldir file itself.
+
+ \sa addPluginPath() setPluginPathList()
+*/
+QStringList QDeclarativeEngine::pluginPathList() const
+{
+ Q_D(const QDeclarativeEngine);
+ return d->filePluginPath;
+}
+
+/*!
+ Sets the list of directories where the engine searches for
+ native plugins for imported modules (referenced in the \c qmldir file).
+
+ By default, the list contains only \c ., i.e. the engine searches
+ in the directory of the \c qmldir file itself.
+
+ \sa pluginPathList() addPluginPath()
+ */
+void QDeclarativeEngine::setPluginPathList(const QStringList &paths)
+{
+ Q_D(QDeclarativeEngine);
+ d->filePluginPath = paths;
+}
+
+
/*!
- Imports the extension named \a fileName from the \a uri provided.
- Returns true if the extension was successfully imported.
+ Imports the plugin named \a filePath with the \a uri provided.
+ Returns true if the plugin was successfully imported; otherwise returns false.
*/
-bool QDeclarativeEngine::importExtension(const QString &fileName, const QString &uri)
+bool QDeclarativeEngine::importPlugin(const QString &filePath, const QString &uri)
{
if (qmlImportTrace())
- qDebug() << "QDeclarativeEngine::importExtension" << uri << "from" << fileName;
- QFileInfo fileInfo(fileName);
+ qDebug() << "QDeclarativeEngine::importPlugin" << uri << "from" << filePath;
+ QFileInfo fileInfo(filePath);
const QString absoluteFilePath = fileInfo.absoluteFilePath();
QDeclarativeEnginePrivate *d = QDeclarativeEnginePrivate::get(this);
@@ -1943,27 +1997,53 @@ QString QDeclarativeEngine::offlineStoragePath() const
/*!
\internal
- Returns the result of the merge of \a baseName with \a dir, \a suffixes, and \a prefix.
+ Returns the result of the merge of \a baseName with \a path, \a suffixes, and \a prefix.
The \a prefix must contain the dot.
+
+ \a qmldirPath is the location of the qmldir file.
*/
-QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &dir, const QString &baseName,
+QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &qmldirPath, const QString &qmldirPluginPath, const QString &baseName,
const QStringList &suffixes,
const QString &prefix)
{
- foreach (const QString &suffix, suffixes) {
- QString pluginFileName = prefix;
+ QStringList searchPaths = filePluginPath;
+ bool qmldirPluginPathIsRelative = QDir::isRelativePath(qmldirPluginPath);
+ if (!qmldirPluginPathIsRelative)
+ searchPaths.prepend(qmldirPluginPath);
+
+ foreach (const QString &pluginPath, searchPaths) {
+
+ QString resolvedPath;
- pluginFileName += baseName;
- pluginFileName += suffix;
+ if (pluginPath == QLatin1String(".")) {
+ if (qmldirPluginPathIsRelative)
+ resolvedPath = qmldirPath.absoluteFilePath(qmldirPluginPath);
+ else
+ resolvedPath = qmldirPath.absolutePath();
+ } else {
+ resolvedPath = pluginPath;
+ }
+
+ // hack for resources, should probably go away
+ if (resolvedPath.startsWith(QLatin1Char(':')))
+ resolvedPath = QCoreApplication::applicationDirPath();
- QFileInfo fileInfo(dir, pluginFileName);
+ QDir dir(resolvedPath);
+ foreach (const QString &suffix, suffixes) {
+ QString pluginFileName = prefix;
- if (fileInfo.exists())
- return fileInfo.absoluteFilePath();
+ pluginFileName += baseName;
+ pluginFileName += suffix;
+
+ QFileInfo fileInfo(dir, pluginFileName);
+
+ if (fileInfo.exists())
+ return fileInfo.absoluteFilePath();
+ }
}
if (qmlImportTrace())
- qDebug() << "QDeclarativeEngine::resolvePlugin: Could not resolve plugin" << baseName << "in" << dir.absolutePath();
+ qDebug() << "QDeclarativeEngine::resolvePlugin: Could not resolve plugin" << baseName << "in" << qmldirPath.absolutePath();
return QString();
}
@@ -1984,17 +2064,17 @@ QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &dir, const QString
Version number on unix are ignored.
*/
-QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &dir, const QString &baseName)
+QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &qmldirPath, const QString &qmldirPluginPath, const QString &baseName)
{
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE)
- return resolvePlugin(dir, baseName,
+ return resolvePlugin(qmldirPath, qmldirPluginPath, baseName,
QStringList()
# ifdef QT_DEBUG
<< QLatin1String("d.dll") // try a qmake-style debug build first
# endif
<< QLatin1String(".dll"));
#elif defined(Q_OS_SYMBIAN)
- return resolvePlugin(dir, baseName,
+ return resolvePlugin(qmldirPath, qmldirPluginPath, baseName,
QStringList()
<< QLatin1String(".dll")
<< QLatin1String(".qtplugin"));
@@ -2002,7 +2082,7 @@ QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &dir, const QString
# if defined(Q_OS_DARWIN)
- return resolvePlugin(dir, baseName,
+ return resolvePlugin(qmldirPath, qmldirPluginPath, baseName,
QStringList()
# ifdef QT_DEBUG
<< QLatin1String("_debug.dylib") // try a qmake-style debug build first
@@ -2036,7 +2116,7 @@ QString QDeclarativeEnginePrivate::resolvePlugin(const QDir &dir, const QString
// Examples of valid library names:
// libfoo.so
- return resolvePlugin(dir, baseName, validSuffixList, QLatin1String("lib"));
+ return resolvePlugin(qmldirPath, qmldirPluginPath, baseName, validSuffixList, QLatin1String("lib"));
# endif
#endif
diff --git a/src/declarative/qml/qdeclarativeengine.h b/src/declarative/qml/qdeclarativeengine.h
index b861c1b..fcaddcf 100644
--- a/src/declarative/qml/qdeclarativeengine.h
+++ b/src/declarative/qml/qdeclarativeengine.h
@@ -81,7 +81,11 @@ public:
void setImportPathList(const QStringList &paths);
void addImportPath(const QString& dir);
- bool importExtension(const QString &fileName, const QString &uri);
+ QStringList pluginPathList() const;
+ void setPluginPathList(const QStringList &paths);
+ void addPluginPath(const QString& dir);
+
+ bool importPlugin(const QString &filePath, const QString &uri);
void setNetworkAccessManagerFactory(QDeclarativeNetworkAccessManagerFactory *);
QDeclarativeNetworkAccessManagerFactory *networkAccessManagerFactory() const;
diff --git a/src/declarative/qml/qdeclarativeengine_p.h b/src/declarative/qml/qdeclarativeengine_p.h
index 3f22d61..6bcd0d1 100644
--- a/src/declarative/qml/qdeclarativeengine_p.h
+++ b/src/declarative/qml/qdeclarativeengine_p.h
@@ -231,6 +231,7 @@ public:
QDeclarativeCompositeTypeManager typeManager;
QStringList fileImportPath;
+ QStringList filePluginPath;
QString offlineStoragePath;
mutable quint32 uniqueId;
@@ -274,10 +275,10 @@ public:
QSet<QString> initializedPlugins;
- QString resolvePlugin(const QDir &dir, const QString &baseName,
+ QString resolvePlugin(const QDir &qmldirPath, const QString &qmldirPluginPath, const QString &baseName,
const QStringList &suffixes,
const QString &prefix = QString());
- QString resolvePlugin(const QDir &dir, const QString &baseName);
+ QString resolvePlugin(const QDir &qmldirPath, const QString &qmldirPluginPath, const QString &baseName);
bool addToImport(Imports*, const QDeclarativeDirComponents &qmldircomponentsnetwork,