Maintain date added and date last opened.
[dorian] / model / book.h
1 #ifndef BOOK_H
2 #define BOOK_H
3
4 #include <QString>
5 #include <QStringList>
6 #include <QHash>
7 #include <QImage>
8 #include <QMetaType>
9 #include <QObject>
10 #include <QTemporaryFile>
11 #include <QDateTime>
12
13 class QPixmap;
14
15 /** A book. */
16 class Book: public QObject
17 {
18     Q_OBJECT
19
20 public:
21
22     /** Content item: An individual, named part of the book. */
23     struct ContentItem
24     {
25         QString href;
26         QString name;
27         qint64 size;
28     };
29
30     /** Bookmark: a volume index and a relative position in volume. */
31     struct Bookmark
32     {
33         Bookmark(int part_, qreal pos_, const QString &note_ = QString()):
34                 part(part_), pos(pos_), note(note_) {}
35         Bookmark(): part(0), pos(0.0) {}
36         int part;
37         qreal pos;
38         QString note;
39         bool operator<(const Bookmark &other) const {
40             return (part == other.part)? (pos<other.pos): (part<other.part);
41         }
42     };
43
44     /** Construct a book from an EPUB file. */
45     Book(const QString &fileName, QObject *parent = 0);
46
47     /** Destructor. */
48     ~Book();
49
50     /** Load book meta-data from persistent storage. */
51     void load();
52
53     /** Save book meta-data to persistent storage. */
54     void save();
55
56     /** Upgrade persistent storage of book meta-data. */
57     void upgrade();
58
59     /** Delete book meta-data from persistent storage. */
60     void remove();
61
62     /** Extract and parse EPUB contents, fill in all members except mPath. */
63     bool open();
64
65     /** Extract and parse metadata only, fill in all members except mPath. */
66     void peek();
67
68     /** Clear toc and content members, remove extracted content files. */
69     void close();
70
71     /** Return path to EPUB. */
72     QString path();
73
74     /**
75      * Return path to root directory of extracted EPUB.
76      * Only valid after parsing Book::opsPath().
77      */
78     QString rootPath();
79
80     /** Return temporary directory path for extracting EPUB file. */
81     QString tmpDir() const;
82
83     /** Clear directory. */
84     bool clearDir(const QString &directory);
85
86     /** Set last bookmark. */
87     void setLastBookmark(int part, qreal position);
88
89     /** Get last bookmark. */
90     Bookmark lastBookmark();
91
92     /** Add bookmark. */
93     void addBookmark(int part, qreal position, const QString &note);
94
95     /** Delete bookmark. */
96     void deleteBookmark(int index);
97
98     /** List bookmarks. */
99     QList<Bookmark> bookmarks();
100
101     /**
102      * Get friendly name.
103      * @return @see title or path name combined with author(s) name.
104      */
105     QString name();
106
107     /** Get cover image. */
108     QImage coverImage();
109
110     /** Get short friendly name: title or file name. */
111     QString shortName();
112
113     /** Get chapter index from part index. */
114     int chapterFromPart(int index);
115
116     /** Get part index and URL fragment from chapter index. */
117     int partFromChapter(int index, QString &fragment);
118
119     /** Get progress (0..1) corresponding to part index and part position. */
120     qreal getProgress(int part, qreal position);
121
122     QString title;                          //< Book title from EPUB.
123     QStringList parts;                      //< EPUB part list.
124     QHash<QString, ContentItem> content;    //< Content items from EPUB.
125     QImage cover;                           //< Cover image.
126     QStringList creators;                   //< Creators.
127     QString date;                           //< Date of creation.
128     QString publisher;                      //< Publisher.
129     QString datePublished;                  //< Date of publishing.
130     QString subject;                        //< Subject.
131     QString source;                         //< Source.
132     QString rights;                         //< Rights.
133     QString tocPath;                        //< Path to toc NCX file.
134     QString coverPath;                      //< Path to cover HTML file.
135     QStringList chapters;                   //< Main navigation items.
136     qint64 size;                            //< Size of all parts.
137     QDateTime dateAdded;                    //< Date book added to library.
138     QDateTime dateOpened;                   //< Date book was last read.
139
140 signals:
141     /** Emitted if @see open() succeeds. */
142     void opened(const QString &bookPath);
143
144 protected:
145     /** Extract EPUB as ZIP. */
146     bool extract(const QStringList &excludedExtensions);
147
148     /** Extract metadata from EPUB. */
149     bool extractMetaData();
150
151     /** Parse extracted EPUB. */
152     bool parse();
153
154     /** Clear all book fields except path. */
155     void clear();
156
157     /** Get location of OPS file in EPUB archive. */
158     QString opsPath();
159
160     /** Make a cover image from a file. */
161     QImage makeCover(const QString &fileName);
162
163     /** Make a cover image from an pixmap. */
164     QImage makeCover(const QPixmap &pixmap);
165
166     QString mPath;                          //< Path to EPUB file.
167     Bookmark mLastBookmark;                 //< Last position read.
168     QList<Bookmark> mBookmarks;             //< List of bookmarks.
169     QString mRootPath;                      //< Path to root item in EPUB dir.
170     QTemporaryFile mTempFile;               //< Guards extracting books.
171     bool loaded;                            //< True, if loaded from database.
172 };
173
174 #endif // BOOK_H