51 QByteArray data = QByteArray::fromRawData(b->byte(), b->len);
52 if (encoding == QCborKnownTags::ExpectedBase16)
54 else if (encoding == QCborKnownTags::ExpectedBase64)
55 data = data.toBase64();
57 data = data.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
59 return QString::fromLatin1(data);
67 qint64 tag = d->elements.at(0).value;
68 const Element &e = d->elements.at(1);
71 case qint64(QCborKnownTags::DateTimeString):
72 case qint64(QCborKnownTags::Url):
73 if (e.type == QCborValue::String)
74 return makeString(d, 1);
77 case qint64(QCborKnownTags::ExpectedBase64url):
78 case qint64(QCborKnownTags::ExpectedBase64):
79 case qint64(QCborKnownTags::ExpectedBase16):
80 if (e.type == QCborValue::ByteArray)
81 return encodeByteArray(d, 1, QCborTag(tag));
84 case qint64(QCborKnownTags::Uuid):
85#ifndef QT_BOOTSTRAPPED
86 if (
const ByteData *b = d->byteData(e); e.type == QCborValue::ByteArray && b
87 && b->len ==
sizeof(QUuid))
88 return QUuid::fromRfc4122(b->asByteArrayView()).toString(QUuid::WithoutBraces);
111Q_NEVER_INLINE
static QString makeString(
const QCborContainerPrivate *d, qsizetype idx,
114 const auto &e = d->elements.at(idx);
117 case QCborValue::Integer:
118 return QString::number(qint64(e.value));
120 case QCborValue::Double:
121 return QString::number(e.fpvalue());
123 case QCborValue::ByteArray:
124 return mode == ConversionMode::FromVariantToJson
126 : encodeByteArray(d, idx, QCborTag(QCborKnownTags::ExpectedBase64url));
128 case QCborValue::String:
129 return d->stringAt(idx);
131 case QCborValue::Array:
132 case QCborValue::Map:
133#if defined(QT_BOOTSTRAPPED)
134 Q_UNREACHABLE_RETURN(QString());
136 return d->valueAt(idx).toDiagnosticNotation(QCborValue::Compact);
139 case QCborValue::SimpleType:
142 case QCborValue::False:
143 return QStringLiteral(
"false");
145 case QCborValue::True:
146 return QStringLiteral(
"true");
148 case QCborValue::Null:
149 return QStringLiteral(
"null");
151 case QCborValue::Undefined:
152 return QStringLiteral(
"undefined");
154 case QCborValue::Invalid:
157 case QCborValue::Tag:
158 case QCborValue::DateTime:
159 case QCborValue::Url:
160 case QCborValue::RegularExpression:
161 case QCborValue::Uuid:
162 return encodeTag(e.flags & Element::IsContainer ? e.container :
nullptr);
166 return simpleTypeString(e.type);
174 qint64 tag = d->elements.at(0).value;
177 case qint64(QCborKnownTags::Url):
178#ifdef QT_BOOTSTRAPPED
182 if (d->elements.at(1).type == QCborValue::String)
183 return QUrl::fromEncoded(d->byteData(1)->asByteArrayView()).toString(QUrl::FullyEncoded);
187 case qint64(QCborKnownTags::DateTimeString):
188 case qint64(QCborKnownTags::ExpectedBase64url):
189 case qint64(QCborKnownTags::ExpectedBase64):
190 case qint64(QCborKnownTags::ExpectedBase16):
191 case qint64(QCborKnownTags::Uuid): {
193 QString s = maybeEncodeTag(d);
200 return qt_convertToJson(d, 1);
231 if (idx == -QCborValue::Array)
232 return convertToJsonArray(d, mode);
233 if (idx == -QCborValue::Map)
234 return convertToJsonObject(d, mode);
237 if (!d || d->elements.size() != 2)
238 return QJsonValue::Undefined;
239 return convertExtendedTypeToJson(d);
243 const auto &e = d->elements.at(idx);
245 case QCborValue::Integer:
246 return QJsonValue(e.value);
247 case QCborValue::ByteArray:
249 const auto value = makeString(d, idx, mode);
250 return value.isEmpty() ? QJsonValue() : QJsonPrivate::Value::fromTrustedCbor(value);
253 case QCborValue::RegularExpression:
257 case QCborValue::String:
258 case QCborValue::SimpleType:
262 case QCborValue::Array:
263 case QCborValue::Map:
264 case QCborValue::Tag:
265 case QCborValue::DateTime:
266 case QCborValue::Url:
267 case QCborValue::Uuid:
269 return qt_convertToJson(e.flags & Element::IsContainer ? e.container :
nullptr, -e.type,
272 case QCborValue::Null:
273 case QCborValue::Undefined:
274 case QCborValue::Invalid:
277 case QCborValue::False:
280 case QCborValue::True:
283 case QCborValue::Double:
284 return fpToJson(e.fpvalue());
287 return QJsonPrivate::Value::fromTrustedCbor(makeString(d, idx, mode));
349QJsonValue QCborValue::toJsonValue()
const
352 return qt_convertToJson(container, n < 0 ? -type() : n);
360 return QJsonPrivate::Value::fromTrustedCbor(*
this);
371 return fpToJson(fp_helper());
379 return QJsonValue::String;
387 return QJsonObject();
392 case RegularExpression:
395 return QJsonValue::Undefined;
398 return QJsonPrivate::Value::fromTrustedCbor(simpleTypeString(type()));
518QVariant QCborValue::toVariant()
const
535 return QVariant::fromValue(
nullptr);
541 return toByteArray();
547 return toArray().toVariantList();
550 return toMap().toVariantMap();
554 return taggedValue().toVariant();
556#if QT_CONFIG(datestring)
561#ifndef QT_BOOTSTRAPPED
565# if QT_CONFIG(regularexpression)
566 case RegularExpression:
567 return toRegularExpression();
582 return QVariant::fromValue(toSimpleType());
584 Q_UNREACHABLE_RETURN(QVariant());
645 int type = variant.metaType().id();
646 if (type == QMetaType::QString) {
648 }
else if (type == QMetaType::QByteArray) {
649 QByteArray ba = variant.toByteArray();
650 d->appendByteData(ba.constData(), ba.size(), QCborValue::ByteArray);
653 d->append(QCborValue::fromVariant(variant));
709QCborValue QCborValue::fromVariant(
const QVariant &variant)
711 switch (variant.metaType().id()) {
712 case QMetaType::UnknownType:
714 case QMetaType::Nullptr:
716 case QMetaType::Bool:
717 return variant.toBool();
718 case QMetaType::Short:
719 case QMetaType::UShort:
721 case QMetaType::LongLong:
722 case QMetaType::Long:
723 case QMetaType::UInt:
724 return variant.toLongLong();
725 case QMetaType::ULong:
726 case QMetaType::ULongLong:
727 if (variant.toULongLong() <=
static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
728 return variant.toLongLong();
730 case QMetaType::Float16:
731 case QMetaType::Float:
732 case QMetaType::Double:
733 return variant.toDouble();
734 case QMetaType::QString:
735 return variant.toString();
736 case QMetaType::QStringList:
737 return QCborArray::fromStringList(variant.toStringList());
738 case QMetaType::QByteArray:
739 return variant.toByteArray();
740#if QT_CONFIG(datestring)
741 case QMetaType::QDateTime:
742 return QCborValue(variant.toDateTime());
744#ifndef QT_BOOTSTRAPPED
745 case QMetaType::QUrl:
746 return QCborValue(variant.toUrl());
747 case QMetaType::QUuid:
748 return QCborValue(variant.toUuid());
750 case QMetaType::QVariantList:
751 return QCborArray::fromVariantList(variant.toList());
752 case QMetaType::QVariantMap:
753 return QCborMap::fromVariantMap(variant.toMap());
754 case QMetaType::QVariantHash:
755 return QCborMap::fromVariantHash(variant.toHash());
756#ifndef QT_BOOTSTRAPPED
757#if QT_CONFIG(regularexpression)
758 case QMetaType::QRegularExpression:
759 return QCborValue(variant.toRegularExpression());
761 case QMetaType::QJsonValue:
762 return fromJsonValue(variant.toJsonValue());
763 case QMetaType::QJsonObject:
764 return QCborMap::fromJsonObject(variant.toJsonObject());
765 case QMetaType::QJsonArray:
766 return QCborArray::fromJsonArray(variant.toJsonArray());
767 case QMetaType::QJsonDocument: {
768 QJsonDocument doc = variant.toJsonDocument();
770 return QCborArray::fromJsonArray(doc.array());
771 return QCborMap::fromJsonObject(doc.object());
773 case QMetaType::QCborValue:
774 return qvariant_cast<QCborValue>(variant);
775 case QMetaType::QCborArray:
776 return qvariant_cast<QCborArray>(variant);
777 case QMetaType::QCborMap:
778 return qvariant_cast<QCborMap>(variant);
779 case QMetaType::QCborSimpleType:
780 return qvariant_cast<QCborSimpleType>(variant);
786 if (variant.isNull())
787 return QCborValue(
nullptr);
789 QString string = variant.toString();