diff options
author | Robert C. Helling <helling@atdotde.de> | 2015-02-26 14:39:42 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-02-27 06:29:44 +0100 |
commit | b02bf002a677e45dbaa4d28edadbaafc89a7badc (patch) | |
tree | 86f26c0dc8edbf66999e602277a15bb6a09dc38e /qthelper.cpp | |
parent | ea00fdb36ab727b2f403a9feed5e8d96fb6659fc (diff) | |
download | subsurface-b02bf002a677e45dbaa4d28edadbaafc89a7badc.tar.gz |
Add hashes to images
Upon successfull reading an image file, this computes a SHA1 hash of the
image and saves it with the picture tag in the log file. When a file is
not successfully loaded (for example because the log was created on a
different computer) we look up the hash in a dictionary that maps hashes
to local file names.
That dictionary (actually two for both directions), is loaded on startup
and saved upon destruction of the main window.
Signed-off-by: Robert C. Helling <helling@atdotde.de>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qthelper.cpp')
-rw-r--r-- | qthelper.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/qthelper.cpp b/qthelper.cpp index 4cedc5597..74c67d769 100644 --- a/qthelper.cpp +++ b/qthelper.cpp @@ -27,6 +27,11 @@ #include <QUrlQuery> #include <QEventLoop> #include <QDateTime> +#include <QSaveFile> +#include <QDir> +#include <QImageReader> +#include <QtConcurrent> +#include "divepicturewidget.h" #include <libxslt/documents.h> @@ -780,3 +785,67 @@ extern "C" void reverseGeoLookup(degrees_t latitude, degrees_t longitude, uint32 ds->notes = add_to_string(ds->notes, "countrytag: %s", address.value("country").toString().toUtf8().data()); } } + +QHash<QString, QByteArray> hashOf; +QHash<QByteArray, QString> localFilenameOf; + +extern "C" char * hashstring(char * filename) +{ + return hashOf[QString(filename)].toHex().data(); +} + +void read_hashes() +{ + QFile hashfile(QString(system_default_directory()).append("/hashes")); + if (hashfile.open(QIODevice::ReadOnly)) { + QDataStream stream(&hashfile); + stream >> localFilenameOf; + hashfile.close(); + } +} + +void write_hashes() +{ + QSaveFile hashfile(QString(system_default_directory()).append("/hashes")); + if (hashfile.open(QIODevice::WriteOnly)) { + QDataStream stream(&hashfile); + stream << localFilenameOf; + hashfile.commit(); + } else { + qDebug() << "cannot open" << hashfile.fileName(); + } +} + +void add_hash(const QString filename, QByteArray hash) +{ + hashOf[filename] = hash; + localFilenameOf[hash] = filename; +} + +QByteArray hashFile(const QString filename) +{ + QCryptographicHash hash(QCryptographicHash::Sha1); + QFile imagefile(filename); + imagefile.open(QIODevice::ReadOnly); + hash.addData(&imagefile); + add_hash(filename, hash.result()); + return hash.result(); +} + +QString localFilePath(const QString originalFilename) +{ + return localFilenameOf[hashOf[originalFilename]]; +} + +QString fileFromHash(char *hash) +{ + return localFilenameOf[QByteArray::fromHex(hash)]; +} + +void updateHash(struct picture *picture) { + QByteArray hash = hashFile(fileFromHash(picture->hash)); + hashOf[QString(picture->filename)] = hash; + char *old = picture->hash; + picture->hash = strdup(hash.toHex()); + free(old); +} |