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>
This commit is contained in:
Robert C. Helling 2015-02-26 14:39:42 +01:00 committed by Dirk Hohndel
parent ea00fdb36a
commit b02bf002a6
11 changed files with 139 additions and 15 deletions

View file

@ -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);
}