summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authormae <qt-info@nokia.com>2010-04-08 12:54:42 (GMT)
committermae <qt-info@nokia.com>2010-04-08 13:00:35 (GMT)
commitc3a54c47048b7123f51f2a1078e156d259445221 (patch)
tree299c0dfd3c039ec5fbf36f5a64bca13c1b8b4fd7 /src/declarative/qml
parentdc2429a34e8d0168ef33f48ec0da35631be49243 (diff)
downloadQt-c3a54c47048b7123f51f2a1078e156d259445221.zip
Qt-c3a54c47048b7123f51f2a1078e156d259445221.tar.gz
Qt-c3a54c47048b7123f51f2a1078e156d259445221.tar.bz2
Tune plugin import mechanism
In shadow build environments, we cannot enforce that shared library objects for plugins are located in the same directory as the qmldir file. This makes it hard for Creator to support mixed projects (qml/c++). In order to gain more flexibility, the patch introduces a pluginPathList to QDeclarativeEngine, which completes the existing importsPathList. The pluginPathList defaults to ["."], which indicates the directory where the qmldir file is located in. The qml viewer tool gains a command line option -P to add to the pluginPathList. For consistency, the -L option ("Library") has been renamed to -I ("Import"). QDeclarativeEngine::importExtension() has been renamed to QDeclarativeEngine::importPlugin(). The documentation has been adjusted accordingly. Done with erikv. Reviewed-by: erikv
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,