Add m_archives and getArchiveById to Library

These members will mirror the functionality offered by equivalent usage
of Reader class.
This commit is contained in:
Maneesh P M 2021-05-22 21:17:45 +05:30
parent 0594e60df3
commit 940368b8ac
4 changed files with 43 additions and 3 deletions

View File

@ -24,6 +24,7 @@
#include <vector> #include <vector>
#include <map> #include <map>
#include <memory> #include <memory>
#include <zim/archive.h>
#include "book.h" #include "book.h"
#include "bookmark.h" #include "bookmark.h"
@ -146,6 +147,7 @@ class Library
{ {
std::map<std::string, kiwix::Book> m_books; std::map<std::string, kiwix::Book> m_books;
std::map<std::string, std::shared_ptr<Reader>> m_readers; std::map<std::string, std::shared_ptr<Reader>> m_readers;
std::map<std::string, std::shared_ptr<zim::Archive>> m_archives;
std::vector<kiwix::Bookmark> m_bookmarks; std::vector<kiwix::Bookmark> m_bookmarks;
class BookDB; class BookDB;
std::unique_ptr<BookDB> m_bookDB; std::unique_ptr<BookDB> m_bookDB;
@ -198,6 +200,7 @@ class Library
const Book& getBookByPath(const std::string& path) const; const Book& getBookByPath(const std::string& path) const;
Book& getBookByPath(const std::string& path); Book& getBookByPath(const std::string& path);
std::shared_ptr<Reader> getReaderById(const std::string& id); std::shared_ptr<Reader> getReaderById(const std::string& id);
std::shared_ptr<zim::Archive> getArchiveById(const std::string& id);
/** /**
* Remove a book from the library. * Remove a book from the library.

View File

@ -91,6 +91,13 @@ class Reader
* (.zim extesion). * (.zim extesion).
*/ */
explicit Reader(const string zimFilePath); explicit Reader(const string zimFilePath);
/**
* Create a Reader to read a zim file given by the Archive.
*
* @param archive The shared pointer to the Archive object.
*/
explicit Reader(const std::shared_ptr<zim::Archive> archive);
#ifndef _WIN32 #ifndef _WIN32
explicit Reader(int fd); explicit Reader(int fd);
Reader(int fd, zim::offset_type offset, zim::size_type size); Reader(int fd, zim::offset_type offset, zim::size_type size);
@ -488,7 +495,7 @@ class Reader
zim::Archive* getZimArchive() const; zim::Archive* getZimArchive() const;
protected: protected:
std::unique_ptr<zim::Archive> zimArchive; std::shared_ptr<zim::Archive> zimArchive;
std::string zimFilePath; std::string zimFilePath;
SuggestionsList_t suggestions; SuggestionsList_t suggestions;

View File

@ -108,6 +108,7 @@ bool Library::removeBookById(const std::string& id)
{ {
m_bookDB->delete_document("Q" + id); m_bookDB->delete_document("Q" + id);
m_readers.erase(id); m_readers.erase(id);
m_archives.erase(id);
return m_books.erase(id) == 1; return m_books.erase(id) == 1;
} }
@ -146,11 +147,35 @@ std::shared_ptr<Reader> Library::getReaderById(const std::string& id)
return m_readers.at(id); return m_readers.at(id);
} catch (std::out_of_range& e) {} } catch (std::out_of_range& e) {}
try {
auto reader = make_shared<Reader>(m_archives.at(id));
m_readers[id] = reader;
return reader;
} catch (std::out_of_range& e) {}
auto book = getBookById(id); auto book = getBookById(id);
if (!book.isPathValid()) if (!book.isPathValid())
return nullptr; return nullptr;
auto sptr = make_shared<Reader>(book.getPath());
m_readers[id] = sptr; auto archive = make_shared<zim::Archive>(book.getPath());
m_archives[id] = archive;
auto reader = make_shared<Reader>(archive);
m_readers[id] = reader;
return reader;
}
std::shared_ptr<zim::Archive> Library::getArchiveById(const std::string& id)
{
try {
return m_archives.at(id);
} catch (std::out_of_range& e) {}
auto book = getBookById(id);
if (!book.isPathValid())
return nullptr;
auto sptr = make_shared<zim::Archive>(book.getPath());
m_archives[id] = sptr;
return sptr; return sptr;
} }

View File

@ -86,6 +86,11 @@ Reader::Reader(const string zimFilePath)
srand(time(nullptr)); srand(time(nullptr));
} }
Reader::Reader(const std::shared_ptr<zim::Archive> archive)
: zimArchive(archive),
zimFilePath(archive->getFilename())
{}
#ifndef _WIN32 #ifndef _WIN32
Reader::Reader(int fd) Reader::Reader(int fd)
: zimArchive(new zim::Archive(fd)), : zimArchive(new zim::Archive(fd)),