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 : #ifndef INCLUDED_OOXML_DOCUMENT_HXX
20 : #define INCLUDED_OOXML_DOCUMENT_HXX
21 :
22 : #include <sal/types.h>
23 : #include <com/sun/star/uno/Reference.hxx>
24 : #include <com/sun/star/io/XInputStream.hpp>
25 : #include <com/sun/star/uno/XComponentContext.hpp>
26 : #include <resourcemodel/WW8ResourceModel.hxx>
27 : #include <com/sun/star/xml/sax/XParser.hpp>
28 : #include <com/sun/star/xml/sax/XFastParser.hpp>
29 : #include <com/sun/star/xml/sax/XFastTokenHandler.hpp>
30 : #include <com/sun/star/xml/sax/XFastShapeContextHandler.hpp>
31 : #include <com/sun/star/frame/XModel.hpp>
32 : #include <com/sun/star/drawing/XDrawPage.hpp>
33 :
34 : /**
35 : @file OOXMLDocument.hxx
36 :
37 : <h1>Import of OOXML WordprocessingML Documents</h1>
38 :
39 : The following picture shows the classes involved in importing OOXML
40 : WordprocessingML documents.
41 :
42 : @image html ooxmlimportchain.png
43 :
44 : The DOCX consists of parts. Each part is an XML document. The
45 : OOXMLDocument opens the DOCX and creates a SAX parser for the part
46 : containing the main document content. The OOXMLDocument creates a
47 : SAX handler, too. This handler is set as the handler for the events
48 : created by the parser. Finally the OOXMLDocument initiates the
49 : parsing process.
50 :
51 : The SAX handler hosts a stack of contexts. Each context is an
52 : instance of a class derived from OOXMLContext. There is a context
53 : class for each <define> in the model.xml.
54 :
55 : For a detailed information about how the contexts are handled see
56 : the documentation for OOXMLContext.
57 :
58 : The contexts know how to convert an element in OOXML to the
59 : intermediate format that the domain mapper understands. They
60 : enumerate the according entity in OOXML by sending the according
61 : events to the domain mapper.
62 :
63 : The domain mapper knows how to convert the intermediate format to
64 : API calls. It takes the events sent by the contexts and uses the
65 : core API to insert the according elements to the core.
66 : */
67 :
68 : namespace writerfilter {
69 : namespace ooxml
70 : {
71 :
72 : using namespace com::sun::star;
73 :
74 821 : class WRITERFILTER_OOXML_DLLPUBLIC OOXMLStream
75 : {
76 : public:
77 : enum StreamType_t { UNKNOWN, DOCUMENT, STYLES, FONTTABLE, NUMBERING,
78 : FOOTNOTES, ENDNOTES, COMMENTS, THEME, SETTINGS, VBAPROJECT };
79 : typedef boost::shared_ptr<OOXMLStream> Pointer_t;
80 :
81 821 : virtual ~OOXMLStream() {}
82 :
83 : /**
84 : Returns parser for this stream.
85 : */
86 : virtual uno::Reference<xml::sax::XParser> getParser() = 0;
87 :
88 : /**
89 : Returns fast parser for this stream.
90 : */
91 : virtual uno::Reference<xml::sax::XFastParser> getFastParser() = 0;
92 :
93 : virtual uno::Reference<io::XInputStream> getDocumentStream() = 0;
94 :
95 : virtual uno::Reference<io::XInputStream> getStorageStream() = 0;
96 :
97 : /**
98 : Returns component context for this stream.
99 : */
100 : virtual uno::Reference<uno::XComponentContext> getContext() = 0;
101 :
102 : /**
103 : Returns target URL from relationships for a given id.
104 :
105 : @param rId the id to look for
106 :
107 : @return the URL found or an empty string
108 : */
109 : virtual OUString getTargetForId(const OUString & rId) = 0;
110 :
111 : virtual const OUString & getTarget() const = 0;
112 :
113 : virtual uno::Reference<xml::sax::XFastTokenHandler>
114 : getFastTokenHandler(uno::Reference<uno::XComponentContext> rContext) = 0;
115 :
116 : };
117 :
118 121 : class WRITERFILTER_OOXML_DLLPUBLIC OOXMLDocument : public writerfilter::Reference<Stream>
119 : {
120 : public:
121 : /**
122 : Pointer to this stream.
123 : */
124 : typedef boost::shared_ptr<OOXMLDocument> Pointer_t;
125 :
126 121 : virtual ~OOXMLDocument() {}
127 :
128 : /**
129 : Resolves this document to a stream handler.
130 :
131 : @param rStream stream handler to resolve this document to
132 : */
133 : virtual void resolve(Stream & rStream) = 0;
134 :
135 : /**
136 : Returns string representation of the type of this reference.
137 :
138 : DEBUGGING PURPOSE ONLY.
139 : */
140 : virtual string getType() const = 0;
141 :
142 : /**
143 : Resolves a footnote to a stream handler.
144 :
145 : A footnote is resolved if either the note type or
146 : note id matches.
147 :
148 : @param rStream stream handler to resolve to
149 : @param rNoteType type of footnote to resolve
150 : @param rNoteId id of the footnote to resolve
151 : */
152 : virtual void resolveFootnote(Stream & rStream,
153 : const Id & rNoteType,
154 : const sal_Int32 nNoteId) = 0;
155 : /**
156 : Resolves an endnote to a stream handler.
157 :
158 : An endnote is resolved if either the note type or
159 : note id matches.
160 :
161 : @param rStream stream handler to resolve to
162 : @param rNoteType type of footnote to resolve
163 : @param rNoteId id of the endnote to resolve
164 : */
165 : virtual void resolveEndnote(Stream & rStream,
166 : const Id & rNoteType,
167 : const sal_Int32 NoteId) = 0;
168 :
169 : /**
170 : Resolves a comment to a stream handler.
171 :
172 : @param rStream stream handler to resolve to
173 : @param rComment id of the comment to resolve
174 : */
175 : virtual void resolveComment(Stream & rStream,
176 : const sal_Int32 nCommentId) = 0;
177 :
178 : /**
179 : Resolves a picture to a stream handler.
180 :
181 : @param rStream stream handler to resolve to
182 : @param rPictureId id of the picture to resolve
183 : */
184 : virtual void resolvePicture(Stream & rStream,
185 : const OUString & rPictureId) = 0;
186 :
187 : /**
188 : Resolves a header to a stream handler.
189 :
190 : @param rStream stream handler to resolve to
191 : @param type type of header to resolve:
192 : NS_ooxml::LN_Value_ST_HrdFtr_even header on even page
193 : NS_ooxml::LN_Value_ST_HrdFtr_default header on right page
194 : NS_ooxml::LN_Value_ST_HrdFtr_first header on first page
195 :
196 : @param rId id of the header
197 : */
198 : virtual void resolveHeader(Stream & rStream,
199 : const sal_Int32 type,
200 : const OUString & rId) = 0;
201 :
202 : /**
203 : Resolves a footer to a stream handler.
204 :
205 : @param rStream stream handler to resolve to
206 : @param type type of footer to resolve:
207 : NS_ooxml::LN_Value_ST_HrdFtr_even header on even page
208 : NS_ooxml::LN_Value_ST_HrdFtr_default header on right page
209 : NS_ooxml::LN_Value_ST_HrdFtr_first header on first page
210 :
211 : @param rId id of the header
212 : */
213 : virtual void resolveFooter(Stream & rStream,
214 : const sal_Int32 type,
215 : const OUString & rId) = 0;
216 :
217 :
218 : /**
219 : Returns target URL from relationships for a given id.
220 :
221 : @param rId the id to look for
222 :
223 : @return the URL found or an empty string
224 : */
225 : virtual OUString getTargetForId(const OUString & rId) = 0;
226 :
227 : virtual void setModel(uno::Reference<frame::XModel> xModel) = 0;
228 : virtual uno::Reference<frame::XModel> getModel() = 0;
229 : virtual void setDrawPage(uno::Reference<drawing::XDrawPage> xDrawPage) = 0;
230 : virtual uno::Reference<drawing::XDrawPage> getDrawPage() = 0;
231 : virtual uno::Reference<io::XInputStream> getInputStream() = 0;
232 : virtual uno::Reference<io::XInputStream> getStorageStream() = 0;
233 : virtual uno::Reference<io::XInputStream> getInputStreamForId
234 : (const OUString & rId) = 0;
235 : virtual void setXNoteId(const sal_Int32 nId) = 0;
236 : virtual sal_Int32 getXNoteId() const = 0;
237 : virtual void setXNoteType(const Id & nId) = 0;
238 : virtual const Id & getXNoteType() const = 0;
239 : virtual const OUString & getTarget() const = 0;
240 : virtual uno::Reference<xml::sax::XFastShapeContextHandler> getShapeContext( ) = 0;
241 : virtual void setShapeContext( uno::Reference<xml::sax::XFastShapeContextHandler> xContext ) = 0;
242 : };
243 :
244 :
245 : class WRITERFILTER_OOXML_DLLPUBLIC OOXMLDocumentFactory
246 : {
247 : public:
248 : static OOXMLStream::Pointer_t
249 : createStream(uno::Reference<uno::XComponentContext> rContext,
250 : uno::Reference<io::XInputStream> rStream,
251 : bool bRepairStorage,
252 : OOXMLStream::StreamType_t nStreamType = OOXMLStream::DOCUMENT);
253 :
254 : static OOXMLStream::Pointer_t
255 : createStream(OOXMLStream::Pointer_t pStream,
256 : OOXMLStream::StreamType_t nStreamType = OOXMLStream::DOCUMENT);
257 :
258 : static OOXMLStream::Pointer_t
259 : createStream(OOXMLStream::Pointer_t pStream, const OUString & rId);
260 :
261 : static OOXMLDocument *
262 : createDocument(OOXMLStream::Pointer_t pStream);
263 :
264 : };
265 :
266 : void ooxmlidsToXML(::std::iostream & out);
267 :
268 : }}
269 : #endif // INCLUDED_OOXML_DOCUMENT_HXX
270 :
271 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|