mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
54d56a74aa
commit
117f4a0d7d
2 changed files with 21 additions and 18 deletions
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue