mirror of https://github.com/kiwix/libkiwix.git
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:
parent
0594e60df3
commit
940368b8ac
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
Loading…
Reference in New Issue