mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
ea00fdb36a
commit
b02bf002a6
11 changed files with 139 additions and 15 deletions
69
qthelper.cpp
69
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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue