Commit bb1504c2 authored by Miikka Heikkinen's avatar Miikka Heikkinen Committed by Pasi Keränen
Browse files

Fix QNetworkAccessManager crash at application shutdown


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: default avatarTomi Korpipää <tomi.korpipaa@theqtcompany.com>
Reviewed-by: default avatarPasi Keränen <pasi.keranen@digia.com>
Showing with 35 additions and 23 deletions
...@@ -154,7 +154,8 @@ QJSValue CanvasTextureImageFactory::newTexImage() ...@@ -154,7 +154,8 @@ QJSValue CanvasTextureImageFactory::newTexImage()
CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) : CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) :
CanvasAbstractObject(0, parent), CanvasAbstractObject(0, parent),
m_engine(engine), m_engine(engine),
m_networkAccessManager(0), m_networkAccessManager(m_engine->networkAccessManager()),
m_networkReply(0),
m_state(INITIALIZED), m_state(INITIALIZED),
m_errorString(""), m_errorString(""),
m_pixelCache(0), m_pixelCache(0),
...@@ -162,9 +163,6 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn ...@@ -162,9 +163,6 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn
m_pixelCacheFlipY(false), m_pixelCacheFlipY(false),
m_parentFactory(parent) m_parentFactory(parent)
{ {
m_networkAccessManager = new QNetworkAccessManager(this);
QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
this, &CanvasTextureImage::handleReply);
} }
CanvasTextureImage::CanvasTextureImage(const QImage &source, CanvasTextureImage::CanvasTextureImage(const QImage &source,
...@@ -173,24 +171,32 @@ CanvasTextureImage::CanvasTextureImage(const QImage &source, ...@@ -173,24 +171,32 @@ CanvasTextureImage::CanvasTextureImage(const QImage &source,
QQmlEngine *engine) : QQmlEngine *engine) :
CanvasAbstractObject(0, parent), CanvasAbstractObject(0, parent),
m_engine(engine), m_engine(engine),
m_networkAccessManager(0), m_networkAccessManager(m_engine->networkAccessManager()),
m_networkReply(0),
m_state(INITIALIZED), m_state(INITIALIZED),
m_errorString(""), m_errorString(""),
m_pixelCache(0), m_pixelCache(0),
m_pixelCacheFormat(CanvasContext::NONE), m_pixelCacheFormat(CanvasContext::NONE),
m_pixelCacheFlipY(false) m_pixelCacheFlipY(false)
{ {
m_networkAccessManager = new QNetworkAccessManager(this);
QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
this, &CanvasTextureImage::handleReply);
m_image = source.scaled(width, height); m_image = source.scaled(width, height);
setImageState(LOADING_FINISHED); 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() CanvasTextureImage::~CanvasTextureImage()
{ {
delete m_networkAccessManager; cleanupNetworkReply();
delete m_pixelCache; delete m_pixelCache;
} }
...@@ -250,7 +256,9 @@ void CanvasTextureImage::load() ...@@ -250,7 +256,9 @@ void CanvasTextureImage::load()
emit imageLoadingStarted(this); emit imageLoadingStarted(this);
QNetworkRequest request(m_source); 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 ...@@ -262,18 +270,19 @@ QString CanvasTextureImage::errorString() const
return m_errorString; return m_errorString;
} }
void CanvasTextureImage::handleReply(QNetworkReply *reply) void CanvasTextureImage::handleReply()
{ {
if (reply->error() != QNetworkReply::NoError) { if (m_networkReply) {
m_errorString = reply->errorString(); if (m_networkReply->error() != QNetworkReply::NoError) {
emit errorStringChanged(m_errorString); m_errorString = m_networkReply->errorString();
setImageState(LOADING_ERROR); emit errorStringChanged(m_errorString);
return; 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() QImage &CanvasTextureImage::getImage()
......
...@@ -120,7 +120,7 @@ public: ...@@ -120,7 +120,7 @@ public:
void emitImageLoadingError(); void emitImageLoadingError();
void load(); void load();
void handleReply(QNetworkReply *reply); void handleReply();
QImage &getImage(); QImage &getImage();
uchar *convertToFormat(CanvasContext::glEnums format, bool flipY = false, bool premultipliedAlpha = false); uchar *convertToFormat(CanvasContext::glEnums format, bool flipY = false, bool premultipliedAlpha = false);
...@@ -143,8 +143,11 @@ signals: ...@@ -143,8 +143,11 @@ signals:
void imageLoadingFailed(CanvasTextureImage *image); void imageLoadingFailed(CanvasTextureImage *image);
private: private:
void cleanupNetworkReply();
QQmlEngine *m_engine; QQmlEngine *m_engine;
QNetworkAccessManager *m_networkAccessManager; QNetworkAccessManager *m_networkAccessManager; // not owned
QNetworkReply *m_networkReply;
QImage m_image; QImage m_image;
QUrl m_source; QUrl m_source;
TextureImageState m_state; TextureImageState m_state;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment