From 20598f53df8da349e5b0cf4c4bed7d0f4c9292b0 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 31 Oct 2014 11:43:32 +0100 Subject: Improve conversion of QVariants with QJsonValues Adds conversion from QJsonArray and QJsonObject, and report missing conversion failures for other QJsonValues. Change-Id: Ic0c3a952657912401db877b068f7fcc3c08c94c2 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant.cpp | 62 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 528ba190d6..248ca4923b 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -201,6 +201,12 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok) return v_cast(d)->toLongLong(ok); case QVariant::Bool: return qlonglong(d->data.b); +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + if (!v_cast(d)->isDouble()) + break; + // no break +#endif case QVariant::Double: case QVariant::Int: case QMetaType::Char: @@ -209,7 +215,6 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok) case QMetaType::Long: case QMetaType::Float: case QMetaType::LongLong: - case QMetaType::QJsonValue: return qMetaTypeNumber(d); case QVariant::ULongLong: case QVariant::UInt: @@ -271,6 +276,12 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok) return v_cast(d)->toULongLong(ok); case QVariant::Bool: return qulonglong(d->data.b); +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + if (!v_cast(d)->isDouble()) + break; + // no break +#endif case QVariant::Double: case QVariant::Int: case QMetaType::Char: @@ -279,7 +290,6 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok) case QMetaType::Long: case QMetaType::Float: case QMetaType::LongLong: - case QMetaType::QJsonValue: return qulonglong(qMetaTypeNumber(d)); case QVariant::ULongLong: case QVariant::UInt: @@ -413,7 +423,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) *str = v_cast(d)->toString(); break; case QMetaType::QJsonValue: - *str = v_cast(d)->toString(); + if (v_cast(d)->isString()) + *str = v_cast(d)->toString(); + else if (!v_cast(d)->isNull()) + return false; break; #endif case QVariant::Uuid: @@ -657,7 +670,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) break; #ifndef QT_BOOTSTRAPPED case QMetaType::QJsonValue: - *b = v_cast(d)->toBool(); + *b = v_cast(d)->toBool(false); + if (!v_cast(d)->isBool()) + return false; break; #endif default: @@ -698,7 +713,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) break; #ifndef QT_BOOTSTRAPPED case QMetaType::QJsonValue: - *f = v_cast(d)->toDouble(); + *f = v_cast(d)->toDouble(0.0); + if (!v_cast(d)->isDouble()) + return false; break; #endif default: @@ -739,7 +756,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) break; #ifndef QT_BOOTSTRAPPED case QMetaType::QJsonValue: - *f = v_cast(d)->toDouble(); + *f = v_cast(d)->toDouble(0.0); + if (!v_cast(d)->isDouble()) + return false; break; #endif default: @@ -757,6 +776,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) } else if (qstrcmp(QMetaType::typeName(d->type), "QList") == 0) { *static_cast(result) = *static_cast *>(d->data.shared->ptr); +#ifndef QT_BOOTSTRAPPED + } else if (d->type == QMetaType::QJsonValue) { + if (!v_cast(d)->isArray()) + return false; + *static_cast(result) = v_cast(d)->toArray().toVariantList(); + } else if (d->type == QMetaType::QJsonArray) { + *static_cast(result) = v_cast(d)->toVariantList(); +#endif } else { return false; } @@ -765,6 +792,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) if (qstrcmp(QMetaType::typeName(d->type), "QMap") == 0) { *static_cast(result) = *static_cast *>(d->data.shared->ptr); +#ifndef QT_BOOTSTRAPPED + } else if (d->type == QMetaType::QJsonValue) { + if (!v_cast(d)->isObject()) + return false; + *static_cast(result) = v_cast(d)->toObject().toVariantMap(); + } else if (d->type == QMetaType::QJsonObject) { + *static_cast(result) = v_cast(d)->toVariantMap(); +#endif } else { return false; } @@ -773,6 +808,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) if (qstrcmp(QMetaType::typeName(d->type), "QHash") == 0) { *static_cast(result) = *static_cast *>(d->data.shared->ptr); +#ifndef QT_BOOTSTRAPPED + } else if (d->type == QMetaType::QJsonValue) { + if (!v_cast(d)->isObject()) + return false; + *static_cast(result) = v_cast(d)->toObject().toVariantHash(); + } else if (d->type == QMetaType::QJsonObject) { + *static_cast(result) = v_cast(d)->toVariantHash(); +#endif } else { return false; } @@ -2924,11 +2967,18 @@ bool QVariant::canConvert(int targetTypeId) const case QMetaType::Char: case QMetaType::SChar: case QMetaType::Short: + case QMetaType::QVariantList: + case QMetaType::QVariantMap: + case QMetaType::QVariantHash: return true; default: return false; } } + if (currentType == QMetaType::QJsonArray) + return targetTypeId == QMetaType::QVariantList; + if (currentType == QMetaType::QJsonObject) + return targetTypeId == QMetaType::QVariantMap || targetTypeId == QMetaType::QVariantHash; // FIXME It should be LastCoreType intead of Uuid if (currentType > int(QMetaType::QUuid) || targetTypeId > int(QMetaType::QUuid)) { -- cgit v1.2.3