Jump to exact position on page, as identified by TOC entry. Handle
[dorian] / model / book.cpp
index bfaf451..c28af23 100644 (file)
@@ -1,12 +1,4 @@
-#include <QDir>
-#include <QString>
-#include <QDebug>
-#include <QtXml>
 #include <qtextdocument.h>  // Qt::escape is currently defined here...
-#include <QDirIterator>
-#include <QFileInfo>
-#include <QtAlgorithms>
-#include <QCryptographicHash>
 
 #include "book.h"
 #include "opshandler.h"
@@ -16,6 +8,7 @@
 #include "containerhandler.h"
 #include "ncxhandler.h"
 #include "trace.h"
+#include "bookdb.h"
 
 const int COVER_WIDTH = 53;
 const int COVER_HEIGHT = 59;
@@ -46,7 +39,7 @@ QString Book::path() const
 
 bool Book::open()
 {
-    Trace t("Book::open");
+    TRACE;
     qDebug() << path();
     close();
     clear();
@@ -67,7 +60,7 @@ bool Book::open()
 
 void Book::peek()
 {
-    Trace t("Book::peek");
+    TRACE;
     qDebug() << path();
     close();
     clear();
@@ -87,7 +80,7 @@ void Book::peek()
 
 void Book::close()
 {
-    Trace t("Book::close");
+    TRACE;
     content.clear();
     parts.clear();
     QDir::setCurrent(QDir::rootPath());
@@ -103,7 +96,7 @@ QString Book::tmpDir() const
 
 bool Book::extract(const QStringList &excludedExtensions)
 {
-    Trace t("Book::extract");
+    TRACE;
     bool ret = false;
     QString tmp = tmpDir();
     qDebug() << "Extracting" << mPath << "to" << tmp;
@@ -149,7 +142,7 @@ bool Book::extract(const QStringList &excludedExtensions)
 
 bool Book::parse()
 {
-    Trace t("Book::parse");
+    TRACE;
 
     // Parse OPS file
     bool ret = false;
@@ -275,78 +268,64 @@ void Book::clear()
 
 void Book::load()
 {
-    Trace t("Book::load");
+    TRACE;
     qDebug() << "path" << path();
-    QSettings settings;
-    QString key = "book/" + path() + "/";
-    qDebug() << "key" << key;
 
-    // Load book info
-    title = settings.value(key + "title").toString();
+    QVariantHash data = BookDb::instance()->load(path());
+    title = data["title"].toString();
     qDebug() << title;
-    creators = settings.value(key + "creators").toStringList();
-    date = settings.value(key + "date").toString();
-    publisher = settings.value(key + "publisher").toString();
-    datePublished = settings.value(key + "datepublished").toString();
-    subject = settings.value(key + "subject").toString();
-    source = settings.value(key + "source").toString();
-    rights = settings.value(key + "rights").toString();
-    mLastBookmark.part = settings.value(key + "lastpart").toInt();
-    mLastBookmark.pos = settings.value(key + "lastpos").toReal();
-    cover = settings.value(key + "cover").value<QImage>().scaled(COVER_WIDTH,
+    creators = data["creators"].toStringList();
+    date = data["date"].toString();
+    publisher = data["publisher"].toString();
+    datePublished = data["datepublished"].toString();
+    subject = data["subject"].toString();
+    source = data["source"].toString();
+    rights = data["rights"].toString();
+    mLastBookmark.part = data["lastpart"].toInt();
+    mLastBookmark.pos = data["lastpos"].toReal();
+    cover = data["cover"].value<QImage>().scaled(COVER_WIDTH,
         COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
     if (cover.isNull()) {
         cover = makeCover(":/icons/book.png");
     }
-
-    // Load bookmarks
-    int size = settings.value(key + "bookmarks").toInt();
+    int size = data["bookmarks"].toInt();
     for (int i = 0; i < size; i++) {
-        int part = settings.value(key + "bookmark" + QString::number(i) +
-                                     "/part").toInt();
-        qreal pos = settings.value(key + "bookmark" + QString::number(i) +
-                                   "/pos").toReal();
-        qDebug() << QString("Bookmark %1 at part %2, %3").
-                arg(i).arg(part).arg(pos);
-        mBookmarks.append(Bookmark(part, pos));
+        int part = data[QString("bookmark%1part").arg(i)].toInt();
+        qreal pos = data[QString("bookmark%1pos").arg(i)].toReal();
+        QString note = data[QString("bookmark%1note").arg(i)].toString();
+        mBookmarks.append(Bookmark(part, pos, note));
     }
 }
 
 void Book::save()
 {
-    Trace t("Book::save");
-    QSettings settings;
-    QString key = "book/" + path() + "/";
-    qDebug() << "key" << key;
-
-    // Save book info
-    settings.setValue(key + "title", title);
-    qDebug() << "title" << title;
-    settings.setValue(key + "creators", creators);
-    settings.setValue(key + "date", date);
-    settings.setValue(key + "publisher", publisher);
-    settings.setValue(key + "datepublished", datePublished);
-    settings.setValue(key + "subject", subject);
-    settings.setValue(key + "source", source);
-    settings.setValue(key + "rights", rights);
-    settings.setValue(key + "lastpart", mLastBookmark.part);
-    settings.setValue(key + "lastpos", mLastBookmark.pos);
-    settings.setValue(key + "cover", cover);
-
-    // Save bookmarks
-    settings.setValue(key + "bookmarks", mBookmarks.size());
+    TRACE;
+
+    QVariantHash data;
+    data["title"] = title;
+    data["creators"] = creators;
+    data["date"] = date;
+    data["publisher"] = publisher;
+    data["datepublished"] = datePublished;
+    data["subject"] = subject;
+    data["source"] = source;
+    data["rights"] = rights;
+    data["lastpart"] = mLastBookmark.part;
+    data["lastpos"] = mLastBookmark.pos;
+    data["cover"] = cover;
+    data["bookmarks"] = mBookmarks.size();
     for (int i = 0; i < mBookmarks.size(); i++) {
-        qDebug() << QString("Bookmark %1 at %2, %3").
-                arg(i).arg(mBookmarks[i].part).arg(mBookmarks[i].pos);
-        settings.setValue(key + "bookmark" + QString::number(i) + "/part",
-                          mBookmarks[i].part);
-        settings.setValue(key + "bookmark" + QString::number(i) + "/pos",
-                          mBookmarks[i].pos);
+        data[QString("bookmark%1part").arg(i)] = mBookmarks[i].part;
+        data[QString("bookmark%1pos").arg(i)] = mBookmarks[i].pos;
+        data[QString("bookmark%1note").arg(i)] = mBookmarks[i].note;
     }
+    BookDb::instance()->save(path(), data);
 }
 
 void Book::setLastBookmark(int part, qreal position)
 {
+    TRACE;
+    qDebug() << "part" << part << "position" << position;
     mLastBookmark.part = part;
     mLastBookmark.pos = position;
     save();
@@ -357,9 +336,9 @@ Book::Bookmark Book::lastBookmark() const
     return Book::Bookmark(mLastBookmark);
 }
 
-void Book::addBookmark(int part, qreal position)
+void Book::addBookmark(int part, qreal position, const QString &note)
 {
-    mBookmarks.append(Bookmark(part, position));
+    mBookmarks.append(Bookmark(part, position, note));
     qSort(mBookmarks.begin(), mBookmarks.end());
     save();
 }
@@ -377,7 +356,7 @@ QList<Book::Bookmark> Book::bookmarks() const
 
 QString Book::opsPath()
 {
-    Trace t("Book::opsPath");
+    TRACE;
     QString ret;
 
     QFile container(tmpDir() + "/META-INF/container.xml");
@@ -450,19 +429,22 @@ int Book::chapterFromPart(int index)
     return ret;
 }
 
-int Book::partFromChapter(int index)
+int Book::partFromChapter(int index, QString &fragment)
 {
     Trace t("Book::partFromChapter");
+    fragment.clear();
     QString id = chapters[index];
     QString href = content[id].href;
     int hashPos = href.indexOf("#");
     if (hashPos != -1) {
+        fragment = href.mid(hashPos);
         href = href.left(hashPos);
     }
 
     qDebug() << "Chapter" << index;
     qDebug() << " id" << id;
     qDebug() << " href" << href;
+    qDebug() << " fragment" << fragment;
 
     for (int i = 0; i < parts.size(); i++) {
         QString partId = parts[i];
@@ -500,6 +482,48 @@ bool Book::extractMetaData()
 
 void Book::upgrade()
 {
-    Trace t("Book::upgrade");
+    TRACE;
+
     qDebug() << path();
+
+    // Load book from old database (QSettings)
+
+    QSettings settings;
+    QString key = "book/" + path() + "/";
+    title = settings.value(key + "title").toString();
+    qDebug() << title;
+    creators = settings.value(key + "creators").toStringList();
+    date = settings.value(key + "date").toString();
+    publisher = settings.value(key + "publisher").toString();
+    datePublished = settings.value(key + "datepublished").toString();
+    subject = settings.value(key + "subject").toString();
+    source = settings.value(key + "source").toString();
+    rights = settings.value(key + "rights").toString();
+    mLastBookmark.part = settings.value(key + "lastpart").toInt();
+    mLastBookmark.pos = settings.value(key + "lastpos").toReal();
+    cover = settings.value(key + "cover").value<QImage>().scaled(COVER_WIDTH,
+        COVER_HEIGHT, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+    if (cover.isNull()) {
+        cover = makeCover(":/icons/book.png");
+    }
+    int size = settings.value(key + "bookmarks").toInt();
+    for (int i = 0; i < size; i++) {
+        int part = settings.value(key + "bookmark" + QString::number(i) +
+                                     "/part").toInt();
+        qreal pos = settings.value(key + "bookmark" + QString::number(i) +
+                                   "/pos").toReal();
+        qDebug() << QString("Bookmark %1 at part %2, %3").
+                arg(i).arg(part).arg(pos);
+        mBookmarks.append(Bookmark(part, pos));
+    }
+
+    // Save book to new database
+
+    save();
+}
+
+void Book::remove()
+{
+    TRACE;
+    BookDb::instance()->remove(path());
 }