1/****************************************************************************
2**
3** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4** Contact: http://www.qt-project.org/legal
5**
6** This file is part of the QtCore 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 Digia. For licensing terms and
14** conditions see http://qt.digia.com/licensing. For further information
15** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Digia gives you certain additional
26** rights. These rights are described in the Digia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37**
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QOBJECTDEFS_H
43#define QOBJECTDEFS_H
44
45#include <QtCore/qnamespace.h>
46
47QT_BEGIN_HEADER
48
49QT_BEGIN_NAMESPACE
50
51QT_MODULE(Core)
52
53class QByteArray;
54
55class QString;
56
57#ifndef Q_MOC_OUTPUT_REVISION
58#define Q_MOC_OUTPUT_REVISION 63
59#endif
60
61// The following macros are our "extensions" to C++
62// They are used, strictly speaking, only by the moc.
63
64#ifndef Q_MOC_RUN
65# if defined(QT_NO_KEYWORDS)
66# define QT_NO_EMIT
67# else
68# define slots
69# define signals protected
70# endif
71# define Q_SLOTS
72# define Q_SIGNALS protected
73# define Q_PRIVATE_SLOT(d, signature)
74# define Q_EMIT
75#ifndef QT_NO_EMIT
76# define emit
77#endif
78#define Q_CLASSINFO(name, value)
79#define Q_INTERFACES(x)
80#define Q_PROPERTY(text)
81#define Q_PRIVATE_PROPERTY(d, text)
82#define Q_REVISION(v)
83#define Q_OVERRIDE(text)
84#define Q_ENUMS(x)
85#define Q_FLAGS(x)
86#ifdef QT3_SUPPORT
87# define Q_SETS(x)
88#endif
89#define Q_SCRIPTABLE
90#define Q_INVOKABLE
91#define Q_SIGNAL
92#define Q_SLOT
93
94#ifndef QT_NO_TRANSLATION
95# ifndef QT_NO_TEXTCODEC
96// full set of tr functions
97// ### Qt 5: merge overloads
98# define QT_TR_FUNCTIONS \
99 static inline QString tr(const char *s, const char *c = 0) \
100 { return staticMetaObject.tr(s, c); } \
101 static inline QString trUtf8(const char *s, const char *c = 0) \
102 { return staticMetaObject.trUtf8(s, c); } \
103 static inline QString tr(const char *s, const char *c, int n) \
104 { return staticMetaObject.tr(s, c, n); } \
105 static inline QString trUtf8(const char *s, const char *c, int n) \
106 { return staticMetaObject.trUtf8(s, c, n); }
107# else
108// no QTextCodec, no utf8
109// ### Qt 5: merge overloads
110# define QT_TR_FUNCTIONS \
111 static inline QString tr(const char *s, const char *c = 0) \
112 { return staticMetaObject.tr(s, c); } \
113 static inline QString tr(const char *s, const char *c, int n) \
114 { return staticMetaObject.tr(s, c, n); }
115# endif
116#else
117// inherit the ones from QObject
118# define QT_TR_FUNCTIONS
119#endif
120
121#if defined(QT_NO_QOBJECT_CHECK)
122/* tmake ignore Q_OBJECT */
123#define Q_OBJECT_CHECK
124#else
125
126/* This is a compile time check that ensures that any class cast with qobject_cast
127 actually contains a Q_OBJECT macro. Note: qobject_cast will fail if a QObject
128 subclass doesn't contain Q_OBJECT.
129
130 In qt_check_for_QOBJECT_macro, we call a dummy templated function with two
131 parameters, the first being "this" and the other the target of the qobject
132 cast. If the types are not identical, we know that a Q_OBJECT macro is missing.
133
134 If you get a compiler error here, make sure that the class you are casting
135 to contains a Q_OBJECT macro.
136*/
137
138/* tmake ignore Q_OBJECT */
139#define Q_OBJECT_CHECK \
140 template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const \
141 { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; }
142
143template <typename T>
144inline int qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }
145
146template <typename T1, typename T2>
147inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
148#endif // QT_NO_QOBJECT_CHECK
149
150#ifdef Q_NO_DATA_RELOCATION
151#define Q_OBJECT_GETSTATICMETAOBJECT static const QMetaObject &getStaticMetaObject();
152#else
153#define Q_OBJECT_GETSTATICMETAOBJECT
154#endif
155
156/* tmake ignore Q_OBJECT */
157#define Q_OBJECT \
158public: \
159 Q_OBJECT_CHECK \
160 static const QMetaObject staticMetaObject; \
161 Q_OBJECT_GETSTATICMETAOBJECT \
162 virtual const QMetaObject *metaObject() const; \
163 virtual void *qt_metacast(const char *); \
164 QT_TR_FUNCTIONS \
165 virtual int qt_metacall(QMetaObject::Call, int, void **); \
166private: \
167 Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \
168 Q_DECL_HIDDEN static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
169
170/* tmake ignore Q_OBJECT */
171#define Q_OBJECT_FAKE Q_OBJECT
172/* tmake ignore Q_GADGET */
173#define Q_GADGET \
174public: \
175 static const QMetaObject staticMetaObject; \
176 Q_OBJECT_GETSTATICMETAOBJECT \
177private:
178#else // Q_MOC_RUN
179#define slots slots
180#define signals signals
181#define Q_SLOTS Q_SLOTS
182#define Q_SIGNALS Q_SIGNALS
183#define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
184#define Q_INTERFACES(x) Q_INTERFACES(x)
185#define Q_PROPERTY(text) Q_PROPERTY(text)
186#define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
187#define Q_REVISION(v) Q_REVISION(v)
188#define Q_OVERRIDE(text) Q_OVERRIDE(text)
189#define Q_ENUMS(x) Q_ENUMS(x)
190#define Q_FLAGS(x) Q_FLAGS(x)
191#ifdef QT3_SUPPORT
192# define Q_SETS(x) Q_SETS(x)
193#endif
194 /* tmake ignore Q_OBJECT */
195#define Q_OBJECT Q_OBJECT
196 /* tmake ignore Q_OBJECT */
197#define Q_OBJECT_FAKE Q_OBJECT_FAKE
198 /* tmake ignore Q_GADGET */
199#define Q_GADGET Q_GADGET
200#define Q_SCRIPTABLE Q_SCRIPTABLE
201#define Q_INVOKABLE Q_INVOKABLE
202#define Q_SIGNAL Q_SIGNAL
203#define Q_SLOT Q_SLOT
204#endif //Q_MOC_RUN
205
206// macro for onaming members
207#ifdef METHOD
208#undef METHOD
209#endif
210#ifdef SLOT
211#undef SLOT
212#endif
213#ifdef SIGNAL
214#undef SIGNAL
215#endif
216
217Q_CORE_EXPORT const char *qFlagLocation(const char *method);
218
219#define QTOSTRING_HELPER(s) #s
220#define QTOSTRING(s) QTOSTRING_HELPER(s)
221#ifndef QT_NO_DEBUG
222# define QLOCATION "\0" __FILE__ ":" QTOSTRING(__LINE__)
223# ifndef QT_NO_KEYWORDS
224# define METHOD(a) qFlagLocation("0"#a QLOCATION)
225# endif
226# define SLOT(a) qFlagLocation("1"#a QLOCATION)
227# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
228#else
229# ifndef QT_NO_KEYWORDS
230# define METHOD(a) "0"#a
231# endif
232# define SLOT(a) "1"#a
233# define SIGNAL(a) "2"#a
234#endif
235
236#ifdef QT3_SUPPORT
237#define METHOD_CODE 0 // member type codes
238#define SLOT_CODE 1
239#define SIGNAL_CODE 2
240#endif
241
242#define QMETHOD_CODE 0 // member type codes
243#define QSLOT_CODE 1
244#define QSIGNAL_CODE 2
245
246#define Q_ARG(type, data) QArgument<type >(#type, data)
247#define Q_RETURN_ARG(type, data) QReturnArgument<type >(#type, data)
248
249class QObject;
250class QMetaMethod;
251class QMetaEnum;
252class QMetaProperty;
253class QMetaClassInfo;
254
255
256class Q_CORE_EXPORT QGenericArgument
257{
258public:
259 inline QGenericArgument(const char *aName = 0, const void *aData = 0)
260 : _data(aData), _name(aName) {}
261 inline void *data() const { return const_cast<void *>(_data); }
262 inline const char *name() const { return _name; }
263
264private:
265 const void *_data;
266 const char *_name;
267};
268
269class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument
270{
271public:
272 inline QGenericReturnArgument(const char *aName = 0, void *aData = 0)
273 : QGenericArgument(aName, aData)
274 {}
275};
276
277template <class T>
278class QArgument: public QGenericArgument
279{
280public:
281 inline QArgument(const char *aName, const T &aData)
282 : QGenericArgument(aName, static_cast<const void *>(&aData))
283 {}
284};
285template <class T>
286class QArgument<T &>: public QGenericArgument
287{
288public:
289 inline QArgument(const char *aName, T &aData)
290 : QGenericArgument(aName, static_cast<const void *>(&aData))
291 {}
292};
293
294
295template <typename T>
296class QReturnArgument: public QGenericReturnArgument
297{
298public:
299 inline QReturnArgument(const char *aName, T &aData)
300 : QGenericReturnArgument(aName, static_cast<void *>(&aData))
301 {}
302};
303
304struct Q_CORE_EXPORT QMetaObject
305{
306 const char *className() const;
307 const QMetaObject *superClass() const;
308
309 QObject *cast(QObject *obj) const;
310 const QObject *cast(const QObject *obj) const;
311
312#ifndef QT_NO_TRANSLATION
313 // ### Qt 4: Merge overloads
314 QString tr(const char *s, const char *c) const;
315 QString trUtf8(const char *s, const char *c) const;
316 QString tr(const char *s, const char *c, int n) const;
317 QString trUtf8(const char *s, const char *c, int n) const;
318#endif // QT_NO_TRANSLATION
319
320 int methodOffset() const;
321 int enumeratorOffset() const;
322 int propertyOffset() const;
323 int classInfoOffset() const;
324
325 int constructorCount() const;
326 int methodCount() const;
327 int enumeratorCount() const;
328 int propertyCount() const;
329 int classInfoCount() const;
330
331 int indexOfConstructor(const char *constructor) const;
332 int indexOfMethod(const char *method) const;
333 int indexOfSignal(const char *signal) const;
334 int indexOfSlot(const char *slot) const;
335 int indexOfEnumerator(const char *name) const;
336 int indexOfProperty(const char *name) const;
337 int indexOfClassInfo(const char *name) const;
338
339 QMetaMethod constructor(int index) const;
340 QMetaMethod method(int index) const;
341 QMetaEnum enumerator(int index) const;
342 QMetaProperty property(int index) const;
343 QMetaClassInfo classInfo(int index) const;
344 QMetaProperty userProperty() const;
345
346 static bool checkConnectArgs(const char *signal, const char *method);
347 static QByteArray normalizedSignature(const char *method);
348 static QByteArray normalizedType(const char *type);
349
350 // internal index-based connect
351 static bool connect(const QObject *sender, int signal_index,
352 const QObject *receiver, int method_index,
353 int type = 0, int *types = 0);
354 // internal index-based disconnect
355 static bool disconnect(const QObject *sender, int signal_index,
356 const QObject *receiver, int method_index);
357 static bool disconnectOne(const QObject *sender, int signal_index,
358 const QObject *receiver, int method_index);
359 // internal slot-name based connect
360 static void connectSlotsByName(QObject *o);
361
362 // internal index-based signal activation
363 static void activate(QObject *sender, int signal_index, void **argv); //obsolete
364 static void activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv); //obsolete
365 static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
366 static void activate(QObject *sender, const QMetaObject *, int from_local_signal_index, int to_local_signal_index, void **argv); //obsolete
367
368 // internal guarded pointers
369 static void addGuard(QObject **ptr);
370 static void removeGuard(QObject **ptr);
371 static void changeGuard(QObject **ptr, QObject *o);
372
373 static bool invokeMethod(QObject *obj, const char *member,
374 Qt::ConnectionType,
375 QGenericReturnArgument ret,
376 QGenericArgument val0 = QGenericArgument(0),
377 QGenericArgument val1 = QGenericArgument(),
378 QGenericArgument val2 = QGenericArgument(),
379 QGenericArgument val3 = QGenericArgument(),
380 QGenericArgument val4 = QGenericArgument(),
381 QGenericArgument val5 = QGenericArgument(),
382 QGenericArgument val6 = QGenericArgument(),
383 QGenericArgument val7 = QGenericArgument(),
384 QGenericArgument val8 = QGenericArgument(),
385 QGenericArgument val9 = QGenericArgument());
386
387 static inline bool invokeMethod(QObject *obj, const char *member,
388 QGenericReturnArgument ret,
389 QGenericArgument val0 = QGenericArgument(0),
390 QGenericArgument val1 = QGenericArgument(),
391 QGenericArgument val2 = QGenericArgument(),
392 QGenericArgument val3 = QGenericArgument(),
393 QGenericArgument val4 = QGenericArgument(),
394 QGenericArgument val5 = QGenericArgument(),
395 QGenericArgument val6 = QGenericArgument(),
396 QGenericArgument val7 = QGenericArgument(),
397 QGenericArgument val8 = QGenericArgument(),
398 QGenericArgument val9 = QGenericArgument())
399 {
400 return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,
401 val4, val5, val6, val7, val8, val9);
402 }
403
404 static inline bool invokeMethod(QObject *obj, const char *member,
405 Qt::ConnectionType type,
406 QGenericArgument val0 = QGenericArgument(0),
407 QGenericArgument val1 = QGenericArgument(),
408 QGenericArgument val2 = QGenericArgument(),
409 QGenericArgument val3 = QGenericArgument(),
410 QGenericArgument val4 = QGenericArgument(),
411 QGenericArgument val5 = QGenericArgument(),
412 QGenericArgument val6 = QGenericArgument(),
413 QGenericArgument val7 = QGenericArgument(),
414 QGenericArgument val8 = QGenericArgument(),
415 QGenericArgument val9 = QGenericArgument())
416 {
417 return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2,
418 val3, val4, val5, val6, val7, val8, val9);
419 }
420
421 static inline bool invokeMethod(QObject *obj, const char *member,
422 QGenericArgument val0 = QGenericArgument(0),
423 QGenericArgument val1 = QGenericArgument(),
424 QGenericArgument val2 = QGenericArgument(),
425 QGenericArgument val3 = QGenericArgument(),
426 QGenericArgument val4 = QGenericArgument(),
427 QGenericArgument val5 = QGenericArgument(),
428 QGenericArgument val6 = QGenericArgument(),
429 QGenericArgument val7 = QGenericArgument(),
430 QGenericArgument val8 = QGenericArgument(),
431 QGenericArgument val9 = QGenericArgument())
432 {
433 return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,
434 val1, val2, val3, val4, val5, val6, val7, val8, val9);
435 }
436
437 QObject *newInstance(QGenericArgument val0 = QGenericArgument(0),
438 QGenericArgument val1 = QGenericArgument(),
439 QGenericArgument val2 = QGenericArgument(),
440 QGenericArgument val3 = QGenericArgument(),
441 QGenericArgument val4 = QGenericArgument(),
442 QGenericArgument val5 = QGenericArgument(),
443 QGenericArgument val6 = QGenericArgument(),
444 QGenericArgument val7 = QGenericArgument(),
445 QGenericArgument val8 = QGenericArgument(),
446 QGenericArgument val9 = QGenericArgument()) const;
447
448 enum Call {
449 InvokeMetaMethod,
450 ReadProperty,
451 WriteProperty,
452 ResetProperty,
453 QueryPropertyDesignable,
454 QueryPropertyScriptable,
455 QueryPropertyStored,
456 QueryPropertyEditable,
457 QueryPropertyUser,
458 CreateInstance
459 };
460
461 int static_metacall(Call, int, void **) const;
462 static int metacall(QObject *, Call, int, void **);
463
464#ifdef QT3_SUPPORT
465 QT3_SUPPORT const char *superClassName() const;
466#endif
467
468 struct { // private data
469 const QMetaObject *superdata;
470 const char *stringdata;
471 const uint *data;
472 const void *extradata;
473 } d;
474};
475
476typedef const QMetaObject& (*QMetaObjectAccessor)();
477
478struct QMetaObjectExtraData
479{
480#ifdef Q_NO_DATA_RELOCATION
481 const QMetaObjectAccessor *objects;
482#else
483 const QMetaObject **objects;
484#endif
485
486 typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); //from revision 6
487 //typedef int (*StaticMetaCall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5
488 StaticMetacallFunction static_metacall;
489};
490
491inline const char *QMetaObject::className() const
492{ return d.stringdata; }
493
494inline const QMetaObject *QMetaObject::superClass() const
495{ return d.superdata; }
496
497#ifdef QT3_SUPPORT
498inline const char *QMetaObject::superClassName() const
499{ return d.superdata ? d.superdata->className() : 0; }
500#endif
501
502QT_END_NAMESPACE
503
504QT_END_HEADER
505
506#endif // QOBJECTDEFS_H
507