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 Element e = d->elements.at(1);
184 if (e.type == QCborValue::String) {
187 return QUrl::fromEncoded(bd->asByteArrayView()).toString(QUrl::FullyEncoded);
193 case qint64(QCborKnownTags::DateTimeString):
194 case qint64(QCborKnownTags::ExpectedBase64url):
195 case qint64(QCborKnownTags::ExpectedBase64):
196 case qint64(QCborKnownTags::ExpectedBase16):
197 case qint64(QCborKnownTags::Uuid): {
199 QString s = maybeEncodeTag(d);
206 return convertToJson(d, 1);
237 if (idx == -QCborValue::Array)
238 return convertToJsonArray(d, mode);
239 if (idx == -QCborValue::Map)
240 return convertToJsonObject(d, mode);
243 if (!d || d->elements.size() != 2)
244 return QJsonValue::Undefined;
245 return convertExtendedTypeToJson(d);
249 const auto &e = d->elements.at(idx);
251 case QCborValue::Integer:
252 return QJsonValue(e.value);
253 case QCborValue::ByteArray:
255 const auto value = makeString(d, idx, mode);
256 return value.isEmpty() ? QJsonValue() : QJsonPrivate::Value::fromTrustedCbor(value);
259 case QCborValue::RegularExpression:
263 case QCborValue::String:
264 case QCborValue::SimpleType:
268 case QCborValue::Array:
269 case QCborValue::Map:
270 case QCborValue::Tag:
271 case QCborValue::DateTime:
272 case QCborValue::Url:
273 case QCborValue::Uuid:
275 return convertToJson(e.flags & Element::IsContainer ? e.container :
nullptr, -e.type,
278 case QCborValue::Null:
279 case QCborValue::Undefined:
280 case QCborValue::Invalid:
283 case QCborValue::False:
286 case QCborValue::True:
289 case QCborValue::Double:
290 return fpToJson(e.fpvalue());
293 return QJsonPrivate::Value::fromTrustedCbor(makeString(d, idx, mode));
355QJsonValue QCborValue::toJsonValue()
const
358 return convertToJson(container, n < 0 ? -type() : n);
366 return QJsonPrivate::Value::fromTrustedCbor(*
this);
377 return fpToJson(fp_helper());
385 return QJsonValue::String;
393 return QJsonObject();
398 case RegularExpression:
401 return QJsonValue::Undefined;
404 return QJsonPrivate::Value::fromTrustedCbor(simpleTypeString(type()));
524QVariant QCborValue::toVariant()
const
541 return QVariant::fromValue(
nullptr);
547 return toByteArray();
553 return toArray().toVariantList();
556 return toMap().toVariantMap();
560 return taggedValue().toVariant();
562#if QT_CONFIG(datestring)
567#ifndef QT_BOOTSTRAPPED
571# if QT_CONFIG(regularexpression)
572 case RegularExpression:
573 return toRegularExpression();
588 return QVariant::fromValue(toSimpleType());
590 Q_UNREACHABLE_RETURN(QVariant());
651 int type = variant.metaType().id();
652 if (type == QMetaType::QString) {
654 }
else if (type == QMetaType::QByteArray) {
655 QByteArray ba = variant.toByteArray();
656 d->appendByteData(ba.constData(), ba.size(), QCborValue::ByteArray);
659 d
->append(QCborValue::fromVariant(variant));
715QCborValue QCborValue::fromVariant(
const QVariant &variant)
717 switch (variant.metaType().id()) {
718 case QMetaType::UnknownType:
720 case QMetaType::Nullptr:
722 case QMetaType::Bool:
723 return variant.toBool();
724 case QMetaType::Short:
725 case QMetaType::UShort:
727 case QMetaType::LongLong:
728 case QMetaType::Long:
729 case QMetaType::UInt:
730 return variant.toLongLong();
731 case QMetaType::ULong:
732 case QMetaType::ULongLong:
733 if (variant.toULongLong() <=
static_cast<uint64_t>(std::numeric_limits<qint64>::max()))
734 return variant.toLongLong();
736 case QMetaType::Float16:
737 case QMetaType::Float:
738 case QMetaType::Double:
739 return variant.toDouble();
740 case QMetaType::QString:
741 return variant.toString();
742 case QMetaType::QStringList:
743 return QCborArray::fromStringList(variant.toStringList());
744 case QMetaType::QByteArray:
745 return variant.toByteArray();
746#if QT_CONFIG(datestring)
747 case QMetaType::QDateTime:
748 return QCborValue(variant.toDateTime());
750#ifndef QT_BOOTSTRAPPED
751 case QMetaType::QUrl:
752 return QCborValue(variant.toUrl());
753 case QMetaType::QUuid:
754 return QCborValue(variant.toUuid());
756 case QMetaType::QVariantList:
757 return QCborArray::fromVariantList(variant.toList());
758 case QMetaType::QVariantMap:
759 return QCborMap::fromVariantMap(variant.toMap());
760 case QMetaType::QVariantHash:
761 return QCborMap::fromVariantHash(variant.toHash());
762#ifndef QT_BOOTSTRAPPED
763#if QT_CONFIG(regularexpression)
764 case QMetaType::QRegularExpression:
765 return QCborValue(variant.toRegularExpression());
767 case QMetaType::QJsonValue:
768 return fromJsonValue(variant.toJsonValue());
769 case QMetaType::QJsonObject:
770 return QCborMap::fromJsonObject(variant.toJsonObject());
771 case QMetaType::QJsonArray:
772 return QCborArray::fromJsonArray(variant.toJsonArray());
773 case QMetaType::QJsonDocument: {
774 QJsonDocument doc = variant.toJsonDocument();
776 return QCborArray::fromJsonArray(doc.array());
777 return QCborMap::fromJsonObject(doc.object());
779 case QMetaType::QCborValue:
780 return qvariant_cast<QCborValue>(variant);
781 case QMetaType::QCborArray:
782 return qvariant_cast<QCborArray>(variant);
783 case QMetaType::QCborMap:
784 return qvariant_cast<QCborMap>(variant);
785 case QMetaType::QCborSimpleType:
786 return qvariant_cast<QCborSimpleType>(variant);
792 if (variant.isNull())
793 return QCborValue(
nullptr);
795 QString string = variant.toString();