aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/divepicturewidget.cpp73
-rw-r--r--desktop-widgets/divepicturewidget.h13
-rw-r--r--qt-models/divepicturemodel.cpp1
-rw-r--r--qt-models/divepicturemodel.h7
-rw-r--r--subsurface-core/CMakeLists.txt1
-rw-r--r--subsurface-core/imagedownloader.cpp79
-rw-r--r--subsurface-core/imagedownloader.h29
7 files changed, 110 insertions, 93 deletions
diff --git a/desktop-widgets/divepicturewidget.cpp b/desktop-widgets/divepicturewidget.cpp
index bed3d3bd1..d095929ad 100644
--- a/desktop-widgets/divepicturewidget.cpp
+++ b/desktop-widgets/divepicturewidget.cpp
@@ -15,79 +15,6 @@
#include <qthelper.h>
#include <QStandardPaths>
-void loadPicture(struct picture *picture)
-{
- ImageDownloader download(picture);
- download.load();
-}
-
-SHashedImage::SHashedImage(struct picture *picture) : QImage()
-{
- QUrl url = QUrl::fromUserInput(QString(picture->filename));
- if(url.isLocalFile())
- load(url.toLocalFile());
- if (isNull()) {
- // Hash lookup.
- load(fileFromHash(picture->hash));
- if (!isNull()) {
- QtConcurrent::run(updateHash, picture);
- } else {
- QtConcurrent::run(loadPicture, picture);
- }
- } else {
- QByteArray hash = hashFile(url.toLocalFile());
- free(picture->hash);
- picture->hash = strdup(hash.toHex().data());
- }
-}
-
-ImageDownloader::ImageDownloader(struct picture *pic)
-{
- picture = pic;
-}
-
-void ImageDownloader::load(){
- QUrl url = QUrl::fromUserInput(QString(picture->filename));
- if (url.isValid()) {
- QEventLoop loop;
- QNetworkRequest request(url);
- connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveImage(QNetworkReply *)));
- QNetworkReply *reply = manager.get(request);
- while (reply->isRunning()) {
- loop.processEvents();
- sleep(1);
- }
- }
-
-}
-
-void ImageDownloader::saveImage(QNetworkReply *reply)
-{
- QByteArray imageData = reply->readAll();
- QImage image = QImage();
- image.loadFromData(imageData);
- if (image.isNull())
- return;
- QCryptographicHash hash(QCryptographicHash::Sha1);
- hash.addData(imageData);
- QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first();
- QDir dir(path);
- if (!dir.exists())
- dir.mkpath(path);
- QFile imageFile(path.append("/").append(hash.result().toHex()));
- if (imageFile.open(QIODevice::WriteOnly)) {
- QDataStream stream(&imageFile);
- stream.writeRawData(imageData.data(), imageData.length());
- imageFile.waitForBytesWritten(-1);
- imageFile.close();
- add_hash(imageFile.fileName(), hash.result());
- learnHash(picture, hash.result());
- DivePictureModel::instance()->updateDivePictures();
- }
- reply->manager()->deleteLater();
- reply->deleteLater();
-}
-
DivePictureWidget::DivePictureWidget(QWidget *parent) : QListView(parent)
{
connect(this, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(doubleClicked(const QModelIndex &)));
diff --git a/desktop-widgets/divepicturewidget.h b/desktop-widgets/divepicturewidget.h
index 54f5bb826..3dc9767f1 100644
--- a/desktop-widgets/divepicturewidget.h
+++ b/desktop-widgets/divepicturewidget.h
@@ -5,19 +5,6 @@
#include <QListView>
#include <QThread>
#include <QFuture>
-#include <QNetworkReply>
-
-class ImageDownloader : public QObject {
- Q_OBJECT;
-public:
- ImageDownloader(struct picture *picture);
- void load();
-private:
- struct picture *picture;
- QNetworkAccessManager manager;
-private slots:
- void saveImage(QNetworkReply *reply);
-};
class DivePictureWidget : public QListView {
Q_OBJECT
diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp
index bb5db33b7..55f20cef9 100644
--- a/qt-models/divepicturemodel.cpp
+++ b/qt-models/divepicturemodel.cpp
@@ -2,6 +2,7 @@
#include "dive.h"
#include "metrics.h"
#include "divelist.h"
+#include "imagedownloader.h"
#include <QtConcurrent>
diff --git a/qt-models/divepicturemodel.h b/qt-models/divepicturemodel.h
index 7390fc5eb..18a96d893 100644
--- a/qt-models/divepicturemodel.h
+++ b/qt-models/divepicturemodel.h
@@ -5,13 +5,6 @@
#include <QImage>
#include <QFuture>
-typedef QPair<QString, QByteArray> SHashedFilename;
-
-class SHashedImage : public QImage {
-public:
- SHashedImage(struct picture *picture);
-};
-
struct PhotoHelper {
QImage image;
int offsetSeconds;
diff --git a/subsurface-core/CMakeLists.txt b/subsurface-core/CMakeLists.txt
index 9532ff35a..bd4950767 100644
--- a/subsurface-core/CMakeLists.txt
+++ b/subsurface-core/CMakeLists.txt
@@ -76,6 +76,7 @@ set(SUBSURFACE_CORE_LIB_SRCS
metrics.cpp
color.cpp
pluginmanager.cpp
+ imagedownloader.cpp
${SERIAL_FTDI}
${PLATFORM_SRC}
${BT_CORE_SRC_FILES}
diff --git a/subsurface-core/imagedownloader.cpp b/subsurface-core/imagedownloader.cpp
new file mode 100644
index 000000000..8be1daccc
--- /dev/null
+++ b/subsurface-core/imagedownloader.cpp
@@ -0,0 +1,79 @@
+#include "dive.h"
+#include "metrics.h"
+#include "divelist.h"
+#include "qthelper.h"
+#include "imagedownloader.h"
+#include <unistd.h>
+
+#include <QtConcurrent>
+
+ImageDownloader::ImageDownloader(struct picture *pic)
+{
+ picture = pic;
+}
+
+void ImageDownloader::load(){
+ QUrl url = QUrl::fromUserInput(QString(picture->filename));
+ if (url.isValid()) {
+ QEventLoop loop;
+ QNetworkRequest request(url);
+ connect(&manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveImage(QNetworkReply *)));
+ QNetworkReply *reply = manager.get(request);
+ while (reply->isRunning()) {
+ loop.processEvents();
+ sleep(1);
+ }
+ }
+}
+
+void ImageDownloader::saveImage(QNetworkReply *reply)
+{
+ QByteArray imageData = reply->readAll();
+ QImage image = QImage();
+ image.loadFromData(imageData);
+ if (image.isNull())
+ return;
+ QCryptographicHash hash(QCryptographicHash::Sha1);
+ hash.addData(imageData);
+ QString path = QStandardPaths::standardLocations(QStandardPaths::CacheLocation).first();
+ QDir dir(path);
+ if (!dir.exists())
+ dir.mkpath(path);
+ QFile imageFile(path.append("/").append(hash.result().toHex()));
+ if (imageFile.open(QIODevice::WriteOnly)) {
+ QDataStream stream(&imageFile);
+ stream.writeRawData(imageData.data(), imageData.length());
+ imageFile.waitForBytesWritten(-1);
+ imageFile.close();
+ add_hash(imageFile.fileName(), hash.result());
+ learnHash(picture, hash.result());
+ }
+ reply->manager()->deleteLater();
+ reply->deleteLater();
+}
+
+void loadPicture(struct picture *picture)
+{
+ ImageDownloader download(picture);
+ download.load();
+}
+
+SHashedImage::SHashedImage(struct picture *picture) : QImage()
+{
+ QUrl url = QUrl::fromUserInput(QString(picture->filename));
+ if(url.isLocalFile())
+ load(url.toLocalFile());
+ if (isNull()) {
+ // Hash lookup.
+ load(fileFromHash(picture->hash));
+ if (!isNull()) {
+ QtConcurrent::run(updateHash, picture);
+ } else {
+ QtConcurrent::run(loadPicture, picture);
+ }
+ } else {
+ QByteArray hash = hashFile(url.toLocalFile());
+ free(picture->hash);
+ picture->hash = strdup(hash.toHex().data());
+ }
+}
diff --git a/subsurface-core/imagedownloader.h b/subsurface-core/imagedownloader.h
new file mode 100644
index 000000000..fd6a91158
--- /dev/null
+++ b/subsurface-core/imagedownloader.h
@@ -0,0 +1,29 @@
+#ifndef IMAGEDOWNLOADER_H
+#define IMAGEDOWNLOADER_H
+
+#include <QImage>
+#include <QFuture>
+#include <QNetworkReply>
+
+typedef QPair<QString, QByteArray> SHashedFilename;
+
+class ImageDownloader : public QObject {
+ Q_OBJECT;
+public:
+ ImageDownloader(struct picture *picture);
+ void load();
+
+private:
+ struct picture *picture;
+ QNetworkAccessManager manager;
+
+private slots:
+ void saveImage(QNetworkReply *reply);
+};
+
+class SHashedImage : public QImage {
+public:
+ SHashedImage(struct picture *picture);
+};
+
+#endif // IMAGEDOWNLOADER_H