Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice 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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_WW8_DOCUMENT_HXX
21 : #define INCLUDED_WW8_DOCUMENT_HXX
22 :
23 : #include <boost/shared_ptr.hpp>
24 : #include <sal/types.h>
25 : #include <com/sun/star/uno/Reference.hxx>
26 : #include <resourcemodel/SubSequence.hxx>
27 : #include <com/sun/star/io/XInputStream.hpp>
28 : #include <com/sun/star/uno/XComponentContext.hpp>
29 :
30 : #include <resourcemodel/WW8ResourceModel.hxx>
31 : #include <resourcemodel/OutputWithDepth.hxx>
32 :
33 : #include <WriterFilterDllApi.hxx>
34 :
35 : namespace writerfilter {
36 : namespace doctok {
37 :
38 : using namespace ::com::sun::star;
39 :
40 : /**
41 : A stream containing a WW8 document.
42 :
43 : The content of the stream is a sequence of unsigned bytes. The
44 : stream consists of substreams that are identified by string
45 : identifiers.
46 : */
47 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8Stream
48 : {
49 : public:
50 : /**
51 : Pointer to a WW8Stream.
52 : */
53 : typedef boost::shared_ptr<WW8Stream> Pointer_t;
54 :
55 : /**
56 : Type for the content of the stream
57 : */
58 : typedef SubSequence<sal_uInt8> Sequence;
59 :
60 : virtual ~WW8Stream();
61 :
62 : /**
63 : Returns pointer to a substream.
64 :
65 : @param rSid identifier of substream to return
66 :
67 : @return the substream
68 : */
69 : virtual Pointer_t getSubStream(const OUString & rSid) = 0;
70 :
71 : /**
72 : Return a continious part of the stream.
73 :
74 : @param nOffset offset in the stream where the part starts
75 : @param nCount length of the part (number of bytes)
76 :
77 : @return sequence of unsigned bytes
78 : */
79 : virtual Sequence get(sal_uInt32 nOffset, sal_uInt32 nCount)
80 : const = 0;
81 :
82 : // Returns the names of substreams contained in the stream
83 : virtual string getSubStreamNames() const = 0;
84 :
85 : virtual uno::Sequence<OUString> getSubStreamUNames() const = 0;
86 :
87 : /**
88 : Dumps content of stream to output.
89 :
90 : @param o the target output
91 : */
92 : virtual void dump(OutputWithDepth<string> & o) const = 0;
93 :
94 : //virtual bool put(sal_uInt32 nOffset, const Sequence & rSeq) = 0;
95 : };
96 :
97 : /**
98 : A property.
99 :
100 : */
101 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8Property
102 : {
103 : public:
104 : /**
105 : Ponter to a property.
106 : */
107 : typedef boost::shared_ptr<WW8Property> Pointer_t;
108 :
109 : virtual ~WW8Property();
110 :
111 : virtual sal_uInt32 getId() const = 0;
112 : virtual sal_uInt32 getParam() const = 0;
113 : virtual WW8Stream::Sequence getParams() const = 0;
114 :
115 : virtual string toString() const = 0;
116 :
117 : /**
118 : Dumps this object to an output.
119 :
120 : */
121 : virtual void dump(OutputWithDepth<string> & o) const = 0;
122 : };
123 :
124 : /**
125 : An iterator for traversal of a set of properties.
126 :
127 : Sample code for use of iterator:
128 :
129 : \code
130 : Return_t function(WW8PropertySet::tPointer pSet)
131 : {
132 : do_something;
133 :
134 : WW8PropertySetIterator::tPointer pIt = pSet->begin();
135 : WW8PropertySetIterator::tPointer pItEnd = pSet->end();
136 :
137 : while ((*pIt) != (*pItEnd))
138 : {
139 : do_something();
140 :
141 : ++(*pIt);
142 : }
143 :
144 : do_something;
145 : }
146 : \endcode
147 : */
148 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8PropertySetIterator
149 : {
150 : public:
151 : typedef boost::shared_ptr<WW8PropertySetIterator> Pointer_t;
152 :
153 : virtual ~WW8PropertySetIterator();
154 :
155 : /**
156 : Advance iterator to the next property.
157 : */
158 : virtual WW8PropertySetIterator & operator++() = 0;
159 :
160 : /**
161 : Returns a pointer to the property the iterator references.
162 : */
163 : virtual WW8Property::Pointer_t get() const = 0;
164 :
165 : /**
166 : Checks if the iterator is equal to another one.
167 : */
168 : virtual bool equal(const WW8PropertySetIterator & rIt) const = 0;
169 :
170 : /**
171 : Returns string representation of iterator.
172 : */
173 : virtual string toString() const = 0;
174 : };
175 :
176 : /**
177 : Checks if two property set iterators are not equal.
178 : */
179 : bool operator != (const WW8PropertySetIterator & rA,
180 : const WW8PropertySetIterator & rB);
181 :
182 : /**
183 : A set of properties.
184 : */
185 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8PropertySet
186 : {
187 : public:
188 : typedef boost::shared_ptr<WW8PropertySet> Pointer_t;
189 :
190 : virtual ~WW8PropertySet();
191 :
192 : /**
193 : Returns iterator to the start of the set.
194 : */
195 : virtual WW8PropertySetIterator::Pointer_t begin() = 0;
196 :
197 : /**
198 : Returns iterator to the end of the set.
199 : */
200 : virtual WW8PropertySetIterator::Pointer_t end() = 0;
201 :
202 : /**
203 : Dumps property set to output stream.
204 :
205 : @param o output stream to dump property set to
206 : */
207 : virtual void dump(OutputWithDepth<string> & o) const = 0;
208 :
209 : /**
210 : Iterate through property set and for each element dump a dot
211 : output stream.
212 :
213 : @param o output stream to dump dots to
214 : */
215 : virtual void dots(ostream & o) = 0;
216 :
217 : virtual bool isPap() const = 0;
218 : virtual sal_uInt32 get_istd() const = 0;
219 :
220 : /**
221 : Insert another property set into this property set.
222 :
223 : @param pSet the set to insert
224 : */
225 : virtual void insert(const WW8PropertySet::Pointer_t pSet) = 0;
226 : };
227 :
228 : enum PropertyType {
229 : /** Auxiliary type for character positions defined in piece table */
230 : PROP_DOC,
231 :
232 : /** properties are section properies */
233 : PROP_SEC,
234 :
235 : /** properties are paragraph properties */
236 : PROP_PAP,
237 :
238 : /** properties are character properties */
239 : PROP_CHP,
240 :
241 : /** a footnote reference */
242 : PROP_FOOTNOTE,
243 :
244 : /** an endnote reference */
245 : PROP_ENDNOTE,
246 :
247 : /** an annotaion reference */
248 : PROP_ANNOTATION,
249 :
250 : /** the start of a bookmark */
251 : PROP_BOOKMARKSTART,
252 :
253 : /** the end of a bookmark */
254 : PROP_BOOKMARKEND,
255 :
256 : /** a field character (start, separator or end) */
257 : PROP_FLD,
258 :
259 : /** a shape character */
260 : PROP_SHP,
261 :
262 : /** a break character */
263 : PROP_BRK
264 : };
265 :
266 : /**
267 : An iterator for traversal of the character positions of a Word
268 : document.
269 :
270 : The use of the iterator is analogous to WW8PropertySetIterator.
271 : */
272 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8DocumentIterator
273 : {
274 : public:
275 : typedef boost::shared_ptr<WW8DocumentIterator> Pointer_t;
276 :
277 : virtual ~WW8DocumentIterator();
278 :
279 : /**
280 : Advance iterator to next character position of the document.
281 : */
282 : virtual WW8DocumentIterator & operator++() = 0;
283 :
284 : /**
285 : Recedes iterator to previous character postion of the document.
286 : */
287 : virtual WW8DocumentIterator & operator--() = 0;
288 :
289 : /**
290 : Returns properties set at the character position the iterator
291 : points to.
292 :
293 : @return pointer to set of properties
294 : */
295 : virtual writerfilter::Reference<Properties>::Pointer_t getProperties()
296 : const = 0;
297 :
298 : virtual writerfilter::Reference<Stream>::Pointer_t getSubDocument()
299 : const = 0;
300 :
301 : /**
302 : Returns text run at the character position the iterator points
303 : to.
304 : */
305 : virtual WW8Stream::Sequence getText() = 0;
306 :
307 : /**
308 : Return pointer to the shape at character position the iterator
309 : is pointing to.
310 : */
311 : virtual writerfilter::Reference<Properties>::Pointer_t getShape() const = 0;
312 :
313 : /**
314 : Checks if the characters of the entity the iterator points to
315 : are complex.
316 :
317 : Complex characters in a Word document are byte size
318 : characters. Non-complex characters are word size characters.
319 :
320 : @retval true The characters are complex.
321 : @retval false The characters are non-complex.
322 : */
323 : virtual bool isComplex() const = 0;
324 :
325 : /**
326 : Returns the property type of the entity the iterator points to.
327 : */
328 : virtual PropertyType getPropertyType() const = 0;
329 :
330 : /**
331 : Checks is the iterator is equal to another one.
332 :
333 : @param rIt iterator to check against
334 :
335 : @retval true the iterators are equal
336 : @retval false else
337 : */
338 : virtual bool equal(const WW8DocumentIterator & rIt) const = 0;
339 :
340 : /**
341 : Returns string representation of the iterator.
342 : */
343 : virtual string toString() const = 0;
344 :
345 : /**
346 : Dumps the iterator to an output stream.
347 :
348 : @param o the output stream to dump the iterator to
349 : */
350 : virtual void dump(ostream & o) const = 0;
351 : };
352 :
353 : /**
354 : Checks if two document iterators are equal.
355 :
356 : @param rA first iterator
357 : @param rB second iterator
358 :
359 : @retval true the document iterators are equal
360 : @retval false else
361 : */
362 : bool operator == (const WW8DocumentIterator & rA,
363 : const WW8DocumentIterator & rB);
364 :
365 : class SubDocumentId
366 : {
367 : public:
368 : enum eType { FOOTNOTES, HEADERS, FOOTERS };
369 :
370 : private:
371 : eType mnType;
372 : sal_uInt8 mnIndex;
373 :
374 : public:
375 : SubDocumentId(eType nType, sal_uInt8 nIndex)
376 : : mnType(nType), mnIndex(nIndex)
377 : {
378 : }
379 :
380 : eType getType() const { return mnType; }
381 : sal_uInt8 getIndex() const { return mnIndex; }
382 : };
383 :
384 : /**
385 : A Word 8 document.
386 : */
387 0 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8Document :
388 : public writerfilter::Reference<Stream>
389 : {
390 : public:
391 : typedef boost::shared_ptr<WW8Document> Pointer_t;
392 :
393 : virtual ~WW8Document();
394 :
395 : /**
396 : Get a subdocument.
397 :
398 : A subdocument can be
399 :
400 : - a header
401 : - a footer
402 : - a footnode
403 :
404 : @param nId identifier of the subdocumen
405 : */
406 : virtual Pointer_t getSubDocument(SubDocumentId nId) = 0;
407 :
408 : /**
409 : Returns iterator to beginning of document.
410 : */
411 : virtual WW8DocumentIterator::Pointer_t begin() = 0;
412 :
413 : /**
414 : Returns iterator to end of document.
415 : */
416 : virtual WW8DocumentIterator::Pointer_t end() = 0;
417 : };
418 :
419 : class WRITERFILTER_DOCTOK_DLLPUBLIC WW8DocumentFactory
420 : {
421 : public:
422 : static WW8Stream::Pointer_t
423 : createStream(uno::Reference<uno::XComponentContext> rContext,
424 : uno::Reference<io::XInputStream> rStream);
425 :
426 : static WW8Document *
427 : createDocument(WW8Stream::Pointer_t rpStream);
428 : };
429 :
430 : }}
431 :
432 : #endif // INCLUDED_WW8_DOCUMENT_HXX
433 :
434 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|