Use QUrl constructor directly.
[profile/ivi/qtdeclarative.git] / src / qml / qml / qqmlproperty.cpp
index 00cb65d..0029861 100644 (file)
@@ -55,6 +55,7 @@
 #include "qqmlcompiler_p.h"
 #include "qqmlvmemetaobject_p.h"
 #include "qqmlexpression_p.h"
+#include "qqmlvaluetypeproxybinding_p.h"
 
 #include <QStringList>
 #include <QtCore/qdebug.h>
@@ -71,7 +72,8 @@ QT_BEGIN_NAMESPACE
 
 /*!
 \class QQmlProperty
-\since 4.7
+\since 5.0
+\inmodule QtQml
 \brief The QQmlProperty class abstracts accessing properties on objects created from  QML.
 
 As QML uses Qt's meta-type system all of the existing QMetaObject classes can be used to introspect
@@ -107,6 +109,8 @@ qWarning() << "Current pixel size:" << property.read().toInt();
 property.write(24);
 qWarning() << "Pixel size should now be 24:" << property.read().toInt();
 \endcode
+
+The QtQuick 1 version of this class was named QDeclarativeProperty.
 */
 
 /*!
@@ -333,7 +337,7 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name)
         signalName[0] = signalName.at(0).toLower();
 
         QMetaMethod method = findSignalByName(currentObject->metaObject(), signalName.toLatin1().constData());
-        if (method.signature()) {
+        if (method.isValid()) {
             object = currentObject;
             core.load(method);
             return;
@@ -916,21 +920,23 @@ QQmlPropertyPrivate::setBindingNoEnable(QObject *object, int coreIndex, int valu
     Returns the expression associated with this signal property, or 0 if no 
     signal expression exists.
 */
-QQmlExpression *
+QQmlBoundSignalExpression *
 QQmlPropertyPrivate::signalExpression(const QQmlProperty &that)
 {
     if (!(that.type() & QQmlProperty::SignalProperty))
         return 0;
 
-    const QObjectList &children = that.d->object->children();
-    
-    for (int ii = 0; ii < children.count(); ++ii) {
-        QObject *child = children.at(ii);
+    QQmlData *data = QQmlData::get(that.d->object);
+    if (!data)
+        return 0;
 
-        QQmlBoundSignal *signal = QQmlBoundSignal::cast(child);
-        if (signal && signal->index() == that.index()) 
-            return signal->expression();
-    }
+    QQmlAbstractBoundSignal *signalHandler = data->signalHandlers;
+
+    while (signalHandler && signalHandler->index() != that.index())
+        signalHandler = signalHandler->m_nextSignal;
+
+    if (signalHandler)
+        return signalHandler->expression();
 
     return 0;
 }
@@ -942,28 +948,31 @@ QQmlPropertyPrivate::signalExpression(const QQmlProperty &that)
     Ownership of \a expr transfers to QML.  Ownership of the return value is
     assumed by the caller.
 */
-QQmlExpression *
+QQmlBoundSignalExpression *
 QQmlPropertyPrivate::setSignalExpression(const QQmlProperty &that,
-                                                     QQmlExpression *expr) 
+                                         QQmlBoundSignalExpression *expr)
 {
     if (!(that.type() & QQmlProperty::SignalProperty)) {
         delete expr;
         return 0;
     }
 
-    const QObjectList &children = that.d->object->children();
-    
-    for (int ii = 0; ii < children.count(); ++ii) {
-        QObject *child = children.at(ii);
+    QQmlData *data = QQmlData::get(that.d->object, 0 != expr);
+    if (!data)
+        return 0;
 
-        QQmlBoundSignal *signal = QQmlBoundSignal::cast(child);
-        if (signal && signal->index() == that.index()) 
-            return signal->setExpression(expr);
-    }
+    QQmlAbstractBoundSignal *signalHandler = data->signalHandlers;
+
+    while (signalHandler && signalHandler->index() != that.index())
+        signalHandler = signalHandler->m_nextSignal;
+
+    if (signalHandler)
+        return signalHandler->setExpression(expr);
 
     if (expr) {
         QQmlBoundSignal *signal = new QQmlBoundSignal(that.d->object, that.method(), that.d->object);
-        return signal->setExpression(expr);
+        QQmlBoundSignalExpression *oldExpr = signal->setExpression(expr);
+        return oldExpr;
     } else {
         return 0;
     }
@@ -1075,22 +1084,6 @@ QVariant QQmlPropertyPrivate::readValueProperty()
     }
 }
 
