Split heap gate into separate free-memory (50KB) and largest-block (20KB) thresholds based on field measurements. Enable wolfSSL single-precision ECC to use fixed 256-bit arrays instead of heap-allocated fast-math bignums, reducing TLS handshake memory footprint. Reclaim ~7KB by right-sizing ESP timer task stacks and move WiFi code out of IRAM to free ~25-30KB for heap. Add memory audit landmarks for font and EPUB allocations.
90 lines
3.5 KiB
C++
90 lines
3.5 KiB
C++
#pragma once
|
|
|
|
#include <Print.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "Epub/BookMetadataCache.h"
|
|
#include "Epub/css/CssParser.h"
|
|
|
|
class ZipFile;
|
|
|
|
class Epub {
|
|
// the ncx file (EPUB 2)
|
|
std::string tocNcxItem;
|
|
// the nav file (EPUB 3)
|
|
std::string tocNavItem;
|
|
// where is the EPUBfile?
|
|
std::string filepath;
|
|
// the base path for items in the EPUB file
|
|
std::string contentBasePath;
|
|
// Uniq cache key based on filepath
|
|
std::string cachePath;
|
|
// Spine and TOC cache
|
|
std::unique_ptr<BookMetadataCache> bookMetadataCache;
|
|
// CSS parser for styling
|
|
std::unique_ptr<CssParser> cssParser;
|
|
// CSS files
|
|
std::vector<std::string> cssFiles;
|
|
|
|
bool findContentOpfFile(std::string* contentOpfFile) const;
|
|
bool parseContentOpf(BookMetadataCache::BookMetadata& bookMetadata, bool writeSpineEntries = true);
|
|
bool parseTocNcxFile() const;
|
|
bool parseTocNavFile() const;
|
|
void discoverCssFilesFromZip();
|
|
void parseCssFiles() const;
|
|
|
|
public:
|
|
explicit Epub(std::string filepath, const std::string& cacheDir) : filepath(std::move(filepath)) {
|
|
// create a cache key based on the filepath
|
|
cachePath = cacheDir + "/epub_" + std::to_string(std::hash<std::string>{}(this->filepath));
|
|
}
|
|
~Epub() = default;
|
|
std::string& getBasePath() { return contentBasePath; }
|
|
// MEMFIX-PORT: epub resident-bytes audit accessor; portable
|
|
// Approximate resident heap of the open book (audit): path strings, the CSS
|
|
// file list, and the parsed stylesheet. BookMetadataCache is file-backed
|
|
// (counts + HalFile handles) and contributes little.
|
|
size_t residentBytes() const {
|
|
size_t total = sizeof(Epub) + tocNcxItem.capacity() + tocNavItem.capacity() + filepath.capacity() +
|
|
contentBasePath.capacity() + cachePath.capacity();
|
|
for (const auto& f : cssFiles) total += sizeof(f) + (f.capacity() > 15 ? f.capacity() : 0);
|
|
if (cssParser) total += cssParser->residentBytes();
|
|
return total;
|
|
}
|
|
size_t cssRuleCount() const { return cssParser ? cssParser->ruleCount() : 0; }
|
|
bool load(bool buildIfMissing = true, bool skipLoadingCss = false);
|
|
bool clearCache() const;
|
|
void setupCacheDir() const;
|
|
const std::string& getCachePath() const;
|
|
const std::string& getPath() const;
|
|
const std::string& getTitle() const;
|
|
const std::string& getAuthor() const;
|
|
const std::string& getLanguage() const;
|
|
std::string getCoverBmpPath(bool cropped = false) const;
|
|
bool generateCoverBmp(bool cropped = false) const;
|
|
std::string getThumbBmpPath() const;
|
|
std::string getThumbBmpPath(int height) const;
|
|
bool generateThumbBmp(int height) const;
|
|
uint8_t* readItemContentsToBytes(const std::string& itemHref, size_t* size = nullptr,
|
|
bool trailingNullByte = false) const;
|
|
bool readItemContentsToStream(const std::string& itemHref, Print& out, size_t chunkSize) const;
|
|
bool getItemSize(const std::string& itemHref, size_t* size) const;
|
|
BookMetadataCache::SpineEntry getSpineItem(int spineIndex) const;
|
|
BookMetadataCache::TocEntry getTocItem(int tocIndex) const;
|
|
int getSpineItemsCount() const;
|
|
int getTocItemsCount() const;
|
|
int getSpineIndexForTocIndex(int tocIndex) const;
|
|
int getTocIndexForSpineIndex(int spineIndex) const;
|
|
size_t getCumulativeSpineItemSize(int spineIndex) const;
|
|
int getSpineIndexForTextReference() const;
|
|
|
|
size_t getBookSize() const;
|
|
float calculateProgress(int currentSpineIndex, float currentSpineRead) const;
|
|
CssParser* getCssParser() const { return cssParser.get(); }
|
|
int resolveHrefToSpineIndex(const std::string& href) const;
|
|
};
|