-
Notifications
You must be signed in to change notification settings - Fork 0
/
file.cpp
69 lines (53 loc) · 1.87 KB
/
file.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <QDebug>
#include <QtCrypto>
#include "file.h"
const int File::BLOCK_SIZE = 8192;
const int File::SHA_SIZE = 32;
File::File() {
}
File::File(QString fileName, QMap<QByteArray, QByteArray> *hashToBlock, QMap<QByteArray, QByteArray> *blockToHash) {
this->fileName = fileName;
if (parseFile() == 0) {
qDebug() << "Opened file " << fileName << " with size " << this->fileSize;
blocklist = hashFile(contents, BLOCK_SIZE, hashToBlock, blockToHash);
qDebug() << "Calculated blocklist";
fileID = hashFile(blocklist, BLOCK_SIZE, hashToBlock, blockToHash);
qDebug() << "FileID for " << fileName << " is " << fileID.toHex();
}
}
QByteArray File::getFileID() {
return fileID;
}
bool File::operator== (const File& other) const {
return (fileName == other.fileName);
}
int File::parseFile() {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Error in reading file";
return 1;
}
this->fileSize = file.size();
contents = file.readAll();
return 0;
}
QByteArray File::hashFile(QByteArray contents, int blockSize, QMap<QByteArray, QByteArray> *hashToBlock,
QMap<QByteArray, QByteArray> *blockToHash) {
QByteArray result;
while (contents.size() != 0) {
QByteArray block = contents.left(blockSize);
qDebug() << "computed block of size " << block.size();
if (!QCA::isSupported("sha256")) {
qDebug() << "SHA256 not supported!";
}
QCA::Hash shaHash("sha256");
QByteArray blockHash = shaHash.hash(block).toByteArray();
hashToBlock->insert(blockHash, block);
blockToHash->insert(block, blockHash);
result.append(blockHash);
if (blockSize > contents.size())
return result;
contents = contents.mid(blockSize);
}
return result;
}