summaryrefslogtreecommitdiffstats
path: root/reader/src/network/NetworkBookItem.cpp
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2024-06-07 23:30:05 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2024-06-07 23:30:05 +0900
commit17b259df9cb6b28779d4881b2b6c805ee2e48eea (patch)
tree5ed61937459cb7081089111b0242c01ec178f1f3 /reader/src/network/NetworkBookItem.cpp
parent1cba8bce178eb2d6719c6f7f21e2c9352c5513a6 (diff)
downloadtde-ebook-reader-17b259df9cb6b28779d4881b2b6c805ee2e48eea.tar.gz
tde-ebook-reader-17b259df9cb6b28779d4881b2b6c805ee2e48eea.zip
Rename to tde-ebook-reader
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'reader/src/network/NetworkBookItem.cpp')
-rw-r--r--reader/src/network/NetworkBookItem.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/reader/src/network/NetworkBookItem.cpp b/reader/src/network/NetworkBookItem.cpp
new file mode 100644
index 0000000..5eeb101
--- /dev/null
+++ b/reader/src/network/NetworkBookItem.cpp
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2009-2012 Geometer Plus <contact@geometerplus.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "NetworkItems.h"
+#include "NetworkLink.h"
+#include "authentication/NetworkAuthenticationManager.h"
+
+const ZLTypeId NetworkBookItem::TYPE_ID(NetworkItem::TYPE_ID);
+
+bool NetworkBookItem::AuthorData::operator < (const AuthorData &data) const {
+ const int sComp = SortKey.compare(data.SortKey);
+ return (sComp < 0) || (sComp == 0 && DisplayName < data.DisplayName);
+}
+
+bool NetworkBookItem::AuthorData::operator != (const NetworkBookItem::AuthorData &data) const {
+ return DisplayName != data.DisplayName || SortKey != data.SortKey;
+}
+
+bool NetworkBookItem::AuthorData::operator == (const NetworkBookItem::AuthorData &data) const {
+ return DisplayName == data.DisplayName && SortKey == data.SortKey;
+}
+
+NetworkBookItem::NetworkBookItem(
+ const NetworkLink &link,
+ const std::string &id,
+ unsigned int index,
+ const std::string &title,
+ const std::string &summary,
+ const std::string &language,
+ const std::string &date,
+ const std::vector<AuthorData> &authors,
+ const std::vector<std::string> &tags,
+ const std::string &seriesTitle,
+ unsigned int indexInSeries,
+ const UrlInfoCollection &urlByType,
+ const std::vector<shared_ptr<BookReference> > references
+) :
+ NetworkItem(link, title, summary, urlByType),
+ Index(index),
+ Id(id),
+ Language(language),
+ Date(date),
+ Authors(authors),
+ Tags(tags),
+ SeriesTitle(seriesTitle),
+ IndexInSeries(indexInSeries),
+ myReferences(references) {
+}
+
+NetworkBookItem::NetworkBookItem(const NetworkBookItem &book, unsigned int index) :
+ NetworkItem(book.Link, book.Title, book.Summary, book.URLByType),
+ Index(index),
+ Id(book.Id),
+ Language(book.Language),
+ Date(book.Date),
+ Authors(book.Authors),
+ Tags(book.Tags),
+ SeriesTitle(book.SeriesTitle),
+ IndexInSeries(book.IndexInSeries) {
+}
+
+const ZLTypeId &NetworkBookItem::typeId() const {
+ return TYPE_ID;
+}
+
+shared_ptr<BookReference> NetworkBookItem::reference(BookReference::Type type) const {
+ shared_ptr<BookReference> reference;
+ for (std::vector<shared_ptr<BookReference> >::const_iterator it = myReferences.begin(); it != myReferences.end(); ++it) {
+ if ((*it)->ReferenceType == type &&
+ (reference.isNull() || (*it)->BookFormat > reference->BookFormat)) {
+ reference = *it;
+ }
+ }
+
+ if (reference.isNull() && type == BookReference::DOWNLOAD_FULL) {
+ reference = this->reference(BookReference::DOWNLOAD_FULL_CONDITIONAL);
+ if (!reference.isNull()) {
+ shared_ptr<NetworkAuthenticationManager> authManager =
+ Link.authenticationManager();
+ if (authManager.isNull() || authManager->needPurchase(*this)) {
+ return 0;
+ }
+ reference = authManager->downloadReference(*this);
+ }
+ }
+
+ if (reference.isNull() &&
+ type == BookReference::DOWNLOAD_FULL &&
+ this->reference(BookReference::BUY).isNull() &&
+ this->reference(BookReference::BUY_IN_BROWSER).isNull()) {
+ reference = this->reference(BookReference::DOWNLOAD_FULL_OR_DEMO);
+ }
+
+ if (reference.isNull() &&
+ type == BookReference::DOWNLOAD_DEMO &&
+ (!this->reference(BookReference::BUY).isNull() ||
+ !this->reference(BookReference::BUY_IN_BROWSER).isNull())) {
+ reference = this->reference(BookReference::DOWNLOAD_FULL_OR_DEMO);
+ }
+
+ return reference;
+}
+
+std::string NetworkBookItem::localCopyFileName() const {
+ const bool hasBuyReference =
+ !this->reference(BookReference::BUY).isNull() ||
+ !this->reference(BookReference::BUY_IN_BROWSER).isNull();
+ shared_ptr<BookReference> reference;
+ std::string fileName;
+ for (std::vector<shared_ptr<BookReference> >::const_iterator it = myReferences.begin(); it != myReferences.end(); ++it) {
+ const BookReference::Type type = (*it)->ReferenceType;
+ if ((type == BookReference::DOWNLOAD_FULL ||
+ type == BookReference::DOWNLOAD_FULL_CONDITIONAL ||
+ (!hasBuyReference && type == BookReference::DOWNLOAD_FULL_OR_DEMO)) &&
+ (reference.isNull() || (*it)->BookFormat > reference->BookFormat)) {
+ std::string name = (*it)->localCopyFileName();
+ if (!name.empty()) {
+ reference = *it;
+ fileName = name;
+ }
+ }
+ }
+ return fileName;
+}
+
+void NetworkBookItem::removeLocalFiles() const {
+ const bool hasBuyReference =
+ !this->reference(BookReference::BUY).isNull() ||
+ !this->reference(BookReference::BUY_IN_BROWSER).isNull();
+ for (std::vector<shared_ptr<BookReference> >::const_iterator it = myReferences.begin(); it != myReferences.end(); ++it) {
+ const BookReference::Type type = (*it)->ReferenceType;
+ if (type == BookReference::DOWNLOAD_FULL ||
+ type == BookReference::DOWNLOAD_FULL_CONDITIONAL ||
+ (!hasBuyReference && type == BookReference::DOWNLOAD_FULL_OR_DEMO)) {
+ std::string fileName = (*it)->localCopyFileName();
+ if (!fileName.empty()) {
+ // TODO: remove a book from the library
+ // TODO: remove a record from the database
+ ZLFile(fileName).remove();
+ }
+ }
+ }
+}
+
+bool NetworkBookItem::isFullyLoaded() const {
+ return true;
+}
+
+void NetworkBookItem::loadFullInformation(shared_ptr<ZLNetworkRequest::Listener> listener) {
+ listener->finished();
+}
+
+std::vector<shared_ptr<NetworkItem> > NetworkBookItem::getRelatedCatalogsItems() const {
+ return std::vector<shared_ptr<NetworkItem> >();
+}
+
+void NetworkBookItem::updateReferences(const std::vector<shared_ptr<BookReference> > &references) {
+ //TODO implement using one UrlInfoCollection instead of vector of references and urlByType
+ for (std::size_t i = 0; i < references.size(); ++i) {
+ bool found = false;
+ const shared_ptr<BookReference> newRef = references.at(i);
+ for (std::size_t j = 0; j < myReferences.size(); ++j) {
+ shared_ptr<BookReference> ref = myReferences.at(j);
+ if (ref->ReferenceType == newRef->ReferenceType && ref->BookFormat == ref->BookFormat) {
+ //TODO maybe implement a supporting of new urls with same book format & reference type:
+ //ref->URL = newRef->URL;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ myReferences.push_back(newRef);
+ }
+ }
+}