aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/extensionsystem/pluginmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/extensionsystem/pluginmanager.cpp')
-rw-r--r--src/libs/extensionsystem/pluginmanager.cpp43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 7477cc3b494..deac311ee3e 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -40,6 +40,7 @@
#include <QDateTime>
#include <QDir>
#include <QFile>
+#include <QLibrary>
#include <QMetaProperty>
#include <QSettings>
#include <QTextStream>
@@ -53,6 +54,8 @@
#include <QTest>
#endif
+Q_LOGGING_CATEGORY(pluginLog, "qtc.extensionsystem")
+
const char C_IGNORED_PLUGINS[] = "Plugins/Ignored";
const char C_FORCEENABLED_PLUGINS[] = "Plugins/ForceEnabled";
const int DELAYED_INITIALIZE_INTERVAL = 20; // ms
@@ -406,25 +409,25 @@ void PluginManager::setPluginPaths(const QStringList &paths)
}
/*!
- The file extension of plugin description files.
- The default is "xml".
+ The IID that valid plugins must have.
- \sa setFileExtension()
+ \sa setPluginIID()
*/
-QString PluginManager::fileExtension()
+QString PluginManager::pluginIID()
{
- return d->extension;
+ return d->pluginIID;
}
/*!
- Sets the file extension of plugin description files.
- The default is "xml".
+ Sets the IID that valid plugins must have. Only plugins with this IID are loaded, others are
+ silently ignored.
+
At the moment this must be called before setPluginPaths() is called.
- // ### TODO let this + setPluginPaths read the plugin specs lazyly whenever loadPlugins() or plugins() is called.
+ // ### TODO let this + setPluginPaths read the plugin meta data lazyly whenever loadPlugins() or plugins() is called.
*/
-void PluginManager::setFileExtension(const QString &extension)
+void PluginManager::setPluginIID(const QString &iid)
{
- d->extension = extension;
+ d->pluginIID = iid;
}
/*!
@@ -892,7 +895,6 @@ void PluginManagerPrivate::nextDelayedInitialize()
\internal
*/
PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager) :
- extension(QLatin1String("xml")),
delayedInitializeTimer(0),
shutdownEventLoop(0),
m_profileElapsedMS(0),
@@ -1216,6 +1218,8 @@ void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destSt
*/
void PluginManagerPrivate::setPluginPaths(const QStringList &paths)
{
+ qCDebug(pluginLog) << "Plugin search paths:" << paths;
+ qCDebug(pluginLog) << "Required IID:" << pluginIID;
pluginPaths = paths;
readSettings();
readPluginPaths();
@@ -1231,14 +1235,16 @@ void PluginManagerPrivate::readPluginPaths()
pluginSpecs.clear();
pluginCategories.clear();
- QStringList specFiles;
+ QStringList pluginFiles;
QStringList searchPaths = pluginPaths;
while (!searchPaths.isEmpty()) {
const QDir dir(searchPaths.takeFirst());
- const QString pattern = QLatin1String("*.") + extension;
- const QFileInfoList files = dir.entryInfoList(QStringList(pattern), QDir::Files);
- foreach (const QFileInfo &file, files)
- specFiles << file.absoluteFilePath();
+ const QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::NoSymLinks);
+ foreach (const QFileInfo &file, files) {
+ const QString filePath = file.absoluteFilePath();
+ if (QLibrary::isLibrary(filePath))
+ pluginFiles.append(filePath);
+ }
const QFileInfoList dirs = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot);
foreach (const QFileInfo &subdir, dirs)
searchPaths << subdir.absoluteFilePath();
@@ -1246,9 +1252,10 @@ void PluginManagerPrivate::readPluginPaths()
defaultCollection = new PluginCollection(QString());
pluginCategories.insert(QString(), defaultCollection);
- foreach (const QString &specFile, specFiles) {
+ foreach (const QString &pluginFile, pluginFiles) {
PluginSpec *spec = new PluginSpec;
- spec->d->read(specFile);
+ if (!spec->d->read(pluginFile)) // not a Qt Creator plugin
+ continue;
PluginCollection *collection = 0;
// find correct plugin collection or create a new one