qpluginloader.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/plugin/qpluginloader.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4QPluginLoader::QPluginLoader(QObject *parent)-
5 : QObject(parent), d(0), did_load(false)-
6{-
7}-
8QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)-
9 : QObject(parent), d(0), did_load(false)-
10{-
11 setFileName(fileName);-
12 setLoadHints(QLibrary::PreventUnloadHint);-
13}-
14QPluginLoader::~QPluginLoader()-
15{-
16 if (d)-
17 d->release();-
18}-
19QObject *QPluginLoader::instance()-
20{-
21 if (!isLoaded() && !load())-
22 return 0;-
23 if (!d->inst && d->instance)-
24 d->inst = d->instance();-
25 return d->inst.data();-
26}-
27QJsonObject QPluginLoader::metaData() const-
28{-
29 if (!d)-
30 return QJsonObject();-
31 return d->metaData;-
32}-
33bool QPluginLoader::load()-
34{-
35 if (!d || d->fileName.isEmpty())-
36 return false;-
37 if (did_load)-
38 return d->pHnd && d->instance;-
39 if (!d->isPlugin())-
40 return false;-
41 did_load = true;-
42 return d->loadPlugin();-
43}-
44bool QPluginLoader::unload()-
45{-
46 if (did_load) {-
47 did_load = false;-
48 return d->unload();-
49 }-
50 if (d)-
51 d->errorString = tr("The plugin was not loaded.");-
52 return false;-
53}-
54-
55-
56-
57-
58-
59-
60bool QPluginLoader::isLoaded() const-
61{-
62 return d && d->pHnd && d->instance;-
63}-
64-
65-
66static QString locatePlugin(const QString& fileName)-
67{-
68 const bool isAbsolute = QDir::isAbsolutePath(fileName);-
69 if (isAbsolute
isAbsoluteDescription
TRUEevaluated 24 times by 2 tests
Evaluated by:
  • tst_QPlugin
  • tst_QPluginLoader
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tst_QPluginLoader
) {
3-24
70 QFileInfo fi(fileName);-
71 if (fi.isFile()
fi.isFile()Description
TRUEevaluated 23 times by 2 tests
Evaluated by:
  • tst_QPlugin
  • tst_QPluginLoader
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tst_QPluginLoader
) {
1-23
72 return
executed 23 times by 2 tests: return fi.canonicalFilePath();
Executed by:
  • tst_QPlugin
  • tst_QPluginLoader
fi.canonicalFilePath();
executed 23 times by 2 tests: return fi.canonicalFilePath();
Executed by:
  • tst_QPlugin
  • tst_QPluginLoader
23
73 }-
74 }
executed 1 time by 1 test: end of block
Executed by:
  • tst_QPluginLoader
1
75 QStringList prefixes = QLibraryPrivate::prefixes_sys();-
76 prefixes.prepend(QString());-
77 QStringList suffixes = QLibraryPrivate::suffixes_sys(QString());-
78 suffixes.prepend(QString());-
79-
80-
81 const int slash = fileName.lastIndexOf(QLatin1Char('/'));-
82 const QStringRef baseName = fileName.midRef(slash + 1);-
83 const QStringRef basePath = isAbsolute
isAbsoluteDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • tst_QPluginLoader
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tst_QPluginLoader
? QStringRef() : fileName.leftRef(slash + 1);
1-3
84-
85 const bool debug = qt_debug_component();-
86-
87 QStringList paths;-
88 if (isAbsolute
isAbsoluteDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • tst_QPluginLoader
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tst_QPluginLoader
) {
1-3
89 paths.append(fileName.left(slash));-
90 }
executed 1 time by 1 test: end of block
Executed by:
  • tst_QPluginLoader
else {
1
91 paths = QCoreApplication::libraryPaths();-
92 paths.prepend(([]() -> QString { enum { Size = sizeof(u"" ".")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "." }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }()));-
93 }
executed 3 times by 1 test: end of block
Executed by:
  • tst_QPluginLoader
3
94-
95 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(paths)>::type> _container_((paths)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)for (const QString &path = *_container_.i; _container_.control; _container_.control = 0) {-
for (QForeachContainer<typename QtPrivate::remove_reference<decltype: qAsConst(prefixes)>::type> _container_((prefixes)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)paths)) {
96 for (const QString &prefix = *_container_.i; _container_.control; _container_.control = 0) {-
for (QForeachContainer<typename QtPrivate::remove_reference<decltype: qAsConst(suffixes)>::type> _container_((suffixes)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)prefixes)) {
97 for (const QString &suffix = *_container_.i; _container_.control; _container_.control = 0): qAsConst(suffixes)) {-
98 const QString fn = path + QLatin1Char('/') + basePath + prefix + baseName + suffix;-
99 if (debug
debugDescription
TRUEnever evaluated
FALSEevaluated 36 times by 1 test
Evaluated by:
  • tst_QPluginLoader
)
0-36
100 QMessageLogger(__FILE__, 309315, __PRETTY_FUNCTION__).debug() << "Trying..." << fn;
never executed: QMessageLogger(__FILE__, 315, __PRETTY_FUNCTION__).debug() << "Trying..." << fn;
0
101 if (QFileInfo(fn).isFile()
QFileInfo(fn).isFile()Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QPluginLoader
FALSEevaluated 34 times by 1 test
Evaluated by:
  • tst_QPluginLoader
)
2-34
102 return
executed 2 times by 1 test: return fn;
Executed by:
  • tst_QPluginLoader
fn;
executed 2 times by 1 test: return fn;
Executed by:
  • tst_QPluginLoader
2
103 }
executed 34 times by 1 test: end of block
Executed by:
  • tst_QPluginLoader
34
104 }
executed 16 times by 1 test: end of block
Executed by:
  • tst_QPluginLoader
16
105 }
executed 7 times by 1 test: end of block
Executed by:
  • tst_QPluginLoader
7
106 if (debug
debugDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tst_QPluginLoader
)
0-2
107 QMessageLogger(__FILE__, 316322, __PRETTY_FUNCTION__).debug() << fileName << "not found";
never executed: QMessageLogger(__FILE__, 322, __PRETTY_FUNCTION__).debug() << fileName << "not found";
0
108 return
executed 2 times by 1 test: return QString();
Executed by:
  • tst_QPluginLoader
QString();
executed 2 times by 1 test: return QString();
Executed by:
  • tst_QPluginLoader
2
109}-
110void QPluginLoader::setFileName(const QString &fileName)-
111{-
112-
113 QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;-
114 if (d) {-
115 lh = d->loadHints();-
116 d->release();-
117 d = 0;-
118 did_load = false;-
119 }-
120-
121 const QString fn = locatePlugin(fileName);-
122-
123 d = QLibraryPrivate::findOrCreate(fn, QString(), lh);-
124 if (!fn.isEmpty())-
125 d->updatePluginState();-
126}-
127-
128QString QPluginLoader::fileName() const-
129{-
130 if (d)-
131 return d->fileName;-
132 return QString();-
133}-
134-
135-
136-
137-
138-
139-
140QString QPluginLoader::errorString() const-
141{-
142 return (!d || d->errorString.isEmpty()) ? tr("Unknown error") : d->errorString;-
143}-
144void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)-
145{-
146 if (!d) {-
147 d = QLibraryPrivate::findOrCreate(QString());-
148 d->errorString.clear();-
149 }-
150 d->setLoadHints(loadHints);-
151}-
152-
153QLibrary::LoadHints QPluginLoader::loadHints() const-
154{-
155 return d ? d->loadHints() : QLibrary::LoadHints();-
156}-
157-
158-
159-
160typedef QVector<QStaticPlugin> StaticPluginList;-
161namespace { namespace Q_QGS_staticPluginList { typedef StaticPluginList Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<StaticPluginList, Q_QGS_staticPluginList::innerFunction, Q_QGS_staticPluginList::guard> staticPluginList;-
void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)
{
if (!d) {
d = QLibraryPrivate::findOrCreate(QString());
d->errorString.clear();
}
d->setLoadHints(loadHints);
}
QLibrary::LoadHints QPluginLoader::loadHints() const
{
return d ? d->loadHints() : QLibrary::LoadHints();
}void __attribute__((visibility("default"))) qRegisterStaticPluginFunction(QStaticPlugin plugin)
163{-
164 staticPluginList()->append(plugin);-
165}-
166-
167-
168-
169-
170-
171-
172QObjectList QPluginLoader::staticInstances()-
173{-
174 QObjectList instances;-
175 const StaticPluginList *plugins = staticPluginList();-
176 if (plugins) {-
177 const int numPlugins = plugins->size();-
178 instances.reserve(numPlugins);-
179 for (int i = 0; i < numPlugins; ++i)-
180 instances += plugins->at(i).instance();-
181 }-
182 return instances;-
183}-
184QVector<QStaticPlugin> QPluginLoader::staticPlugins()-
185{-
186 StaticPluginList *plugins = staticPluginList();-
187 if (plugins)-
188 return *plugins;-
189 return QVector<QStaticPlugin>();-
190}-
191-
192-
193-
194-
195-
196-
197QJsonObject QStaticPlugin::metaData() const-
198{-
199 return
executed 26 times by 1 test: return qJsonFromRawLibraryMetaData(rawMetaData()).object();
Executed by:
  • tst_QGuiApplication
QLibraryPrivate::fromRawMetaDataqJsonFromRawLibraryMetaData(rawMetaData()).object();
executed 26 times by 1 test: return qJsonFromRawLibraryMetaData(rawMetaData()).object();
Executed by:
  • tst_QGuiApplication
26
200}-
201-
202-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9