Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
2.5 kB · 69 lines
C
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#pragma once#include <ArduinoJson.h>#include <PersistableStore.h>
#include <string>#include <vector>
struct RecentBook { std::string path; std::string title; std::string author; std::string coverBmpPath;
bool operator==(const RecentBook& other) const { return path == other.path; }};
class RecentBooksStore : public PersistableStore<RecentBooksStore> { public: static constexpr int MAX_RECENT_BOOKS = 10;
private: std::vector<RecentBook> recentBooks;
RecentBooksStore() = default; ~RecentBooksStore() = default;
friend class PersistableStore<RecentBooksStore>;
public: static const char* getFilePath() { return "/.crosspoint/recent.json"; } void toJson(JsonDocument& doc) const; bool fromJson(JsonVariantConst doc);
// Add a book to the recent list (moves to front if already exists) void addBook(const std::string& path, const std::string& title, const std::string& author, const std::string& coverBmpPath);
void updateBook(const std::string& path, const std::string& title, const std::string& author, const std::string& coverBmpPath);
// Remove the entry whose path matches (used when a book is removed from recents or finished/read). // Returns true if an entry was found and removed (no-op + false otherwise). // Persistence is best-effort: a failed save is logged, not reflected in the return. bool removeByPath(const std::string& path);
// Repoint an entry's path (and coverBmpPath, if it lived under the old cache dir) after the // backing file and cache dir were moved on disk. No-op if no entry matches oldPath. // Persists on success. Keeps the entry's list position (does not reorder). void updatePath(const std::string& oldPath, const std::string& newPath, const std::string& oldCachePath, const std::string& newCachePath);
// True if the book's backing file is no longer present on the SD card. static bool isMissing(const RecentBook& book);
// Remove entries whose backing file is no longer on the SD card. // Returns true if any entry was removed. Does not persist — caller decides. bool pruneMissing();
// Get the list of recent books (most recent first) const std::vector<RecentBook>& getBooks() const { return recentBooks; }
// Get the count of recent books int getCount() const { return static_cast<int>(recentBooks.size()); }
RecentBook getDataFromBook(std::string path) const;};
// Helper macro to access recent books store#define RECENT_BOOKS RecentBooksStore::getInstance()