/src/libmwaw/src/lib/HanMacWrdKParser.hxx
Line | Count | Source |
1 | | /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */ |
2 | | |
3 | | /* libmwaw |
4 | | * Version: MPL 2.0 / LGPLv2+ |
5 | | * |
6 | | * The contents of this file are subject to the Mozilla Public License Version |
7 | | * 2.0 (the "License"); you may not use this file except in compliance with |
8 | | * the License or as specified alternatively below. You may obtain a copy of |
9 | | * the License at http://www.mozilla.org/MPL/ |
10 | | * |
11 | | * Software distributed under the License is distributed on an "AS IS" basis, |
12 | | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
13 | | * for the specific language governing rights and limitations under the |
14 | | * License. |
15 | | * |
16 | | * Major Contributor(s): |
17 | | * Copyright (C) 2002 William Lachance (wrlach@gmail.com) |
18 | | * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net) |
19 | | * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch) |
20 | | * Copyright (C) 2006, 2007 Andrew Ziem |
21 | | * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr) |
22 | | * |
23 | | * |
24 | | * All Rights Reserved. |
25 | | * |
26 | | * For minor contributions see the git repository. |
27 | | * |
28 | | * Alternatively, the contents of this file may be used under the terms of |
29 | | * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"), |
30 | | * in which case the provisions of the LGPLv2+ are applicable |
31 | | * instead of those above. |
32 | | */ |
33 | | |
34 | | /* |
35 | | * Parser to convert HanMac Word-K document |
36 | | */ |
37 | | #ifndef HAN_MAC_WRD_K_PARSER |
38 | | # define HAN_MAC_WRD_K_PARSER |
39 | | |
40 | | #include <iostream> |
41 | | #include <string> |
42 | | #include <vector> |
43 | | |
44 | | #include <librevenge/librevenge.h> |
45 | | |
46 | | #include "MWAWDebug.hxx" |
47 | | #include "MWAWInputStream.hxx" |
48 | | |
49 | | #include "MWAWParser.hxx" |
50 | | |
51 | | namespace HanMacWrdKParserInternal |
52 | | { |
53 | | struct State; |
54 | | class SubDocument; |
55 | | } |
56 | | |
57 | | //! Small class used to store the decoded zone of HanMacWrdKParser |
58 | | struct HanMacWrdKZone { |
59 | | //! constructor given an input and an asciiFile |
60 | | HanMacWrdKZone(MWAWInputStreamPtr const &input, libmwaw::DebugFile &asciiFile); |
61 | | //! constructor given an asciiFile (used for compressed zone) |
62 | | explicit HanMacWrdKZone(std::shared_ptr<libmwaw::DebugFile> const &asciiFile); |
63 | | //! destructor |
64 | | ~HanMacWrdKZone(); |
65 | | |
66 | | //! returns the first position in the input |
67 | | long begin() const |
68 | 32.5k | { |
69 | 32.5k | return m_asciiFilePtr ? 0 : m_filePos; |
70 | 32.5k | } |
71 | | //! returns the last position in the input |
72 | | long end() const |
73 | 32.3k | { |
74 | 32.3k | return m_asciiFilePtr ? long(m_data.size()) : m_endFilePos; |
75 | 32.3k | } |
76 | | //! returns the zone size |
77 | | long length() const |
78 | 390k | { |
79 | 390k | if (m_asciiFilePtr) return long(m_data.size()); |
80 | 0 | return m_endFilePos-m_filePos; |
81 | 390k | } |
82 | | //! returns true if the zone data exists |
83 | | bool valid() const |
84 | 266k | { |
85 | 266k | return length() > 0; |
86 | 266k | } |
87 | | |
88 | | // function to define the zone in the original file |
89 | | |
90 | | //! returns the file begin position |
91 | | long fileBeginPos() const |
92 | 364k | { |
93 | 364k | return m_filePos; |
94 | 364k | } |
95 | | //! returns the file begin position |
96 | | long fileEndPos() const |
97 | 75.4M | { |
98 | 75.4M | return m_endFilePos; |
99 | 75.4M | } |
100 | | //! sets the begin file pos |
101 | | void setFileBeginPos(long begPos) |
102 | 204k | { |
103 | 204k | m_filePos = m_endFilePos = begPos; |
104 | 204k | } |
105 | | //! sets the file length |
106 | | void setFileLength(long len) |
107 | 39.6k | { |
108 | 39.6k | m_endFilePos = m_filePos+len; |
109 | 39.6k | } |
110 | | //! sets the begin/end file pos |
111 | | void setFilePositions(long begPos, long endPos) |
112 | 0 | { |
113 | 0 | m_filePos = begPos; |
114 | 0 | m_endFilePos = endPos; |
115 | 0 | } |
116 | | //! returns a pointer to the binary data |
117 | | librevenge::RVNGBinaryData &getBinaryData() |
118 | 79.2k | { |
119 | 79.2k | return m_data; |
120 | 79.2k | } |
121 | | //! returns the zone name |
122 | | std::string name() const |
123 | 406k | { |
124 | 406k | return name(m_type); |
125 | 406k | } |
126 | | //! returns the zone name |
127 | | static std::string name(int type); |
128 | | |
129 | | //! operator << |
130 | | friend std::ostream &operator<<(std::ostream &o, HanMacWrdKZone const &zone); |
131 | | |
132 | | //! returns the debug file |
133 | | libmwaw::DebugFile &ascii() const |
134 | 522k | { |
135 | 522k | return *m_asciiFile; |
136 | 522k | } |
137 | | |
138 | | //! the type : 1(text), .... |
139 | | int m_type; |
140 | | |
141 | | //! the zone id |
142 | | long m_id; |
143 | | |
144 | | //! the zone subId |
145 | | long m_subId; |
146 | | |
147 | | //! the main input |
148 | | MWAWInputStreamPtr m_input; |
149 | | |
150 | | //! some extra data |
151 | | std::string m_extra; |
152 | | |
153 | | //! true if the zone is sended |
154 | | mutable bool m_parsed; |
155 | | |
156 | | protected: |
157 | | //! the begin of the entry |
158 | | long m_filePos; |
159 | | |
160 | | //! the end of the entry |
161 | | long m_endFilePos; |
162 | | |
163 | | //! the storage (if needed) |
164 | | librevenge::RVNGBinaryData m_data; |
165 | | |
166 | | //! the debug file |
167 | | libmwaw::DebugFile *m_asciiFile; |
168 | | |
169 | | //! the file pointer |
170 | | std::shared_ptr<libmwaw::DebugFile> m_asciiFilePtr; |
171 | | |
172 | | private: |
173 | | HanMacWrdKZone(HanMacWrdKZone const &orig) = delete; |
174 | | HanMacWrdKZone &operator=(HanMacWrdKZone const &orig) = delete; |
175 | | }; |
176 | | |
177 | | class HanMacWrdKGraph; |
178 | | class HanMacWrdKText; |
179 | | |
180 | | /** \brief the main class to read a HanMac Word-K file |
181 | | * |
182 | | * |
183 | | * |
184 | | */ |
185 | | class HanMacWrdKParser final : public MWAWTextParser |
186 | | { |
187 | | friend class HanMacWrdKGraph; |
188 | | friend class HanMacWrdKText; |
189 | | friend class HanMacWrdKParserInternal::SubDocument; |
190 | | |
191 | | public: |
192 | | //! constructor |
193 | | HanMacWrdKParser(MWAWInputStreamPtr const &input, MWAWRSRCParserPtr const &rsrcParser, MWAWHeader *header); |
194 | | //! destructor |
195 | | ~HanMacWrdKParser() final; |
196 | | |
197 | | //! checks if the document header is correct (or not) |
198 | | bool checkHeader(MWAWHeader *header, bool strict=false) final; |
199 | | |
200 | | // the main parse function |
201 | | void parse(librevenge::RVNGTextInterface *documentInterface) final; |
202 | | |
203 | | protected: |
204 | | //! inits all internal variables |
205 | | void init(); |
206 | | |
207 | | //! creates the listener which will be associated to the document |
208 | | void createDocument(librevenge::RVNGTextInterface *documentInterface); |
209 | | |
210 | | //! finds the different objects zones |
211 | | bool createZones(); |
212 | | |
213 | | //! returns the page left top point ( in inches) |
214 | | MWAWVec2f getPageLeftTop() const; |
215 | | |
216 | | //! adds a new page |
217 | | void newPage(int number); |
218 | | |
219 | | // interface with the text parser |
220 | | |
221 | | //! send a text zone |
222 | | bool sendText(long id, long subId, MWAWListenerPtr listener=MWAWListenerPtr()); |
223 | | |
224 | | //! check if we can send a textzone as graphic |
225 | | bool canSendTextAsGraphic(long id, long subId); |
226 | | |
227 | | // interface with the graph parser |
228 | | |
229 | | //! send a zone |
230 | | bool sendZone(long zId); |
231 | | //! returns the color associated with a pattern |
232 | | bool getColor(int colId, int patternId, MWAWColor &color) const; |
233 | | |
234 | | // |
235 | | // low level |
236 | | // |
237 | | |
238 | | /** try to read the zones list */ |
239 | | bool readZonesList(); |
240 | | /** try to read a generic zone */ |
241 | | bool readZone(std::shared_ptr<HanMacWrdKZone> zone); |
242 | | /** try to decode a zone */ |
243 | | std::shared_ptr<HanMacWrdKZone> decodeZone(std::shared_ptr<HanMacWrdKZone> zone); |
244 | | /** try to read a zone storing a list of ?, frameType*/ |
245 | | bool readFramesUnkn(std::shared_ptr<HanMacWrdKZone> zone); |
246 | | /** try to read a printinfo zone (type 7)*/ |
247 | | bool readPrintInfo(HanMacWrdKZone &zone); |
248 | | /** try to read a unknown zone of type 6*/ |
249 | | bool readZone6(std::shared_ptr<HanMacWrdKZone> zone); |
250 | | /** try to read a unknown zone of type 8*/ |
251 | | bool readZone8(std::shared_ptr<HanMacWrdKZone> zone); |
252 | | /** try to read a unknown zone of type a*/ |
253 | | bool readZonea(std::shared_ptr<HanMacWrdKZone> zone); |
254 | | /** try to read a unknown zone of type b*/ |
255 | | bool readZoneb(HanMacWrdKZone &zone); |
256 | | /** try to read a unknown zone of type c*/ |
257 | | bool readZonec(std::shared_ptr<HanMacWrdKZone> zone); |
258 | | |
259 | | protected: |
260 | | // |
261 | | // data |
262 | | // |
263 | | //! the state |
264 | | std::shared_ptr<HanMacWrdKParserInternal::State> m_state; |
265 | | |
266 | | //! the graph parser |
267 | | std::shared_ptr<HanMacWrdKGraph> m_graphParser; |
268 | | |
269 | | //! the text parser |
270 | | std::shared_ptr<HanMacWrdKText> m_textParser; |
271 | | }; |
272 | | #endif |
273 | | // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab: |