diff options
author | Jonas M. Gastal <jgastal@profusion.mobi> | 2011-12-29 12:24:17 -0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-29 16:20:45 +0100 |
commit | 231369eb043e9c5221da1a4f2a724643a3f380f3 (patch) | |
tree | 0aeb845bbeea919dba5485c2351f3d7341525d0e /src | |
parent | 4c1469f7da33dd65eb5e8e9a50b79d935eb4add0 (diff) |
Make qDecodeDataUrl return bool.
Change-Id: I23b9fed39af7bea6c171b35e10bd72c424bd903e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/io/qdataurl.cpp | 66 | ||||
-rw-r--r-- | src/corelib/io/qdataurl_p.h | 2 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 8 | ||||
-rw-r--r-- | src/network/access/qnetworkreplydataimpl.cpp | 15 | ||||
-rw-r--r-- | src/network/access/qnetworkreplydataimpl_p.h | 1 |
5 files changed, 45 insertions, 47 deletions
diff --git a/src/corelib/io/qdataurl.cpp b/src/corelib/io/qdataurl.cpp index ed8abdd839..2764212279 100644 --- a/src/corelib/io/qdataurl.cpp +++ b/src/corelib/io/qdataurl.cpp @@ -51,51 +51,49 @@ QT_BEGIN_NAMESPACE Decode a data: URL into its mimetype and payload. Returns a null string if the URL could not be decoded. */ -Q_CORE_EXPORT QPair<QString, QByteArray> qDecodeDataUrl(const QUrl &uri) +Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &uri, QString &mimeType, QByteArray &payload) { - QString mimeType; - QByteArray payload; + if (uri.scheme() != QLatin1String("data") || !uri.host().isEmpty()) + return false; - if (uri.scheme() == QLatin1String("data") && uri.host().isEmpty()) { - mimeType = QLatin1String("text/plain;charset=US-ASCII"); + mimeType = QLatin1String("text/plain;charset=US-ASCII"); - // the following would have been the correct thing, but - // reality often differs from the specification. People have - // data: URIs with ? and # - //QByteArray data = QByteArray::fromPercentEncoding(uri.encodedPath()); - QByteArray data = QByteArray::fromPercentEncoding(uri.toEncoded()); + // the following would have been the correct thing, but + // reality often differs from the specification. People have + // data: URIs with ? and # + //QByteArray data = QByteArray::fromPercentEncoding(uri.encodedPath()); + QByteArray data = QByteArray::fromPercentEncoding(uri.toEncoded()); - // remove the data: scheme - data.remove(0, 5); + // remove the data: scheme + data.remove(0, 5); - // parse it: - int pos = data.indexOf(','); - if (pos != -1) { - payload = data.mid(pos + 1); - data.truncate(pos); - data = data.trimmed(); + // parse it: + int pos = data.indexOf(','); + if (pos != -1) { + payload = data.mid(pos + 1); + data.truncate(pos); + data = data.trimmed(); - // find out if the payload is encoded in Base64 - if (data.endsWith(";base64")) { - payload = QByteArray::fromBase64(payload); - data.chop(7); - } + // find out if the payload is encoded in Base64 + if (data.endsWith(";base64")) { + payload = QByteArray::fromBase64(payload); + data.chop(7); + } - if (data.toLower().startsWith("charset")) { - int i = 7; // strlen("charset") - while (data.at(i) == ' ') - ++i; - if (data.at(i) == '=') - data.prepend("text/plain;"); - } + if (data.toLower().startsWith("charset")) { + int i = 7; // strlen("charset") + while (data.at(i) == ' ') + ++i; + if (data.at(i) == '=') + data.prepend("text/plain;"); + } - if (!data.isEmpty()) - mimeType = QLatin1String(data.trimmed()); + if (!data.isEmpty()) + mimeType = QLatin1String(data.trimmed()); - } } - return QPair<QString,QByteArray>(mimeType,payload); + return true; } QT_END_NAMESPACE diff --git a/src/corelib/io/qdataurl_p.h b/src/corelib/io/qdataurl_p.h index d666d9e52a..a8c9ed847b 100644 --- a/src/corelib/io/qdataurl_p.h +++ b/src/corelib/io/qdataurl_p.h @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE -Q_CORE_EXPORT QPair<QString, QByteArray> qDecodeDataUrl(const QUrl &url); +Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &url, QString &mimeType, QByteArray &payload); QT_END_NAMESPACE diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 8d9a8c405a..1028a2329a 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -1925,8 +1925,12 @@ QVariant QTextDocument::loadResource(int type, const QUrl &name) #endif // handle data: URLs - if (r.isNull() && name.scheme().compare(QLatin1String("data"), Qt::CaseInsensitive) == 0) - r = qDecodeDataUrl(name).second; + if (r.isNull() && name.scheme().compare(QLatin1String("data"), Qt::CaseInsensitive) == 0) { + QString mimetype; + QByteArray payload; + if (qDecodeDataUrl(name, mimetype, payload)) + r = payload; + } // if resource was not loaded try to load it here if (!doc && r.isNull() && name.isRelative()) { diff --git a/src/network/access/qnetworkreplydataimpl.cpp b/src/network/access/qnetworkreplydataimpl.cpp index 0cd10ce13b..285b41190d 100644 --- a/src/network/access/qnetworkreplydataimpl.cpp +++ b/src/network/access/qnetworkreplydataimpl.cpp @@ -70,19 +70,16 @@ QNetworkReplyDataImpl::QNetworkReplyDataImpl(QObject *parent, const QNetworkRequ QNetworkReply::open(QIODevice::ReadOnly); QUrl url = req.url(); - - // FIXME qDecodeDataUrl should instead be rewritten to have the QByteArray - // and the mime type as an output parameter and return a bool instead - d->decodeDataUrlResult = qDecodeDataUrl(url); - - if (! d->decodeDataUrlResult.first.isNull()) { - QString &mimeType = d->decodeDataUrlResult.first; - qint64 size = d->decodeDataUrlResult.second.size(); + QString mimeType; + QByteArray payload; + if (qDecodeDataUrl(url, mimeType, payload)) { + QString &mimeType = mimeType; + qint64 size = payload.size(); setHeader(QNetworkRequest::ContentTypeHeader, mimeType); setHeader(QNetworkRequest::ContentLengthHeader, size); QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection); - d->decodedData.setBuffer(&d->decodeDataUrlResult.second); + d->decodedData.setBuffer(&payload); d->decodedData.open(QIODevice::ReadOnly); QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection, diff --git a/src/network/access/qnetworkreplydataimpl_p.h b/src/network/access/qnetworkreplydataimpl_p.h index a63c4b1eec..11e17d1c43 100644 --- a/src/network/access/qnetworkreplydataimpl_p.h +++ b/src/network/access/qnetworkreplydataimpl_p.h @@ -87,7 +87,6 @@ public: QNetworkReplyDataImplPrivate(); ~QNetworkReplyDataImplPrivate(); - QPair<QString, QByteArray> decodeDataUrlResult; QBuffer decodedData; Q_DECLARE_PUBLIC(QNetworkReplyDataImpl) |