-static QUrl urlFromUserString(const QByteArray &data)
-{
-    QUrl u;
-    if (!data.isEmpty())
-    {
-        // Preserve any valid percent-encoded octets supplied by the source
-        u.setEncodedUrl(data, QUrl::TolerantMode);
-    }
-    return u;
-}
-
-static QUrl urlFromUserString(const QString &data)
-{
-    return urlFromUserString(data.toUtf8());
-}
-
 // helper function to allow assignment / binding to QList<QUrl> properties.
 static QVariant resolvedUrlSequence(const QVariant &value, QQmlContextData *context)
 {
@@ -1098,19 +1091,19 @@ static QVariant resolvedUrlSequence(const QVariant &value, QQmlContextData *cont
     if (value.userType() == qMetaTypeId<QUrl>()) {
         urls.append(value.toUrl());
     } else if (value.userType() == qMetaTypeId<QString>()) {
-        urls.append(urlFromUserString(value.toString()));
+        urls.append(QUrl(value.toString()));
     } else if (value.userType() == qMetaTypeId<QByteArray>()) {
-        urls.append(urlFromUserString(value.toByteArray()));
+        urls.append(QUrl(QString::fromUtf8(value.toByteArray())));
     } else if (value.userType() == qMetaTypeId<QList<QUrl> >()) {
         urls = value.value<QList<QUrl> >();
     } else if (value.userType() == qMetaTypeId<QStringList>()) {
         QStringList urlStrings = value.value<QStringList>();
         for (int i = 0; i < urlStrings.size(); ++i)
-            urls.append(urlFromUserString(urlStrings.at(i)));
+            urls.append(QUrl(urlStrings.at(i)));
     } else if (value.userType() == qMetaTypeId<QList<QString> >()) {
         QList<QString> urlStrings = value.value<QList<QString> >();
         for (int i = 0; i < urlStrings.size(); ++i)
-            urls.append(urlFromUserString(urlStrings.at(i)));
+            urls.append(QUrl(urlStrings.at(i)));
     } // note: QList<QByteArray> is not currently supported.
 
     QList<QUrl> resolvedUrls;
@@ -1147,7 +1140,7 @@ bool QQmlPropertyPrivate::writeEnumProperty(const QMetaProperty &prop, int idx,
                 return false;
         } else if (v.userType() != QVariant::Int && v.userType() != QVariant::UInt) {
             int enumMetaTypeId = QMetaType::type(QByteArray(menum.scope() + QByteArray("::") + menum.name()));
-            if ((enumMetaTypeId == 0) || (v.userType() != enumMetaTypeId) || !v.constData())
+            if ((enumMetaTypeId == QMetaType::UnknownType) || (v.userType() != enumMetaTypeId) || !v.constData())
                 return false;
             v = QVariant(*reinterpret_cast<const int *>(v.constData()));
         }
@@ -1250,10 +1243,10 @@ bool QQmlPropertyPrivate::write(QObject *object,
             u = value.toUrl();
             found = true;
         } else if (variantType == QVariant::ByteArray) {
-            u = urlFromUserString(value.toByteArray());
+            u = QUrl(QString::fromUtf8(value.toByteArray()));
             found = true;
         } else if (variantType == QVariant::String) {
-            u = urlFromUserString(value.toString());
+            u = QUrl(value.toString());
             found = true;
         }
 
@@ -1517,37 +1510,35 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object,
             return true;
 
         const char *valueType = 0;
-        if (value.userType() == QVariant::Invalid) valueType = "null";
-        else valueType = QMetaType::typeName(value.userType());
+        const char *propertyType = 0;
+
+        if (value.userType() == QMetaType::QObjectStar) {
+            if (QObject *o = *(QObject **)value.constData()) {
+                valueType = o->metaObject()->className();
+
+                if (const QMetaObject *propertyMetaObject = rawMetaObjectForType(QQmlEnginePrivate::get(engine), type)) {
+                    propertyType = propertyMetaObject->className();
+                }
+            }
+        } else if (value.userType() != QVariant::Invalid) {
+            valueType = QMetaType::typeName(value.userType());
+        }
+
+        if (!valueType)
+            valueType = "null";
+        if (!propertyType)
+            propertyType = QMetaType::typeName(type);
 
         expression->delayedError()->error.setDescription(QLatin1String("Unable to assign ") +
                                                          QLatin1String(valueType) +
                                                          QLatin1String(" to ") +
-                                                         QLatin1String(QMetaType::typeName(type)));
+                                                         QLatin1String(propertyType));
         return false;
     }
 
     return true;
 }
 
-bool QQmlPropertyPrivate::writeBinding(const QQmlProperty &that, 
-                                               QQmlContextData *context,
-                                               QQmlJavaScriptExpression *expression, 
-                                               v8::Handle<v8::Value> result, bool isUndefined,
-                                               WriteFlags flags)
-{
-    QQmlPropertyPrivate *pp = that.d;
-
-    if (!pp)
-        return true;
-
-    QObject *object = that.object();
-    if (!object)
-        return true;
-
-    return writeBinding(object, pp->core, context, expression, result, isUndefined, flags);
-}
-
 const QMetaObject *QQmlPropertyPrivate::rawMetaObjectForType(QQmlEnginePrivate *engine, int userType)
 {
     if (engine) {
@@ -1707,7 +1698,7 @@ bool QQmlProperty::connectNotifySignal(QObject *dest, const char *slot) const
 
     QMetaProperty prop = d->object->metaObject()->property(d->core.coreIndex);
     if (prop.hasNotifySignal()) {
-        QByteArray signal(QByteArray("2") + prop.notifySignal().signature());
+        QByteArray signal(QByteArray("2") + prop.notifySignal().methodSignature());
         return QObject::connect(d->object, signal.constData(), dest, slot);
     } else  {
         return false;
@@ -1813,11 +1804,8 @@ QMetaMethod QQmlPropertyPrivate::findSignalByName(const QMetaObject *mo, const Q
     int methods = mo->methodCount();
     for (int ii = methods - 1; ii >= 2; --ii) { // >= 2 to block the destroyed signal
         QMetaMethod method = mo->method(ii);
-        QByteArray methodName = method.signature();
-        int idx = methodName.indexOf('(');
-        methodName = methodName.left(idx);
 
-        if (methodName == name)
+        if (method.name() == name)
             return method;
     }