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 #include <ooxml/resourceids.hxx>
21 #include "Handler.hxx"
22 
23 #include <sal/log.hxx>
24 
25 namespace writerfilter::ooxml
26 {
27 
28 /*
29   class OOXMLFootnoteHandler
30  */
OOXMLFootnoteHandler(OOXMLFastContextHandler * pContext)31 OOXMLFootnoteHandler::OOXMLFootnoteHandler(OOXMLFastContextHandler * pContext)
32 : mpFastContext(pContext)
33 {
34 }
35 
~OOXMLFootnoteHandler()36 OOXMLFootnoteHandler::~OOXMLFootnoteHandler()
37 {
38 }
39 
attribute(Id name,Value & val)40 void OOXMLFootnoteHandler::attribute(Id name, Value & val)
41 {
42     switch (name)
43     {
44     case NS_ooxml::LN_CT_FtnEdnRef_id:
45         mpFastContext->resolveFootnote(sal_Int32(val.getInt()));
46         break;
47     default:
48         break;
49     }
50 }
51 
sprm(Sprm &)52 void OOXMLFootnoteHandler::sprm(Sprm & /*sprm*/)
53 {
54 }
55 
56 /*
57   class OOXMLEndnoteHandler
58  */
OOXMLEndnoteHandler(OOXMLFastContextHandler * pContext)59 OOXMLEndnoteHandler::OOXMLEndnoteHandler(OOXMLFastContextHandler * pContext)
60 : mpFastContext(pContext)
61 {
62 }
63 
~OOXMLEndnoteHandler()64 OOXMLEndnoteHandler::~OOXMLEndnoteHandler()
65 {
66 }
67 
attribute(Id name,Value & val)68 void OOXMLEndnoteHandler::attribute(Id name, Value & val)
69 {
70     switch (name)
71     {
72     case NS_ooxml::LN_CT_FtnEdnRef_id:
73         mpFastContext->resolveEndnote(sal_Int32(val.getInt()));
74         break;
75     default:
76         break;
77     }
78 }
79 
sprm(Sprm &)80 void OOXMLEndnoteHandler::sprm(Sprm & /*sprm*/)
81 {
82 }
83 
84 /*
85   class OOXMLCommentHandler
86 */
OOXMLCommentHandler(OOXMLFastContextHandler * pContext)87 OOXMLCommentHandler::OOXMLCommentHandler(OOXMLFastContextHandler * pContext)
88 : mpFastContext(pContext)
89 {
90 }
91 
~OOXMLCommentHandler()92 OOXMLCommentHandler::~OOXMLCommentHandler()
93 {
94 }
95 
attribute(Id name,Value & val)96 void OOXMLCommentHandler::attribute(Id name, Value & val)
97 {
98     switch (name)
99     {
100     case NS_ooxml::LN_CT_Markup_id:
101         mpFastContext->resolveComment(val.getInt());
102         break;
103     default:
104         ;
105     }
106 }
107 
sprm(Sprm &)108 void OOXMLCommentHandler::sprm(Sprm & /*sprm*/)
109 {
110 }
111 
112 /*
113    class OOXMLOLEHandler
114 */
OOXMLOLEHandler(OOXMLFastContextHandler * pContext)115 OOXMLOLEHandler::OOXMLOLEHandler(OOXMLFastContextHandler * pContext)
116 : mpFastContext(pContext)
117 {
118 }
119 
~OOXMLOLEHandler()120 OOXMLOLEHandler::~OOXMLOLEHandler()
121 {
122 }
123 
attribute(Id name,Value & val)124 void OOXMLOLEHandler::attribute(Id name, Value & val)
125 {
126     switch (name)
127     {
128     case NS_ooxml::LN_CT_OLEObject_r_id:
129         try {
130             mpFastContext->resolveData(val.getString());
131         }
132         catch (const ::css::uno::Exception&)
133         {
134             // Can't resolve OLE stream
135             SAL_WARN("writerfilter.ooxml", "Failed to open OLE stream!");
136         }
137         break;
138     default:
139         ;
140     }
141 }
142 
sprm(Sprm &)143 void OOXMLOLEHandler::sprm(Sprm & /*sprm*/)
144 {
145 }
146 
OOXMLEmbeddedFontHandler(OOXMLFastContextHandler * pContext)147 OOXMLEmbeddedFontHandler::OOXMLEmbeddedFontHandler(OOXMLFastContextHandler * pContext)
148 : mpFastContext(pContext)
149 {
150 }
151 
~OOXMLEmbeddedFontHandler()152 OOXMLEmbeddedFontHandler::~OOXMLEmbeddedFontHandler()
153 {
154 }
155 
attribute(Id name,Value & val)156 void OOXMLEmbeddedFontHandler::attribute(Id name, Value & val)
157 {
158     switch (name)
159     {
160     case NS_ooxml::LN_CT_Rel_id:
161         mpFastContext->resolveData(val.getString());
162         break;
163     default:
164         break;
165     }
166 }
167 
sprm(Sprm &)168 void OOXMLEmbeddedFontHandler::sprm(Sprm & /*sprm*/)
169 {
170 }
171 
172 /*
173   class OOXMLFooterHandler
174  */
OOXMLFooterHandler(OOXMLFastContextHandler * pContext)175 OOXMLFooterHandler::OOXMLFooterHandler(OOXMLFastContextHandler * pContext)
176     : mpFastContext(pContext), msStreamId(), mnType(0)
177 {
178 }
179 
finalize()180 void OOXMLFooterHandler::finalize()
181 {
182     mpFastContext->resolveFooter(mnType, msStreamId);
183 }
184 
attribute(Id name,Value & val)185 void OOXMLFooterHandler::attribute(Id name, Value & val)
186 {
187     switch (name)
188     {
189     case NS_ooxml::LN_CT_HdrFtrRef_id:
190         msStreamId = val.getString();
191         break;
192     case NS_ooxml::LN_CT_HdrFtrRef_type:
193         mnType = val.getInt();
194         break;
195     default:
196         break;
197     }
198 }
199 
sprm(Sprm &)200 void OOXMLFooterHandler::sprm(Sprm & /*sprm*/)
201 {
202 }
203 
204 /*
205   class OOXMLHeaderHandler
206  */
OOXMLHeaderHandler(OOXMLFastContextHandler * pContext)207 OOXMLHeaderHandler::OOXMLHeaderHandler(OOXMLFastContextHandler * pContext)
208     : mpFastContext(pContext), msStreamId(), mnType(0)
209 {
210 }
211 
finalize()212 void OOXMLHeaderHandler::finalize()
213 {
214     mpFastContext->resolveHeader(mnType, msStreamId);
215 }
216 
attribute(Id name,Value & val)217 void OOXMLHeaderHandler::attribute(Id name, Value & val)
218 {
219     switch (name)
220     {
221     case NS_ooxml::LN_CT_HdrFtrRef_id:
222         msStreamId = val.getString();
223         break;
224     case NS_ooxml::LN_CT_HdrFtrRef_type:
225         mnType = val.getInt();
226         break;
227     default:
228         break;
229     }
230 }
231 
sprm(Sprm &)232 void OOXMLHeaderHandler::sprm(Sprm & /*sprm*/)
233 {
234 }
235 
236 /*
237   class OOXMLBreakHandler
238  */
OOXMLBreakHandler(Stream & rStream)239 OOXMLBreakHandler::OOXMLBreakHandler(Stream &rStream)
240 : mnType(0),
241   mrStream(rStream)
242 {
243 }
244 
~OOXMLBreakHandler()245 OOXMLBreakHandler::~OOXMLBreakHandler()
246 {
247     sal_uInt8 tmpBreak[1];
248     switch (mnType)
249     {
250     case NS_ooxml::LN_Value_ST_BrType_column:
251         tmpBreak[0] = 0x0E;
252         break;
253     case NS_ooxml::LN_Value_ST_BrType_page:
254         tmpBreak[0] = 0x0C;
255         break;
256     case NS_ooxml::LN_Value_ST_BrType_textWrapping:
257     default: // when no attribute type is present, the spec assume textWrapping
258         tmpBreak[0] = 0x0A;
259         break;
260     }
261     mrStream.text(&tmpBreak[0], 1);
262 }
263 
attribute(Id name,Value & val)264 void OOXMLBreakHandler::attribute(Id name, Value & val)
265 {
266     switch (name)
267     {
268     case NS_ooxml::LN_CT_Br_type:
269         mnType = val.getInt();
270         break;
271     case NS_ooxml::LN_CT_Br_clear:
272         break;
273     default:
274         break;
275     }
276 }
277 
sprm(Sprm &)278 void OOXMLBreakHandler::sprm(Sprm & /*sprm*/)
279 {
280 }
281 
282 /*
283   class OOXMLPictureHandler
284  */
OOXMLPictureHandler(OOXMLFastContextHandler * pContext)285 OOXMLPictureHandler::OOXMLPictureHandler(OOXMLFastContextHandler * pContext)
286 : mpFastContext(pContext)
287 {
288 }
289 
~OOXMLPictureHandler()290 OOXMLPictureHandler::~OOXMLPictureHandler()
291 {
292 }
293 
attribute(Id name,Value & val)294 void OOXMLPictureHandler::attribute(Id name, Value & val)
295 {
296     if (name == NS_ooxml::LN_AG_Blob_r_embed)
297         mpFastContext->resolvePicture(val.getString());
298     else
299     {
300         writerfilter::Reference<Properties>::Pointer_t pProps
301             (val.getProperties());
302         if (pProps)
303             pProps->resolve(*this);
304     }
305 }
306 
sprm(Sprm & rSprm)307 void OOXMLPictureHandler::sprm(Sprm & rSprm)
308 {
309     writerfilter::Reference<Properties>::Pointer_t pProps
310         (rSprm.getProps());
311 
312     if (pProps)
313         pProps->resolve(*this);
314 }
315 
316 /**
317    class OOXMLHyperlinkHandler
318  */
319 
OOXMLHyperlinkHandler(OOXMLFastContextHandler * pContext)320 OOXMLHyperlinkHandler::OOXMLHyperlinkHandler(OOXMLFastContextHandler * pContext)
321 : mpFastContext(pContext)
322 {
323 }
324 
~OOXMLHyperlinkHandler()325 OOXMLHyperlinkHandler::~OOXMLHyperlinkHandler()
326 {
327 }
328 
writetext()329 void OOXMLHyperlinkHandler::writetext()
330 {
331     OUString sReturn = " HYPERLINK \"" + mURL + "\"" + mFieldCode;
332     mpFastContext->text(sReturn);
333 }
334 
attribute(Id name,Value & val)335 void OOXMLHyperlinkHandler::attribute(Id name, Value & val)
336 {
337     switch (name)
338     {
339     case NS_ooxml::LN_CT_Hyperlink_tgtFrame:
340         mFieldCode += " \\t \"";
341         mFieldCode += val.getString();
342         mFieldCode += "\"";
343         break;
344     case NS_ooxml::LN_CT_Hyperlink_tooltip:
345         mFieldCode += " \\o \"";
346         mFieldCode += val.getString();
347         mFieldCode += "\"";
348         break;
349     case NS_ooxml::LN_CT_Hyperlink_docLocation:
350         break;
351     case NS_ooxml::LN_CT_Hyperlink_history:
352         break;
353     case NS_ooxml::LN_CT_Hyperlink_anchor:
354         mFieldCode += " \\l \"";
355         mFieldCode += val.getString();
356         mFieldCode += "\"";
357         break;
358     case NS_ooxml::LN_CT_Hyperlink_r_id:
359         mURL = mpFastContext->getTargetForId(val.getString());
360         break;
361     default:
362         break;
363     }
364 }
365 
sprm(Sprm &)366 void OOXMLHyperlinkHandler::sprm(Sprm & /*rSprm*/)
367 {
368 }
369 
370 /**
371    class OOXMLHyperlinkURLHandler
372  */
373 
OOXMLHyperlinkURLHandler(OOXMLFastContextHandler * pContext)374 OOXMLHyperlinkURLHandler::OOXMLHyperlinkURLHandler(OOXMLFastContextHandler * pContext)
375 : mpFastContext(pContext)
376 {
377 }
378 
~OOXMLHyperlinkURLHandler()379 OOXMLHyperlinkURLHandler::~OOXMLHyperlinkURLHandler()
380 {
381     mpFastContext->clearProps();
382     mpFastContext->newProperty(NS_ooxml::LN_CT_Hyperlink_URL, OOXMLValue::Pointer_t(new OOXMLStringValue(mURL)));
383 }
384 
attribute(Id name,Value & val)385 void OOXMLHyperlinkURLHandler::attribute(Id name, Value & val)
386 {
387     switch (name)
388     {
389     case NS_ooxml::LN_CT_Hyperlink_URL:
390         mURL = mpFastContext->getTargetForId(val.getString());
391         break;
392     default:
393         break;
394     }
395 }
396 
sprm(Sprm &)397 void OOXMLHyperlinkURLHandler::sprm(Sprm & /*rSprm*/)
398 {
399 }
400 
OOXMLAltChunkHandler(OOXMLFastContextHandler * pContext)401 OOXMLAltChunkHandler::OOXMLAltChunkHandler(OOXMLFastContextHandler* pContext)
402     : mpFastContext(pContext)
403 {
404 }
405 
~OOXMLAltChunkHandler()406 OOXMLAltChunkHandler::~OOXMLAltChunkHandler()
407 {
408     mpFastContext->clearProps();
409     mpFastContext->newProperty(NS_ooxml::LN_CT_AltChunk,
410                                OOXMLValue::Pointer_t(new OOXMLStringValue(m_aStreamName)));
411 }
412 
attribute(Id nName,Value & rValue)413 void OOXMLAltChunkHandler::attribute(Id nName, Value& rValue)
414 {
415     switch (nName)
416     {
417         case NS_ooxml::LN_CT_AltChunk:
418             m_aStreamName = mpFastContext->getTargetForId(rValue.getString());
419             break;
420         default:
421             break;
422     }
423 }
424 
sprm(Sprm &)425 void OOXMLAltChunkHandler::sprm(Sprm& /*rSprm*/) {}
426 }
427 
428 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
429