1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
5 ** Contact: https://www.qt.io/licensing/
6 **
7 ** This file is part of the QtCore module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see https://www.qt.io/terms-conditions. For further
16 ** information use the contact form at https://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or (at your option) the GNU General
29 ** Public license version 3 or any later version approved by the KDE Free
30 ** Qt Foundation. The licenses are as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32 ** included in the packaging of this file. Please review the following
33 ** information to ensure the GNU General Public License requirements will
34 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35 ** https://www.gnu.org/licenses/gpl-3.0.html.
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #ifndef QMETAOBJECT_H
42 #define QMETAOBJECT_H
43 
44 #include <QtCore/qobjectdefs.h>
45 #include <QtCore/qvariant.h>
46 
47 QT_BEGIN_NAMESPACE
48 
49 
50 template <typename T> class QList;
51 
52 #define Q_METAMETHOD_INVOKE_MAX_ARGS 10
53 
54 class Q_CORE_EXPORT QMetaMethod
55 {
56 public:
QMetaMethod()57     Q_DECL_CONSTEXPR inline QMetaMethod() : mobj(nullptr), handle(0) {}
58 
59     QByteArray methodSignature() const;
60     QByteArray name() const;
61     const char *typeName() const;
62     int returnType() const;
63     int parameterCount() const;
64     int parameterType(int index) const;
65     void getParameterTypes(int *types) const;
66     QList<QByteArray> parameterTypes() const;
67     QList<QByteArray> parameterNames() const;
68     const char *tag() const;
69     enum Access { Private, Protected, Public };
70     Access access() const;
71     enum MethodType { Method, Signal, Slot, Constructor };
72     MethodType methodType() const;
73     enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 };
74     int attributes() const;
75     int methodIndex() const;
76     int revision() const;
77 
enclosingMetaObject()78     inline const QMetaObject *enclosingMetaObject() const { return mobj; }
79 
80     bool invoke(QObject *object,
81                 Qt::ConnectionType connectionType,
82                 QGenericReturnArgument returnValue,
83                 QGenericArgument val0 = QGenericArgument(nullptr),
84                 QGenericArgument val1 = QGenericArgument(),
85                 QGenericArgument val2 = QGenericArgument(),
86                 QGenericArgument val3 = QGenericArgument(),
87                 QGenericArgument val4 = QGenericArgument(),
88                 QGenericArgument val5 = QGenericArgument(),
89                 QGenericArgument val6 = QGenericArgument(),
90                 QGenericArgument val7 = QGenericArgument(),
91                 QGenericArgument val8 = QGenericArgument(),
92                 QGenericArgument val9 = QGenericArgument()) const;
93     inline bool invoke(QObject *object,
94                        QGenericReturnArgument returnValue,
95                        QGenericArgument val0 = QGenericArgument(nullptr),
96                        QGenericArgument val1 = QGenericArgument(),
97                        QGenericArgument val2 = QGenericArgument(),
98                        QGenericArgument val3 = QGenericArgument(),
99                        QGenericArgument val4 = QGenericArgument(),
100                        QGenericArgument val5 = QGenericArgument(),
101                        QGenericArgument val6 = QGenericArgument(),
102                        QGenericArgument val7 = QGenericArgument(),
103                        QGenericArgument val8 = QGenericArgument(),
104                        QGenericArgument val9 = QGenericArgument()) const
105     {
106         return invoke(object, Qt::AutoConnection, returnValue,
107                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
108     }
109     inline bool invoke(QObject *object,
110                        Qt::ConnectionType connectionType,
111                        QGenericArgument val0 = QGenericArgument(nullptr),
112                        QGenericArgument val1 = QGenericArgument(),
113                        QGenericArgument val2 = QGenericArgument(),
114                        QGenericArgument val3 = QGenericArgument(),
115                        QGenericArgument val4 = QGenericArgument(),
116                        QGenericArgument val5 = QGenericArgument(),
117                        QGenericArgument val6 = QGenericArgument(),
118                        QGenericArgument val7 = QGenericArgument(),
119                        QGenericArgument val8 = QGenericArgument(),
120                        QGenericArgument val9 = QGenericArgument()) const
121     {
122         return invoke(object, connectionType, QGenericReturnArgument(),
123                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
124     }
125     inline bool invoke(QObject *object,
126                        QGenericArgument val0 = QGenericArgument(nullptr),
127                        QGenericArgument val1 = QGenericArgument(),
128                        QGenericArgument val2 = QGenericArgument(),
129                        QGenericArgument val3 = QGenericArgument(),
130                        QGenericArgument val4 = QGenericArgument(),
131                        QGenericArgument val5 = QGenericArgument(),
132                        QGenericArgument val6 = QGenericArgument(),
133                        QGenericArgument val7 = QGenericArgument(),
134                        QGenericArgument val8 = QGenericArgument(),
135                        QGenericArgument val9 = QGenericArgument()) const
136     {
137         return invoke(object, Qt::AutoConnection, QGenericReturnArgument(),
138                       val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
139     }
140     bool invokeOnGadget(void *gadget,
141                         QGenericReturnArgument returnValue,
142                         QGenericArgument val0 = QGenericArgument(nullptr),
143                         QGenericArgument val1 = QGenericArgument(),
144                         QGenericArgument val2 = QGenericArgument(),
145                         QGenericArgument val3 = QGenericArgument(),
146                         QGenericArgument val4 = QGenericArgument(),
147                         QGenericArgument val5 = QGenericArgument(),
148                         QGenericArgument val6 = QGenericArgument(),
149                         QGenericArgument val7 = QGenericArgument(),
150                         QGenericArgument val8 = QGenericArgument(),
151                         QGenericArgument val9 = QGenericArgument()) const;
152     inline bool invokeOnGadget(void *gadget,
153                                QGenericArgument val0 = QGenericArgument(nullptr),
154                                QGenericArgument val1 = QGenericArgument(),
155                                QGenericArgument val2 = QGenericArgument(),
156                                QGenericArgument val3 = QGenericArgument(),
157                                QGenericArgument val4 = QGenericArgument(),
158                                QGenericArgument val5 = QGenericArgument(),
159                                QGenericArgument val6 = QGenericArgument(),
160                                QGenericArgument val7 = QGenericArgument(),
161                                QGenericArgument val8 = QGenericArgument(),
162                                QGenericArgument val9 = QGenericArgument()) const
163     {
164         return invokeOnGadget(gadget, QGenericReturnArgument(),
165                               val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
166     }
167 
isValid()168     inline bool isValid() const { return mobj != nullptr; }
169 
170     template <typename PointerToMemberFunction>
fromSignal(PointerToMemberFunction signal)171     static inline QMetaMethod fromSignal(PointerToMemberFunction signal)
172     {
173         typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType;
174         Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
175                           "No Q_OBJECT in the class with the signal");
176         return fromSignalImpl(&SignalType::Object::staticMetaObject,
177                               reinterpret_cast<void **>(&signal));
178     }
179 
180 private:
181 #if QT_DEPRECATED_SINCE(5,0)
182     // signature() has been renamed to methodSignature() in Qt 5.
183     // Warning, that function returns a QByteArray; check the life time if
184     // you convert to char*.
185     char *signature(struct renamedInQt5_warning_checkTheLifeTime * = nullptr) = delete;
186 #endif
187     static QMetaMethod fromSignalImpl(const QMetaObject *, void **);
188 
189     const QMetaObject *mobj;
190     uint handle;
191     friend class QMetaMethodPrivate;
192     friend struct QMetaObject;
193     friend struct QMetaObjectPrivate;
194     friend class QObject;
195     friend bool operator==(const QMetaMethod &m1, const QMetaMethod &m2);
196     friend bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2);
197 };
198 Q_DECLARE_TYPEINFO(QMetaMethod, Q_MOVABLE_TYPE);
199 
200 inline bool operator==(const QMetaMethod &m1, const QMetaMethod &m2)
201 { return m1.mobj == m2.mobj && m1.handle == m2.handle; }
202 inline bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
203 { return !(m1 == m2); }
204 
205 class Q_CORE_EXPORT QMetaEnum
206 {
207 public:
QMetaEnum()208     Q_DECL_CONSTEXPR inline QMetaEnum() : mobj(nullptr), handle(0) {}
209 
210     const char *name() const;
211     const char *enumName() const;
212     bool isFlag() const;
213     bool isScoped() const;
214 
215     int keyCount() const;
216     const char *key(int index) const;
217     int value(int index) const;
218 
219     const char *scope() const;
220 
221     int keyToValue(const char *key, bool *ok = nullptr) const;
222     const char* valueToKey(int value) const;
223     int keysToValue(const char * keys, bool *ok = nullptr) const;
224     QByteArray valueToKeys(int value) const;
225 
enclosingMetaObject()226     inline const QMetaObject *enclosingMetaObject() const { return mobj; }
227 
isValid()228     inline bool isValid() const { return name() != nullptr; }
229 
fromType()230     template<typename T> static QMetaEnum fromType() {
231         Q_STATIC_ASSERT_X(QtPrivate::IsQEnumHelper<T>::Value,
232                           "QMetaEnum::fromType only works with enums declared as "
233                           "Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS");
234         const QMetaObject *metaObject = qt_getEnumMetaObject(T());
235         const char *name = qt_getEnumName(T());
236         return metaObject->enumerator(metaObject->indexOfEnumerator(name));
237     }
238 
239 private:
240     const QMetaObject *mobj;
241     uint handle;
242     friend struct QMetaObject;
243 };
244 Q_DECLARE_TYPEINFO(QMetaEnum, Q_MOVABLE_TYPE);
245 
246 class Q_CORE_EXPORT QMetaProperty
247 {
248 public:
249     QMetaProperty();
250 
251     const char *name() const;
252     const char *typeName() const;
253     QVariant::Type type() const;
254     int userType() const;
255     int propertyIndex() const;
256     int relativePropertyIndex() const;
257 
258     bool isReadable() const;
259     bool isWritable() const;
260     bool isResettable() const;
261     bool isDesignable(const QObject *obj = nullptr) const;
262     bool isScriptable(const QObject *obj = nullptr) const;
263     bool isStored(const QObject *obj = nullptr) const;
264 #if QT_DEPRECATED_SINCE(5, 15)
265     QT_DEPRECATED_VERSION_5_15 bool isEditable(const QObject *obj = nullptr) const;
266 #endif
267     bool isUser(const QObject *obj = nullptr) const;
268     bool isConstant() const;
269     bool isFinal() const;
270     bool isRequired() const;
271 
272     bool isFlagType() const;
273     bool isEnumType() const;
274     QMetaEnum enumerator() const;
275 
276     bool hasNotifySignal() const;
277     QMetaMethod notifySignal() const;
278     int notifySignalIndex() const;
279 
280     int revision() const;
281 
282     QVariant read(const QObject *obj) const;
283     bool write(QObject *obj, const QVariant &value) const;
284     bool reset(QObject *obj) const;
285 
286     QVariant readOnGadget(const void *gadget) const;
287     bool writeOnGadget(void *gadget, const QVariant &value) const;
288     bool resetOnGadget(void *gadget) const;
289 
290     bool hasStdCppSet() const;
isValid()291     inline bool isValid() const { return isReadable(); }
enclosingMetaObject()292     inline const QMetaObject *enclosingMetaObject() const { return mobj; }
293 
294 private:
295     int registerPropertyType() const;
296 
297     const QMetaObject *mobj;
298     uint handle;
299     int idx;
300     QMetaEnum menum;
301     friend struct QMetaObject;
302     friend struct QMetaObjectPrivate;
303 };
304 
305 class Q_CORE_EXPORT QMetaClassInfo
306 {
307 public:
QMetaClassInfo()308     Q_DECL_CONSTEXPR inline QMetaClassInfo() : mobj(nullptr), handle(0) {}
309     const char *name() const;
310     const char *value() const;
enclosingMetaObject()311     inline const QMetaObject *enclosingMetaObject() const { return mobj; }
312 private:
313     const QMetaObject *mobj;
314     uint handle;
315     friend struct QMetaObject;
316 };
317 Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_MOVABLE_TYPE);
318 
319 QT_END_NAMESPACE
320 
321 #endif // QMETAOBJECT_H
322