162 lines
5.7 KiB
C++
Raw Normal View History

2025-12-03 22:00:29 +11:00
#include "Section.h"
#include <FsHelpers.h>
2025-12-03 22:00:29 +11:00
#include <SD.h>
#include <Serialization.h>
2025-12-03 22:00:29 +11:00
#include "Page.h"
#include "parsers/ChapterHtmlSlimParser.h"
2025-12-06 22:04:59 +11:00
namespace {
constexpr uint8_t SECTION_FILE_VERSION = 5;
}
2025-12-03 22:00:29 +11:00
void Section::onPageComplete(std::unique_ptr<Page> page) {
2025-12-03 22:00:29 +11:00
const auto filePath = cachePath + "/page_" + std::to_string(pageCount) + ".bin";
File outputFile;
if (!FsHelpers::openFileForWrite("SCT", filePath, outputFile)) {
return;
}
2025-12-03 22:00:29 +11:00
page->serialize(outputFile);
outputFile.close();
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Page %d processed\n", millis(), pageCount);
2025-12-03 22:00:29 +11:00
pageCount++;
}
void Section::writeCacheMetadata(const int fontId, const float lineCompression, const int marginTop,
const int marginRight, const int marginBottom, const int marginLeft,
const bool extraParagraphSpacing) const {
File outputFile;
if (!FsHelpers::openFileForWrite("SCT", cachePath + "/section.bin", outputFile)) {
return;
}
2025-12-06 22:04:59 +11:00
serialization::writePod(outputFile, SECTION_FILE_VERSION);
serialization::writePod(outputFile, fontId);
serialization::writePod(outputFile, lineCompression);
serialization::writePod(outputFile, marginTop);
serialization::writePod(outputFile, marginRight);
serialization::writePod(outputFile, marginBottom);
serialization::writePod(outputFile, marginLeft);
serialization::writePod(outputFile, extraParagraphSpacing);
2025-12-06 22:04:59 +11:00
serialization::writePod(outputFile, pageCount);
outputFile.close();
}
bool Section::loadCacheMetadata(const int fontId, const float lineCompression, const int marginTop,
const int marginRight, const int marginBottom, const int marginLeft,
const bool extraParagraphSpacing) {
2025-12-03 22:00:29 +11:00
const auto sectionFilePath = cachePath + "/section.bin";
File inputFile;
if (!FsHelpers::openFileForRead("SCT", sectionFilePath, inputFile)) {
2025-12-03 22:00:29 +11:00
return false;
}
// Match parameters
{
uint8_t version;
serialization::readPod(inputFile, version);
if (version != SECTION_FILE_VERSION) {
inputFile.close();
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Deserialization failed: Unknown version %u\n", millis(), version);
clearCache();
return false;
}
int fileFontId, fileMarginTop, fileMarginRight, fileMarginBottom, fileMarginLeft;
float fileLineCompression;
bool fileExtraParagraphSpacing;
serialization::readPod(inputFile, fileFontId);
serialization::readPod(inputFile, fileLineCompression);
serialization::readPod(inputFile, fileMarginTop);
serialization::readPod(inputFile, fileMarginRight);
serialization::readPod(inputFile, fileMarginBottom);
serialization::readPod(inputFile, fileMarginLeft);
serialization::readPod(inputFile, fileExtraParagraphSpacing);
if (fontId != fileFontId || lineCompression != fileLineCompression || marginTop != fileMarginTop ||
marginRight != fileMarginRight || marginBottom != fileMarginBottom || marginLeft != fileMarginLeft ||
extraParagraphSpacing != fileExtraParagraphSpacing) {
inputFile.close();
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Deserialization failed: Parameters do not match\n", millis());
clearCache();
return false;
}
2025-12-06 22:04:59 +11:00
}
2025-12-06 22:04:59 +11:00
serialization::readPod(inputFile, pageCount);
inputFile.close();
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Deserialization succeeded: %d pages\n", millis(), pageCount);
2025-12-03 22:00:29 +11:00
return true;
}
void Section::setupCacheDir() const {
epub->setupCacheDir();
SD.mkdir(cachePath.c_str());
}
// Your updated class method (assuming you are using the 'SD' object, which is a wrapper for a specific filesystem)
bool Section::clearCache() const {
if (!SD.exists(cachePath.c_str())) {
Serial.printf("[%lu] [SCT] Cache does not exist, no action needed\n", millis());
return true;
}
if (!FsHelpers::removeDir(cachePath.c_str())) {
Serial.printf("[%lu] [SCT] Failed to clear cache\n", millis());
return false;
}
Serial.printf("[%lu] [SCT] Cache cleared successfully\n", millis());
return true;
}
2025-12-03 22:00:29 +11:00
bool Section::persistPageDataToSD(const int fontId, const float lineCompression, const int marginTop,
const int marginRight, const int marginBottom, const int marginLeft,
const bool extraParagraphSpacing) {
const auto localPath = epub->getSpineItem(spineIndex).href;
2025-12-03 22:00:29 +11:00
const auto tmpHtmlPath = epub->getCachePath() + "/.tmp_" + std::to_string(spineIndex) + ".html";
File tmpHtml;
if (!FsHelpers::openFileForWrite("SCT", tmpHtmlPath, tmpHtml)) {
return false;
}
bool success = epub->readItemContentsToStream(localPath, tmpHtml, 1024);
tmpHtml.close();
2025-12-03 22:00:29 +11:00
if (!success) {
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Failed to stream item contents to temp file\n", millis());
2025-12-03 22:00:29 +11:00
return false;
}
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Streamed temp HTML to %s\n", millis(), tmpHtmlPath.c_str());
ChapterHtmlSlimParser visitor(tmpHtmlPath, renderer, fontId, lineCompression, marginTop, marginRight, marginBottom,
marginLeft, extraParagraphSpacing,
[this](std::unique_ptr<Page> page) { this->onPageComplete(std::move(page)); });
success = visitor.parseAndBuildPages();
2025-12-03 22:00:29 +11:00
SD.remove(tmpHtmlPath.c_str());
if (!success) {
2025-12-08 22:39:23 +11:00
Serial.printf("[%lu] [SCT] Failed to parse XML and build pages\n", millis());
2025-12-03 22:00:29 +11:00
return false;
}
writeCacheMetadata(fontId, lineCompression, marginTop, marginRight, marginBottom, marginLeft, extraParagraphSpacing);
2025-12-03 22:00:29 +11:00
return true;
}
std::unique_ptr<Page> Section::loadPageFromSD() const {
const auto filePath = cachePath + "/page_" + std::to_string(currentPage) + ".bin";
File inputFile;
if (!FsHelpers::openFileForRead("SCT", filePath, inputFile)) {
return nullptr;
2025-12-03 22:00:29 +11:00
}
auto page = Page::deserialize(inputFile);
inputFile.close();
return page;
2025-12-03 22:00:29 +11:00
}