19Q_CORE_EXPORT
bool qDecodeDataUrl(
const QUrl &uri, QString &mimeType, QByteArray &payload)
22
23
24
25
26
27
28
30 if (uri.scheme() !=
"data"_L1 || !uri.host().isEmpty())
33 payload = uri.toEncoded(QUrl::RemoveScheme);
37 const qsizetype pos = payload.indexOf(
',');
39 QByteArray contentType = payload.first(pos).percentDecoded();
40 auto data = QLatin1StringView{contentType};
41 data = data.trimmed();
43 QLatin1StringView mime;
44 QLatin1StringView charsetParam;
45 constexpr auto charset =
"charset"_L1;
47 for (
auto part : qTokenize(data, u';', Qt::SkipEmptyParts)) {
48 part = part.trimmed();
50 if (part.contains(u'/'))
56 if (part.startsWith(charset, Qt::CaseInsensitive))
59 if (!mime.isEmpty() && !charsetParam.isEmpty())
64 mime =
"text/plain"_L1;
65 if (charsetParam.isEmpty())
66 charsetParam =
"charset=US-ASCII"_L1;
68 if (!charsetParam.isEmpty())
69 mimeType = mime + u';' + charsetParam;
74 constexpr auto base64 =
";base64"_L1;
75 const bool isBas64 = data.endsWith(base64, Qt::CaseInsensitive);
77 payload.slice(pos + 1);
79 payload = std::move(payload).percentDecoded();
82 auto r = QByteArray::fromBase64Encoding(std::move(payload));
88 payload = std::move(r.decoded);