subsurface/core/imagedownloader.h
Berthold Stoeger c3c2c2f606 Dive pictures: Don't enter infinity loop on invalid pictures
The recently committed refactoring of the dive-picture code introduced
a severe bug:

If an image couldn't be loaded from disk owing to an invalid file, the
filename was interpreted as an url and loaded in the background. This
succeeded, because the file actually exists. After download, the file
would then still be invalid and the whole thing restarted, leading to
an infinity loop.

To fix this, do two things:

1) Don't even try to download local files.
2) If interpreting a downloaded file fails, don't try the downloading
business again.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-05-16 02:01:26 +03:00

59 lines
1.5 KiB
C++

// SPDX-License-Identifier: GPL-2.0
#ifndef IMAGEDOWNLOADER_H
#define IMAGEDOWNLOADER_H
#include <QImage>
#include <QFuture>
#include <QNetworkReply>
#include <QThreadPool>
class ImageDownloader : public QObject {
Q_OBJECT
public:
static ImageDownloader *instance();
ImageDownloader();
public slots:
void load(QString filename, bool fromHash);
signals:
void loaded(QString filename);
void failed(QString filename);
private:
QNetworkAccessManager manager;
void loadFromUrl(const QString &filename, const QUrl &);
void saveImage(QNetworkReply *reply);
};
class PictureEntry;
class Thumbnailer : public QObject {
Q_OBJECT
public:
static Thumbnailer *instance();
// Schedule a thumbnail for fetching or calculation.
// Returns a placehlder thumbnail. The actual thumbnail will be sent
// via a signal later.
QImage fetchThumbnail(PictureEntry &entry);
// If we change dive, clear all unfinished thumbnail creations
void clearWorkQueue();
static int maxThumbnailSize();
static int defaultThumbnailSize();
static int thumbnailSize(double zoomLevel);
public slots:
void imageDownloaded(QString filename);
void imageDownloadFailed(QString filename);
signals:
void thumbnailChanged(QString filename, QImage thumbnail);
private:
Thumbnailer();
void processItem(QString filename, bool tryDownload);
mutable QMutex lock;
QThreadPool pool;
QImage failImage; // Shown when image-fetching fails
QImage dummyImage; // Shown before thumbnail is fetched
QMap<QString,QFuture<void>> workingOn;
};
#endif // IMAGEDOWNLOADER_H