Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtplugininfo.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "qtplugininfo.h"
5
6#include <QDir>
7
8static PluginDetection determinePluginLibrary(const QDir &platformPluginDir, const QString &infix)
9{
10 // Use the platform plugin to determine which dlls are there (release/debug/both)
11 QString platformReleaseFilter(QStringLiteral("qwindows"));
12 if (!infix.isEmpty())
13 platformReleaseFilter += infix;
14 QString platformFilter = platformReleaseFilter + u'*';
15 platformFilter += sharedLibrarySuffix();
16
17 const QFileInfoList &dlls =
18 platformPluginDir.entryInfoList(QStringList(platformFilter), QDir::Files);
19 if (dlls.size() == 1) {
20 const QFileInfo dllFi = dlls.first();
21 const bool hasDebugDlls =
22 dllFi.fileName() == QString(platformReleaseFilter + sharedLibrarySuffix()) ? false
23 : true;
25 } else {
27 }
28}
29
30static QStringList findPluginNames(const QDir &pluginDir, const PluginDetection libraryType,
31 const Platform &platform)
32{
36 filter += u"*";
38
39 const QFileInfoList &dlls =
40 pluginDir.entryInfoList(QStringList(filter), QDir::Files, QDir::Name);
41
42 for (const QFileInfo &dllFi : dlls) {
43 QString plugin = dllFi.fileName();
44 const int dotIndex = plugin.lastIndexOf(u'.');
45 // We don't need the .dll for the name
46 plugin = plugin.first(dotIndex);
47
48 if (libraryType == PluginDetection::DebugAndRelease) {
49 bool isDebugDll{};
50 if (!readPeExecutable(dllFi.absoluteFilePath(), &errorMessage, 0, 0, &isDebugDll,
52 std::wcerr << "Warning: Unable to read "
53 << QDir::toNativeSeparators(dllFi.absoluteFilePath()) << ": "
54 << errorMessage;
55 }
56 if (isDebugDll && platformHasDebugSuffix(platform))
57 plugin.removeLast();
58 }
59 else if (libraryType == PluginDetection::DebugOnly)
60 plugin.removeLast();
61
62 if (!result.contains(plugin))
63 result.append(plugin);
64 }
65 return result;
66}
67
68bool PluginInformation::isTypeForPlugin(const QString &type, const QString &plugin) const
69{
70 return m_pluginMap.at(plugin) == type;
71}
72
73void PluginInformation::populatePluginToType(const QDir &pluginDir, const QStringList &plugins)
74{
75 for (const QString &plugin : plugins)
76 m_pluginMap.insert({ plugin, pluginDir.dirName() });
77}
78
79void PluginInformation::generateAvailablePlugins(const QMap<QString, QString> &qtPathsVariables,
80 const Platform &platform)
81{
82 const QDir pluginTypesDir(qtPathsVariables.value(QLatin1String("QT_INSTALL_PLUGINS")));
83 const QDir platformPluginDir(pluginTypesDir.absolutePath() + QStringLiteral("/platforms"));
84 const QString infix(qtPathsVariables.value(QLatin1String(qmakeInfixKey)));
85 const PluginDetection debugDetection = determinePluginLibrary(platformPluginDir, infix);
86
87 const QFileInfoList &pluginTypes =
88 pluginTypesDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
89 for (const QFileInfo &pluginType : pluginTypes) {
90 const QString pluginTypeName = pluginType.baseName();
91 m_typeMap.insert({ pluginTypeName, QStringList{} });
92 const QStringList plugins =
93 findPluginNames(pluginType.absoluteFilePath(), debugDetection, platform);
94 m_typeMap.at(pluginTypeName) = plugins;
95 populatePluginToType(pluginTypeName, plugins);
96 }
97 if (!m_typeMap.size() || !m_pluginMap.size())
98 std::wcerr << "Warning: could not parse available plugins properly, plugin "
99 "inclusion/exclusion options will not work\n";
100}
void generateAvailablePlugins(const QMap< QString, QString > &qtPathsVariables, const Platform &platform)
void populatePluginToType(const QDir &pluginDir, const QStringList &plugins)
bool isTypeForPlugin(const QString &type, const QString &plugin) const
\inmodule QtCore
Definition qdir.h:20
static QString toNativeSeparators(const QString &pathName)
Definition qdir.cpp:929
@ Name
Definition qdir.h:50
@ Files
Definition qdir.h:23
@ NoDotAndDotDot
Definition qdir.h:44
@ Dirs
Definition qdir.h:22
QString fileName() const
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QList< QString > QStringList
Constructs a string list that contains the given string, str.
GLenum type
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint64EXT * result
[6]
#define QStringLiteral(str)
static PluginDetection determinePluginLibrary(const QDir &platformPluginDir, const QString &infix)
static QStringList findPluginNames(const QDir &pluginDir, const PluginDetection libraryType, const Platform &platform)
PluginDetection
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3517
QT_BEGIN_NAMESPACE Platform platform()
Platform
bool readPeExecutable(const QString &, QString *errorMessage, QStringList *, unsigned *, bool *, bool, unsigned short *)
Definition utils.cpp:930
const char * qmakeInfixKey
Definition utils.cpp:421
@ WindowsDesktopMinGW
Definition utils.h:35
bool platformHasDebugSuffix(Platform p)
Definition utils.h:45
QString sharedLibrarySuffix()
Definition utils.h:141