diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 170ebc60e5..5b13e2da42 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -450,7 +450,7 @@ class GeometryReader : public QRunnable { public: GeometryReader(const QWeakPointer& geometry, const QUrl& url, - const QByteArray& data, const QVariantHash& mapping); + QNetworkReply* reply, const QVariantHash& mapping); virtual void run(); @@ -458,40 +458,41 @@ private: QWeakPointer _geometry; QUrl _url; - QByteArray _data; + QNetworkReply* _reply; QVariantHash _mapping; }; GeometryReader::GeometryReader(const QWeakPointer& geometry, const QUrl& url, - const QByteArray& data, const QVariantHash& mapping) : + QNetworkReply* reply, const QVariantHash& mapping) : _geometry(geometry), _url(url), - _data(data), + _reply(reply), _mapping(mapping) { } void GeometryReader::run() { QSharedPointer geometry = _geometry.toStrongRef(); if (geometry.isNull()) { + _reply->deleteLater(); return; } try { QMetaObject::invokeMethod(geometry.data(), "setGeometry", Q_ARG(const FBXGeometry&, - _url.path().toLower().endsWith(".svo") ? readSVO(_data) : readFBX(_data, _mapping))); + _url.path().toLower().endsWith(".svo") ? readSVO(_reply->readAll()) : readFBX(_reply->readAll(), _mapping))); } catch (const QString& error) { qDebug() << "Error reading " << _url << ": " << error; QMetaObject::invokeMethod(geometry.data(), "finishedLoading", Q_ARG(bool, false)); } + _reply->deleteLater(); } void NetworkGeometry::downloadFinished(QNetworkReply* reply) { QUrl url = reply->url(); - QByteArray data = reply->readAll(); - if (url.path().toLower().endsWith(".fst")) { // it's a mapping file; parse it and get the mesh filename - _mapping = readMapping(data); + _mapping = readMapping(reply->readAll()); + reply->deleteLater(); QString filename = _mapping.value("filename").toString(); if (filename.isNull()) { qDebug() << "Mapping file " << url << " has no filename."; @@ -525,7 +526,7 @@ void NetworkGeometry::downloadFinished(QNetworkReply* reply) { } // send the reader off to the thread pool - QThreadPool::globalInstance()->start(new GeometryReader(_self, url, data, _mapping)); + QThreadPool::globalInstance()->start(new GeometryReader(_self, url, reply, _mapping)); } void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 794516f7b7..dcaf059714 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -273,27 +273,28 @@ NetworkTexture::NetworkTexture(const QUrl& url, bool normalMap) : class ImageReader : public QRunnable { public: - ImageReader(const QWeakPointer& texture, const QByteArray& data); + ImageReader(const QWeakPointer& texture, QNetworkReply* reply); virtual void run(); private: QWeakPointer _texture; - QByteArray _data; + QNetworkReply* _reply; }; -ImageReader::ImageReader(const QWeakPointer& texture, const QByteArray& data) : +ImageReader::ImageReader(const QWeakPointer& texture, QNetworkReply* reply) : _texture(texture), - _data(data) { + _reply(reply) { } void ImageReader::run() { QSharedPointer texture = _texture.toStrongRef(); if (texture.isNull()) { + _reply->deleteLater(); return; } - QImage image = QImage::fromData(_data); + QImage image = QImage::fromData(_reply->readAll()); if (image.format() != QImage::Format_ARGB32) { image = image.convertToFormat(QImage::Format_ARGB32); } @@ -320,11 +321,12 @@ void ImageReader::run() { QMetaObject::invokeMethod(texture.data(), "setImage", Q_ARG(const QImage&, image), Q_ARG(const glm::vec4&, accumulated / (imageArea * EIGHT_BIT_MAXIMUM)), Q_ARG(bool, translucentPixels >= imageArea / 2)); + _reply->deleteLater(); } void NetworkTexture::downloadFinished(QNetworkReply* reply) { // send the reader off to the thread pool - QThreadPool::globalInstance()->start(new ImageReader(_self, reply->readAll())); + QThreadPool::globalInstance()->start(new ImageReader(_self, reply)); } void NetworkTexture::setImage(const QImage& image, const glm::vec4& averageColor, bool translucent) { diff --git a/libraries/metavoxels/src/ScriptCache.cpp b/libraries/metavoxels/src/ScriptCache.cpp index fd58f5b6f3..702a36de2a 100644 --- a/libraries/metavoxels/src/ScriptCache.cpp +++ b/libraries/metavoxels/src/ScriptCache.cpp @@ -61,6 +61,7 @@ NetworkProgram::NetworkProgram(ScriptCache* cache, const QUrl& url) : void NetworkProgram::downloadFinished(QNetworkReply* reply) { _program = QScriptProgram(QTextStream(reply).readAll(), reply->url().toString()); + reply->deleteLater(); finishedLoading(true); emit loaded(); } diff --git a/libraries/shared/src/ResourceCache.cpp b/libraries/shared/src/ResourceCache.cpp index 90dc5961dc..bd08b240c5 100644 --- a/libraries/shared/src/ResourceCache.cpp +++ b/libraries/shared/src/ResourceCache.cpp @@ -161,7 +161,6 @@ void Resource::handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { return; } _reply->disconnect(this); - _reply->deleteLater(); QNetworkReply* reply = _reply; _reply = NULL; ResourceCache::requestCompleted(); diff --git a/libraries/shared/src/ResourceCache.h b/libraries/shared/src/ResourceCache.h index eae5e752e2..c77318aac2 100644 --- a/libraries/shared/src/ResourceCache.h +++ b/libraries/shared/src/ResourceCache.h @@ -99,6 +99,7 @@ protected slots: protected: + /// Called when the download has finished. The recipient should delete the reply when done with it. virtual void downloadFinished(QNetworkReply* reply) = 0; /// Should be called by subclasses when all the loading that will be done has been done.