[app] Add support for loading books from compressed files

This commit is contained in:
Slava Monich 2015-07-15 22:59:00 +03:00
parent dffa24d4e6
commit b108c25f25
7 changed files with 143 additions and 11 deletions

View file

@ -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

View file

@ -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());

View file

@ -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)) {

View file

@ -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();

View file

@ -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
View 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
View 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