f764860363e4b381577d87f2ca62ef3e527418b1
[dorian] / model / opshandler.h
1 #ifndef OPSHANDLER_H
2 #define OPSHANDLER_H
3
4 #include "xmlhandler.h"
5 #include "book.h"
6 #include "trace.h"
7
8 /** XML content handler for OPS format. */
9 class OpsHandler: public XmlHandler
10 {
11 public:
12     OpsHandler(Book &b): book(b), partCount(0) {}
13
14     bool endElement(const QString &namespaceUri, const QString &name,
15                     const QString &qName) {
16         (void)namespaceUri;
17         (void)qName;
18         if (currentText.size()) {
19             if (name == "title") {
20                 book.title = currentText;
21             } else if (name == "creator") {
22                 book.creators.append(currentText);
23             } else if (name == "publisher") {
24                 book.publisher = currentText;
25             } else if (name == "subject") {
26                 book.subject = currentText;
27             } else if (name == "source") {
28                 book.source = currentText;
29             } else if (name == "rights") {
30                 book.rights = currentText;
31             }
32         }
33         return true;
34     }
35
36     bool startElement(const QString &namespaceUri, const QString &name,
37                       const QString &qName, const QXmlAttributes &attrs) {
38         (void)namespaceUri;
39         (void)qName;
40         currentText = "";
41
42         if (name == "item") {
43             Book::ContentItem item;
44             item.href = attrs.value("href");
45             item.name = QString("Part %1").arg(partCount + 1);
46             item.size = 0;
47             QString key = attrs.value("id");
48             book.content[key] = item;
49             partCount++;
50         } else if (name == "itemref") {
51             book.parts.append(attrs.value("idref"));
52         }
53         return true;
54     }
55
56 private:
57     Book &book;
58     int partCount;
59 };
60
61 #endif // OPSHANDLER_H