public slots:
void finished();
void downloadProgress(qint64, qint64);
+ void manualFinished(QNetworkReply*);
private:
QQmlDataLoader *l;
l->networkReplyProgress(reply, bytesReceived, bytesTotal);
}
+// This function is for when you want to shortcut the signals and call directly
+void QQmlDataLoaderNetworkReplyProxy::manualFinished(QNetworkReply *reply)
+{
+ qint64 replySize = reply->size();
+ l->networkReplyProgress(reply, replySize, replySize);
+ l->networkReplyFinished(reply);
+}
+
/*!
\class QQmlDataBlob
} else {
QNetworkReply *reply = m_thread->networkAccessManager()->get(QNetworkRequest(blob->m_url));
- QObject *nrp = m_thread->networkReplyProxy();
- QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
- nrp, SLOT(downloadProgress(qint64,qint64)));
- QObject::connect(reply, SIGNAL(finished()),
- nrp, SLOT(finished()));
+ QQmlDataLoaderNetworkReplyProxy *nrp = m_thread->networkReplyProxy();
+ blob->addref();
m_networkReplies.insert(reply, blob);
+
+ if (reply->isFinished()) {
+ nrp->manualFinished(reply);
+ } else {
+ QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
+ nrp, SLOT(downloadProgress(qint64,qint64)));
+ QObject::connect(reply, SIGNAL(finished()),
+ nrp, SLOT(finished()));
+ }
+
#ifdef DATABLOB_DEBUG
qWarning("QQmlDataBlob: requested %s", qPrintable(blob->url().toString()));
#endif
- blob->addref();
}
}
#include <QStandardPaths>
#include <QSignalSpy>
#include <QDebug>
+#include <QBuffer>
#include <QQmlComponent>
#include <QQmlNetworkAccessManagerFactory>
#include <QQmlExpression>
private slots:
void rootContext();
void networkAccessManager();
+ void synchronousNetworkAccessManager();
void baseUrl();
void contextForObject();
void offlineStoragePath();
delete engine;
}
+class ImmediateReply : public QNetworkReply {
+
+ Q_OBJECT
+
+public:
+ ImmediateReply() {
+ setFinished(true);
+ }
+ virtual qint64 readData(char* , qint64 ) {
+ return 0;
+ }
+ virtual void abort() { }
+};
+
+class ImmediateManager : public QNetworkAccessManager {
+
+ Q_OBJECT
+
+public:
+ ImmediateManager(QObject *parent = 0) : QNetworkAccessManager(parent) {
+ }
+
+ QNetworkReply *createRequest(Operation, const QNetworkRequest & , QIODevice * outgoingData = 0) {
+ Q_UNUSED(outgoingData);
+ return new ImmediateReply;
+ }
+};
+
+class ImmediateFactory : public QQmlNetworkAccessManagerFactory {
+
+public:
+ QNetworkAccessManager *create(QObject *) {
+ return new ImmediateManager;
+ }
+};
+
+void tst_qqmlengine::synchronousNetworkAccessManager()
+{
+ ImmediateFactory factory;
+ QQmlEngine engine;
+ engine.setNetworkAccessManagerFactory(&factory);
+ QQmlComponent c(&engine, QUrl("myScheme://test.qml"));
+ // reply is finished, so should not be in loading state.
+ QVERIFY(!c.isLoading());
+}
+
+
void tst_qqmlengine::baseUrl()
{
QQmlEngine engine;