core/imagedownloader.cpp: remove recursion

If loading from hash failed in the saveImage() slot(!) it would
recurse into loadFromUrl(), which would generate a new network
reply. Very scary and a (small) wonder that it worked.

Let's try to make this all more explicit.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-02-08 22:45:55 +01:00 committed by Lubomir I. Ivanov
parent 54d56a74aa
commit 117f4a0d7d
2 changed files with 21 additions and 18 deletions

View file

@ -17,7 +17,6 @@ static QUrl cloudImageURL(const char *hash)
ImageDownloader::ImageDownloader(struct picture *pic) ImageDownloader::ImageDownloader(struct picture *pic)
{ {
picture = pic; picture = pic;
loadFromHash = false;
} }
ImageDownloader::~ImageDownloader() ImageDownloader::~ImageDownloader()
@ -25,18 +24,24 @@ ImageDownloader::~ImageDownloader()
picture_free(picture); picture_free(picture);
} }
void ImageDownloader::load(bool fromHash){ void ImageDownloader::load(bool fromHash)
QUrl url; {
loadFromHash = fromHash; if (fromHash && loadFromUrl(cloudImageURL(picture->hash)))
if(fromHash) return;
url = cloudImageURL(picture->hash);
else // If loading from hash failed, try to load from filename
url = QUrl::fromUserInput(QString(picture->filename)); loadFromUrl(QUrl::fromUserInput(QString(picture->filename)));
}
bool ImageDownloader::loadFromUrl(const QUrl &url)
{
bool success = false;
if (url.isValid()) { if (url.isValid()) {
QEventLoop loop; QEventLoop loop;
QNetworkAccessManager manager; QNetworkAccessManager manager;
QNetworkRequest request(url); QNetworkRequest request(url);
connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveImage(QNetworkReply *))); connect(&manager, &QNetworkAccessManager::finished, this,
[this,&success] (QNetworkReply *reply) { saveImage(reply, success); });
QNetworkReply *reply = manager.get(request); QNetworkReply *reply = manager.get(request);
while (reply->isRunning()) { while (reply->isRunning()) {
loop.processEvents(); loop.processEvents();
@ -44,18 +49,18 @@ void ImageDownloader::load(bool fromHash){
} }
delete reply; delete reply;
} }
return success;
} }
void ImageDownloader::saveImage(QNetworkReply *reply) void ImageDownloader::saveImage(QNetworkReply *reply, bool &success)
{ {
success = false;
QByteArray imageData = reply->readAll(); QByteArray imageData = reply->readAll();
QImage image = QImage(); QImage image = QImage();
image.loadFromData(imageData); image.loadFromData(imageData);
if (image.isNull()) { if (image.isNull())
if (loadFromHash)
load(false);
return; return;
} success = true;
QCryptographicHash hash(QCryptographicHash::Sha1); QCryptographicHash hash(QCryptographicHash::Sha1);
hash.addData(imageData); hash.addData(imageData);
QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first(); QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first();

View file

@ -14,11 +14,9 @@ public:
void load(bool fromHash); void load(bool fromHash);
private: private:
bool loadFromUrl(const QUrl &); // return true on success
void saveImage(QNetworkReply *reply, bool &success);
struct picture *picture; struct picture *picture;
bool loadFromHash;
private slots:
void saveImage(QNetworkReply *reply);
}; };
class SHashedImage : public QImage { class SHashedImage : public QImage {