Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qplugin_p.h
Go to the documentation of this file.
1// Copyright (C) 2018 Intel Corporation.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QPLUGIN_P_H
6#define QPLUGIN_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of the QLibrary class. This header file may change from
14// version to version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <private/qglobal_p.h>
20
21#include "QtCore/qplugin.h"
22#include "QtCore/qcborvalue.h"
23#include "QtCore/qcbormap.h"
24
25QT_BEGIN_NAMESPACE
26
27enum class QtPluginMetaDataKeys {
28 QtVersion,
29 Requirements,
30 IID,
31 ClassName,
32 MetaData,
33 URI,
34 IsDebug,
35};
36
37// F(IntKey, StringKey, Description)
38// Keep this list sorted in the order moc should output.
39#define QT_PLUGIN_FOREACH_METADATA(F)
40 F(QtPluginMetaDataKeys::IID, "IID", "Plugin's Interface ID")
41 F(QtPluginMetaDataKeys::ClassName, "className", "Plugin class name")
42 F(QtPluginMetaDataKeys::MetaData, "MetaData", "Other meta data")
43 F(QtPluginMetaDataKeys::URI, "URI", "Plugin URI")
44 /* not output by moc in CBOR */
45 F(QtPluginMetaDataKeys::QtVersion, "version", "Qt version")
46 F(QtPluginMetaDataKeys::Requirements, "archlevel", "Architectural level")
47 F(QtPluginMetaDataKeys::IsDebug, "debug", "Debug-mode plugin")
48 /**/
49
50namespace {
51struct DecodedArchRequirements
52{
53 quint8 level;
54 bool isDebug;
55 friend constexpr bool operator==(DecodedArchRequirements r1, DecodedArchRequirements r2)
56 {
57 return r1.level == r2.level && r1.isDebug == r2.isDebug;
58 }
59};
60
61static constexpr DecodedArchRequirements decodeVersion0ArchRequirements(quint8 value)
62{
63 // see qPluginArchRequirements() and QPluginMetaDataV2::archRequirements()
64 DecodedArchRequirements r = {};
65#ifdef Q_PROCESSOR_X86
66 if (value & 4)
67 r.level = 4; // AVX512F -> x86-64-v4
68 else if (value & 2)
69 r.level = 3; // AVX2 -> x86-64-v3
70#endif
71 if (value & 1)
72 r.isDebug = true;
73 return r;
74}
75// self checks
76static_assert(decodeVersion0ArchRequirements(0) == DecodedArchRequirements{ 0, false });
77static_assert(decodeVersion0ArchRequirements(1) == DecodedArchRequirements{ 0, true });
78#ifdef Q_PROCESSOR_X86
79static_assert(decodeVersion0ArchRequirements(2) == DecodedArchRequirements{ 3, false });
80static_assert(decodeVersion0ArchRequirements(3) == DecodedArchRequirements{ 3, true });
81static_assert(decodeVersion0ArchRequirements(4) == DecodedArchRequirements{ 4, false });
82static_assert(decodeVersion0ArchRequirements(5) == DecodedArchRequirements{ 4, true });
83#endif
84
85static constexpr DecodedArchRequirements decodeVersion1ArchRequirements(quint8 value)
86{
87 return { quint8(value & 0x7f), bool(value & 0x80) };
88}
89// self checks
90static_assert(decodeVersion1ArchRequirements(0) == DecodedArchRequirements{ 0, false });
91static_assert(decodeVersion1ArchRequirements(0x80) == DecodedArchRequirements{ 0, true });
92#ifdef Q_PROCESSOR_X86
93static_assert(decodeVersion1ArchRequirements(1) == DecodedArchRequirements{ 1, false });
94static_assert(decodeVersion1ArchRequirements(3) == DecodedArchRequirements{ 3, false});
95static_assert(decodeVersion1ArchRequirements(4) == DecodedArchRequirements{ 4, false });
96static_assert(decodeVersion1ArchRequirements(0x82) == DecodedArchRequirements{ 2, true });
97static_assert(decodeVersion1ArchRequirements(0x84) == DecodedArchRequirements{ 4, true });
98#endif
99} // unnamed namespace
100
102{
103 QCborValue data;
104 bool setError(const QString &errorString) Q_DECL_COLD_FUNCTION
105 {
107 return false;
108 }
109public:
111 QPluginParsedMetaData(QByteArrayView input) { parse(input); }
112
113 bool isError() const { return !data.isMap(); }
114 QString errorString() const { return data.toString(); }
115
116 bool parse(QByteArrayView input);
117 bool parse(QPluginMetaData metaData)
118 { return parse(QByteArrayView(reinterpret_cast<const char *>(metaData.data), metaData.size)); }
119
120 QJsonObject toJson() const; // only for QLibrary & QPluginLoader
121
122 // if data is not a map, toMap() returns empty, so shall these functions
123 QCborMap toCbor() const { return data.toMap(); }
124 QCborValue value(QtPluginMetaDataKeys k) const { return data[int(k)]; }
125};
126
127
128QT_END_NAMESPACE
129
130#endif // QPLUGIN_P_H
QPluginParsedMetaData(QByteArrayView input)
Definition qplugin_p.h:111
QCborValue value(QtPluginMetaDataKeys k) const
Definition qplugin_p.h:124
bool parse(QByteArrayView input)
QCborMap toCbor() const
Definition qplugin_p.h:123
bool isError() const
Definition qplugin_p.h:113
QJsonObject toJson() const
QString errorString() const
Definition qplugin_p.h:114