Files

95 lines
2.3 KiB
C++
Raw Permalink Normal View History

2026-01-19 06:55:35 -05:00
#include "KOReaderDocumentId.h"
2026-02-08 21:29:14 +01:00
#include <HalStorage.h>
2026-02-13 12:16:39 +01:00
#include <Logging.h>
2026-01-19 06:55:35 -05:00
#include <MD5Builder.h>
namespace {
// Extract filename from path (everything after last '/')
std::string getFilename(const std::string& path) {
const size_t pos = path.rfind('/');
if (pos == std::string::npos) {
return path;
}
return path.substr(pos + 1);
}
} // namespace
std::string KOReaderDocumentId::calculateFromFilename(const std::string& filePath) {
const std::string filename = getFilename(filePath);
if (filename.empty()) {
return "";
}
MD5Builder md5;
md5.begin();
md5.add(filename.c_str());
md5.calculate();
std::string result = md5.toString().c_str();
2026-02-13 12:16:39 +01:00
LOG_DBG("KODoc", "Filename hash: %s (from '%s')", result.c_str(), filename.c_str());
2026-01-19 06:55:35 -05:00
return result;
}
size_t KOReaderDocumentId::getOffset(int i) {
// Offset = 1024 << (2*i)
// For i = -1: KOReader uses a value of 0
2026-01-19 06:55:35 -05:00
// For i >= 0: 1024 << (2*i)
if (i < 0) {
return 0;
2026-01-19 06:55:35 -05:00
}
return CHUNK_SIZE << (2 * i);
}
std::string KOReaderDocumentId::calculate(const std::string& filePath) {
FsFile file;
2026-02-08 21:29:14 +01:00
if (!Storage.openFileForRead("KODoc", filePath, file)) {
2026-02-13 12:16:39 +01:00
LOG_DBG("KODoc", "Failed to open file: %s", filePath.c_str());
2026-01-19 06:55:35 -05:00
return "";
}
const size_t fileSize = file.fileSize();
2026-02-13 12:16:39 +01:00
LOG_DBG("KODoc", "Calculating hash for file: %s (size: %zu)", filePath.c_str(), fileSize);
2026-01-19 06:55:35 -05:00
// Initialize MD5 builder
MD5Builder md5;
md5.begin();
// Buffer for reading chunks
uint8_t buffer[CHUNK_SIZE];
size_t totalBytesRead = 0;
// Read from each offset (i = -1 to 10)
for (int i = -1; i < OFFSET_COUNT - 1; i++) {
const size_t offset = getOffset(i);
// Skip if offset is beyond file size
if (offset >= fileSize) {
continue;
}
// Seek to offset
if (!file.seekSet(offset)) {
2026-02-13 12:16:39 +01:00
LOG_DBG("KODoc", "Failed to seek to offset %zu", offset);
2026-01-19 06:55:35 -05:00
continue;
}
// Read up to CHUNK_SIZE bytes
const size_t bytesToRead = std::min(CHUNK_SIZE, fileSize - offset);
const size_t bytesRead = file.read(buffer, bytesToRead);
if (bytesRead > 0) {
md5.add(buffer, bytesRead);
totalBytesRead += bytesRead;
}
}
// Calculate final hash
md5.calculate();
std::string result = md5.toString().c_str();
2026-02-13 12:16:39 +01:00
LOG_DBG("KODoc", "Hash calculated: %s (from %zu bytes)", result.c_str(), totalBytesRead);
2026-01-19 06:55:35 -05:00
return result;
}