1/****************************************************************************
2**
3** Copyright (C) 2019 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtQml module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QQMLTYPE_P_H
41#define QQMLTYPE_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <functional>
55
56#include <private/qtqmlglobal_p.h>
57#include <private/qqmlrefcount_p.h>
58
59#include <QtQml/qqmlprivate.h>
60#include <QtQml/qjsvalue.h>
61
62#include <QtCore/qobject.h>
63
64QT_BEGIN_NAMESPACE
65
66class QHashedCStringRef;
67class QQmlTypePrivate;
68class QHashedString;
69class QHashedStringRef;
70class QQmlCustomParser;
71class QQmlEnginePrivate;
72class QQmlPropertyCache;
73
74namespace QV4 {
75struct String;
76}
77struct CompositeMetaTypeIds;
78
79class Q_QML_PRIVATE_EXPORT QQmlType
80{
81public:
82 QQmlType();
83 QQmlType(const QQmlType &other);
84 QQmlType(QQmlType &&other);
85 QQmlType &operator =(const QQmlType &other);
86 QQmlType &operator =(QQmlType &&other);
87 explicit QQmlType(const QQmlTypePrivate *priv);
88 ~QQmlType();
89
90 bool operator ==(const QQmlType &other) const {
91 return d.data() == other.d.data();
92 }
93
94 bool isValid() const { return !d.isNull(); }
95
96 QByteArray typeName() const;
97 QString qmlTypeName() const;
98 QString elementName() const;
99
100 QHashedString module() const;
101 int majorVersion() const;
102 int minorVersion() const;
103
104 bool availableInVersion(int vmajor, int vminor) const;
105 bool availableInVersion(const QHashedStringRef &module, int vmajor, int vminor) const;
106
107 QObject *create() const;
108 void create(QObject **, void **, size_t) const;
109
110 typedef void (*CreateFunc)(void *);
111 CreateFunc createFunction() const;
112 QQmlCustomParser *customParser() const;
113
114 bool isCreatable() const;
115 typedef QObject *(*ExtensionFunc)(QObject *);
116 ExtensionFunc extensionFunction() const;
117 bool isExtendedType() const;
118 QString noCreationReason() const;
119
120 bool isSingleton() const;
121 bool isInterface() const;
122 bool isComposite() const;
123 bool isCompositeSingleton() const;
124 bool isQObjectSingleton() const;
125 bool isQJSValueSingleton() const;
126
127 int typeId() const;
128 int qListTypeId() const;
129
130 const QMetaObject *metaObject() const;
131 const QMetaObject *baseMetaObject() const;
132 int metaObjectRevision() const;
133 bool containsRevisionedAttributes() const;
134
135 QQmlAttachedPropertiesFunc attachedPropertiesFunction(QQmlEnginePrivate *engine) const;
136 const QMetaObject *attachedPropertiesType(QQmlEnginePrivate *engine) const;
137#if QT_DEPRECATED_SINCE(5, 14)
138 QT_DEPRECATED int attachedPropertiesId(QQmlEnginePrivate *engine) const;
139#endif
140
141 int parserStatusCast() const;
142 const char *interfaceIId() const;
143 int propertyValueSourceCast() const;
144 int propertyValueInterceptorCast() const;
145
146 int index() const;
147
148 bool isInlineComponentType() const;
149 int inlineComponendId() const;
150
151 struct Q_QML_PRIVATE_EXPORT SingletonInstanceInfo
152 {
153 QJSValue (*scriptCallback)(QQmlEngine *, QJSEngine *) = nullptr;
154 std::function<QObject *(QQmlEngine *, QJSEngine *)> qobjectCallback = {};
155 const QMetaObject *instanceMetaObject = nullptr;
156 QString typeName;
157 QUrl url; // used by composite singletons
158 };
159 SingletonInstanceInfo *singletonInstanceInfo() const;
160
161 QUrl sourceUrl() const;
162
163 int enumValue(QQmlEnginePrivate *engine, const QHashedStringRef &, bool *ok) const;
164 int enumValue(QQmlEnginePrivate *engine, const QHashedCStringRef &, bool *ok) const;
165 int enumValue(QQmlEnginePrivate *engine, const QV4::String *, bool *ok) const;
166
167 int scopedEnumIndex(QQmlEnginePrivate *engine, const QV4::String *, bool *ok) const;
168 int scopedEnumIndex(QQmlEnginePrivate *engine, const QString &, bool *ok) const;
169 int scopedEnumValue(QQmlEnginePrivate *engine, int index, const QV4::String *, bool *ok) const;
170 int scopedEnumValue(QQmlEnginePrivate *engine, int index, const QString &, bool *ok) const;
171 int scopedEnumValue(QQmlEnginePrivate *engine, const QByteArray &, const QByteArray &, bool *ok) const;
172 int scopedEnumValue(QQmlEnginePrivate *engine, const QStringRef &, const QStringRef &, bool *ok) const;
173 int inlineComponentObjectId();
174 void setInlineComponentObjectId(int id) const; // TODO: const setters are BAD
175
176 const QQmlTypePrivate *priv() const { return d.data(); }
177 static void refHandle(const QQmlTypePrivate *priv);
178 static void derefHandle(const QQmlTypePrivate *priv);
179 static int refCount(const QQmlTypePrivate *priv);
180
181 enum RegistrationType {
182 CppType = 0,
183 SingletonType = 1,
184 InterfaceType = 2,
185 CompositeType = 3,
186 CompositeSingletonType = 4,
187 InlineComponentType = 5,
188 AnyRegistrationType = 255
189 };
190
191 QQmlType containingType() const;
192 int lookupInlineComponentIdByName(const QString &name) const;
193 QQmlType lookupInlineComponentById(int objectid) const;
194 int generatePlaceHolderICId() const;
195
196 void associateInlineComponent(const QString &name, int objectID, const CompositeMetaTypeIds &metaTypeIds, QQmlType existingType);
197 void setPendingResolutionName(const QString &name);
198 QString pendingResolutionName() const;
199
200private:
201 friend class QQmlTypePrivate;
202 friend uint qHash(const QQmlType &t, uint seed);
203 QQmlRefPointer<const QQmlTypePrivate> d;
204};
205
206inline uint qHash(const QQmlType &t, uint seed = 0)
207{
208 return qHash(key: reinterpret_cast<quintptr>(t.d.data()), seed);
209}
210
211QT_END_NAMESPACE
212
213#endif // QQMLTYPE_P_H
214

source code of qtdeclarative/src/qml/qml/qqmltype_p.h