[app] Add support for loading books from compressed files
This commit is contained in:
parent
dffa24d4e6
commit
b108c25f25
7 changed files with 143 additions and 11 deletions
|
@ -109,6 +109,7 @@ SOURCES += \
|
||||||
src/BooksTextStyle.cpp \
|
src/BooksTextStyle.cpp \
|
||||||
src/BooksTaskQueue.cpp \
|
src/BooksTaskQueue.cpp \
|
||||||
src/BooksTextView.cpp \
|
src/BooksTextView.cpp \
|
||||||
|
src/BooksUtil.cpp \
|
||||||
src/main.cpp \
|
src/main.cpp \
|
||||||
src/ZLApplication.cpp \
|
src/ZLApplication.cpp \
|
||||||
src/ZLibrary.cpp
|
src/ZLibrary.cpp
|
||||||
|
@ -144,4 +145,5 @@ HEADERS += \
|
||||||
src/BooksTaskQueue.h \
|
src/BooksTaskQueue.h \
|
||||||
src/BooksTextView.h \
|
src/BooksTextView.h \
|
||||||
src/BooksTextStyle.h \
|
src/BooksTextStyle.h \
|
||||||
src/BooksTypes.h
|
src/BooksTypes.h \
|
||||||
|
src/BooksUtil.h
|
||||||
|
|
|
@ -304,7 +304,7 @@ BooksBook::BooksBook(const BooksStorage& aStorage, shared_ptr<Book> aBook) :
|
||||||
init();
|
init();
|
||||||
HASSERT(!iBook.isNull());
|
HASSERT(!iBook.isNull());
|
||||||
iTitle = QString::fromStdString(iBook->title());
|
iTitle = QString::fromStdString(iBook->title());
|
||||||
iPath = QString::fromStdString(iBook->file().path());
|
iPath = QString::fromStdString(iBook->file().physicalFilePath());
|
||||||
iFileName = QString::fromStdString(iBook->file().name(false));
|
iFileName = QString::fromStdString(iBook->file().name(false));
|
||||||
iFormatPlugin = PluginCollection::Instance().plugin(*iBook);
|
iFormatPlugin = PluginCollection::Instance().plugin(*iBook);
|
||||||
AuthorList authors(iBook->authors());
|
AuthorList authors(iBook->authors());
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "BooksImportModel.h"
|
#include "BooksImportModel.h"
|
||||||
#include "BooksStorage.h"
|
#include "BooksStorage.h"
|
||||||
#include "BooksTask.h"
|
#include "BooksTask.h"
|
||||||
|
#include "BooksUtil.h"
|
||||||
|
|
||||||
#include "HarbourDebug.h"
|
#include "HarbourDebug.h"
|
||||||
|
|
||||||
|
@ -201,8 +202,7 @@ void BooksImportModel::Task::scanDir(QDir aDir)
|
||||||
QFileInfo fileInfo(fileList.at(i));
|
QFileInfo fileInfo(fileList.at(i));
|
||||||
QString filePath(fileInfo.canonicalFilePath());
|
QString filePath(fileInfo.canonicalFilePath());
|
||||||
std::string path(filePath.toStdString());
|
std::string path(filePath.toStdString());
|
||||||
ZLFile file(path);
|
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
|
||||||
if (!book.isNull()) {
|
if (!book.isNull()) {
|
||||||
if (!isDuplicate(filePath, iDestFiles) &&
|
if (!isDuplicate(filePath, iDestFiles) &&
|
||||||
!isDuplicate(filePath, iSrcFiles)) {
|
!isDuplicate(filePath, iSrcFiles)) {
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
#include "BooksTextStyle.h"
|
#include "BooksTextStyle.h"
|
||||||
#include "BooksBook.h"
|
#include "BooksBook.h"
|
||||||
#include "BooksDefs.h"
|
#include "BooksDefs.h"
|
||||||
|
#include "BooksUtil.h"
|
||||||
|
|
||||||
#include "HarbourDebug.h"
|
#include "HarbourDebug.h"
|
||||||
|
|
||||||
#include <MGConfItem>
|
#include <MGConfItem>
|
||||||
|
@ -292,8 +294,7 @@ BooksSettings::updateCurrentBook()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (!iCurrentBook || iCurrentBook->path() != path) {
|
} else if (!iCurrentBook || iCurrentBook->path() != path) {
|
||||||
ZLFile file(path.toStdString());
|
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
|
||||||
if (!book.isNull()) {
|
if (!book.isNull()) {
|
||||||
QFileInfo info(path);
|
QFileInfo info(path);
|
||||||
BooksStorageManager* mgr = BooksStorageManager::instance();
|
BooksStorageManager* mgr = BooksStorageManager::instance();
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "BooksShelf.h"
|
#include "BooksShelf.h"
|
||||||
#include "BooksDefs.h"
|
#include "BooksDefs.h"
|
||||||
#include "BooksBook.h"
|
#include "BooksBook.h"
|
||||||
|
#include "BooksUtil.h"
|
||||||
|
|
||||||
#include "HarbourJson.h"
|
#include "HarbourJson.h"
|
||||||
#include "HarbourDebug.h"
|
#include "HarbourDebug.h"
|
||||||
|
@ -175,8 +176,7 @@ void BooksShelf::LoadTask::performTask()
|
||||||
const int n = list.count();
|
const int n = list.count();
|
||||||
for (int i=0; i<n && !isCanceled(); i++) {
|
for (int i=0; i<n && !isCanceled(); i++) {
|
||||||
std::string path(list.at(i).filePath().toStdString());
|
std::string path(list.at(i).filePath().toStdString());
|
||||||
ZLFile file(path);
|
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
|
||||||
if (!book.isNull()) {
|
if (!book.isNull()) {
|
||||||
BooksBook* newBook = new BooksBook(iStorage, book);
|
BooksBook* newBook = new BooksBook(iStorage, book);
|
||||||
newBook->moveToThread(thread());
|
newBook->moveToThread(thread());
|
||||||
|
@ -988,15 +988,14 @@ void BooksShelf::onCopyTaskDone()
|
||||||
if (src) {
|
if (src) {
|
||||||
src->retain();
|
src->retain();
|
||||||
if (task->iSuccess) {
|
if (task->iSuccess) {
|
||||||
ZLFile file(task->iDest.toStdString());
|
shared_ptr<Book> book = BooksUtil::bookFromFile(task->iDest);
|
||||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
|
||||||
if (!book.isNull()) {
|
if (!book.isNull()) {
|
||||||
copy = new BooksBook(iStorage, book);
|
copy = new BooksBook(iStorage, book);
|
||||||
copy->setLastPos(src->lastPos());
|
copy->setLastPos(src->lastPos());
|
||||||
copy->setCoverImage(src->coverImage());
|
copy->setCoverImage(src->coverImage());
|
||||||
copy->requestCoverImage();
|
copy->requestCoverImage();
|
||||||
} else {
|
} else {
|
||||||
HWARN("can't open copied book:" << file.path().c_str());
|
HWARN("can't open copied book" << qPrintable(task->iDest));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
79
app/src/BooksUtil.cpp
Normal file
79
app/src/BooksUtil.cpp
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jolla Ltd.
|
||||||
|
* Contact: Slava Monich <slava.monich@jolla.com>
|
||||||
|
*
|
||||||
|
* You may use this file under the terms of the BSD license as follows:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Nemo Mobile nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BooksUtil.h"
|
||||||
|
#include "HarbourDebug.h"
|
||||||
|
|
||||||
|
#include "ZLDir.h"
|
||||||
|
#include "formats/FormatPlugin.h"
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
shared_ptr<Book> BooksUtil::bookFromFile(std::string aPath)
|
||||||
|
{
|
||||||
|
shared_ptr<Book> book;
|
||||||
|
const ZLFile file(aPath);
|
||||||
|
PluginCollection& plugins = PluginCollection::Instance();
|
||||||
|
shared_ptr<FormatPlugin> plugin = plugins.plugin(file, false);
|
||||||
|
if (!plugin.isNull()) {
|
||||||
|
std::string error = plugin->tryOpen(file);
|
||||||
|
if (error.empty()) {
|
||||||
|
book = Book::loadFromFile(file);
|
||||||
|
} else {
|
||||||
|
HWARN(error.c_str());
|
||||||
|
}
|
||||||
|
} else if (file.isArchive()) {
|
||||||
|
std::queue<std::string> archiveNames;
|
||||||
|
std::vector<std::string> items;
|
||||||
|
archiveNames.push(aPath);
|
||||||
|
while (!archiveNames.empty() && book.isNull()) {
|
||||||
|
shared_ptr<ZLDir> dir = ZLFile(archiveNames.front()).directory();
|
||||||
|
archiveNames.pop();
|
||||||
|
if (!dir.isNull()) {
|
||||||
|
dir->collectFiles(items, true);
|
||||||
|
for (std::vector<std::string>::const_iterator it = items.begin();
|
||||||
|
book.isNull() && it != items.end(); ++it) {
|
||||||
|
const std::string itemName = dir->itemPath(*it);
|
||||||
|
ZLFile subFile(itemName);
|
||||||
|
if (subFile.isArchive()) {
|
||||||
|
archiveNames.push(itemName);
|
||||||
|
} else {
|
||||||
|
book = Book::loadFromFile(subFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return book;
|
||||||
|
}
|
51
app/src/BooksUtil.h
Normal file
51
app/src/BooksUtil.h
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jolla Ltd.
|
||||||
|
* Contact: Slava Monich <slava.monich@jolla.com>
|
||||||
|
*
|
||||||
|
* You may use this file under the terms of the BSD license as follows:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Nemo Mobile nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOKS_UTIL_H
|
||||||
|
#define BOOKS_UTIL_H
|
||||||
|
|
||||||
|
#include "BooksTypes.h"
|
||||||
|
|
||||||
|
#include "library/Book.h"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace BooksUtil {
|
||||||
|
shared_ptr<Book> bookFromFile(std::string aPath);
|
||||||
|
shared_ptr<Book> bookFromFile(QString aPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline shared_ptr<Book> BooksUtil::bookFromFile(QString aPath)
|
||||||
|
{ return BooksUtil::bookFromFile(aPath.toStdString()); }
|
||||||
|
|
||||||
|
#endif // BOOKS_UTIL_H
|
Loading…
Reference in a new issue