Make qDecodeDataUrl return bool.
authorJonas M. Gastal <jgastal@profusion.mobi>
Thu, 29 Dec 2011 14:24:17 +0000 (12:24 -0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 29 Dec 2011 15:20:45 +0000 (16:20 +0100)
Change-Id: I23b9fed39af7bea6c171b35e10bd72c424bd903e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/io/qdataurl.cpp
src/corelib/io/qdataurl_p.h
src/gui/text/qtextdocument.cpp
src/network/access/qnetworkreplydataimpl.cpp
src/network/access/qnetworkreplydataimpl_p.h

index ed8abdd..2764212 100644 (file)
@@ -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
index d666d9e..a8c9ed8 100644 (file)
@@ -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
 
index 8d9a8c4..1028a23 100644 (file)
@@ -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()) {
index 0cd10ce..285b411 100644 (file)
@@ -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,
index a63c4b1..11e17d1 100644 (file)
@@ -87,7 +87,6 @@ public:
     QNetworkReplyDataImplPrivate();
     ~QNetworkReplyDataImplPrivate();
 
-    QPair<QString, QByteArray> decodeDataUrlResult;
     QBuffer decodedData;
 
     Q_DECLARE_PUBLIC(QNetworkReplyDataImpl)