[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/BooksTaskQueue.cpp \
|
||||
src/BooksTextView.cpp \
|
||||
src/BooksUtil.cpp \
|
||||
src/main.cpp \
|
||||
src/ZLApplication.cpp \
|
||||
src/ZLibrary.cpp
|
||||
|
@ -144,4 +145,5 @@ HEADERS += \
|
|||
src/BooksTaskQueue.h \
|
||||
src/BooksTextView.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();
|
||||
HASSERT(!iBook.isNull());
|
||||
iTitle = QString::fromStdString(iBook->title());
|
||||
iPath = QString::fromStdString(iBook->file().path());
|
||||
iPath = QString::fromStdString(iBook->file().physicalFilePath());
|
||||
iFileName = QString::fromStdString(iBook->file().name(false));
|
||||
iFormatPlugin = PluginCollection::Instance().plugin(*iBook);
|
||||
AuthorList authors(iBook->authors());
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "BooksImportModel.h"
|
||||
#include "BooksStorage.h"
|
||||
#include "BooksTask.h"
|
||||
#include "BooksUtil.h"
|
||||
|
||||
#include "HarbourDebug.h"
|
||||
|
||||
|
@ -201,8 +202,7 @@ void BooksImportModel::Task::scanDir(QDir aDir)
|
|||
QFileInfo fileInfo(fileList.at(i));
|
||||
QString filePath(fileInfo.canonicalFilePath());
|
||||
std::string path(filePath.toStdString());
|
||||
ZLFile file(path);
|
||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
||||
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||
if (!book.isNull()) {
|
||||
if (!isDuplicate(filePath, iDestFiles) &&
|
||||
!isDuplicate(filePath, iSrcFiles)) {
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#include "BooksTextStyle.h"
|
||||
#include "BooksBook.h"
|
||||
#include "BooksDefs.h"
|
||||
#include "BooksUtil.h"
|
||||
|
||||
#include "HarbourDebug.h"
|
||||
|
||||
#include <MGConfItem>
|
||||
|
@ -292,8 +294,7 @@ BooksSettings::updateCurrentBook()
|
|||
return true;
|
||||
}
|
||||
} else if (!iCurrentBook || iCurrentBook->path() != path) {
|
||||
ZLFile file(path.toStdString());
|
||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
||||
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||
if (!book.isNull()) {
|
||||
QFileInfo info(path);
|
||||
BooksStorageManager* mgr = BooksStorageManager::instance();
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "BooksShelf.h"
|
||||
#include "BooksDefs.h"
|
||||
#include "BooksBook.h"
|
||||
#include "BooksUtil.h"
|
||||
|
||||
#include "HarbourJson.h"
|
||||
#include "HarbourDebug.h"
|
||||
|
@ -175,8 +176,7 @@ void BooksShelf::LoadTask::performTask()
|
|||
const int n = list.count();
|
||||
for (int i=0; i<n && !isCanceled(); i++) {
|
||||
std::string path(list.at(i).filePath().toStdString());
|
||||
ZLFile file(path);
|
||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
||||
shared_ptr<Book> book = BooksUtil::bookFromFile(path);
|
||||
if (!book.isNull()) {
|
||||
BooksBook* newBook = new BooksBook(iStorage, book);
|
||||
newBook->moveToThread(thread());
|
||||
|
@ -988,15 +988,14 @@ void BooksShelf::onCopyTaskDone()
|
|||
if (src) {
|
||||
src->retain();
|
||||
if (task->iSuccess) {
|
||||
ZLFile file(task->iDest.toStdString());
|
||||
shared_ptr<Book> book = Book::loadFromFile(file);
|
||||
shared_ptr<Book> book = BooksUtil::bookFromFile(task->iDest);
|
||||
if (!book.isNull()) {
|
||||
copy = new BooksBook(iStorage, book);
|
||||
copy->setLastPos(src->lastPos());
|
||||
copy->setCoverImage(src->coverImage());
|
||||
copy->requestCoverImage();
|
||||
} 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