Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativemetatype.cpp
index bd4b935..ac9d231 100644 (file)
@@ -1,8 +1,7 @@
 /****************************************************************************
 **
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
 **
 ** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
 
 #include <QtDeclarative/qdeclarativeprivate.h>
-#include "private/qdeclarativemetatype_p.h"
+#include "qdeclarativemetatype_p.h"
 
 #include <private/qdeclarativeproxymetaobject_p.h>
 #include <private/qdeclarativecustomparser_p.h>
 #include <QtCore/qmetaobject.h>
 #include <QtCore/qbitarray.h>
 #include <QtCore/qreadwritelock.h>
+#include <QtCore/private/qmetaobject_p.h>
+
 #include <qmetatype.h>
 #include <qobjectdefs.h>
-#include <qdatetime.h>
 #include <qbytearray.h>
 #include <qreadwritelock.h>
 #include <qstring.h>
 #include <qstringlist.h>
 #include <qvector.h>
-#include <qlocale.h>
-#include <QtCore/qcryptographichash.h>
-#include <QtDeclarative/qjsvalue.h>
 
 #include <ctype.h>
 
-#ifdef QT_BOOTSTRAPPED
-# ifndef QT_NO_GEOM_VARIANT
-#  define QT_NO_GEOM_VARIANT
-# endif
-#else
-#  include <qbitarray.h>
-#  include <qurl.h>
-#  include <qvariant.h>
-#endif
-
-#ifndef QT_NO_GEOM_VARIANT
-# include <qsize.h>
-# include <qpoint.h>
-# include <qrect.h>
-# include <qline.h>
-# include <qvector3d.h>
-#endif
-#define NS(x) QT_PREPEND_NAMESPACE(x)
-
 QT_BEGIN_NAMESPACE
 
 struct QDeclarativeMetaTypeData
@@ -94,7 +73,7 @@ struct QDeclarativeMetaTypeData
     QList<QDeclarativeType *> types;
     typedef QHash<int, QDeclarativeType *> Ids;
     Ids idToType;
-    typedef QHash<QByteArray, QDeclarativeType *> Names;
+    typedef QHash<QString, QDeclarativeType *> Names;
     Names nameToType;
     typedef QHash<const QMetaObject *, QDeclarativeType *> MetaObjects;
     MetaObjects metaObjectToType;
@@ -104,12 +83,12 @@ struct QDeclarativeMetaTypeData
     struct VersionedUri {
         VersionedUri()
         : majorVersion(0) {}
-        VersionedUri(const QByteArray &uri, int majorVersion)
+        VersionedUri(const QString &uri, int majorVersion)
         : uri(uri), majorVersion(majorVersion) {}
         bool operator==(const VersionedUri &other) const {
             return other.majorVersion == majorVersion && other.uri == uri;
         }
-        QByteArray uri;
+        QString uri;
         int majorVersion;
     };
     typedef QHash<VersionedUri, QDeclarativeTypeModule *> TypeModules;
@@ -120,7 +99,7 @@ struct QDeclarativeMetaTypeData
         QList<QDeclarativeMetaType::ModuleApi> moduleApis;
         bool sorted;
     };
-    typedef QHash<QByteArray, ModuleApiList> ModuleApis;
+    typedef QHash<QString, ModuleApiList> ModuleApis;
     ModuleApis moduleApis;
     int moduleApiCount;
 
@@ -177,8 +156,8 @@ public:
 
     bool m_isInterface : 1;
     const char *m_iid;
-    QByteArray m_module;
-    QByteArray m_name;
+    QString m_module;
+    QString m_name;
     QString m_elementName;
     int m_version_maj;
     int m_version_min;
@@ -240,11 +219,11 @@ QDeclarativeType::QDeclarativeType(int index, const QDeclarativePrivate::Registe
 QDeclarativeType::QDeclarativeType(int index, const QDeclarativePrivate::RegisterType &type)
 : d(new QDeclarativeTypePrivate)
 {
-    QByteArray name = type.uri;
-    if (type.uri) name += '/';
-    name += type.elementName;
+    QString name = QString::fromUtf8(type.uri);
+    if (type.uri) name += QLatin1Char('/');
+    name += QString::fromUtf8(type.elementName);
 
-    d->m_module = type.uri;
+    d->m_module = QString::fromUtf8(type.uri);
     d->m_name = name;
     d->m_version_maj = type.versionMajor;
     d->m_version_min = type.versionMinor;
@@ -283,7 +262,7 @@ QDeclarativeType::~QDeclarativeType()
     delete d;
 }
 
-QByteArray QDeclarativeType::module() const
+QString QDeclarativeType::module() const
 {
     return d->m_module;
 }
@@ -304,7 +283,7 @@ bool QDeclarativeType::availableInVersion(int vmajor, int vminor) const
     return vmajor == d->m_version_maj && vminor >= d->m_version_min;
 }
 
-bool QDeclarativeType::availableInVersion(const QByteArray &module, int vmajor, int vminor) const
+bool QDeclarativeType::availableInVersion(const QString &module, int vmajor, int vminor) const
 {
     Q_ASSERT(vmajor >= 0 && vminor >= 0);
     return module == d->m_module && vmajor == d->m_version_maj && vminor >= d->m_version_min;
@@ -398,6 +377,24 @@ static void clone(QMetaObjectBuilder &builder, const QMetaObject *mo,
     }
 }
 
+static bool isPropertyRevisioned(const QMetaObject *mo, int index)
+{
+    int i = index;
+    i -= mo->propertyOffset();
+    if (i < 0 && mo->d.superdata)
+        return isPropertyRevisioned(mo->d.superdata, index);
+
+    const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate*>(mo->d.data);
+    if (i >= 0 && i < mop->propertyCount) {
+        int handle = mop->propertyData + 3*i;
+        int flags = mo->d.data[handle + 2];
+
+        return (flags & Revisioned);
+    }
+
+    return false;
+}
+
 void QDeclarativeTypePrivate::init() const
 {
     if (m_isSetup) return;
@@ -410,8 +407,10 @@ void QDeclarativeTypePrivate::init() const
     // XXX - very inefficient
     const QMetaObject *mo = m_baseMetaObject;
     if (m_extFunc) {
-        QMetaObject *mmo = new QMetaObject;
-        *mmo = *m_extMetaObject;
+        QMetaObjectBuilder builder;
+        clone(builder, m_extMetaObject, m_extMetaObject, m_extMetaObject);
+        builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
+        QMetaObject *mmo = builder.toMetaObject();
         mmo->d.superdata = mo;
         QDeclarativeProxyMetaObject::ProxyData data = { mmo, m_extFunc, 0, 0 };
         m_metaObjects << data;
@@ -424,6 +423,7 @@ void QDeclarativeTypePrivate::init() const
             if (t->d->m_extFunc) {
                 QMetaObjectBuilder builder;
                 clone(builder, t->d->m_extMetaObject, t->d->m_baseMetaObject, m_baseMetaObject);
+                builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
                 QMetaObject *mmo = builder.toMetaObject();
                 mmo->d.superdata = m_baseMetaObject;
                 if (!m_metaObjects.isEmpty())
@@ -451,7 +451,7 @@ void QDeclarativeTypePrivate::init() const
             mo = m_metaObjects.first().metaObject;
 
         for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
-            if (mo->property(ii).revision() != 0)
+            if (isPropertyRevisioned(mo, ii))
                 m_containsRevisionedAttributes = true;
         }
 
@@ -497,14 +497,14 @@ QByteArray QDeclarativeType::typeName() const
 const QString &QDeclarativeType::elementName() const
 {
     if (d->m_elementName.isEmpty()) {
-        QByteArray n = qmlTypeName();
-        int idx = n.lastIndexOf('/');
-        d->m_elementName = QString::fromUtf8(n.mid(idx + 1));
+        QString n = qmlTypeName();
+        int idx = n.lastIndexOf(QLatin1Char('/'));
+        d->m_elementName = n.mid(idx + 1);
     }
     return d->m_elementName;
 }
 
-const QByteArray &QDeclarativeType::qmlTypeName() const
+const QString &QDeclarativeType::qmlTypeName() const
 {
     return d->m_name;
 }
@@ -682,7 +682,7 @@ QDeclarativeTypeModule::~QDeclarativeTypeModule()
     delete d; d = 0;
 }
 
-QByteArray QDeclarativeTypeModule::module() const
+QString QDeclarativeTypeModule::module() const
 {
     return d->uri.uri;
 }
@@ -887,7 +887,7 @@ int registerType(const QDeclarativePrivate::RegisterType &type)
     if (type.listId) data->lists.setBit(type.listId, true);
 
     if (type.uri) {
-        QByteArray mod(type.uri);
+        QString mod = QString::fromUtf8(type.uri);
 
         QDeclarativeMetaTypeData::VersionedUri versionedUri(mod, type.versionMajor);
         QDeclarativeTypeModule *module = data->uriToModule.value(versionedUri);
@@ -907,7 +907,7 @@ int registerModuleApi(const QDeclarativePrivate::RegisterModuleApi &api)
     QWriteLocker lock(metaTypeDataLock());
 
     QDeclarativeMetaTypeData *data = metaTypeData();
-    QByteArray uri(api.uri);
+    QString uri = QString::fromUtf8(api.uri);
     QDeclarativeMetaType::ModuleApi import;
     import.major = api.versionMajor;
     import.minor = api.versionMinor;
@@ -948,24 +948,10 @@ int QDeclarativePrivate::qmlregister(RegistrationType type, void *data)
     return -1;
 }
 
-bool QDeclarativeMetaType::isAnyModule(const QByteArray &module)
-{
-    QDeclarativeMetaTypeData *data = metaTypeData();
-
-    QDeclarativeMetaTypeData::ModuleInfoHash::Iterator it = data->modules.begin();
-    while (it != data->modules.end()) {
-        if (it.key().first == module)
-            return true;
-        ++it;
-    }
-
-    return false;
-}
-
 /*
     Returns true if a module \a uri of any version is installed.
 */
