QNetworkReplyDataImpl::QNetworkReplyDataImpl(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op) : QNetworkReply(*new QNetworkReplyDataImplPrivate(), parent) { Q_D(QNetworkReplyDataImpl); setRequest(req); setUrl(req.url()); setOperation(op); setFinished(true); 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(); setHeader(QNetworkRequest::ContentTypeHeader, mimeType); setHeader(QNetworkRequest::ContentLengthHeader, size); QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection); d->decodedData.setBuffer(&d->decodeDataUrlResult.second); d->decodedData.open(QIODevice::ReadOnly); QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection, Q_ARG(qint64,size), Q_ARG(qint64, size)); QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection); QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection); } else { // something wrong with this URI const QString msg = QCoreApplication::translate("QNetworkAccessDataBackend", "Invalid URI: %1").arg(QString::fromLatin1(url.toEncoded())); setError(QNetworkReply::ProtocolFailure, msg); QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProtocolFailure)); QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection); } }
void QNetworkAccessDataBackend::open() { QUrl uri = request().url(); if (operation() != QNetworkAccessManager::GetOperation && operation() != QNetworkAccessManager::HeadOperation) { // data: doesn't support anything but GET const QString msg = QCoreApplication::translate("QNetworkAccessDataBackend", "Operation not supported on %1") .arg(uri.toString()); error(QNetworkReply::ContentOperationNotPermittedError, msg); finished(); return; } QPair<QString, QByteArray> decoded = qDecodeDataUrl(uri); if (! decoded.first.isNull()) { setHeader(QNetworkRequest::ContentTypeHeader, decoded.first); setHeader(QNetworkRequest::ContentLengthHeader, decoded.second.size()); emit metaDataChanged(); QByteDataBuffer list; list.append(decoded.second); decoded.second.clear(); // important because of implicit sharing! writeDownstreamData(list); finished(); return; } // something wrong with this URI const QString msg = QCoreApplication::translate("QNetworkAccessDataBackend", "Invalid URI: %1").arg(uri.toString()); error(QNetworkReply::ProtocolFailure, msg); finished(); }
QNetworkReplyDataImpl::QNetworkReplyDataImpl(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op) : QNetworkReply(*new QNetworkReplyDataImplPrivate(), parent) { Q_D(QNetworkReplyDataImpl); setRequest(req); setUrl(req.url()); setOperation(op); setFinished(true); QNetworkReply::open(QIODevice::ReadOnly); QUrl url = req.url(); QString mimeType; QByteArray payload; if (qDecodeDataUrl(url, mimeType, payload)) { qint64 size = payload.size(); setHeader(QNetworkRequest::ContentTypeHeader, mimeType); setHeader(QNetworkRequest::ContentLengthHeader, size); QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection); d->decodedData.setData(payload); d->decodedData.open(QIODevice::ReadOnly); QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection, Q_ARG(qint64,size), Q_ARG(qint64, size)); QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection); QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection); } else { // something wrong with this URI const QString msg = QCoreApplication::translate("QNetworkAccessDataBackend", "Invalid URI: %1").arg(url.toString()); setError(QNetworkReply::ProtocolFailure, msg); QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNetworkReply::NetworkError, QNetworkReply::ProtocolFailure)); QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection); } }