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