/src/libqxp/src/lib/QXPDetector.cpp
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* |
3 | | * This file is part of the libqxp project. |
4 | | * |
5 | | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | | */ |
9 | | |
10 | | #include "QXPDetector.h" |
11 | | |
12 | | #include "QXP1Header.h" |
13 | | #include "QXP33Header.h" |
14 | | #include "QXP3HeaderBase.h" |
15 | | #include "QXP4Header.h" |
16 | | #include "QXPMacFileParser.h" |
17 | | #include "QXPParser.h" |
18 | | |
19 | | namespace libqxp |
20 | | { |
21 | | |
22 | | namespace |
23 | | { |
24 | | |
25 | | class QXP3Detector : public QXP3HeaderBase |
26 | | { |
27 | | public: |
28 | | bool isSupported() |
29 | 9.84k | { |
30 | 9.84k | switch (m_version) |
31 | 9.84k | { |
32 | 3.03k | case QXPVersion::QXP_31_MAC: |
33 | 3.07k | case QXPVersion::QXP_31: |
34 | 3.71k | case QXPVersion::QXP_33: |
35 | 5.91k | case QXPVersion::QXP_4: |
36 | 5.91k | return m_signature == "XPR"; |
37 | 3.92k | default: |
38 | 3.92k | return false; |
39 | 9.84k | } |
40 | 9.84k | } |
41 | | |
42 | | std::shared_ptr<QXPHeader> createHeader(const boost::optional<QXPDocument::Type> type = boost::none) |
43 | 5.88k | { |
44 | 5.88k | switch (m_version) |
45 | 5.88k | { |
46 | 3.02k | case QXPVersion::QXP_31_MAC: |
47 | 3.05k | case QXPVersion::QXP_31: |
48 | 3.69k | case QXPVersion::QXP_33: |
49 | 3.69k | return std::make_shared<QXP33Header>(type); |
50 | 2.18k | case QXPVersion::QXP_4: |
51 | 2.18k | return std::make_shared<QXP4Header>(type); |
52 | 0 | default: |
53 | 0 | return nullptr; |
54 | 5.88k | } |
55 | 5.88k | } |
56 | | |
57 | | private: |
58 | | QXPDocument::Type getType() const override |
59 | 0 | { |
60 | 0 | return QXPDocument::TYPE_UNKNOWN; |
61 | 0 | } |
62 | | |
63 | | std::unique_ptr<QXPParser> createParser(const std::shared_ptr<librevenge::RVNGInputStream> &, librevenge::RVNGDrawingInterface *) override |
64 | 0 | { |
65 | 0 | return nullptr; |
66 | 0 | } |
67 | | }; |
68 | | |
69 | | } |
70 | | |
71 | | QXPDetector::QXPDetector() |
72 | 10.0k | : m_input() |
73 | 10.0k | , m_header() |
74 | 10.0k | , m_type(QXPDocument::TYPE_UNKNOWN) |
75 | 10.0k | , m_supported(false) |
76 | 10.0k | { |
77 | 10.0k | } |
78 | | |
79 | | void QXPDetector::detect(const std::shared_ptr<librevenge::RVNGInputStream> &input) |
80 | 10.0k | { |
81 | 10.0k | boost::optional<QXPDocument::Type> docType; |
82 | | |
83 | 10.0k | std::shared_ptr<librevenge::RVNGInputStream> docStream; |
84 | 10.0k | std::string type; |
85 | 10.0k | std::string creator; |
86 | 10.0k | QXPMacFileParser macFile(docStream, type, creator); |
87 | 10.0k | if (macFile.parse(input)) |
88 | 400 | { |
89 | 400 | if (creator == "XPR3") |
90 | 21 | { |
91 | 21 | if (type == "XDOC") |
92 | 1 | docType = QXPDocument::TYPE_DOCUMENT; |
93 | 20 | else if (type == "XTMP") |
94 | 1 | docType = QXPDocument::TYPE_TEMPLATE; |
95 | 19 | else if (type == "XBOK") |
96 | 1 | docType = QXPDocument::TYPE_BOOK; |
97 | 18 | else if (type == "XLIB") |
98 | 1 | docType = QXPDocument::TYPE_LIBRARY; |
99 | 21 | } |
100 | 379 | else if (creator == "XPRS" && type == "XDOC") |
101 | 218 | { |
102 | 218 | m_input = docStream; |
103 | 218 | m_header = std::make_shared<QXP1Header>(); |
104 | 218 | } |
105 | 400 | } |
106 | 9.68k | else |
107 | 9.68k | { |
108 | 9.68k | docStream = input; |
109 | 9.68k | } |
110 | | |
111 | 10.0k | if (!m_header) |
112 | 9.86k | { |
113 | 9.86k | QXP3Detector detector; |
114 | 9.86k | if (detector.load(docStream) && detector.isSupported()) |
115 | 5.88k | { |
116 | 5.88k | m_input = docStream; |
117 | 5.88k | m_header = detector.createHeader(docType); |
118 | 5.88k | } |
119 | 9.86k | } |
120 | | |
121 | 10.0k | if (bool(m_header)) |
122 | 6.09k | { |
123 | 6.09k | m_input->seek(0, librevenge::RVNG_SEEK_SET); |
124 | 6.09k | m_header->load(m_input); |
125 | 6.09k | m_type = m_header->getType(); |
126 | 6.09k | m_supported = m_type != QXPDocument::TYPE_UNKNOWN; |
127 | 6.09k | } |
128 | 10.0k | } |
129 | | |
130 | | const std::shared_ptr<librevenge::RVNGInputStream> &QXPDetector::input() const |
131 | 5.99k | { |
132 | 5.99k | return m_input; |
133 | 5.99k | } |
134 | | |
135 | | const std::shared_ptr<QXPHeader> &QXPDetector::header() const |
136 | 5.99k | { |
137 | 5.99k | return m_header; |
138 | 5.99k | } |
139 | | |
140 | | bool QXPDetector::isSupported() const |
141 | 9.98k | { |
142 | 9.98k | return m_supported; |
143 | 9.98k | } |
144 | | |
145 | | QXPDocument::Type QXPDetector::type() const |
146 | 6.08k | { |
147 | 6.08k | return m_type; |
148 | 6.08k | } |
149 | | |
150 | | } // namespace libqxp |
151 | | |
152 | | /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ |