diff options
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r-- | src/corelib/plugin/plugin.pri | 1 | ||||
-rw-r--r-- | src/corelib/plugin/qfactoryinterface.cpp | 43 | ||||
-rw-r--r-- | src/corelib/plugin/qfactoryinterface.h | 2 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.h | 8 | ||||
-rw-r--r-- | src/corelib/plugin/qpluginloader.cpp | 30 | ||||
-rw-r--r-- | src/corelib/plugin/qpluginloader.h | 4 |
6 files changed, 71 insertions, 17 deletions
diff --git a/src/corelib/plugin/plugin.pri b/src/corelib/plugin/plugin.pri index 338b3d0972..8b64f93467 100644 --- a/src/corelib/plugin/plugin.pri +++ b/src/corelib/plugin/plugin.pri @@ -13,6 +13,7 @@ HEADERS += \ plugin/qmachparser_p.h SOURCES += \ + plugin/qfactoryinterface.cpp \ plugin/qpluginloader.cpp \ plugin/qfactoryloader.cpp \ plugin/quuid.cpp \ diff --git a/src/corelib/plugin/qfactoryinterface.cpp b/src/corelib/plugin/qfactoryinterface.cpp new file mode 100644 index 0000000000..0307d58315 --- /dev/null +++ b/src/corelib/plugin/qfactoryinterface.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qfactoryinterface.h" + +QT_BEGIN_NAMESPACE + +QFactoryInterface::~QFactoryInterface() +{ + // must be empty until ### Qt 6 +} + +QT_END_NAMESPACE diff --git a/src/corelib/plugin/qfactoryinterface.h b/src/corelib/plugin/qfactoryinterface.h index e20864cd31..86a46fabfa 100644 --- a/src/corelib/plugin/qfactoryinterface.h +++ b/src/corelib/plugin/qfactoryinterface.h @@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE struct Q_CORE_EXPORT QFactoryInterface { - virtual ~QFactoryInterface() {} + virtual ~QFactoryInterface(); virtual QStringList keys() const = 0; }; diff --git a/src/corelib/plugin/qlibrary.h b/src/corelib/plugin/qlibrary.h index 16bdf79206..77ad107c6f 100644 --- a/src/corelib/plugin/qlibrary.h +++ b/src/corelib/plugin/qlibrary.h @@ -59,10 +59,10 @@ public: Q_FLAG(LoadHint) Q_FLAG(LoadHints) - explicit QLibrary(QObject *parent = 0); - explicit QLibrary(const QString& fileName, QObject *parent = 0); - explicit QLibrary(const QString& fileName, int verNum, QObject *parent = 0); - explicit QLibrary(const QString& fileName, const QString &version, QObject *parent = 0); + explicit QLibrary(QObject *parent = Q_NULLPTR); + explicit QLibrary(const QString& fileName, QObject *parent = Q_NULLPTR); + explicit QLibrary(const QString& fileName, int verNum, QObject *parent = Q_NULLPTR); + explicit QLibrary(const QString& fileName, const QString &version, QObject *parent = Q_NULLPTR); ~QLibrary(); QFunctionPointer resolve(const char *symbol); diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index 988dad1d94..292ad30525 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -273,6 +273,13 @@ bool QPluginLoader::isLoaded() const #if defined(QT_SHARED) static QString locatePlugin(const QString& fileName) { + const bool isAbsolute = QDir::isAbsolutePath(fileName); + if (isAbsolute) { + QFileInfo fi(fileName); + if (fi.isFile()) { + return fi.canonicalFilePath(); + } + } QStringList prefixes = QLibraryPrivate::prefixes_sys(); prefixes.prepend(QString()); QStringList suffixes = QLibraryPrivate::suffixes_sys(QString()); @@ -281,12 +288,18 @@ static QString locatePlugin(const QString& fileName) // Split up "subdir/filename" const int slash = fileName.lastIndexOf('/'); const QString baseName = fileName.mid(slash + 1); - const QString basePath = fileName.left(slash + 1); // keep the '/' + const QString basePath = isAbsolute ? QString() : fileName.left(slash + 1); // keep the '/' const bool debug = qt_debug_component(); - QStringList paths = QCoreApplication::libraryPaths(); - paths.prepend(QStringLiteral("./")); // search in current dir first + QStringList paths; + if (isAbsolute) { + paths.append(fileName.left(slash)); // don't include the '/' + } else { + paths = QCoreApplication::libraryPaths(); + paths.prepend(QStringLiteral(".")); // search in current dir first + } + foreach (const QString &path, paths) { foreach (const QString &prefix, prefixes) { foreach (const QString &suffix, suffixes) { @@ -337,12 +350,7 @@ void QPluginLoader::setFileName(const QString &fileName) did_load = false; } - QFileInfo fi(fileName); - QString fn; - if (fi.isAbsolute()) - fn = fi.canonicalFilePath(); - else - fn = locatePlugin(fileName); + const QString fn = locatePlugin(fileName); d = QLibraryPrivate::findOrCreate(fn, QString(), lh); if (!fn.isEmpty()) @@ -427,7 +435,9 @@ QObjectList QPluginLoader::staticInstances() QObjectList instances; const StaticPluginList *plugins = staticPluginList(); if (plugins) { - for (int i = 0; i < plugins->size(); ++i) + const int numPlugins = plugins->size(); + instances.reserve(numPlugins); + for (int i = 0; i < numPlugins; ++i) instances += plugins->at(i).instance(); } return instances; diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h index b947e6ed9e..0ab25bbb07 100644 --- a/src/corelib/plugin/qpluginloader.h +++ b/src/corelib/plugin/qpluginloader.h @@ -50,8 +50,8 @@ class Q_CORE_EXPORT QPluginLoader : public QObject Q_PROPERTY(QString fileName READ fileName WRITE setFileName) Q_PROPERTY(QLibrary::LoadHints loadHints READ loadHints WRITE setLoadHints) public: - explicit QPluginLoader(QObject *parent = 0); - explicit QPluginLoader(const QString &fileName, QObject *parent = 0); + explicit QPluginLoader(QObject *parent = Q_NULLPTR); + explicit QPluginLoader(const QString &fileName, QObject *parent = Q_NULLPTR); ~QPluginLoader(); QObject *instance(); |