/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtDeclarative module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QDECLARATIVEPRIVATE_H #define QDECLARATIVEPRIVATE_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_MODULE(Declarative) typedef QObject *(*QDeclarativeAttachedPropertiesFunc)(QObject *); template class QDeclarativeTypeInfo { public: enum { hasAttachedProperties = 0 }; }; class QDeclarativeCustomParser; namespace QDeclarativePrivate { void Q_DECLARATIVE_EXPORT qdeclarativeelement_destructor(QObject *); template class QDeclarativeElement : public T { public: virtual ~QDeclarativeElement() { QDeclarativePrivate::qdeclarativeelement_destructor(this); } }; template void createInto(void *memory) { new (memory) QDeclarativeElement; } template QObject *createParent(QObject *p) { return new T(p); } template struct StaticCastSelectorClass { static inline int cast() { return -1; } }; template struct StaticCastSelectorClass { static inline int cast() { return int(reinterpret_cast(static_cast(reinterpret_cast(0x10000000)))) - 0x10000000; } }; template struct StaticCastSelector { typedef int yes_type; typedef char no_type; static yes_type check(To *); static no_type check(...); static inline int cast() { return StaticCastSelectorClass(0)))>::cast(); } }; template struct has_attachedPropertiesMember { static bool const value = QDeclarativeTypeInfo::hasAttachedProperties; }; template class has_attachedPropertiesMethod { public: typedef int yes_type; typedef char no_type; template static yes_type check(ReturnType *(*)(QObject *)); static no_type check(...); static bool const value = sizeof(check(&T::qmlAttachedProperties)) == sizeof(yes_type); }; template class has_attachedPropertiesMethod { public: static bool const value = false; }; template class AttachedPropertySelector { public: static inline QDeclarativeAttachedPropertiesFunc func() { return 0; } static inline const QMetaObject *metaObject() { return 0; } }; template class AttachedPropertySelector { static inline QObject *attachedProperties(QObject *obj) { return T::qmlAttachedProperties(obj); } template static inline const QMetaObject *attachedPropertiesMetaObject(ReturnType *(*)(QObject *)) { return &ReturnType::staticMetaObject; } public: static inline QDeclarativeAttachedPropertiesFunc func() { return &attachedProperties; } static inline const QMetaObject *metaObject() { return attachedPropertiesMetaObject(&T::qmlAttachedProperties); } }; template inline QDeclarativeAttachedPropertiesFunc attachedPropertiesFunc() { return AttachedPropertySelector::value>::value>::func(); } template inline const QMetaObject *attachedPropertiesMetaObject() { return AttachedPropertySelector::value>::value>::metaObject(); } enum AutoParentResult { Parented, IncompatibleObject, IncompatibleParent }; typedef AutoParentResult (*AutoParentFunction)(QObject *object, QObject *parent); struct RegisterType { int version; int typeId; int listId; int objectSize; void (*create)(void *); QString noCreationReason; const char *uri; int versionMajor; int versionMinor; const char *elementName; const QMetaObject *metaObject; QDeclarativeAttachedPropertiesFunc attachedPropertiesFunction; const QMetaObject *attachedPropertiesMetaObject; int parserStatusCast; int valueSourceCast; int valueInterceptorCast; QObject *(*extensionObjectCreate)(QObject *); const QMetaObject *extensionMetaObject; QDeclarativeCustomParser *customParser; int revision; // If this is extended ensure "version" is bumped!!! }; struct RegisterInterface { int version; int typeId; int listId; const char *iid; }; struct RegisterAutoParent { int version; AutoParentFunction function; }; struct RegisterComponent { const QUrl &url; const char *uri; const char *typeName; int majorVersion; int minorVersion; }; enum RegistrationType { TypeRegistration = 0, InterfaceRegistration = 1, AutoParentRegistration = 2, ComponentRegistration = 3 }; int Q_DECLARATIVE_EXPORT qmlregister(RegistrationType, void *); } QT_END_NAMESPACE QT_END_HEADER #endif // QDECLARATIVEPRIVATE_H