summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-11-05 15:00:58 +0200
committerPasi Keränen <pasi.keranen@digia.com>2015-11-06 06:37:44 +0000
commitbb1504c271e18a26ad6ac20d55485c167671b1c2 (patch)
tree0e427493ac5cf00f5a861fcfe206f13e5f7b73ef
parentfe30bb10816dcdce99f282e9517fa513637a8019 (diff)
Fix QNetworkAccessManager crash at application shutdownv5.6.0-beta1
Changed textures to use a common network access manager from QML engine instead of each of them creating their own. Change-Id: Ia70a756edc7f3c32679965a8edf28fa64be86dd4 Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
-rw-r--r--src/imports/qtcanvas3d/teximage3d.cpp51
-rw-r--r--src/imports/qtcanvas3d/teximage3d_p.h7
2 files changed, 35 insertions, 23 deletions
diff --git a/src/imports/qtcanvas3d/teximage3d.cpp b/src/imports/qtcanvas3d/teximage3d.cpp
index b6c0be2..38db6cf 100644
--- a/src/imports/qtcanvas3d/teximage3d.cpp
+++ b/src/imports/qtcanvas3d/teximage3d.cpp
@@ -154,7 +154,8 @@ QJSValue CanvasTextureImageFactory::newTexImage()
CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) :
CanvasAbstractObject(0, parent),
m_engine(engine),
- m_networkAccessManager(0),
+ m_networkAccessManager(m_engine->networkAccessManager()),
+ m_networkReply(0),
m_state(INITIALIZED),
m_errorString(""),
m_pixelCache(0),
@@ -162,9 +163,6 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn
m_pixelCacheFlipY(false),
m_parentFactory(parent)
{
- m_networkAccessManager = new QNetworkAccessManager(this);
- QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
- this, &CanvasTextureImage::handleReply);
}
CanvasTextureImage::CanvasTextureImage(const QImage &source,
@@ -173,24 +171,32 @@ CanvasTextureImage::CanvasTextureImage(const QImage &source,
QQmlEngine *engine) :
CanvasAbstractObject(0, parent),
m_engine(engine),
- m_networkAccessManager(0),
+ m_networkAccessManager(m_engine->networkAccessManager()),
+ m_networkReply(0),
m_state(INITIALIZED),
m_errorString(""),
m_pixelCache(0),
m_pixelCacheFormat(CanvasContext::NONE),
m_pixelCacheFlipY(false)
{
- m_networkAccessManager = new QNetworkAccessManager(this);
- QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
- this, &CanvasTextureImage::handleReply);
-
m_image = source.scaled(width, height);
setImageState(LOADING_FINISHED);
}
+void CanvasTextureImage::cleanupNetworkReply()
+{
+ if (m_networkReply) {
+ QObject::disconnect(m_networkReply, &QNetworkReply::finished,
+ this, &CanvasTextureImage::handleReply);
+ m_networkReply->abort();
+ m_networkReply->deleteLater();
+ m_networkReply = 0;
+ }
+}
+
CanvasTextureImage::~CanvasTextureImage()
{
- delete m_networkAccessManager;
+ cleanupNetworkReply();
delete m_pixelCache;
}
@@ -250,7 +256,9 @@ void CanvasTextureImage::load()
emit imageLoadingStarted(this);
QNetworkRequest request(m_source);
- m_networkAccessManager->get(request);
+ m_networkReply = m_networkAccessManager->get(request);
+ QObject::connect(m_networkReply, &QNetworkReply::finished,
+ this, &CanvasTextureImage::handleReply);
}
/*!
@@ -262,18 +270,19 @@ QString CanvasTextureImage::errorString() const
return m_errorString;
}
-void CanvasTextureImage::handleReply(QNetworkReply *reply)
+void CanvasTextureImage::handleReply()
{
- if (reply->error() != QNetworkReply::NoError) {
- m_errorString = reply->errorString();
- emit errorStringChanged(m_errorString);
- setImageState(LOADING_ERROR);
- return;
+ if (m_networkReply) {
+ if (m_networkReply->error() != QNetworkReply::NoError) {
+ m_errorString = m_networkReply->errorString();
+ emit errorStringChanged(m_errorString);
+ setImageState(LOADING_ERROR);
+ } else {
+ m_image.loadFromData(m_networkReply->readAll());
+ setImageState(LOADING_FINISHED);
+ }
+ cleanupNetworkReply();
}
-
- m_image.loadFromData(reply->readAll());
-
- setImageState(LOADING_FINISHED);
}
QImage &CanvasTextureImage::getImage()
diff --git a/src/imports/qtcanvas3d/teximage3d_p.h b/src/imports/qtcanvas3d/teximage3d_p.h
index 70b7f1c..78a6679 100644
--- a/src/imports/qtcanvas3d/teximage3d_p.h
+++ b/src/imports/qtcanvas3d/teximage3d_p.h
@@ -120,7 +120,7 @@ public:
void emitImageLoadingError();
void load();
- void handleReply(QNetworkReply *reply);
+ void handleReply();
QImage &getImage();
uchar *convertToFormat(CanvasContext::glEnums format, bool flipY = false, bool premultipliedAlpha = false);
@@ -143,8 +143,11 @@ signals:
void imageLoadingFailed(CanvasTextureImage *image);
private:
+ void cleanupNetworkReply();
+
QQmlEngine *m_engine;
- QNetworkAccessManager *m_networkAccessManager;
+ QNetworkAccessManager *m_networkAccessManager; // not owned
+ QNetworkReply *m_networkReply;
QImage m_image;
QUrl m_source;
TextureImageState m_state;