-bool QDeclarativeMetaType::isAnyModule(const QByteArray &uri)
+bool QDeclarativeMetaType::isAnyModule(const QString &uri)
 {
     QReadLocker lock(metaTypeDataLock());
     QDeclarativeMetaTypeData *data = metaTypeData();
@@ -986,7 +972,7 @@ bool QDeclarativeMetaType::isAnyModule(const QByteArray &uri)
 
     So if only 4.7 and 4.9 have been registered, 4.7,4.8, and 4.9 are valid, but not 4.6 nor 4.10.
 */
-bool QDeclarativeMetaType::isModule(const QByteArray &module, int versionMajor, int versionMinor)
+bool QDeclarativeMetaType::isModule(const QString &module, int versionMajor, int versionMinor)
 {
     Q_ASSERT(versionMajor >= 0 && versionMinor >= 0);
     QReadLocker lock(metaTypeDataLock());
@@ -1008,7 +994,7 @@ bool QDeclarativeMetaType::isModule(const QByteArray &module, int versionMajor,
     return false;
 }
 
-QDeclarativeTypeModule *QDeclarativeMetaType::typeModule(const QByteArray &uri, int majorVersion)
+QDeclarativeTypeModule *QDeclarativeMetaType::typeModule(const QString &uri, int majorVersion)
 {
     QReadLocker lock(metaTypeDataLock());
     QDeclarativeMetaTypeData *data = metaTypeData();
@@ -1028,7 +1014,7 @@ static bool operator<(const QDeclarativeMetaType::ModuleApi &lhs, const QDeclara
 }
 
 QDeclarativeMetaType::ModuleApi
-QDeclarativeMetaType::moduleApi(const QByteArray &uri, int versionMajor, int versionMinor)
+QDeclarativeMetaType::moduleApi(const QString &uri, int versionMajor, int versionMinor)
 {
     QReadLocker lock(metaTypeDataLock());
     QDeclarativeMetaTypeData *data = metaTypeData();
@@ -1051,6 +1037,21 @@ QDeclarativeMetaType::moduleApi(const QByteArray &uri, int versionMajor, int ver
     return ModuleApi();
 }
 
+QHash<QString, QList<QDeclarativeMetaType::ModuleApi> > QDeclarativeMetaType::moduleApis()
+{
+    QReadLocker lock(metaTypeDataLock());
+    QDeclarativeMetaTypeData *data = metaTypeData();
+
+    QHash<QString, QList<ModuleApi> > moduleApis;
+    QHashIterator<QString, QDeclarativeMetaTypeData::ModuleApiList> it(data->moduleApis);
+    while (it.hasNext()) {
+        it.next();
+        moduleApis[it.key()] = it.value().moduleApis;
+    }
+
+    return moduleApis;
+}
+
 QObject *QDeclarativeMetaType::toQObject(const QVariant &v, bool *ok)
 {
     if (!isQObject(v.userType())) {
@@ -1244,18 +1245,20 @@ QDeclarativeMetaType::StringConverter QDeclarativeMetaType::customStringConverte
     Returns the type (if any) of URI-qualified named \a name in version specified
     by \a version_major and \a version_minor.
 */
-QDeclarativeType *QDeclarativeMetaType::qmlType(const QByteArray &name, int version_major, int version_minor)
+QDeclarativeType *QDeclarativeMetaType::qmlType(const QString &name, int version_major, int version_minor)
 {
     Q_ASSERT(version_major >= 0 && version_minor >= 0);
     QReadLocker lock(metaTypeDataLock());
     QDeclarativeMetaTypeData *data = metaTypeData();
 
-    QList<QDeclarativeType*> types = data->nameToType.values(name);
-    foreach (QDeclarativeType *t, types) {
+    QDeclarativeMetaTypeData::Names::ConstIterator it = data->nameToType.find(name);
+    while (it != data->nameToType.end()) {
         // XXX version_major<0 just a kludge for QDeclarativePropertyPrivate::initProperty
-        if (version_major<0 || t->availableInVersion(version_major,version_minor))
-            return t;
+        if (it.key() == name && (version_major<0 || (*it)->availableInVersion(version_major,version_minor)))
+            return (*it);
+        ++it;
     }
+
     return 0;
 }
 
@@ -1276,7 +1279,7 @@ QDeclarativeType *QDeclarativeMetaType::qmlType(const QMetaObject *metaObject)
     by \a version_major and \a version_minor in module specified by \a uri.  Returns null if no
     type is registered.
 */
-QDeclarativeType *QDeclarativeMetaType::qmlType(const QMetaObject *metaObject, const QByteArray &module, int version_major, int version_minor)
+QDeclarativeType *QDeclarativeMetaType::qmlType(const QMetaObject *metaObject, const QString &module, int version_major, int version_minor)
 {
     Q_ASSERT(version_major >= 0 && version_minor >= 0);
     QReadLocker lock(metaTypeDataLock());
@@ -1312,7 +1315,7 @@ QDeclarativeType *QDeclarativeMetaType::qmlType(int userType)
 /*!
     Returns the list of registered QML type names.
 */
-QList<QByteArray> QDeclarativeMetaType::qmlTypeNames()
+QList<QString> QDeclarativeMetaType::qmlTypeNames()
 {
     QReadLocker lock(metaTypeDataLock());
     QDeclarativeMetaTypeData *data = metaTypeData();
@@ -1331,561 +1334,26 @@ QList<QDeclarativeType*> QDeclarativeMetaType::qmlTypes()
     return data->nameToType.values();
 }
 
-QT_END_NAMESPACE
-
-#include <QtGui/qfont.h>
-#include <QtGui/qpixmap.h>
-#include <QtGui/qbrush.h>
-#include <QtGui/qcolor.h>
-#include <QtGui/qpalette.h>
-#include <QtGui/qicon.h>
-#include <QtGui/qimage.h>
-#include <QtGui/qpolygon.h>
-#include <QtGui/qregion.h>
-#include <QtGui/qbitmap.h>
-#include <QtGui/qcursor.h>
-#include <QtGui/qsizepolicy.h>
-#include <QtGui/qkeysequence.h>
-#include <QtGui/qpen.h>
-
-//#include <QtGui/qtextlength.h>
-#include <QtGui/qtextformat.h>
-#include <QtGui/qmatrix.h>
-#include <QtGui/qtransform.h>
-#include <QtGui/qmatrix4x4.h>
-#include <QtGui/qvector2d.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qvector4d.h>
-#include <QtGui/qquaternion.h>
-#include <private/qv8engine_p.h>
-
-Q_DECLARE_METATYPE(QJSValue);
-Q_DECLARE_METATYPE(QDeclarativeV8Handle);
-
-QT_BEGIN_NAMESPACE
-
-bool QDeclarativeMetaType::canCopy(int type)
-{
-    switch(type) {
-    case QMetaType::VoidStar:
-    case QMetaType::QObjectStar:
-    case QMetaType::QWidgetStar:
-    case QMetaType::Long:
-    case QMetaType::Int:
-    case QMetaType::Short:
-    case QMetaType::Char:
-    case QMetaType::ULong:
-    case QMetaType::UInt:
-    case QMetaType::LongLong:
-    case QMetaType::ULongLong:
-    case QMetaType::UShort:
-    case QMetaType::UChar:
-    case QMetaType::Bool:
-    case QMetaType::Float:
-    case QMetaType::Double:
-    case QMetaType::QChar:
-    case QMetaType::QVariantMap:
-    case QMetaType::QVariantHash:
-    case QMetaType::QVariantList:
-    case QMetaType::QByteArray:
-    case QMetaType::QString:
-    case QMetaType::QStringList:
-    case QMetaType::QBitArray:
-    case QMetaType::QDate:
-    case QMetaType::QTime:
-    case QMetaType::QDateTime:
-    case QMetaType::QUrl:
-    case QMetaType::QLocale:
-    case QMetaType::QRect:
-    case QMetaType::QRectF:
-    case QMetaType::QSize:
-    case QMetaType::QSizeF:
-    case QMetaType::QLine:
-    case QMetaType::QLineF:
-    case QMetaType::QPoint:
-    case QMetaType::QPointF:
-    case QMetaType::QVector3D:
-#ifndef QT_NO_REGEXP
-    case QMetaType::QRegExp:
-#endif
-    case QMetaType::Void:
-#ifdef QT3_SUPPORT
-    case QMetaType::QColorGroup:
-#endif
-    case QMetaType::QFont:
-    case QMetaType::QPixmap:
-    case QMetaType::QBrush:
-    case QMetaType::QColor:
-    case QMetaType::QPalette:
-    case QMetaType::QIcon:
-    case QMetaType::QImage:
-    case QMetaType::QPolygon:
-    case QMetaType::QRegion:
-    case QMetaType::QBitmap:
-#ifndef QT_NO_CURSOR
-    case QMetaType::QCursor:
-#endif
-    case QMetaType::QSizePolicy:
-    case QMetaType::QKeySequence:
-    case QMetaType::QPen:
-    case QMetaType::QTextLength:
-    case QMetaType::QTextFormat:
-    case QMetaType::QMatrix:
-    case QMetaType::QTransform:
-    case QMetaType::QMatrix4x4:
-    case QMetaType::QVector2D:
-    case QMetaType::QVector4D:
-    case QMetaType::QQuaternion:
-        return true;
-
-    default:
-        if (type == qMetaTypeId<QVariant>() ||
-            type == qMetaTypeId<QJSValue>() ||
-            type == qMetaTypeId<QDeclarativeV8Handle>() ||
-            typeCategory(type) != Unknown) {
-            return true;
-        }
-        break;
+int QDeclarativeMetaType::QQuickAnchorLineMetaTypeId()
+{
+    static int id = 0;
+    if (!id) {
+        id = QMetaType::type("QQuickAnchorLine");
     }
-
-    return false;
+    return id;
 }
 
-/*!
-    Copies \a copy into \a data, assuming they both are of type \a type.  If
-    \a copy is zero, a default type is copied.  Returns true if the copy was
-    successful and false if not.
+QDeclarativeMetaType::CompareFunction QDeclarativeMetaType::anchorLineCompareFunction = 0;
 
-    \note This should move into QMetaType once complete
-
-*/
-bool QDeclarativeMetaType::copy(int type, void *data, const void *copy)
-{
-    if (copy) {
-        switch(type) {
-        case QMetaType::VoidStar:
-        case QMetaType::QObjectStar:
-        case QMetaType::QWidgetStar:
-            *static_cast<void **>(data) = *static_cast<void* const *>(copy);
-            return true;
-        case QMetaType::Long:
-            *static_cast<long *>(data) = *static_cast<const long*>(copy);
-            return true;
-        case QMetaType::Int:
-            *static_cast<int *>(data) = *static_cast<const int*>(copy);
-            return true;
-        case QMetaType::Short:
-            *static_cast<short *>(data) = *static_cast<const short*>(copy);
-            return true;
-        case QMetaType::Char:
-            *static_cast<char *>(data) = *static_cast<const char*>(copy);
-            return true;
-        case QMetaType::ULong:
-            *static_cast<ulong *>(data) = *static_cast<const ulong*>(copy);
-            return true;
-        case QMetaType::UInt:
-            *static_cast<uint *>(data) = *static_cast<const uint*>(copy);
-            return true;
-        case QMetaType::LongLong:
-            *static_cast<qlonglong *>(data) = *static_cast<const qlonglong*>(copy);
-            return true;
-        case QMetaType::ULongLong:
-            *static_cast<qulonglong *>(data) = *static_cast<const qulonglong*>(copy);
-            return true;
-        case QMetaType::UShort:
-            *static_cast<ushort *>(data) = *static_cast<const ushort*>(copy);
-            return true;
-        case QMetaType::UChar:
-            *static_cast<uchar *>(data) = *static_cast<const uchar*>(copy);
-            return true;
-        case QMetaType::Bool:
-            *static_cast<bool *>(data) = *static_cast<const bool*>(copy);
-            return true;
-        case QMetaType::Float:
-            *static_cast<float *>(data) = *static_cast<const float*>(copy);
-            return true;
-        case QMetaType::Double:
-            *static_cast<double *>(data) = *static_cast<const double*>(copy);
-            return true;
-        case QMetaType::QChar:
-            *static_cast<NS(QChar) *>(data) = *static_cast<const NS(QChar)*>(copy);
-            return true;
-        case QMetaType::QVariantMap:
-            *static_cast<NS(QVariantMap) *>(data) = *static_cast<const NS(QVariantMap)*>(copy);
-            return true;
-        case QMetaType::QVariantHash:
-            *static_cast<NS(QVariantHash) *>(data) = *static_cast<const NS(QVariantHash)*>(copy);
-            return true;
-        case QMetaType::QVariantList:
-            *static_cast<NS(QVariantList) *>(data) = *static_cast<const NS(QVariantList)*>(copy);
-            return true;
-        case QMetaType::QByteArray:
-            *static_cast<NS(QByteArray) *>(data) = *static_cast<const NS(QByteArray)*>(copy);
-            return true;
-        case QMetaType::QString:
-            *static_cast<NS(QString) *>(data) = *static_cast<const NS(QString)*>(copy);
-            return true;
-        case QMetaType::QStringList:
-            *static_cast<NS(QStringList) *>(data) = *static_cast<const NS(QStringList)*>(copy);
-            return true;
-        case QMetaType::QBitArray:
-            *static_cast<NS(QBitArray) *>(data) = *static_cast<const NS(QBitArray)*>(copy);
-            return true;
-        case QMetaType::QDate:
-            *static_cast<NS(QDate) *>(data) = *static_cast<const NS(QDate)*>(copy);
-            return true;
-        case QMetaType::QTime:
-            *static_cast<NS(QTime) *>(data) = *static_cast<const NS(QTime)*>(copy);
-            return true;
-        case QMetaType::QDateTime:
-            *static_cast<NS(QDateTime) *>(data) = *static_cast<const NS(QDateTime)*>(copy);
-            return true;
-        case QMetaType::QUrl:
-            *static_cast<NS(QUrl) *>(data) = *static_cast<const NS(QUrl)*>(copy);
-            return true;
-        case QMetaType::QLocale:
-            *static_cast<NS(QLocale) *>(data) = *static_cast<const NS(QLocale)*>(copy);
-            return true;
-        case QMetaType::QRect:
-            *static_cast<NS(QRect) *>(data) = *static_cast<const NS(QRect)*>(copy);
-            return true;
-        case QMetaType::QRectF:
-            *static_cast<NS(QRectF) *>(data) = *static_cast<const NS(QRectF)*>(copy);
-            return true;
-        case QMetaType::QSize:
-            *static_cast<NS(QSize) *>(data) = *static_cast<const NS(QSize)*>(copy);
-            return true;
-        case QMetaType::QSizeF:
-            *static_cast<NS(QSizeF) *>(data) = *static_cast<const NS(QSizeF)*>(copy);
-            return true;
-        case QMetaType::QLine:
-            *static_cast<NS(QLine) *>(data) = *static_cast<const NS(QLine)*>(copy);
-            return true;
-        case QMetaType::QLineF:
-            *static_cast<NS(QLineF) *>(data) = *static_cast<const NS(QLineF)*>(copy);
-            return true;
-        case QMetaType::QPoint:
-            *static_cast<NS(QPoint) *>(data) = *static_cast<const NS(QPoint)*>(copy);
-            return true;
-        case QMetaType::QPointF:
-            *static_cast<NS(QPointF) *>(data) = *static_cast<const NS(QPointF)*>(copy);
-            return true;
-        case QMetaType::QVector3D:
-            *static_cast<NS(QVector3D) *>(data) = *static_cast<const NS(QVector3D)*>(copy);
-            return true;
-#ifndef QT_NO_REGEXP
-        case QMetaType::QRegExp:
-            *static_cast<NS(QRegExp) *>(data) = *static_cast<const NS(QRegExp)*>(copy);
-            return true;
-#endif
-        case QMetaType::Void:
-            return true;
-
-
-#ifdef QT3_SUPPORT
-        case QMetaType::QColorGroup:
-            *static_cast<NS(QColorGroup) *>(data) = *static_cast<const NS(QColorGroup)*>(copy);
-            return true;
-#endif
-
-        case QMetaType::QFont:
-            *static_cast<NS(QFont) *>(data) = *static_cast<const NS(QFont)*>(copy);
-            return true;
-        case QMetaType::QPixmap:
-            *static_cast<NS(QPixmap) *>(data) = *static_cast<const NS(QPixmap)*>(copy);
-            return true;
-        case QMetaType::QBrush:
-            *static_cast<NS(QBrush) *>(data) = *static_cast<const NS(QBrush)*>(copy);
-            return true;
-        case QMetaType::QColor:
-            *static_cast<NS(QColor) *>(data) = *static_cast<const NS(QColor)*>(copy);
-            return true;
-        case QMetaType::QPalette:
-            *static_cast<NS(QPalette) *>(data) = *static_cast<const NS(QPalette)*>(copy);
-            return true;
-        case QMetaType::QIcon:
-            *static_cast<NS(QIcon) *>(data) = *static_cast<const NS(QIcon)*>(copy);
-            return true;
-        case QMetaType::QImage:
-            *static_cast<NS(QImage) *>(data) = *static_cast<const NS(QImage)*>(copy);
-            return true;
-        case QMetaType::QPolygon:
-            *static_cast<NS(QPolygon) *>(data) = *static_cast<const NS(QPolygon)*>(copy);
-            return true;
-        case QMetaType::QRegion:
-            *static_cast<NS(QRegion) *>(data) = *static_cast<const NS(QRegion)*>(copy);
-            return true;
-        case QMetaType::QBitmap:
-            *static_cast<NS(QBitmap) *>(data) = *static_cast<const NS(QBitmap)*>(copy);
-            return true;
-#ifndef QT_NO_CURSOR
-        case QMetaType::QCursor:
-            *static_cast<NS(QCursor) *>(data) = *static_cast<const NS(QCursor)*>(copy);
-            return true;
-#endif
-        case QMetaType::QSizePolicy:
-            *static_cast<NS(QSizePolicy) *>(data) = *static_cast<const NS(QSizePolicy)*>(copy);
-            return true;
-        case QMetaType::QKeySequence:
-            *static_cast<NS(QKeySequence) *>(data) = *static_cast<const NS(QKeySequence)*>(copy);
-            return true;
-        case QMetaType::QPen:
-            *static_cast<NS(QPen) *>(data) = *static_cast<const NS(QPen)*>(copy);
-            return true;
-        case QMetaType::QTextLength:
-            *static_cast<NS(QTextLength) *>(data) = *static_cast<const NS(QTextLength)*>(copy);
-            return true;
-        case QMetaType::QTextFormat:
-            *static_cast<NS(QTextFormat) *>(data) = *static_cast<const NS(QTextFormat)*>(copy);
-            return true;
-        case QMetaType::QMatrix:
-            *static_cast<NS(QMatrix) *>(data) = *static_cast<const NS(QMatrix)*>(copy);
-            return true;
-        case QMetaType::QTransform:
-            *static_cast<NS(QTransform) *>(data) = *static_cast<const NS(QTransform)*>(copy);
-            return true;
-        case QMetaType::QMatrix4x4:
-            *static_cast<NS(QMatrix4x4) *>(data) = *static_cast<const NS(QMatrix4x4)*>(copy);
-            return true;
-        case QMetaType::QVector2D:
-            *static_cast<NS(QVector2D) *>(data) = *static_cast<const NS(QVector2D)*>(copy);
-            return true;
-        case QMetaType::QVector4D:
-            *static_cast<NS(QVector4D) *>(data) = *static_cast<const NS(QVector4D)*>(copy);
-            return true;
-        case QMetaType::QQuaternion:
-            *static_cast<NS(QQuaternion) *>(data) = *static_cast<const NS(QQuaternion)*>(copy);
-            return true;
-
-        default:
-            if (type == qMetaTypeId<QVariant>()) {
-                *static_cast<NS(QVariant) *>(data) = *static_cast<const NS(QVariant)*>(copy);
-                return true;
-            } else if (type == qMetaTypeId<QJSValue>()) {
-                *static_cast<NS(QJSValue) *>(data) = *static_cast<const NS(QJSValue)*>(copy);
-                return true;
-            } else if (type == qMetaTypeId<QDeclarativeV8Handle>()) {
-                *static_cast<NS(QDeclarativeV8Handle) *>(data) = *static_cast<const NS(QDeclarativeV8Handle)*>(copy);
-                return true;
-            } else if (typeCategory(type) != Unknown) {
-                *static_cast<void **>(data) = *static_cast<void* const *>(copy);
-                return true;
-            }
-            break;
-        }
-    } else {
-        switch(type) {
-        case QMetaType::VoidStar:
-        case QMetaType::QObjectStar:
-        case QMetaType::QWidgetStar:
-            *static_cast<void **>(data) = 0;
-            return true;
-        case QMetaType::Long:
-            *static_cast<long *>(data) = long(0);
-            return true;
-        case QMetaType::Int:
-            *static_cast<int *>(data) = int(0);
-            return true;
-        case QMetaType::Short:
-            *static_cast<short *>(data) = short(0);
-            return true;
-        case QMetaType::Char:
-            *static_cast<char *>(data) = char(0);
-            return true;
-        case QMetaType::ULong:
-            *static_cast<ulong *>(data) = ulong(0);
-            return true;
-        case QMetaType::UInt:
-            *static_cast<uint *>(data) = uint(0);
-            return true;
-        case QMetaType::LongLong:
-            *static_cast<qlonglong *>(data) = qlonglong(0);
-            return true;
-        case QMetaType::ULongLong:
-            *static_cast<qulonglong *>(data) = qulonglong(0);
-            return true;
-        case QMetaType::UShort:
-            *static_cast<ushort *>(data) = ushort(0);
-            return true;
-        case QMetaType::UChar:
-            *static_cast<uchar *>(data) = uchar(0);
-            return true;
-        case QMetaType::Bool:
-            *static_cast<bool *>(data) = bool(false);
-            return true;
-        case QMetaType::Float:
-            *static_cast<float *>(data) = float(0);
-            return true;
-        case QMetaType::Double:
-            *static_cast<double *>(data) = double(0);
-            return true;
-        case QMetaType::QChar:
-            *static_cast<NS(QChar) *>(data) = NS(QChar)();
-            return true;
-        case QMetaType::QVariantMap:
-            *static_cast<NS(QVariantMap) *>(data) = NS(QVariantMap)();
-            return true;
-        case QMetaType::QVariantHash:
-            *static_cast<NS(QVariantHash) *>(data) = NS(QVariantHash)();
-            return true;
-        case QMetaType::QVariantList:
-            *static_cast<NS(QVariantList) *>(data) = NS(QVariantList)();
-            return true;
-        case QMetaType::QByteArray:
-            *static_cast<NS(QByteArray) *>(data) = NS(QByteArray)();
-            return true;
-        case QMetaType::QString:
-            *static_cast<NS(QString) *>(data) = NS(QString)();
-            return true;
-        case QMetaType::QStringList:
-            *static_cast<NS(QStringList) *>(data) = NS(QStringList)();
-            return true;
-        case QMetaType::QBitArray:
-            *static_cast<NS(QBitArray) *>(data) = NS(QBitArray)();
-            return true;
-        case QMetaType::QDate:
-            *static_cast<NS(QDate) *>(data) = NS(QDate)();
-            return true;
-        case QMetaType::QTime:
-            *static_cast<NS(QTime) *>(data) = NS(QTime)();
-            return true;
-        case QMetaType::QDateTime:
-            *static_cast<NS(QDateTime) *>(data) = NS(QDateTime)();
-            return true;
-        case QMetaType::QUrl:
-            *static_cast<NS(QUrl) *>(data) = NS(QUrl)();
-            return true;
-        case QMetaType::QLocale:
-            *static_cast<NS(QLocale) *>(data) = NS(QLocale)();
-            return true;
-        case QMetaType::QRect:
-            *static_cast<NS(QRect) *>(data) = NS(QRect)();
-            return true;
-        case QMetaType::QRectF:
-            *static_cast<NS(QRectF) *>(data) = NS(QRectF)();
-            return true;
-        case QMetaType::QSize:
-            *static_cast<NS(QSize) *>(data) = NS(QSize)();
-            return true;
-        case QMetaType::QSizeF:
-            *static_cast<NS(QSizeF) *>(data) = NS(QSizeF)();
-            return true;
-        case QMetaType::QLine:
-            *static_cast<NS(QLine) *>(data) = NS(QLine)();
-            return true;
-        case QMetaType::QLineF:
-            *static_cast<NS(QLineF) *>(data) = NS(QLineF)();
-            return true;
-        case QMetaType::QPoint:
-            *static_cast<NS(QPoint) *>(data) = NS(QPoint)();
-            return true;
-        case QMetaType::QPointF:
-            *static_cast<NS(QPointF) *>(data) = NS(QPointF)();
-            return true;
-        case QMetaType::QVector3D:
-            *static_cast<NS(QVector3D) *>(data) = NS(QVector3D)();
-            return true;
-#ifndef QT_NO_REGEXP
-        case QMetaType::QRegExp:
-            *static_cast<NS(QRegExp) *>(data) = NS(QRegExp)();
-            return true;
-#endif
-        case QMetaType::Void:
-            return true;
-
-#ifdef QT3_SUPPORT
-        case QMetaType::QColorGroup:
-            *static_cast<NS(QColorGroup) *>(data) = NS(QColorGroup)();
-            return true;
-#endif
-
-        case QMetaType::QFont:
-            *static_cast<NS(QFont) *>(data) = NS(QFont)();
-            return true;
-        case QMetaType::QPixmap:
-            *static_cast<NS(QPixmap) *>(data) = NS(QPixmap)();
-            return true;
-        case QMetaType::QBrush:
-            *static_cast<NS(QBrush) *>(data) = NS(QBrush)();
-            return true;
-        case QMetaType::QColor:
-            *static_cast<NS(QColor) *>(data) = NS(QColor)();
-            return true;
-        case QMetaType::QPalette:
-            *static_cast<NS(QPalette) *>(data) = NS(QPalette)();
-            return true;
-        case QMetaType::QIcon:
-            *static_cast<NS(QIcon) *>(data) = NS(QIcon)();
-            return true;
-        case QMetaType::QImage:
-            *static_cast<NS(QImage) *>(data) = NS(QImage)();
-            return true;
-        case QMetaType::QPolygon:
-            *static_cast<NS(QPolygon) *>(data) = NS(QPolygon)();
-            return true;
-        case QMetaType::QRegion:
-            *static_cast<NS(QRegion) *>(data) = NS(QRegion)();
-            return true;
-        case QMetaType::QBitmap:
-            *static_cast<NS(QBitmap) *>(data) = NS(QBitmap)();
-            return true;
-#ifndef QT_NO_CURSOR
-        case QMetaType::QCursor:
-            *static_cast<NS(QCursor) *>(data) = NS(QCursor)();
-            return true;
-#endif
-        case QMetaType::QSizePolicy:
-            *static_cast<NS(QSizePolicy) *>(data) = NS(QSizePolicy)();
-            return true;
-        case QMetaType::QKeySequence:
-            *static_cast<NS(QKeySequence) *>(data) = NS(QKeySequence)();
-            return true;
-        case QMetaType::QPen:
-            *static_cast<NS(QPen) *>(data) = NS(QPen)();
-            return true;
-        case QMetaType::QTextLength:
-            *static_cast<NS(QTextLength) *>(data) = NS(QTextLength)();
-            return true;
-        case QMetaType::QTextFormat:
-            *static_cast<NS(QTextFormat) *>(data) = NS(QTextFormat)();
-            return true;
-        case QMetaType::QMatrix:
-            *static_cast<NS(QMatrix) *>(data) = NS(QMatrix)();
-            return true;
-        case QMetaType::QTransform:
-            *static_cast<NS(QTransform) *>(data) = NS(QTransform)();
-            return true;
-        case QMetaType::QMatrix4x4:
-            *static_cast<NS(QMatrix4x4) *>(data) = NS(QMatrix4x4)();
-            return true;
-        case QMetaType::QVector2D:
-            *static_cast<NS(QVector2D) *>(data) = NS(QVector2D)();
-            return true;
-        case QMetaType::QVector4D:
-            *static_cast<NS(QVector4D) *>(data) = NS(QVector4D)();
-            return true;
-        case QMetaType::QQuaternion:
-            *static_cast<NS(QQuaternion) *>(data) = NS(QQuaternion)();
-            return true;
-        default:
-            if (type == qMetaTypeId<QVariant>()) {
-                *static_cast<NS(QVariant) *>(data) = NS(QVariant)();
-                return true;
-            } else if (type == qMetaTypeId<QJSValue>()) {
-                *static_cast<NS(QJSValue) *>(data) = NS(QJSValue)();
-                return true;
-            } else if (type == qMetaTypeId<QDeclarativeV8Handle>()) {
-                *static_cast<NS(QDeclarativeV8Handle) *>(data) = NS(QDeclarativeV8Handle)();
-                return true;
-            } else if (typeCategory(type) != Unknown) {
-                *static_cast<void **>(data) = 0;
-                return true;
-            }
-            break;
-        }
-    }
+void QDeclarativeMetaType::setQQuickAnchorLineCompareFunction(CompareFunction fun)
+{
+    anchorLineCompareFunction = fun;
+}
 
-    return false;
+bool QDeclarativeMetaType::QQuickAnchorLineCompare(const void *p1, const void *p2)
+{
+    Q_ASSERT(anchorLineCompareFunction != 0);
+    return anchorLineCompareFunction(p1, p2);
 }
 
 QT_END_NAMESPACE