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 : #include <sal/config.h>
21 :
22 : #include <stack>
23 : #include <string.h>
24 :
25 : #include <officecfg/Office/Common.hxx>
26 : #include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
27 : #include <osl/mutex.hxx>
28 : #include <tools/debug.hxx>
29 : #include <tools/urlobj.hxx>
30 : #include <comphelper/genericpropertyset.hxx>
31 : #include <com/sun/star/container/XNameAccess.hpp>
32 : #include <com/sun/star/io/XInputStream.hpp>
33 : #include <com/sun/star/document/XBinaryStreamResolver.hpp>
34 : #include <com/sun/star/xml/sax/SAXInvalidCharacterException.hpp>
35 : #include <com/sun/star/uri/XUriReferenceFactory.hpp>
36 : #include <com/sun/star/uri/UriReferenceFactory.hpp>
37 : #include <com/sun/star/util/MeasureUnit.hpp>
38 : #include <i18nlangtag/languagetag.hxx>
39 : #include <comphelper/processfactory.hxx>
40 : #include <xmloff/attrlist.hxx>
41 : #include <xmloff/nmspmap.hxx>
42 : #include <xmloff/xmluconv.hxx>
43 : #include <xmloff/xmlnmspe.hxx>
44 : #include <xmloff/xmltoken.hxx>
45 : #include <xmloff/xmlexp.hxx>
46 : #include <xmloff/xmlnumfe.hxx>
47 : #include <xmloff/xmlmetae.hxx>
48 : #include <xmloff/XMLSettingsExportContext.hxx>
49 : #include <xmloff/families.hxx>
50 : #include <xmloff/XMLEventExport.hxx>
51 : #include "XMLStarBasicExportHandler.hxx"
52 : #include "XMLScriptExportHandler.hxx"
53 : #include <xmloff/SettingsExportHelper.hxx>
54 : #include <com/sun/star/container/XIndexContainer.hpp>
55 : #include <com/sun/star/document/XEventsSupplier.hpp>
56 : #include <com/sun/star/document/XViewDataSupplier.hpp>
57 : #include <xmloff/GradientStyle.hxx>
58 : #include <xmloff/HatchStyle.hxx>
59 : #include <xmloff/ImageStyle.hxx>
60 : #include <TransGradientStyle.hxx>
61 : #include <xmloff/MarkerStyle.hxx>
62 : #include <xmloff/DashStyle.hxx>
63 : #include <xmloff/XMLFontAutoStylePool.hxx>
64 : #include "XMLImageMapExport.hxx"
65 : #include "XMLBase64Export.hxx"
66 : #include <xmloff/xmlerror.hxx>
67 : #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
68 : #include <com/sun/star/beans/PropertyAttribute.hpp>
69 : #include <xmloff/XMLFilterServiceNames.h>
70 : #include <xmloff/XMLEmbeddedObjectExportFilter.hxx>
71 : #include "XMLBasicExportFilter.hxx"
72 : #include <cppuhelper/exc_hlp.hxx>
73 : #include <cppuhelper/implbase1.hxx>
74 : #include <cppuhelper/supportsservice.hxx>
75 : #include <comphelper/extract.hxx>
76 : #include <comphelper/servicehelper.hxx>
77 : #include "PropertySetMerger.hxx"
78 :
79 : #include <svl/urihelper.hxx>
80 : #include <xmloff/xformsexport.hxx>
81 :
82 : #include <unotools/docinfohelper.hxx>
83 : #include <unotools/bootstrap.hxx>
84 : #include <unotools/configmgr.hxx>
85 : #include <com/sun/star/document/XDocumentProperties.hpp>
86 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
87 : #include <com/sun/star/document/XMLOasisBasicExporter.hpp>
88 : #include <com/sun/star/embed/XEncryptionProtectedSource2.hpp>
89 : #include <com/sun/star/rdf/XMetadatable.hpp>
90 : #include "RDFaExportHelper.hxx"
91 :
92 : #include <comphelper/xmltools.hxx>
93 :
94 : using namespace ::osl;
95 : using namespace ::com::sun::star;
96 : using namespace ::com::sun::star::uno;
97 : using namespace ::com::sun::star::frame;
98 : using namespace ::com::sun::star::container;
99 : using namespace ::com::sun::star::lang;
100 : using namespace ::com::sun::star::document;
101 : using namespace ::com::sun::star::beans;
102 : using namespace ::com::sun::star::xml::sax;
103 : using namespace ::com::sun::star::io;
104 : using namespace ::xmloff::token;
105 :
106 : sal_Char const sXML_1_1[] = "1.1";
107 : sal_Char const sXML_1_2[] = "1.2";
108 :
109 : #define XML_MODEL_SERVICE_WRITER "com.sun.star.text.TextDocument"
110 : #define XML_MODEL_SERVICE_CALC "com.sun.star.sheet.SpreadsheetDocument"
111 : #define XML_MODEL_SERVICE_DRAW "com.sun.star.drawing.DrawingDocument"
112 : #define XML_MODEL_SERVICE_IMPRESS "com.sun.star.presentation.PresentationDocument"
113 : #define XML_MODEL_SERVICE_MATH "com.sun.star.formula.FormulaProperties"
114 : #define XML_MODEL_SERVICE_CHART "com.sun.star.chart.ChartDocument"
115 :
116 : #define XML_USEPRETTYPRINTING "UsePrettyPrinting"
117 :
118 : struct XMLServiceMapEntry_Impl
119 : {
120 : const sal_Char *sModelService;
121 : sal_Int32 nModelServiceLen;
122 : const sal_Char *sFilterService;
123 : sal_Int32 nFilterServiceLen;
124 : };
125 :
126 : #define SERVICE_MAP_ENTRY( app ) \
127 : { XML_MODEL_SERVICE_##app, sizeof(XML_MODEL_SERVICE_##app)-1, \
128 : XML_EXPORT_FILTER_##app, sizeof(XML_EXPORT_FILTER_##app)-1 }
129 :
130 : const XMLServiceMapEntry_Impl aServiceMap[] =
131 : {
132 : SERVICE_MAP_ENTRY( WRITER ),
133 : SERVICE_MAP_ENTRY( CALC ),
134 : SERVICE_MAP_ENTRY( IMPRESS ),// Impress supports DrawingDocument, too, so
135 : SERVICE_MAP_ENTRY( DRAW ), // it must appear before Draw
136 : SERVICE_MAP_ENTRY( MATH ),
137 : SERVICE_MAP_ENTRY( CHART ),
138 : { 0, 0, 0, 0 }
139 : };
140 :
141 : class SettingsExportFacade : public ::xmloff::XMLSettingsExportContext
142 : {
143 : public:
144 0 : SettingsExportFacade( SvXMLExport& i_rExport )
145 0 : :m_rExport( i_rExport )
146 : {
147 0 : }
148 :
149 0 : virtual ~SettingsExportFacade()
150 0 : {
151 0 : }
152 :
153 : virtual void AddAttribute( enum ::xmloff::token::XMLTokenEnum i_eName,
154 : const OUString& i_rValue ) SAL_OVERRIDE;
155 : virtual void AddAttribute( enum ::xmloff::token::XMLTokenEnum i_eName,
156 : enum ::xmloff::token::XMLTokenEnum i_eValue ) SAL_OVERRIDE;
157 :
158 : virtual void StartElement( enum ::xmloff::token::XMLTokenEnum i_eName,
159 : const bool i_bIgnoreWhitespace ) SAL_OVERRIDE;
160 : virtual void EndElement( const bool i_bIgnoreWhitespace ) SAL_OVERRIDE;
161 :
162 : virtual void Characters( const OUString& i_rCharacters ) SAL_OVERRIDE;
163 :
164 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >
165 : GetComponentContext() const SAL_OVERRIDE;
166 : private:
167 : SvXMLExport& m_rExport;
168 : ::std::stack< OUString > m_aElements;
169 : };
170 :
171 0 : void SettingsExportFacade::AddAttribute( enum ::xmloff::token::XMLTokenEnum i_eName, const OUString& i_rValue )
172 : {
173 0 : m_rExport.AddAttribute( XML_NAMESPACE_CONFIG, i_eName, i_rValue );
174 0 : }
175 :
176 0 : void SettingsExportFacade::AddAttribute( enum ::xmloff::token::XMLTokenEnum i_eName, enum ::xmloff::token::XMLTokenEnum i_eValue )
177 : {
178 0 : m_rExport.AddAttribute( XML_NAMESPACE_CONFIG, i_eName, i_eValue );
179 0 : }
180 :
181 0 : void SettingsExportFacade::StartElement( enum ::xmloff::token::XMLTokenEnum i_eName, const bool i_bIgnoreWhitespace )
182 : {
183 0 : const OUString sElementName( m_rExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_CONFIG, GetXMLToken( i_eName ) ) );
184 0 : m_rExport.StartElement( sElementName, i_bIgnoreWhitespace );
185 0 : m_aElements.push( sElementName );
186 0 : }
187 :
188 0 : void SettingsExportFacade::EndElement( const bool i_bIgnoreWhitespace )
189 : {
190 0 : const OUString sElementName( m_aElements.top() );
191 0 : m_rExport.EndElement( sElementName, i_bIgnoreWhitespace );
192 0 : m_aElements.pop();
193 0 : }
194 :
195 0 : void SettingsExportFacade::Characters( const OUString& i_rCharacters )
196 : {
197 0 : m_rExport.GetDocHandler()->characters( i_rCharacters );
198 0 : }
199 :
200 0 : Reference< XComponentContext > SettingsExportFacade::GetComponentContext() const
201 : {
202 0 : return m_rExport.getComponentContext();
203 : }
204 :
205 : class SvXMLExportEventListener : public cppu::WeakImplHelper1<
206 : com::sun::star::lang::XEventListener >
207 : {
208 : private:
209 : SvXMLExport* pExport;
210 :
211 : public:
212 : SvXMLExportEventListener(SvXMLExport* pExport);
213 : virtual ~SvXMLExportEventListener();
214 :
215 : // XEventListener
216 : virtual void SAL_CALL disposing(const lang::EventObject& rEventObject) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
217 : };
218 :
219 0 : SvXMLExportEventListener::SvXMLExportEventListener(SvXMLExport* pTempExport)
220 0 : : pExport(pTempExport)
221 : {
222 0 : }
223 :
224 0 : SvXMLExportEventListener::~SvXMLExportEventListener()
225 : {
226 0 : }
227 :
228 : // XEventListener
229 0 : void SAL_CALL SvXMLExportEventListener::disposing( const lang::EventObject& )
230 : throw(uno::RuntimeException, std::exception)
231 : {
232 0 : if (pExport)
233 : {
234 0 : pExport->DisposingModel();
235 0 : pExport = NULL;
236 : }
237 0 : }
238 :
239 0 : class SvXMLExport_Impl
240 : {
241 : public:
242 : SvXMLExport_Impl();
243 :
244 : ::comphelper::UnoInterfaceToUniqueIdentifierMapper maInterfaceToIdentifierMapper;
245 : uno::Reference< uri::XUriReferenceFactory > mxUriReferenceFactory;
246 : OUString msPackageURI;
247 : OUString msPackageURIScheme;
248 : // Written OpenDocument file format doesn't fit to the created text document (#i69627#)
249 : bool mbOutlineStyleAsNormalListStyle;
250 : bool mbSaveBackwardCompatibleODF;
251 :
252 : uno::Reference< embed::XStorage > mxTargetStorage;
253 :
254 : SvtSaveOptions maSaveOptions;
255 :
256 : /// relative path of stream in package, e.g. "someobject/content.xml"
257 : OUString mStreamPath;
258 :
259 : /// name of stream in package, e.g., "content.xml"
260 : OUString mStreamName;
261 :
262 : /// stack of backed up namespace maps
263 : /// long: depth at which namespace map has been backed up into the stack
264 : ::std::stack< ::std::pair< SvXMLNamespaceMap *, long > > mNamespaceMaps;
265 : /// counts depth (number of open elements/start tags)
266 : long mDepth;
267 :
268 : ::std::auto_ptr< ::xmloff::RDFaExportHelper> mpRDFaHelper;
269 :
270 : bool mbExportTextNumberElement;
271 : bool mbNullDateInitialized;
272 :
273 0 : void SetSchemeOf( const OUString& rOrigFileName )
274 : {
275 0 : sal_Int32 nSep = rOrigFileName.indexOf(':');
276 0 : if( nSep != -1 )
277 0 : msPackageURIScheme = rOrigFileName.copy( 0, nSep );
278 0 : }
279 : };
280 :
281 0 : SvXMLExport_Impl::SvXMLExport_Impl()
282 : // Written OpenDocument file format doesn't fit to the created text document (#i69627#)
283 : : mbOutlineStyleAsNormalListStyle( false )
284 : ,mbSaveBackwardCompatibleODF( true )
285 : ,mStreamName()
286 : ,mNamespaceMaps()
287 : ,mDepth(0)
288 : ,mpRDFaHelper() // lazy
289 : ,mbExportTextNumberElement( false )
290 0 : ,mbNullDateInitialized( false )
291 : {
292 0 : mxUriReferenceFactory = uri::UriReferenceFactory::create( comphelper::getProcessComponentContext() );
293 0 : }
294 :
295 0 : void SvXMLExport::SetDocHandler( const uno::Reference< xml::sax::XDocumentHandler > &rHandler )
296 : {
297 0 : mxHandler = rHandler;
298 0 : mxExtHandler = uno::Reference<xml::sax::XExtendedDocumentHandler>( mxHandler, UNO_QUERY );
299 0 : }
300 :
301 0 : void SvXMLExport::_InitCtor()
302 : {
303 : // note: it is not necessary to add XML_NP_XML (it is declared implicitly)
304 0 : if( (getExportFlags() & ~EXPORT_OASIS) != 0 )
305 : {
306 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE );
307 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
308 : }
309 0 : if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS) ) != 0 )
310 : {
311 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_FO), GetXMLToken(XML_N_FO_COMPAT), XML_NAMESPACE_FO );
312 : }
313 0 : if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS) ) != 0 )
314 : {
315 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
316 : }
317 0 : if( (getExportFlags() & EXPORT_SETTINGS) != 0 )
318 : {
319 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_CONFIG), GetXMLToken(XML_N_CONFIG), XML_NAMESPACE_CONFIG );
320 : }
321 :
322 0 : if( (getExportFlags() & (EXPORT_META|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
323 : {
324 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_DC), GetXMLToken(XML_N_DC), XML_NAMESPACE_DC );
325 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_META), GetXMLToken(XML_N_META), XML_NAMESPACE_META );
326 : }
327 0 : if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS) ) != 0 )
328 : {
329 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_STYLE), GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE );
330 : }
331 :
332 : // namespaces for documents
333 0 : if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
334 : {
335 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_DC), GetXMLToken(XML_N_DC), XML_NAMESPACE_DC );
336 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_TEXT), GetXMLToken(XML_N_TEXT), XML_NAMESPACE_TEXT );
337 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW );
338 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_DR3D), GetXMLToken(XML_N_DR3D), XML_NAMESPACE_DR3D );
339 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG_COMPAT), XML_NAMESPACE_SVG );
340 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_CHART), GetXMLToken(XML_N_CHART), XML_NAMESPACE_CHART );
341 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_RPT), GetXMLToken(XML_N_RPT), XML_NAMESPACE_REPORT );
342 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_TABLE), GetXMLToken(XML_N_TABLE), XML_NAMESPACE_TABLE );
343 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_NUMBER),GetXMLToken(XML_N_NUMBER), XML_NAMESPACE_NUMBER );
344 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_OOOW), GetXMLToken(XML_N_OOOW), XML_NAMESPACE_OOOW );
345 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_OOOC), GetXMLToken(XML_N_OOOC), XML_NAMESPACE_OOOC );
346 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_OF), GetXMLToken(XML_N_OF), XML_NAMESPACE_OF );
347 :
348 0 : if (getDefaultVersion() > SvtSaveOptions::ODFVER_012)
349 : {
350 : mpNamespaceMap->Add(
351 0 : GetXMLToken(XML_NP_TABLE_EXT), GetXMLToken(XML_N_TABLE_EXT), XML_NAMESPACE_TABLE_EXT);
352 : mpNamespaceMap->Add(
353 0 : GetXMLToken(XML_NP_CALC_EXT), GetXMLToken(XML_N_CALC_EXT), XML_NAMESPACE_CALC_EXT);
354 : mpNamespaceMap->Add(
355 0 : GetXMLToken(XML_NP_DRAW_EXT), GetXMLToken(XML_N_DRAW_EXT), XML_NAMESPACE_DRAW_EXT);
356 : mpNamespaceMap->Add(
357 0 : GetXMLToken(XML_NP_LO_EXT), GetXMLToken(XML_N_LO_EXT),
358 0 : XML_NAMESPACE_LO_EXT);
359 : }
360 : }
361 0 : if( (getExportFlags() & (EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
362 : {
363 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_MATH), GetXMLToken(XML_N_MATH), XML_NAMESPACE_MATH );
364 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_FORM), GetXMLToken(XML_N_FORM), XML_NAMESPACE_FORM );
365 : }
366 0 : if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS) ) != 0 )
367 : {
368 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_SCRIPT), GetXMLToken(XML_N_SCRIPT), XML_NAMESPACE_SCRIPT );
369 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_DOM), GetXMLToken(XML_N_DOM), XML_NAMESPACE_DOM );
370 : }
371 0 : if( (getExportFlags() & EXPORT_CONTENT ) != 0 )
372 : {
373 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_XFORMS_1_0), GetXMLToken(XML_N_XFORMS_1_0), XML_NAMESPACE_XFORMS );
374 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_XSD), GetXMLToken(XML_N_XSD), XML_NAMESPACE_XSD );
375 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_XSI), GetXMLToken(XML_N_XSI), XML_NAMESPACE_XSI );
376 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_FIELD), GetXMLToken(XML_N_FIELD), XML_NAMESPACE_FIELD );
377 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_FORMX), GetXMLToken(XML_N_FORMX), XML_NAMESPACE_FORMX );
378 : }
379 : // RDFa: needed for content and header/footer styles
380 0 : if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
381 : {
382 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_XHTML),
383 0 : GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML );
384 : }
385 : // GRDDL: to convert RDFa and meta.xml to RDF
386 0 : if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
387 : {
388 0 : mpNamespaceMap->Add( GetXMLToken(XML_NP_GRDDL),
389 0 : GetXMLToken(XML_N_GRDDL), XML_NAMESPACE_GRDDL );
390 : }
391 : // CSS Text Level 3 for distributed text justification.
392 0 : if ( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES)) != 0 )
393 : {
394 : mpNamespaceMap->Add(
395 0 : GetXMLToken(XML_NP_CSS3TEXT), GetXMLToken(XML_N_CSS3TEXT), XML_NAMESPACE_CSS3TEXT );
396 : }
397 :
398 0 : mxAttrList = (xml::sax::XAttributeList*)mpAttrList;
399 :
400 0 : msGraphicObjectProtocol = "vnd.sun.star.GraphicObject:";
401 0 : msEmbeddedObjectProtocol = "vnd.sun.star.EmbeddedObject:";
402 :
403 0 : if (mxModel.is() && !mxEventListener.is())
404 : {
405 0 : mxEventListener.set( new SvXMLExportEventListener(this));
406 0 : mxModel->addEventListener(mxEventListener);
407 : }
408 :
409 : // Determine model type (#i51726#)
410 0 : _DetermineModelType();
411 :
412 : // cl: but only if we do export to current oasis format, old openoffice format *must* always be compatible
413 0 : if( (getExportFlags() & EXPORT_OASIS) != 0 )
414 : {
415 : mpImpl->mbSaveBackwardCompatibleODF =
416 : officecfg::Office::Common::Save::Document::
417 0 : SaveBackwardCompatibleODF::get( comphelper::getProcessComponentContext() );
418 : }
419 0 : }
420 :
421 : // Shapes in Writer cannot be named via context menu (#i51726#)
422 0 : void SvXMLExport::_DetermineModelType()
423 : {
424 0 : meModelType = SvtModuleOptions::E_UNKNOWN_FACTORY;
425 :
426 0 : if ( mxModel.is() )
427 : {
428 0 : meModelType = SvtModuleOptions::ClassifyFactoryByModel( mxModel );
429 : }
430 0 : }
431 :
432 0 : SvXMLExport::SvXMLExport(
433 : sal_Int16 const eDefaultMeasureUnit /*css::util::MeasureUnit*/,
434 : const uno::Reference< uno::XComponentContext >& xContext,
435 : OUString const & implementationName,
436 : const enum XMLTokenEnum eClass, sal_uInt16 nExportFlags )
437 0 : : mpImpl( new SvXMLExport_Impl ),
438 : m_xContext(xContext), m_implementationName(implementationName),
439 0 : mpAttrList( new SvXMLAttributeList ),
440 0 : mpNamespaceMap( new SvXMLNamespaceMap ),
441 : mpUnitConv( new SvXMLUnitConverter( xContext,
442 0 : util::MeasureUnit::MM_100TH, eDefaultMeasureUnit) ),
443 : mpNumExport(0L),
444 : mpProgressBarHelper( NULL ),
445 : mpEventExport( NULL ),
446 : mpImageMapExport( NULL ),
447 : mpXMLErrors( NULL ),
448 : mbExtended( false ),
449 : meClass( eClass ),
450 : mnExportFlags( nExportFlags ),
451 : mnErrorFlags( ERROR_NO ),
452 0 : msWS( GetXMLToken(XML_WS) ),
453 0 : mbSaveLinkedSections(true)
454 : {
455 : SAL_WARN_IF( !xContext.is(), "xmloff.core", "got no service manager" );
456 0 : _InitCtor();
457 0 : }
458 :
459 0 : SvXMLExport::SvXMLExport(
460 : const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext,
461 : OUString const & implementationName,
462 : const OUString &rFileName,
463 : sal_Int16 const eDefaultMeasureUnit /*css::util::MeasureUnit*/,
464 : const uno::Reference< xml::sax::XDocumentHandler > & rHandler)
465 0 : : mpImpl( new SvXMLExport_Impl ),
466 : m_xContext(xContext), m_implementationName(implementationName),
467 : mxHandler( rHandler ),
468 : mxExtHandler( rHandler, uno::UNO_QUERY ),
469 0 : mpAttrList( new SvXMLAttributeList ),
470 : msOrigFileName( rFileName ),
471 0 : mpNamespaceMap( new SvXMLNamespaceMap ),
472 : mpUnitConv( new SvXMLUnitConverter( xContext,
473 0 : util::MeasureUnit::MM_100TH, eDefaultMeasureUnit) ),
474 : mpNumExport(0L),
475 : mpProgressBarHelper( NULL ),
476 : mpEventExport( NULL ),
477 : mpImageMapExport( NULL ),
478 : mpXMLErrors( NULL ),
479 : mbExtended( false ),
480 : meClass( XML_TOKEN_INVALID ),
481 : mnExportFlags( 0 ),
482 : mnErrorFlags( ERROR_NO ),
483 0 : msWS( GetXMLToken(XML_WS) ),
484 0 : mbSaveLinkedSections(true)
485 : {
486 : SAL_WARN_IF( !xContext.is(), "xmloff.core", "got no service manager" );
487 0 : mpImpl->SetSchemeOf( msOrigFileName );
488 0 : _InitCtor();
489 :
490 0 : if (mxNumberFormatsSupplier.is())
491 0 : mpNumExport = new SvXMLNumFmtExport(*this, mxNumberFormatsSupplier);
492 0 : }
493 :
494 0 : SvXMLExport::SvXMLExport(
495 : const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext,
496 : OUString const & implementationName,
497 : const OUString &rFileName,
498 : const uno::Reference< xml::sax::XDocumentHandler > & rHandler,
499 : const Reference< XModel >& rModel,
500 : sal_Int16 const eDefaultFieldUnit)
501 0 : : mpImpl( new SvXMLExport_Impl ),
502 : m_xContext(xContext), m_implementationName(implementationName),
503 : mxModel( rModel ),
504 : mxHandler( rHandler ),
505 : mxExtHandler( rHandler, uno::UNO_QUERY ),
506 : mxNumberFormatsSupplier (rModel, uno::UNO_QUERY),
507 0 : mpAttrList( new SvXMLAttributeList ),
508 : msOrigFileName( rFileName ),
509 0 : mpNamespaceMap( new SvXMLNamespaceMap ),
510 : mpUnitConv( new SvXMLUnitConverter( xContext,
511 : util::MeasureUnit::MM_100TH,
512 0 : SvXMLUnitConverter::GetMeasureUnit(eDefaultFieldUnit)) ),
513 : mpNumExport(0L),
514 : mpProgressBarHelper( NULL ),
515 : mpEventExport( NULL ),
516 : mpImageMapExport( NULL ),
517 : mpXMLErrors( NULL ),
518 : mbExtended( false ),
519 : meClass( XML_TOKEN_INVALID ),
520 : mnExportFlags( 0 ),
521 : mnErrorFlags( ERROR_NO ),
522 0 : msWS( GetXMLToken(XML_WS) ),
523 0 : mbSaveLinkedSections(true)
524 : {
525 : SAL_WARN_IF(!xContext.is(), "xmloff.core", "got no service manager" );
526 0 : mpImpl->SetSchemeOf( msOrigFileName );
527 0 : _InitCtor();
528 :
529 0 : if (mxNumberFormatsSupplier.is())
530 0 : mpNumExport = new SvXMLNumFmtExport(*this, mxNumberFormatsSupplier);
531 0 : }
532 :
533 0 : SvXMLExport::~SvXMLExport()
534 : {
535 0 : delete mpXMLErrors;
536 0 : delete mpImageMapExport;
537 0 : delete mpEventExport;
538 0 : delete mpNamespaceMap;
539 0 : delete mpUnitConv;
540 0 : if (mpProgressBarHelper || mpNumExport)
541 : {
542 0 : if (mxExportInfo.is())
543 : {
544 0 : uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxExportInfo->getPropertySetInfo();
545 0 : if (xPropertySetInfo.is())
546 : {
547 0 : if (mpProgressBarHelper)
548 : {
549 0 : OUString sProgressMax(XML_PROGRESSMAX);
550 0 : OUString sProgressCurrent(XML_PROGRESSCURRENT);
551 0 : OUString sRepeat(XML_PROGRESSREPEAT);
552 0 : if (xPropertySetInfo->hasPropertyByName(sProgressMax) &&
553 0 : xPropertySetInfo->hasPropertyByName(sProgressCurrent))
554 : {
555 0 : sal_Int32 nProgressMax(mpProgressBarHelper->GetReference());
556 0 : sal_Int32 nProgressCurrent(mpProgressBarHelper->GetValue());
557 0 : uno::Any aAny;
558 0 : aAny <<= nProgressMax;
559 0 : mxExportInfo->setPropertyValue(sProgressMax, aAny);
560 0 : aAny <<= nProgressCurrent;
561 0 : mxExportInfo->setPropertyValue(sProgressCurrent, aAny);
562 : }
563 0 : if (xPropertySetInfo->hasPropertyByName(sRepeat))
564 0 : mxExportInfo->setPropertyValue(sRepeat, css::uno::makeAny(mpProgressBarHelper->GetRepeat()));
565 : }
566 0 : if (mpNumExport && (mnExportFlags & (EXPORT_AUTOSTYLES | EXPORT_STYLES)))
567 : {
568 0 : OUString sWrittenNumberFormats(XML_WRITTENNUMBERSTYLES);
569 0 : if (xPropertySetInfo->hasPropertyByName(sWrittenNumberFormats))
570 : {
571 0 : uno::Sequence<sal_Int32> aWasUsed;
572 0 : mpNumExport->GetWasUsed(aWasUsed);
573 0 : uno::Any aAny;
574 0 : aAny <<= aWasUsed;
575 0 : mxExportInfo->setPropertyValue(sWrittenNumberFormats, aAny);
576 0 : }
577 : }
578 0 : }
579 : }
580 0 : delete mpProgressBarHelper;
581 0 : delete mpNumExport;
582 : }
583 :
584 0 : if (mxEventListener.is() && mxModel.is())
585 0 : mxModel->removeEventListener(mxEventListener);
586 :
587 0 : delete mpImpl;
588 0 : }
589 :
590 : // XExporter
591 0 : void SAL_CALL SvXMLExport::setSourceDocument( const uno::Reference< lang::XComponent >& xDoc )
592 : throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
593 : {
594 0 : mxModel = uno::Reference< frame::XModel >::query( xDoc );
595 0 : if( !mxModel.is() )
596 0 : throw lang::IllegalArgumentException();
597 0 : if (mxModel.is() && ! mxEventListener.is())
598 : {
599 0 : mxEventListener.set( new SvXMLExportEventListener(this));
600 0 : mxModel->addEventListener(mxEventListener);
601 : }
602 :
603 0 : if(!mxNumberFormatsSupplier.is() )
604 : {
605 0 : mxNumberFormatsSupplier = mxNumberFormatsSupplier.query( mxModel );
606 0 : if(mxNumberFormatsSupplier.is() && mxHandler.is())
607 0 : mpNumExport = new SvXMLNumFmtExport(*this, mxNumberFormatsSupplier);
608 : }
609 0 : if (mxExportInfo.is())
610 : {
611 0 : uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxExportInfo->getPropertySetInfo();
612 0 : if (xPropertySetInfo.is())
613 : {
614 0 : OUString sUsePrettyPrinting(XML_USEPRETTYPRINTING);
615 0 : if (xPropertySetInfo->hasPropertyByName(sUsePrettyPrinting))
616 : {
617 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sUsePrettyPrinting);
618 0 : if (::cppu::any2bool(aAny))
619 0 : mnExportFlags |= EXPORT_PRETTY;
620 : else
621 0 : mnExportFlags &= ~EXPORT_PRETTY;
622 : }
623 :
624 0 : if (mpNumExport && (mnExportFlags & (EXPORT_AUTOSTYLES | EXPORT_STYLES)))
625 : {
626 0 : OUString sWrittenNumberFormats(XML_WRITTENNUMBERSTYLES);
627 0 : if (xPropertySetInfo->hasPropertyByName(sWrittenNumberFormats))
628 : {
629 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sWrittenNumberFormats);
630 0 : uno::Sequence<sal_Int32> aWasUsed;
631 0 : if(aAny >>= aWasUsed)
632 0 : mpNumExport->SetWasUsed(aWasUsed);
633 0 : }
634 0 : }
635 0 : }
636 : }
637 :
638 0 : if ( mpImpl->mbSaveBackwardCompatibleODF )
639 0 : mnExportFlags |= EXPORT_SAVEBACKWARDCOMPATIBLE;
640 : else
641 0 : mnExportFlags &= ~EXPORT_SAVEBACKWARDCOMPATIBLE;
642 :
643 : // namespaces for user defined attributes
644 0 : Reference< XMultiServiceFactory > xFactory( mxModel, UNO_QUERY );
645 0 : if( xFactory.is() )
646 : {
647 : try
648 : {
649 : Reference < XInterface > xIfc =
650 0 : xFactory->createInstance("com.sun.star.xml.NamespaceMap");
651 0 : if( xIfc.is() )
652 : {
653 0 : Reference< XNameAccess > xNamespaceMap( xIfc, UNO_QUERY );
654 0 : if( xNamespaceMap.is() )
655 : {
656 0 : Sequence< OUString > aPrefixes( xNamespaceMap->getElementNames() );
657 :
658 0 : OUString* pPrefix = aPrefixes.getArray();
659 0 : const sal_Int32 nCount = aPrefixes.getLength();
660 : sal_Int32 nIndex;
661 0 : OUString aURL;
662 :
663 0 : for( nIndex = 0; nIndex < nCount; ++nIndex, ++pPrefix )
664 : {
665 0 : if( xNamespaceMap->getByName( *pPrefix ) >>= aURL )
666 0 : _GetNamespaceMap().Add( *pPrefix, aURL, XML_NAMESPACE_UNKNOWN );
667 0 : }
668 0 : }
669 0 : }
670 : }
671 0 : catch(const com::sun::star::uno::Exception&)
672 : {
673 : }
674 : }
675 :
676 : // Determine model type (#i51726#)
677 0 : _DetermineModelType();
678 0 : }
679 :
680 : // XInitialize
681 0 : void SAL_CALL SvXMLExport::initialize( const uno::Sequence< uno::Any >& aArguments )
682 : throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException, std::exception)
683 : {
684 : // #93186# we need to queryInterface every single Any with any expected outcome. This variable hold the queryInterface results.
685 :
686 0 : const sal_Int32 nAnyCount = aArguments.getLength();
687 0 : const uno::Any* pAny = aArguments.getConstArray();
688 :
689 0 : for( sal_Int32 nIndex = 0; nIndex < nAnyCount; nIndex++, pAny++ )
690 : {
691 0 : Reference<XInterface> xValue;
692 0 : *pAny >>= xValue;
693 :
694 : // status indicator
695 0 : uno::Reference<task::XStatusIndicator> xTmpStatus( xValue, UNO_QUERY );
696 0 : if ( xTmpStatus.is() )
697 0 : mxStatusIndicator = xTmpStatus;
698 :
699 : // graphic resolver
700 : uno::Reference<document::XGraphicObjectResolver> xTmpGraphic(
701 0 : xValue, UNO_QUERY );
702 0 : if ( xTmpGraphic.is() )
703 0 : mxGraphicResolver = xTmpGraphic;
704 :
705 : // object resolver
706 : uno::Reference<document::XEmbeddedObjectResolver> xTmpObjectResolver(
707 0 : xValue, UNO_QUERY );
708 0 : if ( xTmpObjectResolver.is() )
709 0 : mxEmbeddedResolver = xTmpObjectResolver;
710 :
711 : // document handler
712 : uno::Reference<xml::sax::XDocumentHandler> xTmpDocHandler(
713 0 : xValue, UNO_QUERY );
714 0 : if( xTmpDocHandler.is() )
715 : {
716 0 : mxHandler = xTmpDocHandler;
717 0 : *pAny >>= mxExtHandler;
718 :
719 0 : if (mxNumberFormatsSupplier.is() && mpNumExport == NULL)
720 0 : mpNumExport = new SvXMLNumFmtExport(*this, mxNumberFormatsSupplier);
721 : }
722 :
723 : // property set to transport data across
724 : uno::Reference<beans::XPropertySet> xTmpPropertySet(
725 0 : xValue, UNO_QUERY );
726 0 : if( xTmpPropertySet.is() )
727 0 : mxExportInfo = xTmpPropertySet;
728 0 : }
729 :
730 0 : if( mxExportInfo.is() )
731 : {
732 : uno::Reference< beans::XPropertySetInfo > xPropertySetInfo =
733 0 : mxExportInfo->getPropertySetInfo();
734 : OUString sPropName(
735 0 : "BaseURI" );
736 0 : if( xPropertySetInfo->hasPropertyByName(sPropName) )
737 : {
738 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sPropName);
739 0 : aAny >>= msOrigFileName;
740 0 : mpImpl->msPackageURI = msOrigFileName;
741 0 : mpImpl->SetSchemeOf( msOrigFileName );
742 : }
743 0 : OUString sRelPath;
744 0 : sPropName = "StreamRelPath";
745 0 : if( xPropertySetInfo->hasPropertyByName(sPropName) )
746 : {
747 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sPropName);
748 0 : aAny >>= sRelPath;
749 : }
750 0 : OUString sName;
751 0 : sPropName = "StreamName";
752 0 : if( xPropertySetInfo->hasPropertyByName(sPropName) )
753 : {
754 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sPropName);
755 0 : aAny >>= sName;
756 : }
757 0 : if( !msOrigFileName.isEmpty() && !sName.isEmpty() )
758 : {
759 0 : INetURLObject aBaseURL( msOrigFileName );
760 0 : if( !sRelPath.isEmpty() )
761 0 : aBaseURL.insertName( sRelPath );
762 0 : aBaseURL.insertName( sName );
763 0 : msOrigFileName = aBaseURL.GetMainURL(INetURLObject::DECODE_TO_IURI);
764 : }
765 0 : mpImpl->mStreamName = sName; // Note: may be empty (XSLT)
766 :
767 : // Written OpenDocument file format doesn't fit to the created text document (#i69627#)
768 : const OUString sOutlineStyleAsNormalListStyle(
769 0 : "OutlineStyleAsNormalListStyle" );
770 0 : if( xPropertySetInfo->hasPropertyByName( sOutlineStyleAsNormalListStyle ) )
771 : {
772 0 : uno::Any aAny = mxExportInfo->getPropertyValue( sOutlineStyleAsNormalListStyle );
773 0 : aAny >>= (mpImpl->mbOutlineStyleAsNormalListStyle);
774 : }
775 :
776 0 : OUString sTargetStorage( "TargetStorage" );
777 0 : if( xPropertySetInfo->hasPropertyByName( sTargetStorage ) )
778 0 : mxExportInfo->getPropertyValue( sTargetStorage ) >>= mpImpl->mxTargetStorage;
779 :
780 : const OUString sExportTextNumberElement(
781 0 : "ExportTextNumberElement" );
782 0 : if( xPropertySetInfo->hasPropertyByName( sExportTextNumberElement ) )
783 : {
784 0 : uno::Any aAny = mxExportInfo->getPropertyValue( sExportTextNumberElement );
785 0 : aAny >>= (mpImpl->mbExportTextNumberElement);
786 0 : }
787 : }
788 :
789 0 : }
790 :
791 : // XFilter
792 0 : sal_Bool SAL_CALL SvXMLExport::filter( const uno::Sequence< beans::PropertyValue >& aDescriptor ) throw(uno::RuntimeException, std::exception)
793 : {
794 : // check for xHandler first... should have been supplied in initialize
795 0 : if( !mxHandler.is() )
796 0 : return sal_False;
797 :
798 : try
799 : {
800 : const sal_uInt32 nTest =
801 0 : EXPORT_META|EXPORT_STYLES|EXPORT_CONTENT|EXPORT_SETTINGS;
802 0 : if( (mnExportFlags & nTest) == nTest && msOrigFileName.isEmpty() )
803 : {
804 : // evaluate descriptor only for flat files and if a base URI
805 : // has not been provided already
806 0 : const sal_Int32 nPropCount = aDescriptor.getLength();
807 0 : const beans::PropertyValue* pProps = aDescriptor.getConstArray();
808 :
809 0 : for( sal_Int32 nIndex = 0; nIndex < nPropCount; nIndex++, pProps++ )
810 : {
811 0 : const OUString& rPropName = pProps->Name;
812 0 : const Any& rValue = pProps->Value;
813 :
814 0 : if ( rPropName == "FileName" )
815 : {
816 0 : if( !(rValue >>= msOrigFileName ) )
817 0 : return sal_False;
818 : }
819 0 : else if ( rPropName == "FilterName" )
820 : {
821 0 : if( !(rValue >>= msFilterName ) )
822 0 : return sal_False;
823 : }
824 : }
825 : }
826 :
827 0 : exportDoc( meClass );
828 : }
829 0 : catch(const uno::Exception& e)
830 : {
831 : // We must catch exceptions, because according to the
832 : // API definition export must not throw one!
833 0 : css::uno::Any ex(cppu::getCaughtException());
834 : SetError( XMLERROR_FLAG_ERROR | XMLERROR_FLAG_SEVERE | XMLERROR_API,
835 : Sequence<OUString>(),
836 0 : ex.getValueTypeName() + ": \"" + e.Message + "\"", NULL );
837 : }
838 :
839 : // return true only if no error occurred
840 0 : return (GetErrorFlags() & (ERROR_DO_NOTHING|ERROR_ERROR_OCCURRED)) == 0;
841 : }
842 :
843 0 : void SAL_CALL SvXMLExport::cancel() throw(uno::RuntimeException, std::exception)
844 : {
845 : // stop export
846 0 : Sequence<OUString> aEmptySeq;
847 0 : SetError(XMLERROR_CANCEL|XMLERROR_FLAG_SEVERE, aEmptySeq);
848 0 : }
849 :
850 0 : OUString SAL_CALL SvXMLExport::getName( )
851 : throw (::com::sun::star::uno::RuntimeException, std::exception)
852 : {
853 0 : return msFilterName;
854 : }
855 :
856 0 : void SAL_CALL SvXMLExport::setName( const OUString& )
857 : throw (::com::sun::star::uno::RuntimeException, std::exception)
858 : {
859 : // do nothing, because it is not possible to set the FilterName
860 0 : }
861 :
862 : // XServiceInfo
863 0 : OUString SAL_CALL SvXMLExport::getImplementationName( ) throw(uno::RuntimeException, std::exception)
864 : {
865 0 : return m_implementationName;
866 : }
867 :
868 0 : sal_Bool SAL_CALL SvXMLExport::supportsService( const OUString& rServiceName ) throw(uno::RuntimeException, std::exception)
869 : {
870 0 : return cppu::supportsService(this, rServiceName);
871 : }
872 :
873 0 : uno::Sequence< OUString > SAL_CALL SvXMLExport::getSupportedServiceNames( )
874 : throw(uno::RuntimeException, std::exception)
875 : {
876 0 : uno::Sequence<OUString> aSeq(2);
877 0 : aSeq[0] = "com.sun.star.document.ExportFilter";
878 0 : aSeq[1] = "com.sun.star.xml.XMLExportFilter";
879 0 : return aSeq;
880 : }
881 :
882 : OUString
883 0 : SvXMLExport::EnsureNamespace(OUString const & i_rNamespace,
884 : OUString const & i_rPreferredPrefix)
885 : {
886 0 : OUString sPrefix;
887 0 : sal_uInt16 nKey( _GetNamespaceMap().GetKeyByName( i_rNamespace ) );
888 0 : if( XML_NAMESPACE_UNKNOWN == nKey )
889 : {
890 : // There is no prefix for the namespace, so
891 : // we have to generate one and have to add it.
892 0 : sPrefix = i_rPreferredPrefix;
893 0 : nKey = _GetNamespaceMap().GetKeyByPrefix( sPrefix );
894 0 : sal_Int32 n( 0 );
895 0 : OUStringBuffer buf;
896 0 : while( nKey != USHRT_MAX )
897 : {
898 0 : buf.append( i_rPreferredPrefix );
899 0 : buf.append( ++n );
900 0 : sPrefix = buf.makeStringAndClear();
901 0 : nKey = _GetNamespaceMap().GetKeyByPrefix( sPrefix );
902 : }
903 :
904 0 : if (mpImpl->mNamespaceMaps.empty()
905 0 : || (mpImpl->mNamespaceMaps.top().second != mpImpl->mDepth))
906 : {
907 : // top was created for lower depth... need a new namespace map!
908 : mpImpl->mNamespaceMaps.push(
909 0 : ::std::make_pair(mpNamespaceMap, mpImpl->mDepth) );
910 0 : mpNamespaceMap = new SvXMLNamespaceMap( *mpNamespaceMap );
911 : }
912 :
913 : // add the namespace to the map and as attribute
914 0 : mpNamespaceMap->Add( sPrefix, i_rNamespace );
915 0 : buf.append( GetXMLToken(XML_XMLNS) );
916 0 : buf.append( ':' );
917 0 : buf.append( sPrefix );
918 0 : AddAttribute( buf.makeStringAndClear(), i_rNamespace );
919 : }
920 : else
921 : {
922 : // If there is a prefix for the namespace, reuse that.
923 0 : sPrefix = _GetNamespaceMap().GetPrefixByKey( nKey );
924 : }
925 0 : return sPrefix;
926 : }
927 :
928 0 : void SvXMLExport::AddAttributeASCII( sal_uInt16 nPrefixKey,
929 : const sal_Char *pName,
930 : const sal_Char *pValue )
931 : {
932 0 : OUString sName( OUString::createFromAscii( pName ) );
933 0 : OUString sValue( OUString::createFromAscii( pValue ) );
934 :
935 : mpAttrList->AddAttribute(
936 0 : _GetNamespaceMap().GetQNameByKey( nPrefixKey, sName ), sValue );
937 0 : }
938 :
939 0 : void SvXMLExport::AddAttribute( sal_uInt16 nPrefixKey, const sal_Char *pName,
940 : const OUString& rValue )
941 : {
942 0 : OUString sName( OUString::createFromAscii( pName ) );
943 :
944 : mpAttrList->AddAttribute(
945 0 : _GetNamespaceMap().GetQNameByKey( nPrefixKey, sName ), rValue );
946 0 : }
947 :
948 0 : void SvXMLExport::AddAttribute( sal_uInt16 nPrefixKey, const OUString& rName,
949 : const OUString& rValue )
950 : {
951 : mpAttrList->AddAttribute(
952 0 : _GetNamespaceMap().GetQNameByKey( nPrefixKey, rName ), rValue );
953 0 : }
954 :
955 0 : void SvXMLExport::AddAttribute( sal_uInt16 nPrefixKey,
956 : enum XMLTokenEnum eName,
957 : const OUString& rValue )
958 : {
959 : mpAttrList->AddAttribute(
960 0 : _GetNamespaceMap().GetQNameByKey( nPrefixKey, GetXMLToken(eName) ),
961 0 : rValue );
962 0 : }
963 :
964 0 : void SvXMLExport::AddAttribute( sal_uInt16 nPrefixKey,
965 : enum XMLTokenEnum eName,
966 : enum XMLTokenEnum eValue)
967 : {
968 : mpAttrList->AddAttribute(
969 0 : _GetNamespaceMap().GetQNameByKey( nPrefixKey, GetXMLToken(eName) ),
970 0 : GetXMLToken(eValue) );
971 0 : }
972 :
973 0 : void SvXMLExport::AddAttribute( const OUString& rQName,
974 : const OUString& rValue )
975 : {
976 : mpAttrList->AddAttribute(
977 : rQName,
978 0 : rValue );
979 0 : }
980 :
981 0 : void SvXMLExport::AddAttribute( const OUString& rQName,
982 : enum ::xmloff::token::XMLTokenEnum eValue )
983 : {
984 : mpAttrList->AddAttribute(
985 : rQName,
986 0 : GetXMLToken(eValue) );
987 0 : }
988 :
989 0 : void SvXMLExport::AddLanguageTagAttributes( sal_uInt16 nPrefix, sal_uInt16 nPrefixRfc,
990 : const ::com::sun::star::lang::Locale& rLocale, bool bWriteEmpty,
991 : enum ::xmloff::token::XMLTokenEnum eClass )
992 : {
993 0 : if (rLocale.Variant.isEmpty())
994 : {
995 : // Per convention The BCP 47 string is always stored in Variant, if
996 : // that is empty we have a plain language-country combination, no need
997 : // to convert to LanguageTag first. Also catches the case of empty
998 : // locale denoting system locale.
999 : xmloff::token::XMLTokenEnum eLanguage, eCountry;
1000 0 : switch (eClass)
1001 : {
1002 : default:
1003 : case XML_LANGUAGE:
1004 0 : eLanguage = XML_LANGUAGE;
1005 0 : eCountry = XML_COUNTRY;
1006 0 : break;
1007 : case XML_LANGUAGE_ASIAN:
1008 0 : eLanguage = XML_LANGUAGE_ASIAN;
1009 0 : eCountry = XML_COUNTRY_ASIAN;
1010 0 : if (nPrefix == XML_NAMESPACE_FO)
1011 0 : nPrefix = XML_NAMESPACE_STYLE;
1012 0 : break;
1013 : case XML_LANGUAGE_COMPLEX:
1014 0 : eLanguage = XML_LANGUAGE_COMPLEX;
1015 0 : eCountry = XML_COUNTRY_COMPLEX;
1016 0 : if (nPrefix == XML_NAMESPACE_FO)
1017 0 : nPrefix = XML_NAMESPACE_STYLE;
1018 0 : break;
1019 : }
1020 0 : if (bWriteEmpty || !rLocale.Language.isEmpty())
1021 0 : AddAttribute( nPrefix, eLanguage, rLocale.Language);
1022 0 : if (bWriteEmpty || !rLocale.Country.isEmpty())
1023 0 : AddAttribute( nPrefix, eCountry, rLocale.Country);
1024 : }
1025 : else
1026 : {
1027 0 : LanguageTag aLanguageTag( rLocale);
1028 0 : AddLanguageTagAttributes( nPrefix, nPrefixRfc, aLanguageTag, bWriteEmpty, eClass);
1029 : }
1030 0 : }
1031 :
1032 0 : void SvXMLExport::AddLanguageTagAttributes( sal_uInt16 nPrefix, sal_uInt16 nPrefixRfc,
1033 : const LanguageTag& rLanguageTag, bool bWriteEmpty, xmloff::token::XMLTokenEnum eClass )
1034 : {
1035 : xmloff::token::XMLTokenEnum eLanguage, eScript, eCountry, eRfcLanguageTag;
1036 0 : switch (eClass)
1037 : {
1038 : default:
1039 : case XML_LANGUAGE:
1040 0 : eLanguage = XML_LANGUAGE;
1041 0 : eScript = XML_SCRIPT;
1042 0 : eCountry = XML_COUNTRY;
1043 0 : eRfcLanguageTag = XML_RFC_LANGUAGE_TAG;
1044 0 : break;
1045 : case XML_LANGUAGE_ASIAN:
1046 0 : eLanguage = XML_LANGUAGE_ASIAN;
1047 0 : eScript = XML_SCRIPT_ASIAN;
1048 0 : eCountry = XML_COUNTRY_ASIAN;
1049 0 : eRfcLanguageTag = XML_RFC_LANGUAGE_TAG_ASIAN;
1050 0 : if (nPrefix == XML_NAMESPACE_FO)
1051 0 : nPrefix = XML_NAMESPACE_STYLE;
1052 0 : break;
1053 : case XML_LANGUAGE_COMPLEX:
1054 0 : eLanguage = XML_LANGUAGE_COMPLEX;
1055 0 : eScript = XML_SCRIPT_COMPLEX;
1056 0 : eCountry = XML_COUNTRY_COMPLEX;
1057 0 : eRfcLanguageTag = XML_RFC_LANGUAGE_TAG_COMPLEX;
1058 0 : if (nPrefix == XML_NAMESPACE_FO)
1059 0 : nPrefix = XML_NAMESPACE_STYLE;
1060 0 : break;
1061 : }
1062 0 : if (rLanguageTag.isIsoODF())
1063 : {
1064 0 : if (bWriteEmpty || !rLanguageTag.isSystemLocale())
1065 : {
1066 0 : AddAttribute( nPrefix, eLanguage, rLanguageTag.getLanguage());
1067 0 : if (rLanguageTag.hasScript() && getDefaultVersion() >= SvtSaveOptions::ODFVER_012)
1068 0 : AddAttribute( nPrefix, eScript, rLanguageTag.getScript());
1069 0 : if (bWriteEmpty || !rLanguageTag.getCountry().isEmpty())
1070 0 : AddAttribute( nPrefix, eCountry, rLanguageTag.getCountry());
1071 : }
1072 : }
1073 : else
1074 : {
1075 0 : if (getDefaultVersion() >= SvtSaveOptions::ODFVER_012)
1076 0 : AddAttribute( nPrefixRfc, eRfcLanguageTag, rLanguageTag.getBcp47());
1077 : // Also in case of non-pure-ISO tag store best matching fo: attributes
1078 : // for consumers not handling *:rfc-language-tag, ensuring that only
1079 : // valid ISO codes are stored. Here the bWriteEmpty parameter has no
1080 : // meaning.
1081 0 : OUString aLanguage, aScript, aCountry;
1082 0 : rLanguageTag.getIsoLanguageScriptCountry( aLanguage, aScript, aCountry);
1083 0 : if (!aLanguage.isEmpty())
1084 : {
1085 0 : AddAttribute( nPrefix, eLanguage, aLanguage);
1086 0 : if (!aScript.isEmpty() && getDefaultVersion() >= SvtSaveOptions::ODFVER_012)
1087 0 : AddAttribute( nPrefix, eScript, aScript);
1088 0 : if (!aCountry.isEmpty())
1089 0 : AddAttribute( nPrefix, eCountry, aCountry);
1090 0 : }
1091 : }
1092 0 : }
1093 :
1094 0 : void SvXMLExport::AddAttributeList( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1095 : {
1096 0 : if( xAttrList.is())
1097 0 : mpAttrList->AppendAttributeList( xAttrList );
1098 0 : }
1099 :
1100 0 : void SvXMLExport::ClearAttrList()
1101 : {
1102 0 : mpAttrList->Clear();
1103 0 : }
1104 :
1105 : #ifdef DBG_UTIL
1106 : void SvXMLExport::CheckAttrList()
1107 : {
1108 : SAL_WARN_IF( mpAttrList->getLength(), "xmloff.core", "XMLExport::CheckAttrList: list is not empty" );
1109 : }
1110 : #endif
1111 :
1112 0 : void SvXMLExport::ImplExportMeta()
1113 : {
1114 0 : CheckAttrList();
1115 :
1116 0 : _ExportMeta();
1117 0 : }
1118 :
1119 0 : void SvXMLExport::ImplExportSettings()
1120 : {
1121 0 : CheckAttrList();
1122 :
1123 0 : ::std::list< SettingsGroup > aSettings;
1124 0 : sal_Int32 nSettingsCount = 0;
1125 :
1126 : // view settings
1127 0 : uno::Sequence< beans::PropertyValue > aViewSettings;
1128 0 : GetViewSettingsAndViews( aViewSettings );
1129 0 : aSettings.push_back( SettingsGroup( XML_VIEW_SETTINGS, aViewSettings ) );
1130 0 : nSettingsCount += aViewSettings.getLength();
1131 :
1132 : // configuration settings
1133 0 : uno::Sequence<beans::PropertyValue> aConfigSettings;
1134 0 : GetConfigurationSettings( aConfigSettings );
1135 0 : aSettings.push_back( SettingsGroup( XML_CONFIGURATION_SETTINGS, aConfigSettings ) );
1136 0 : nSettingsCount += aConfigSettings.getLength();
1137 :
1138 : // any document specific settings
1139 0 : nSettingsCount += GetDocumentSpecificSettings( aSettings );
1140 :
1141 : {
1142 : SvXMLElementExport aElem( *this,
1143 : nSettingsCount != 0,
1144 : XML_NAMESPACE_OFFICE, XML_SETTINGS,
1145 0 : true, true );
1146 :
1147 0 : SettingsExportFacade aSettingsExportContext( *this );
1148 0 : XMLSettingsExportHelper aSettingsExportHelper( aSettingsExportContext );
1149 :
1150 0 : for ( ::std::list< SettingsGroup >::const_iterator settings = aSettings.begin();
1151 0 : settings != aSettings.end();
1152 : ++settings
1153 : )
1154 : {
1155 0 : if ( !settings->aSettings.getLength() )
1156 0 : continue;
1157 :
1158 0 : OUString sSettingsName( GetXMLToken( settings->eGroupName ) );
1159 0 : OUString sQName = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OOO, sSettingsName );
1160 0 : aSettingsExportHelper.exportAllSettings( settings->aSettings, sQName );
1161 0 : }
1162 0 : }
1163 0 : }
1164 :
1165 0 : void SvXMLExport::ImplExportStyles( bool )
1166 : {
1167 0 : CheckAttrList();
1168 :
1169 : {
1170 : // <style:styles>
1171 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE, XML_STYLES,
1172 0 : true, true );
1173 :
1174 0 : _ExportStyles( false );
1175 : }
1176 :
1177 : // transfer style names (+ families) TO other components (if appropriate)
1178 0 : if( ( ( mnExportFlags & EXPORT_CONTENT ) == 0 ) && mxExportInfo.is() )
1179 : {
1180 0 : static OUString sStyleNames( "StyleNames" );
1181 0 : static OUString sStyleFamilies( "StyleFamilies" );
1182 0 : uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxExportInfo->getPropertySetInfo();
1183 0 : if ( xPropertySetInfo->hasPropertyByName( sStyleNames ) && xPropertySetInfo->hasPropertyByName( sStyleFamilies ) )
1184 : {
1185 0 : Sequence<sal_Int32> aStyleFamilies;
1186 0 : Sequence<OUString> aStyleNames;
1187 0 : mxAutoStylePool->GetRegisteredNames( aStyleFamilies, aStyleNames );
1188 0 : mxExportInfo->setPropertyValue( sStyleNames, makeAny( aStyleNames ) );
1189 0 : mxExportInfo->setPropertyValue( sStyleFamilies,
1190 0 : makeAny( aStyleFamilies ) );
1191 0 : }
1192 : }
1193 0 : }
1194 :
1195 0 : void SvXMLExport::ImplExportAutoStyles( bool )
1196 : {
1197 : // transfer style names (+ families) FROM other components (if appropriate)
1198 0 : OUString sStyleNames( "StyleNames" );
1199 0 : OUString sStyleFamilies( "StyleFamilies" );
1200 0 : if( ( ( mnExportFlags & EXPORT_STYLES ) == 0 )
1201 0 : && mxExportInfo.is()
1202 0 : && mxExportInfo->getPropertySetInfo()->hasPropertyByName( sStyleNames )
1203 0 : && mxExportInfo->getPropertySetInfo()->hasPropertyByName( sStyleFamilies ) )
1204 : {
1205 0 : Sequence<sal_Int32> aStyleFamilies;
1206 0 : mxExportInfo->getPropertyValue( sStyleFamilies ) >>= aStyleFamilies;
1207 0 : Sequence<OUString> aStyleNames;
1208 0 : mxExportInfo->getPropertyValue( sStyleNames ) >>= aStyleNames;
1209 0 : mxAutoStylePool->RegisterNames( aStyleFamilies, aStyleNames );
1210 : }
1211 :
1212 : {
1213 : // <style:automatic-styles>
1214 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE,
1215 0 : XML_AUTOMATIC_STYLES, true, true );
1216 :
1217 0 : _ExportAutoStyles();
1218 0 : }
1219 0 : }
1220 :
1221 0 : void SvXMLExport::ImplExportMasterStyles( bool )
1222 : {
1223 : {
1224 : // <style:master-styles>
1225 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE, XML_MASTER_STYLES,
1226 0 : true, true );
1227 :
1228 0 : _ExportMasterStyles();
1229 : }
1230 :
1231 0 : }
1232 :
1233 0 : void SvXMLExport::ImplExportContent()
1234 : {
1235 0 : CheckAttrList();
1236 :
1237 0 : CheckAttrList();
1238 :
1239 : {
1240 : SvXMLElementExport aElemrnt( *this, XML_NAMESPACE_OFFICE, XML_BODY,
1241 0 : true, true );
1242 : {
1243 0 : XMLTokenEnum eClass = meClass;
1244 0 : if( XML_TEXT_GLOBAL == eClass )
1245 : {
1246 : AddAttribute( XML_NAMESPACE_TEXT, XML_GLOBAL,
1247 0 : GetXMLToken( XML_TRUE ) );
1248 0 : eClass = XML_TEXT;
1249 : }
1250 0 : if ( XML_GRAPHICS == eClass )
1251 0 : eClass = XML_DRAWING;
1252 : // <office:body ...>
1253 0 : SetBodyAttributes();
1254 : SvXMLElementExport aElem( *this, meClass != XML_TOKEN_INVALID,
1255 : XML_NAMESPACE_OFFICE, eClass,
1256 0 : true, true );
1257 :
1258 0 : _ExportContent();
1259 0 : }
1260 : }
1261 0 : }
1262 :
1263 0 : void SvXMLExport::SetBodyAttributes()
1264 : {
1265 0 : }
1266 :
1267 : static void
1268 0 : lcl_AddGrddl(SvXMLExport & rExport, const sal_Int32 /*nExportMode*/)
1269 : {
1270 : // check version >= 1.2
1271 0 : switch (rExport.getDefaultVersion()) {
1272 : case SvtSaveOptions::ODFVER_011: // fall thru
1273 0 : case SvtSaveOptions::ODFVER_010: return;
1274 0 : default: break;
1275 : }
1276 :
1277 : // #i115030#: disabled, the XSLT is not finished, and not available via HTTP
1278 : #if 0
1279 : if (EXPORT_SETTINGS != nExportMode) // meta, content, styles
1280 : {
1281 : rExport.AddAttribute( XML_NAMESPACE_GRDDL, XML_TRANSFORMATION,
1282 : OUString("http://FIXME") );
1283 : }
1284 : #endif
1285 : }
1286 :
1287 0 : void SvXMLExport::addChaffWhenEncryptedStorage()
1288 : {
1289 0 : uno::Reference< embed::XEncryptionProtectedSource2 > xEncr(mpImpl->mxTargetStorage, uno::UNO_QUERY);
1290 :
1291 0 : if (xEncr.is() && xEncr->hasEncryptionData() && mxExtHandler.is())
1292 : {
1293 0 : mxExtHandler->comment(OStringToOUString(comphelper::xml::makeXMLChaff(), RTL_TEXTENCODING_ASCII_US));
1294 0 : }
1295 0 : }
1296 :
1297 0 : sal_uInt32 SvXMLExport::exportDoc( enum ::xmloff::token::XMLTokenEnum eClass )
1298 : {
1299 0 : bool bOwnGraphicResolver = false;
1300 0 : bool bOwnEmbeddedResolver = false;
1301 :
1302 0 : if( !mxGraphicResolver.is() || !mxEmbeddedResolver.is() )
1303 : {
1304 0 : Reference< XMultiServiceFactory > xFactory( mxModel, UNO_QUERY );
1305 0 : if( xFactory.is() )
1306 : {
1307 : try
1308 : {
1309 0 : if( !mxGraphicResolver.is() )
1310 : {
1311 0 : mxGraphicResolver = Reference< XGraphicObjectResolver >::query(
1312 0 : xFactory->createInstance(
1313 0 : OUString( "com.sun.star.document.ExportGraphicObjectResolver")));
1314 0 : bOwnGraphicResolver = mxGraphicResolver.is();
1315 : }
1316 :
1317 0 : if( !mxEmbeddedResolver.is() )
1318 : {
1319 0 : mxEmbeddedResolver = Reference< XEmbeddedObjectResolver >::query(
1320 0 : xFactory->createInstance(
1321 0 : OUString( "com.sun.star.document.ExportEmbeddedObjectResolver")));
1322 0 : bOwnEmbeddedResolver = mxEmbeddedResolver.is();
1323 : }
1324 : }
1325 0 : catch(const com::sun::star::uno::Exception&)
1326 : {
1327 : }
1328 0 : }
1329 : }
1330 0 : if( (getExportFlags() & EXPORT_OASIS) == 0 )
1331 : {
1332 : try
1333 : {
1334 : ::comphelper::PropertyMapEntry const aInfoMap[] =
1335 : {
1336 : { OUString("Class"), 0,
1337 0 : ::getCppuType((OUString*)0),
1338 : PropertyAttribute::MAYBEVOID, 0},
1339 : { OUString(), 0, css::uno::Type(), 0, 0 }
1340 0 : };
1341 : Reference< XPropertySet > xConvPropSet(
1342 : ::comphelper::GenericPropertySet_CreateInstance(
1343 0 : new ::comphelper::PropertySetInfo( aInfoMap ) ) );
1344 :
1345 0 : Any aAny;
1346 0 : aAny <<= GetXMLToken( eClass );
1347 0 : xConvPropSet->setPropertyValue(
1348 0 : OUString("Class"), aAny );
1349 :
1350 : Reference< XPropertySet > xPropSet =
1351 0 : mxExportInfo.is()
1352 : ? PropertySetMerger_CreateInstance( mxExportInfo,
1353 : xConvPropSet )
1354 0 : : xConvPropSet;
1355 :
1356 0 : Sequence<Any> aArgs( 3 );
1357 0 : aArgs[0] <<= mxHandler;
1358 0 : aArgs[1] <<= xPropSet;
1359 0 : aArgs[2] <<= mxModel;
1360 :
1361 : // get filter component
1362 : Reference< xml::sax::XDocumentHandler > xTmpDocHandler(
1363 0 : m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext("com.sun.star.comp.Oasis2OOoTransformer", aArgs, m_xContext),
1364 0 : UNO_QUERY);
1365 : SAL_WARN_IF(!xTmpDocHandler.is(), "xmloff.core", "can't instantiate OASIS transformer component" );
1366 0 : if( xTmpDocHandler.is() )
1367 : {
1368 0 : mxHandler = xTmpDocHandler;
1369 0 : mxExtHandler = uno::Reference<xml::sax::XExtendedDocumentHandler>( mxHandler, UNO_QUERY );
1370 0 : }
1371 : }
1372 0 : catch(const com::sun::star::uno::Exception&)
1373 : {
1374 : }
1375 : }
1376 :
1377 0 : mxHandler->startDocument();
1378 :
1379 0 : addChaffWhenEncryptedStorage();
1380 :
1381 : // <office:document ...>
1382 0 : CheckAttrList();
1383 :
1384 : // namespace attributes
1385 : // ( The namespace decls should be first attributes in the element;
1386 : // some faulty XML parsers (JAXP1.1) have a problem with this,
1387 : // also it's more elegant )
1388 0 : sal_uInt16 nPos = mpNamespaceMap->GetFirstKey();
1389 0 : while( USHRT_MAX != nPos )
1390 : {
1391 : mpAttrList->AddAttribute( mpNamespaceMap->GetAttrNameByKey( nPos ),
1392 0 : mpNamespaceMap->GetNameByKey( nPos ) );
1393 0 : nPos = mpNamespaceMap->GetNextKey( nPos );
1394 : }
1395 :
1396 : // office:version = ...
1397 0 : if( !mbExtended )
1398 : {
1399 0 : const sal_Char* pVersion = 0;
1400 0 : switch( getDefaultVersion() )
1401 : {
1402 0 : case SvtSaveOptions::ODFVER_LATEST: pVersion = sXML_1_2; break;
1403 0 : case SvtSaveOptions::ODFVER_012_EXT_COMPAT: pVersion = sXML_1_2; break;
1404 0 : case SvtSaveOptions::ODFVER_012: pVersion = sXML_1_2; break;
1405 0 : case SvtSaveOptions::ODFVER_011: pVersion = sXML_1_1; break;
1406 0 : case SvtSaveOptions::ODFVER_010: break;
1407 :
1408 : default:
1409 : SAL_WARN("xmloff.core", "xmloff::SvXMLExport::exportDoc(), unexpected odf default version!");
1410 : }
1411 :
1412 0 : if( pVersion )
1413 : AddAttribute( XML_NAMESPACE_OFFICE, XML_VERSION,
1414 0 : OUString::createFromAscii(pVersion) );
1415 : }
1416 :
1417 : {
1418 0 : enum XMLTokenEnum eRootService = XML_TOKEN_INVALID;
1419 0 : const sal_Int32 nExportMode = mnExportFlags & (EXPORT_META|EXPORT_STYLES|EXPORT_CONTENT|EXPORT_SETTINGS);
1420 :
1421 0 : lcl_AddGrddl(*this, nExportMode);
1422 :
1423 0 : if( EXPORT_META == nExportMode )
1424 : {
1425 : // export only meta
1426 0 : eRootService = XML_DOCUMENT_META;
1427 : }
1428 0 : else if ( EXPORT_SETTINGS == nExportMode )
1429 : {
1430 : // export only settings
1431 0 : eRootService = XML_DOCUMENT_SETTINGS;
1432 : }
1433 0 : else if( EXPORT_STYLES == nExportMode )
1434 : {
1435 : // export only styles
1436 0 : eRootService = XML_DOCUMENT_STYLES;
1437 : }
1438 0 : else if( EXPORT_CONTENT == nExportMode )
1439 : {
1440 : // export only content
1441 0 : eRootService = XML_DOCUMENT_CONTENT;
1442 : }
1443 : else
1444 : {
1445 : // the god'ol one4all element
1446 0 : eRootService = XML_DOCUMENT;
1447 : // office:mimetype = ... (only for stream containing the content)
1448 0 : if( eClass != XML_TOKEN_INVALID )
1449 : {
1450 0 : OUString aTmp( "application/vnd.oasis.opendocument." );
1451 0 : aTmp += GetXMLToken( eClass );
1452 0 : AddAttribute( XML_NAMESPACE_OFFICE, XML_MIMETYPE, aTmp );
1453 : }
1454 : }
1455 :
1456 0 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE, eRootService, true, true );
1457 :
1458 : // meta information
1459 0 : if( mnExportFlags & EXPORT_META )
1460 0 : ImplExportMeta();
1461 :
1462 : // settings
1463 0 : if( mnExportFlags & EXPORT_SETTINGS )
1464 0 : ImplExportSettings();
1465 :
1466 : // scripts
1467 0 : if( mnExportFlags & EXPORT_SCRIPTS )
1468 0 : _ExportScripts();
1469 :
1470 : // font declerations
1471 0 : if( mnExportFlags & EXPORT_FONTDECLS )
1472 0 : _ExportFontDecls();
1473 :
1474 : // styles
1475 0 : if( mnExportFlags & EXPORT_STYLES )
1476 0 : ImplExportStyles( false );
1477 :
1478 : // autostyles
1479 0 : if( mnExportFlags & EXPORT_AUTOSTYLES )
1480 0 : ImplExportAutoStyles( false );
1481 :
1482 : // masterstyles
1483 0 : if( mnExportFlags & EXPORT_MASTERSTYLES )
1484 0 : ImplExportMasterStyles( false );
1485 :
1486 : // contnt
1487 0 : if( mnExportFlags & EXPORT_CONTENT )
1488 0 : ImplExportContent();
1489 : }
1490 :
1491 0 : mxHandler->endDocument();
1492 :
1493 0 : if( bOwnGraphicResolver )
1494 : {
1495 0 : Reference< XComponent > xComp( mxGraphicResolver, UNO_QUERY );
1496 0 : xComp->dispose();
1497 : }
1498 :
1499 0 : if( bOwnEmbeddedResolver )
1500 : {
1501 0 : Reference< XComponent > xComp( mxEmbeddedResolver, UNO_QUERY );
1502 0 : xComp->dispose();
1503 : }
1504 :
1505 0 : return 0;
1506 : }
1507 :
1508 0 : void SvXMLExport::ResetNamespaceMap()
1509 : {
1510 0 : delete mpNamespaceMap; mpNamespaceMap = new SvXMLNamespaceMap;
1511 0 : }
1512 :
1513 0 : void SvXMLExport::_ExportMeta()
1514 : {
1515 0 : OUString generator( ::utl::DocInfoHelper::GetGeneratorString() );
1516 : Reference< XDocumentPropertiesSupplier > xDocPropsSupplier(mxModel,
1517 0 : UNO_QUERY);
1518 0 : if (xDocPropsSupplier.is()) {
1519 : Reference<XDocumentProperties> xDocProps(
1520 0 : xDocPropsSupplier->getDocumentProperties());
1521 0 : if (!xDocProps.is()) throw;
1522 : // update generator here
1523 0 : xDocProps->setGenerator(generator);
1524 0 : SvXMLMetaExport * pMeta = new SvXMLMetaExport(*this, xDocProps);
1525 0 : uno::Reference<xml::sax::XDocumentHandler> xMeta(pMeta);
1526 0 : pMeta->Export();
1527 : } else {
1528 : // office:meta
1529 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE, XML_META,
1530 0 : true, true );
1531 : {
1532 : // BM: #i60323# export generator even if xInfoProp is empty (which is the
1533 : // case for charts). The generator does not depend on xInfoProp
1534 : SvXMLElementExport anElem( *this, XML_NAMESPACE_META, XML_GENERATOR,
1535 0 : true, true );
1536 0 : Characters(generator);
1537 0 : }
1538 0 : }
1539 0 : }
1540 :
1541 0 : void SvXMLExport::_ExportScripts()
1542 : {
1543 0 : SvXMLElementExport aElement( *this, XML_NAMESPACE_OFFICE, XML_SCRIPTS, true, true );
1544 :
1545 : // export Basic macros (only for FlatXML)
1546 0 : if ( mnExportFlags & EXPORT_EMBEDDED )
1547 : {
1548 0 : OUString aValue( GetNamespaceMap().GetPrefixByKey( XML_NAMESPACE_OOO ) );
1549 0 : aValue += ":Basic";
1550 0 : AddAttribute( XML_NAMESPACE_SCRIPT, XML_LANGUAGE, aValue );
1551 :
1552 0 : SvXMLElementExport aElem( *this, XML_NAMESPACE_OFFICE, XML_SCRIPT, true, true );
1553 :
1554 : // initialize Basic
1555 0 : if ( mxModel.is() )
1556 : {
1557 0 : Reference< beans::XPropertySet > xPSet( mxModel, UNO_QUERY );
1558 0 : if ( xPSet.is() )
1559 0 : xPSet->getPropertyValue("BasicLibraries");
1560 : }
1561 :
1562 0 : Reference < XDocumentHandler > xHdl( new XMLBasicExportFilter( mxHandler ) );
1563 0 : Reference< document::XXMLBasicExporter > xExporter = document::XMLOasisBasicExporter::createWithHandler( m_xContext, xHdl );
1564 :
1565 0 : Reference< XComponent > xComp( mxModel, UNO_QUERY );
1566 0 : xExporter->setSourceDocument( xComp );
1567 0 : Sequence< PropertyValue > aMediaDesc( 0 );
1568 0 : xExporter->filter( aMediaDesc );
1569 : }
1570 :
1571 : // export document events
1572 0 : Reference< document::XEventsSupplier > xEvents( GetModel(), UNO_QUERY );
1573 0 : GetEventExport().Export( xEvents, true );
1574 0 : }
1575 :
1576 0 : void SvXMLExport::_ExportFontDecls()
1577 : {
1578 0 : if( mxFontAutoStylePool.is() )
1579 0 : mxFontAutoStylePool->exportXML();
1580 0 : }
1581 :
1582 0 : void SvXMLExport::_ExportStyles( bool )
1583 : {
1584 0 : uno::Reference< lang::XMultiServiceFactory > xFact( GetModel(), uno::UNO_QUERY );
1585 0 : if( xFact.is())
1586 : {
1587 : // export (fill-)gradient-styles
1588 : try
1589 : {
1590 0 : uno::Reference< container::XNameAccess > xGradient( xFact->createInstance("com.sun.star.drawing.GradientTable"), uno::UNO_QUERY );
1591 0 : if( xGradient.is() )
1592 : {
1593 0 : XMLGradientStyleExport aGradientStyle( *this );
1594 :
1595 0 : if( xGradient->hasElements() )
1596 : {
1597 0 : uno::Sequence< OUString > aNamesSeq ( xGradient->getElementNames() );
1598 0 : sal_Int32 nCount = aNamesSeq.getLength();
1599 0 : for( sal_Int32 i=0; i<nCount; i++ )
1600 : {
1601 0 : const OUString& rStrName = aNamesSeq[ i ];
1602 :
1603 : try
1604 : {
1605 0 : uno::Any aValue = xGradient->getByName( rStrName );
1606 :
1607 0 : aGradientStyle.exportXML( rStrName, aValue );
1608 : }
1609 0 : catch(const container::NoSuchElementException&)
1610 : {
1611 : }
1612 0 : }
1613 0 : }
1614 0 : }
1615 : }
1616 0 : catch(const lang::ServiceNotRegisteredException&)
1617 : {
1618 : }
1619 :
1620 : // export (fill-)hatch-styles
1621 : try
1622 : {
1623 0 : uno::Reference< container::XNameAccess > xHatch( xFact->createInstance("com.sun.star.drawing.HatchTable"), uno::UNO_QUERY );
1624 0 : if( xHatch.is() )
1625 : {
1626 0 : XMLHatchStyleExport aHatchStyle( *this );
1627 :
1628 0 : if( xHatch->hasElements() )
1629 : {
1630 0 : uno::Sequence< OUString > aNamesSeq ( xHatch->getElementNames() );
1631 0 : sal_Int32 nCount = aNamesSeq.getLength();
1632 0 : for( sal_Int32 i=0; i<nCount; i++ )
1633 : {
1634 0 : const OUString& rStrName = aNamesSeq[ i ];
1635 :
1636 : try
1637 : {
1638 0 : uno::Any aValue = xHatch->getByName( rStrName );
1639 :
1640 0 : aHatchStyle.exportXML( rStrName, aValue );
1641 : }
1642 0 : catch(const container::NoSuchElementException&)
1643 : {}
1644 0 : }
1645 0 : }
1646 0 : }
1647 : }
1648 0 : catch(const lang::ServiceNotRegisteredException&)
1649 : {
1650 : }
1651 :
1652 : // export (fill-)bitmap-styles
1653 : try
1654 : {
1655 0 : uno::Reference< container::XNameAccess > xBitmap( xFact->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY );
1656 0 : if( xBitmap.is() )
1657 : {
1658 0 : XMLImageStyle aImageStyle;
1659 :
1660 0 : if( xBitmap->hasElements() )
1661 : {
1662 0 : uno::Sequence< OUString > aNamesSeq ( xBitmap->getElementNames() );
1663 0 : sal_Int32 nCount = aNamesSeq.getLength();
1664 0 : for( sal_Int32 i=0; i<nCount; i++ )
1665 : {
1666 0 : const OUString& rStrName = aNamesSeq[ i ];
1667 :
1668 : try
1669 : {
1670 0 : uno::Any aValue = xBitmap->getByName( rStrName );
1671 :
1672 0 : aImageStyle.exportXML( rStrName, aValue, *this );
1673 : }
1674 0 : catch(const container::NoSuchElementException&)
1675 : {
1676 : }
1677 0 : }
1678 0 : }
1679 0 : }
1680 : }
1681 0 : catch(const lang::ServiceNotRegisteredException&)
1682 : {
1683 : }
1684 :
1685 : // export transparency-gradient -styles
1686 : try
1687 : {
1688 0 : uno::Reference< container::XNameAccess > xTransGradient( xFact->createInstance("com.sun.star.drawing.TransparencyGradientTable"), uno::UNO_QUERY );
1689 0 : if( xTransGradient.is() )
1690 : {
1691 0 : XMLTransGradientStyleExport aTransGradientstyle( *this );
1692 :
1693 0 : if( xTransGradient->hasElements() )
1694 : {
1695 0 : uno::Sequence< OUString > aNamesSeq ( xTransGradient->getElementNames() );
1696 0 : sal_Int32 nCount = aNamesSeq.getLength();
1697 0 : for( sal_Int32 i=0; i<nCount; i++ )
1698 : {
1699 0 : const OUString& rStrName = aNamesSeq[ i ];
1700 :
1701 : try
1702 : {
1703 0 : uno::Any aValue = xTransGradient->getByName( rStrName );
1704 :
1705 0 : aTransGradientstyle.exportXML( rStrName, aValue );
1706 : }
1707 0 : catch(const container::NoSuchElementException&)
1708 : {
1709 : }
1710 0 : }
1711 0 : }
1712 0 : }
1713 : }
1714 0 : catch(const lang::ServiceNotRegisteredException&)
1715 : {
1716 : }
1717 :
1718 : // export marker-styles
1719 : try
1720 : {
1721 0 : uno::Reference< container::XNameAccess > xMarker( xFact->createInstance("com.sun.star.drawing.MarkerTable"), uno::UNO_QUERY );
1722 0 : if( xMarker.is() )
1723 : {
1724 0 : XMLMarkerStyleExport aMarkerStyle( *this );
1725 :
1726 0 : if( xMarker->hasElements() )
1727 : {
1728 0 : uno::Sequence< OUString > aNamesSeq ( xMarker->getElementNames() );
1729 0 : sal_Int32 nCount = aNamesSeq.getLength();
1730 0 : for( sal_Int32 i=0; i<nCount; i++ )
1731 : {
1732 0 : const OUString& rStrName = aNamesSeq[ i ];
1733 :
1734 : try
1735 : {
1736 0 : uno::Any aValue = xMarker->getByName( rStrName );
1737 :
1738 0 : aMarkerStyle.exportXML( rStrName, aValue );
1739 : }
1740 0 : catch(const container::NoSuchElementException&)
1741 : {
1742 : }
1743 0 : }
1744 0 : }
1745 0 : }
1746 : }
1747 0 : catch(const lang::ServiceNotRegisteredException&)
1748 : {
1749 : }
1750 :
1751 : // export dash-styles
1752 : try
1753 : {
1754 0 : uno::Reference< container::XNameAccess > xDashes( xFact->createInstance("com.sun.star.drawing.DashTable"), uno::UNO_QUERY );
1755 0 : if( xDashes.is() )
1756 : {
1757 0 : XMLDashStyleExport aDashStyle( *this );
1758 :
1759 0 : if( xDashes->hasElements() )
1760 : {
1761 0 : uno::Sequence< OUString > aNamesSeq ( xDashes->getElementNames() );
1762 0 : sal_Int32 nCount = aNamesSeq.getLength();
1763 0 : for( sal_Int32 i=0; i<nCount; i++ )
1764 : {
1765 0 : const OUString& rStrName = aNamesSeq[ i ];
1766 :
1767 : try
1768 : {
1769 0 : uno::Any aValue = xDashes->getByName( rStrName );
1770 :
1771 0 : aDashStyle.exportXML( rStrName, aValue );
1772 : }
1773 0 : catch(const container::NoSuchElementException&)
1774 : {
1775 : }
1776 0 : }
1777 0 : }
1778 0 : }
1779 : }
1780 0 : catch(const lang::ServiceNotRegisteredException&)
1781 : {
1782 : }
1783 0 : }
1784 0 : }
1785 :
1786 0 : XMLTextParagraphExport* SvXMLExport::CreateTextParagraphExport()
1787 : {
1788 0 : return new XMLTextParagraphExport( *this, *(GetAutoStylePool().get()) );
1789 : }
1790 :
1791 0 : XMLShapeExport* SvXMLExport::CreateShapeExport()
1792 : {
1793 0 : return new XMLShapeExport(*this);
1794 : }
1795 :
1796 0 : SvXMLAutoStylePoolP* SvXMLExport::CreateAutoStylePool()
1797 : {
1798 0 : return new SvXMLAutoStylePoolP(*this);
1799 : }
1800 :
1801 0 : XMLPageExport* SvXMLExport::CreatePageExport()
1802 : {
1803 0 : return new XMLPageExport( *this );
1804 : }
1805 :
1806 0 : SchXMLExportHelper* SvXMLExport::CreateChartExport()
1807 : {
1808 0 : return new SchXMLExportHelper(*this,*GetAutoStylePool().get());
1809 : }
1810 :
1811 0 : XMLFontAutoStylePool* SvXMLExport::CreateFontAutoStylePool()
1812 : {
1813 0 : return new XMLFontAutoStylePool( *this );
1814 : }
1815 :
1816 0 : xmloff::OFormLayerXMLExport* SvXMLExport::CreateFormExport()
1817 : {
1818 0 : return new xmloff::OFormLayerXMLExport(*this);
1819 : }
1820 :
1821 0 : void SvXMLExport::GetViewSettingsAndViews(uno::Sequence<beans::PropertyValue>& rProps)
1822 : {
1823 0 : GetViewSettings(rProps);
1824 0 : uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetModel(), uno::UNO_QUERY);
1825 0 : if(xViewDataSupplier.is())
1826 : {
1827 0 : uno::Reference<container::XIndexAccess> xIndexAccess;
1828 0 : xViewDataSupplier->setViewData( xIndexAccess ); // make sure we get a newly created sequence
1829 0 : xIndexAccess = xViewDataSupplier->getViewData();
1830 0 : bool bAdd = false;
1831 0 : uno::Any aAny;
1832 0 : if(xIndexAccess.is() && xIndexAccess->hasElements() )
1833 : {
1834 0 : sal_Int32 nCount = xIndexAccess->getCount();
1835 0 : for (sal_Int32 i = 0; i < nCount; i++)
1836 : {
1837 0 : aAny = xIndexAccess->getByIndex(i);
1838 0 : uno::Sequence<beans::PropertyValue> aProps;
1839 0 : if( aAny >>= aProps )
1840 : {
1841 0 : if( aProps.getLength() > 0 )
1842 : {
1843 0 : bAdd = true;
1844 0 : break;
1845 : }
1846 : }
1847 0 : }
1848 : }
1849 :
1850 0 : if( bAdd )
1851 : {
1852 0 : sal_Int32 nOldLength(rProps.getLength());
1853 0 : rProps.realloc(nOldLength + 1);
1854 0 : beans::PropertyValue aProp;
1855 0 : aProp.Name = "Views";
1856 0 : aProp.Value <<= xIndexAccess;
1857 0 : rProps[nOldLength] = aProp;
1858 0 : }
1859 0 : }
1860 0 : }
1861 :
1862 0 : void SvXMLExport::GetViewSettings(uno::Sequence<beans::PropertyValue>&)
1863 : {
1864 0 : }
1865 :
1866 0 : void SvXMLExport::GetConfigurationSettings(uno::Sequence<beans::PropertyValue>&)
1867 : {
1868 0 : }
1869 :
1870 0 : sal_Int32 SvXMLExport::GetDocumentSpecificSettings( ::std::list< SettingsGroup >& _out_rSettings )
1871 : {
1872 : (void)_out_rSettings;
1873 0 : return 0;
1874 : }
1875 :
1876 0 : void SvXMLExport::addDataStyle(const sal_Int32 nNumberFormat, bool /*bTimeFormat*/ )
1877 : {
1878 0 : if(mpNumExport)
1879 0 : mpNumExport->SetUsed(nNumberFormat);
1880 0 : }
1881 :
1882 0 : void SvXMLExport::exportDataStyles()
1883 : {
1884 0 : if(mpNumExport)
1885 0 : mpNumExport->Export(false);
1886 0 : }
1887 :
1888 0 : void SvXMLExport::exportAutoDataStyles()
1889 : {
1890 0 : if(mpNumExport)
1891 0 : mpNumExport->Export(true);
1892 :
1893 0 : if (mxFormExport.is())
1894 0 : mxFormExport->exportAutoControlNumberStyles();
1895 0 : }
1896 :
1897 0 : OUString SvXMLExport::getDataStyleName(const sal_Int32 nNumberFormat, bool /*bTimeFormat*/ ) const
1898 : {
1899 0 : OUString sTemp;
1900 0 : if(mpNumExport)
1901 0 : sTemp = mpNumExport->GetStyleName(nNumberFormat);
1902 0 : return sTemp;
1903 : }
1904 :
1905 0 : void SvXMLExport::exportAnnotationMeta(const uno::Reference<drawing::XShape>&)
1906 : {
1907 0 : }
1908 :
1909 0 : sal_Int32 SvXMLExport::dataStyleForceSystemLanguage(sal_Int32 nFormat) const
1910 : {
1911 0 : return ( mpNumExport != NULL )
1912 0 : ? mpNumExport->ForceSystemLanguage( nFormat ) : nFormat;
1913 : }
1914 :
1915 0 : OUString SvXMLExport::AddEmbeddedGraphicObject( const OUString& rGraphicObjectURL )
1916 : {
1917 0 : OUString sRet( rGraphicObjectURL );
1918 0 : if( rGraphicObjectURL.startsWith( msGraphicObjectProtocol ) &&
1919 0 : mxGraphicResolver.is() )
1920 : {
1921 0 : if( (getExportFlags() & EXPORT_EMBEDDED) == 0 )
1922 0 : sRet = mxGraphicResolver->resolveGraphicObjectURL( rGraphicObjectURL );
1923 : else
1924 0 : sRet = "";
1925 : }
1926 : else
1927 0 : sRet = GetRelativeReference( sRet );
1928 :
1929 0 : return sRet;
1930 : }
1931 :
1932 0 : bool SvXMLExport::AddEmbeddedGraphicObjectAsBase64( const OUString& rGraphicObjectURL )
1933 : {
1934 0 : bool bRet = false;
1935 :
1936 0 : if( (getExportFlags() & EXPORT_EMBEDDED) != 0 &&
1937 0 : rGraphicObjectURL.startsWith( msGraphicObjectProtocol ) &&
1938 0 : mxGraphicResolver.is() )
1939 : {
1940 0 : Reference< XBinaryStreamResolver > xStmResolver( mxGraphicResolver, UNO_QUERY );
1941 :
1942 0 : if( xStmResolver.is() )
1943 : {
1944 0 : Reference< XInputStream > xIn( xStmResolver->getInputStream( rGraphicObjectURL ) );
1945 :
1946 0 : if( xIn.is() )
1947 : {
1948 0 : XMLBase64Export aBase64Exp( *this );
1949 0 : bRet = aBase64Exp.exportOfficeBinaryDataElement( xIn );
1950 0 : }
1951 0 : }
1952 : }
1953 :
1954 0 : return bRet;
1955 : }
1956 :
1957 0 : OUString SvXMLExport::AddEmbeddedObject( const OUString& rEmbeddedObjectURL )
1958 : {
1959 0 : OUString sRet;
1960 0 : if( (rEmbeddedObjectURL.startsWith( msEmbeddedObjectProtocol ) ||
1961 0 : rEmbeddedObjectURL.startsWith( msGraphicObjectProtocol ) ) &&
1962 0 : mxEmbeddedResolver.is() )
1963 : {
1964 0 : sRet =
1965 0 : mxEmbeddedResolver->resolveEmbeddedObjectURL( rEmbeddedObjectURL );
1966 : }
1967 : else
1968 0 : sRet = GetRelativeReference( rEmbeddedObjectURL );
1969 :
1970 0 : return sRet;
1971 : }
1972 :
1973 0 : bool SvXMLExport::AddEmbeddedObjectAsBase64( const OUString& rEmbeddedObjectURL )
1974 : {
1975 0 : bool bRet = false;
1976 0 : if( (rEmbeddedObjectURL.startsWith( msEmbeddedObjectProtocol ) ||
1977 0 : rEmbeddedObjectURL.startsWith( msGraphicObjectProtocol ) ) &&
1978 0 : mxEmbeddedResolver.is() )
1979 : {
1980 0 : Reference < XNameAccess > xNA( mxEmbeddedResolver, UNO_QUERY );
1981 0 : if( xNA.is() )
1982 : {
1983 0 : Any aAny = xNA->getByName( rEmbeddedObjectURL );
1984 0 : Reference < XInputStream > xIn;
1985 0 : aAny >>= xIn;
1986 0 : if( xIn.is() )
1987 : {
1988 0 : XMLBase64Export aBase64Exp( *this );
1989 0 : bRet = aBase64Exp.exportOfficeBinaryDataElement( xIn );
1990 0 : }
1991 0 : }
1992 : }
1993 :
1994 0 : return bRet;
1995 : }
1996 :
1997 0 : OUString SvXMLExport::EncodeStyleName(
1998 : const OUString& rName,
1999 : bool *pEncoded ) const
2000 : {
2001 0 : return GetMM100UnitConverter().encodeStyleName( rName, pEncoded );
2002 : }
2003 :
2004 0 : ProgressBarHelper* SvXMLExport::GetProgressBarHelper()
2005 : {
2006 0 : if (!mpProgressBarHelper)
2007 : {
2008 0 : mpProgressBarHelper = new ProgressBarHelper(mxStatusIndicator, true);
2009 :
2010 0 : if (mxExportInfo.is())
2011 : {
2012 0 : uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxExportInfo->getPropertySetInfo();
2013 0 : if (xPropertySetInfo.is())
2014 : {
2015 0 : OUString sProgressRange(XML_PROGRESSRANGE);
2016 0 : OUString sProgressMax(XML_PROGRESSMAX);
2017 0 : OUString sProgressCurrent(XML_PROGRESSCURRENT);
2018 0 : OUString sRepeat(XML_PROGRESSREPEAT);
2019 0 : if (xPropertySetInfo->hasPropertyByName(sProgressMax) &&
2020 0 : xPropertySetInfo->hasPropertyByName(sProgressCurrent) &&
2021 0 : xPropertySetInfo->hasPropertyByName(sProgressRange))
2022 : {
2023 0 : uno::Any aAny;
2024 0 : sal_Int32 nProgressMax(0);
2025 0 : sal_Int32 nProgressCurrent(0);
2026 0 : sal_Int32 nProgressRange(0);
2027 0 : aAny = mxExportInfo->getPropertyValue(sProgressRange);
2028 0 : if (aAny >>= nProgressRange)
2029 0 : mpProgressBarHelper->SetRange(nProgressRange);
2030 0 : aAny = mxExportInfo->getPropertyValue(sProgressMax);
2031 0 : if (aAny >>= nProgressMax)
2032 0 : mpProgressBarHelper->SetReference(nProgressMax);
2033 0 : aAny = mxExportInfo->getPropertyValue(sProgressCurrent);
2034 0 : if (aAny >>= nProgressCurrent)
2035 0 : mpProgressBarHelper->SetValue(nProgressCurrent);
2036 : }
2037 0 : if (xPropertySetInfo->hasPropertyByName(sRepeat))
2038 : {
2039 0 : uno::Any aAny = mxExportInfo->getPropertyValue(sRepeat);
2040 0 : if (aAny.getValueType() == getBooleanCppuType())
2041 0 : mpProgressBarHelper->SetRepeat(::cppu::any2bool(aAny));
2042 : else {
2043 : SAL_WARN("xmloff.core", "why is it no boolean?" );
2044 0 : }
2045 0 : }
2046 0 : }
2047 : }
2048 : }
2049 0 : return mpProgressBarHelper;
2050 : }
2051 :
2052 0 : XMLEventExport& SvXMLExport::GetEventExport()
2053 : {
2054 0 : if( NULL == mpEventExport)
2055 : {
2056 : // create EventExport on demand
2057 0 : mpEventExport = new XMLEventExport(*this, NULL);
2058 :
2059 : // and register standard handlers + names
2060 0 : OUString sStarBasic("StarBasic");
2061 0 : mpEventExport->AddHandler(sStarBasic, new XMLStarBasicExportHandler());
2062 0 : OUString sScript("Script");
2063 0 : mpEventExport->AddHandler(sScript, new XMLScriptExportHandler());
2064 0 : mpEventExport->AddTranslationTable(aStandardEventTable);
2065 : }
2066 :
2067 0 : return *mpEventExport;
2068 : }
2069 :
2070 0 : XMLImageMapExport& SvXMLExport::GetImageMapExport()
2071 : {
2072 : // image map export, create on-demand
2073 0 : if( NULL == mpImageMapExport )
2074 : {
2075 0 : mpImageMapExport = new XMLImageMapExport(*this);
2076 : }
2077 :
2078 0 : return *mpImageMapExport;
2079 : }
2080 :
2081 : namespace
2082 : {
2083 : class theSvXMLExportUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSvXMLExportUnoTunnelId> {};
2084 : }
2085 :
2086 : // XUnoTunnel & co
2087 0 : const uno::Sequence< sal_Int8 > & SvXMLExport::getUnoTunnelId() throw()
2088 : {
2089 0 : return theSvXMLExportUnoTunnelId::get().getSeq();
2090 : }
2091 :
2092 0 : SvXMLExport* SvXMLExport::getImplementation( uno::Reference< uno::XInterface > xInt ) throw()
2093 : {
2094 0 : uno::Reference< lang::XUnoTunnel > xUT( xInt, uno::UNO_QUERY );
2095 0 : if( xUT.is() )
2096 : {
2097 : return
2098 : reinterpret_cast<SvXMLExport*>(
2099 : sal::static_int_cast<sal_IntPtr>(
2100 0 : xUT->getSomething( SvXMLExport::getUnoTunnelId())));
2101 : }
2102 : else
2103 0 : return NULL;
2104 : }
2105 :
2106 : // XUnoTunnel
2107 0 : sal_Int64 SAL_CALL SvXMLExport::getSomething( const uno::Sequence< sal_Int8 >& rId )
2108 : throw( uno::RuntimeException, std::exception )
2109 : {
2110 0 : if( rId.getLength() == 16 && 0 == memcmp( getUnoTunnelId().getConstArray(),
2111 0 : rId.getConstArray(), 16 ) )
2112 : {
2113 0 : return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
2114 : }
2115 0 : return 0;
2116 : }
2117 :
2118 0 : bool SvXMLExport::ExportEmbeddedOwnObject( Reference< XComponent >& rComp )
2119 : {
2120 0 : OUString sFilterService;
2121 :
2122 0 : Reference < lang::XServiceInfo > xServiceInfo( rComp, UNO_QUERY );
2123 0 : if( xServiceInfo.is() )
2124 : {
2125 0 : const XMLServiceMapEntry_Impl *pEntry = aServiceMap;
2126 0 : while( pEntry->sModelService )
2127 : {
2128 : OUString sModelService( pEntry->sModelService,
2129 : pEntry->nModelServiceLen,
2130 0 : RTL_TEXTENCODING_ASCII_US );
2131 0 : if( xServiceInfo->supportsService( sModelService ) )
2132 : {
2133 0 : sFilterService = OUString( pEntry->sFilterService,
2134 : pEntry->nFilterServiceLen,
2135 0 : RTL_TEXTENCODING_ASCII_US );
2136 0 : break;
2137 : }
2138 0 : pEntry++;
2139 0 : }
2140 : }
2141 :
2142 : SAL_WARN_IF( !sFilterService.getLength(), "xmloff.core", "no export filter for own object" );
2143 :
2144 0 : if( sFilterService.isEmpty() )
2145 0 : return false;
2146 :
2147 : Reference < XDocumentHandler > xHdl =
2148 0 : new XMLEmbeddedObjectExportFilter( mxHandler );
2149 :
2150 0 : Sequence < Any > aArgs( 1 );
2151 0 : aArgs[0] <<= xHdl;
2152 :
2153 : Reference< document::XExporter > xExporter(
2154 0 : m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(sFilterService, aArgs, m_xContext),
2155 0 : UNO_QUERY);
2156 : SAL_WARN_IF( !xExporter.is(), "xmloff.core", "can't instantiate export filter component for own object" );
2157 0 : if( !xExporter.is() )
2158 0 : return false;
2159 :
2160 0 : xExporter->setSourceDocument( rComp );
2161 :
2162 0 : Reference<XFilter> xFilter( xExporter, UNO_QUERY );
2163 :
2164 0 : Sequence < PropertyValue > aMediaDesc( 0 );
2165 0 : return xFilter->filter( aMediaDesc );
2166 : }
2167 :
2168 0 : OUString SvXMLExport::GetRelativeReference(const OUString& rValue)
2169 : {
2170 0 : OUString sValue( rValue );
2171 : // #i65474# handling of fragment URLs ("#....") is undefined
2172 : // they are stored 'as is'
2173 0 : uno::Reference< uri::XUriReference > xUriRef;
2174 0 : if(!sValue.isEmpty() && sValue[0] != '#')
2175 : {
2176 : try
2177 : {
2178 0 : xUriRef = mpImpl->mxUriReferenceFactory->parse( rValue );
2179 0 : if( xUriRef.is() && !xUriRef->isAbsolute() )
2180 : {
2181 : //#i61943# relative URLs need special handling
2182 0 : INetURLObject aTemp( mpImpl->msPackageURI );
2183 0 : bool bWasAbsolute = false;
2184 0 : sValue = aTemp.smartRel2Abs(sValue, bWasAbsolute ).GetMainURL(INetURLObject::DECODE_TO_IURI);
2185 : }
2186 : }
2187 0 : catch(const uno::Exception&)
2188 : {
2189 : }
2190 : }
2191 0 : if( xUriRef.is() )//no conversion for empty values or for fragments
2192 : {
2193 : //conversion for matching schemes only
2194 0 : if( xUriRef->getScheme() == mpImpl->msPackageURIScheme )
2195 : {
2196 0 : sValue = INetURLObject::GetRelURL( msOrigFileName, sValue,
2197 0 : INetURLObject::WAS_ENCODED, INetURLObject::DECODE_TO_IURI, RTL_TEXTENCODING_UTF8, INetURLObject::FSYS_DETECT);
2198 : }
2199 : }
2200 0 : return sValue;
2201 : }
2202 :
2203 0 : void SvXMLExport::StartElement(sal_uInt16 nPrefix,
2204 : enum ::xmloff::token::XMLTokenEnum eName,
2205 : bool bIgnWSOutside )
2206 : {
2207 0 : StartElement(_GetNamespaceMap().GetQNameByKey( nPrefix,
2208 0 : GetXMLToken(eName) ), bIgnWSOutside);
2209 0 : }
2210 :
2211 0 : void SvXMLExport::StartElement(const OUString& rName,
2212 : bool bIgnWSOutside )
2213 : {
2214 0 : if ((mnErrorFlags & ERROR_DO_NOTHING) != ERROR_DO_NOTHING)
2215 : {
2216 : try
2217 : {
2218 0 : if( bIgnWSOutside && ((mnExportFlags & EXPORT_PRETTY) == EXPORT_PRETTY))
2219 0 : mxHandler->ignorableWhitespace( msWS );
2220 0 : mxHandler->startElement( rName, GetXAttrList() );
2221 : }
2222 0 : catch (const SAXInvalidCharacterException& e)
2223 : {
2224 0 : Sequence<OUString> aPars(1);
2225 0 : aPars[0] = rName;
2226 0 : SetError( XMLERROR_SAX|XMLERROR_FLAG_WARNING, aPars, e.Message, NULL );
2227 : }
2228 0 : catch (const SAXException& e)
2229 : {
2230 0 : Sequence<OUString> aPars(1);
2231 0 : aPars[0] = rName;
2232 : SetError( XMLERROR_SAX|XMLERROR_FLAG_ERROR|XMLERROR_FLAG_SEVERE,
2233 0 : aPars, e.Message, NULL );
2234 : }
2235 : }
2236 0 : ClearAttrList();
2237 0 : ++mpImpl->mDepth; // increment nesting depth counter
2238 0 : }
2239 :
2240 0 : void SvXMLExport::Characters(const OUString& rChars)
2241 : {
2242 0 : if ((mnErrorFlags & ERROR_DO_NOTHING) != ERROR_DO_NOTHING)
2243 : {
2244 : try
2245 : {
2246 0 : mxHandler->characters(rChars);
2247 : }
2248 0 : catch (const SAXInvalidCharacterException& e)
2249 : {
2250 0 : Sequence<OUString> aPars(1);
2251 0 : aPars[0] = rChars;
2252 0 : SetError( XMLERROR_SAX|XMLERROR_FLAG_WARNING, aPars, e.Message, NULL );
2253 : }
2254 0 : catch (const SAXException& e)
2255 : {
2256 0 : Sequence<OUString> aPars(1);
2257 0 : aPars[0] = rChars;
2258 : SetError( XMLERROR_SAX|XMLERROR_FLAG_ERROR|XMLERROR_FLAG_SEVERE,
2259 0 : aPars, e.Message, NULL );
2260 : }
2261 : }
2262 0 : }
2263 :
2264 0 : void SvXMLExport::EndElement(sal_uInt16 nPrefix,
2265 : enum ::xmloff::token::XMLTokenEnum eName,
2266 : bool bIgnWSInside )
2267 : {
2268 0 : EndElement(_GetNamespaceMap().GetQNameByKey( nPrefix, GetXMLToken(eName) ),
2269 0 : bIgnWSInside);
2270 0 : }
2271 :
2272 0 : void SvXMLExport::EndElement(const OUString& rName,
2273 : bool bIgnWSInside )
2274 : {
2275 : // decrement nesting depth counter & (maybe) restore namespace map
2276 0 : --mpImpl->mDepth;
2277 0 : if (!mpImpl->mNamespaceMaps.empty() &&
2278 0 : (mpImpl->mNamespaceMaps.top().second == mpImpl->mDepth))
2279 : {
2280 0 : delete mpNamespaceMap;
2281 0 : mpNamespaceMap = mpImpl->mNamespaceMaps.top().first;
2282 0 : mpImpl->mNamespaceMaps.pop();
2283 : }
2284 : SAL_WARN_IF(!mpImpl->mNamespaceMaps.empty() &&
2285 : (mpImpl->mNamespaceMaps.top().second >= mpImpl->mDepth), "xmloff.core", "SvXMLExport: NamespaceMaps corrupted");
2286 :
2287 0 : if ((mnErrorFlags & ERROR_DO_NOTHING) != ERROR_DO_NOTHING)
2288 : {
2289 : try
2290 : {
2291 0 : if( bIgnWSInside && ((mnExportFlags & EXPORT_PRETTY) == EXPORT_PRETTY))
2292 0 : mxHandler->ignorableWhitespace( msWS );
2293 0 : mxHandler->endElement( rName );
2294 : }
2295 0 : catch (const SAXException& e)
2296 : {
2297 0 : Sequence<OUString> aPars(1);
2298 0 : aPars[0] = rName;
2299 : SetError( XMLERROR_SAX|XMLERROR_FLAG_ERROR|XMLERROR_FLAG_SEVERE,
2300 0 : aPars, e.Message, NULL );
2301 : }
2302 : }
2303 0 : }
2304 :
2305 0 : void SvXMLExport::IgnorableWhitespace()
2306 : {
2307 0 : if ((mnExportFlags & EXPORT_PRETTY) != EXPORT_PRETTY)
2308 0 : return;
2309 :
2310 0 : if ((mnErrorFlags & ERROR_DO_NOTHING) != ERROR_DO_NOTHING)
2311 : {
2312 : try
2313 : {
2314 0 : mxHandler->ignorableWhitespace( msWS );
2315 : }
2316 0 : catch (const SAXException& e)
2317 : {
2318 0 : Sequence<OUString> aPars(0);
2319 : SetError( XMLERROR_SAX|XMLERROR_FLAG_ERROR|XMLERROR_FLAG_SEVERE,
2320 0 : aPars, e.Message, NULL );
2321 : }
2322 : }
2323 : }
2324 :
2325 0 : void SvXMLExport::SetError(
2326 : sal_Int32 nId,
2327 : const Sequence<OUString>& rMsgParams,
2328 : const OUString& rExceptionMessage,
2329 : const Reference<XLocator>& rLocator )
2330 : {
2331 : // allow multi-threaded access to the cancel() method
2332 0 : static osl::Mutex aMutex;
2333 0 : osl::MutexGuard aGuard(aMutex);
2334 :
2335 : // maintain error flags
2336 0 : if ( ( nId & XMLERROR_FLAG_ERROR ) != 0 )
2337 0 : mnErrorFlags |= ERROR_ERROR_OCCURRED;
2338 0 : if ( ( nId & XMLERROR_FLAG_WARNING ) != 0 )
2339 0 : mnErrorFlags |= ERROR_WARNING_OCCURRED;
2340 0 : if ( ( nId & XMLERROR_FLAG_SEVERE ) != 0 )
2341 0 : mnErrorFlags |= ERROR_DO_NOTHING;
2342 :
2343 : // create error lsit on demand
2344 0 : if ( mpXMLErrors == NULL )
2345 0 : mpXMLErrors = new XMLErrors();
2346 :
2347 : // save error information
2348 0 : mpXMLErrors->AddRecord( nId, rMsgParams, rExceptionMessage, rLocator );
2349 0 : }
2350 :
2351 0 : void SvXMLExport::SetError(
2352 : sal_Int32 nId,
2353 : const Sequence<OUString>& rMsgParams)
2354 : {
2355 0 : OUString sEmpty;
2356 0 : SetError( nId, rMsgParams, sEmpty, NULL );
2357 0 : }
2358 :
2359 0 : void SvXMLExport::DisposingModel()
2360 : {
2361 0 : mxModel.clear();
2362 : // Shapes in Writer cannot be named via context menu (#i51726#)
2363 0 : meModelType = SvtModuleOptions::E_UNKNOWN_FACTORY;
2364 0 : mxEventListener.clear();
2365 0 : }
2366 :
2367 0 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > SvXMLExport::getComponentContext()
2368 : {
2369 0 : return m_xContext;
2370 : }
2371 :
2372 0 : ::comphelper::UnoInterfaceToUniqueIdentifierMapper& SvXMLExport::getInterfaceToIdentifierMapper()
2373 : {
2374 0 : return mpImpl->maInterfaceToIdentifierMapper;
2375 : }
2376 :
2377 : // Written OpenDocument file format doesn't fit to the created text document (#i69627#)
2378 0 : bool SvXMLExport::writeOutlineStyleAsNormalListStyle() const
2379 : {
2380 0 : return mpImpl->mbOutlineStyleAsNormalListStyle;
2381 : }
2382 :
2383 0 : uno::Reference< embed::XStorage > SvXMLExport::GetTargetStorage()
2384 : {
2385 0 : return mpImpl->mxTargetStorage;
2386 : }
2387 :
2388 : /// returns the currently configured default version for ODF export
2389 0 : SvtSaveOptions::ODFDefaultVersion SvXMLExport::getDefaultVersion() const
2390 : {
2391 0 : if( mpImpl )
2392 0 : return mpImpl->maSaveOptions.GetODFDefaultVersion();
2393 :
2394 : // fatal error, use current version as default
2395 0 : return SvtSaveOptions::ODFVER_012;
2396 : }
2397 :
2398 0 : OUString SvXMLExport::GetStreamName() const
2399 : {
2400 0 : return mpImpl->mStreamName;
2401 : }
2402 :
2403 : void
2404 0 : SvXMLExport::AddAttributeIdLegacy(
2405 : sal_uInt16 const nLegacyPrefix, OUString const& rValue)
2406 : {
2407 0 : switch (getDefaultVersion()) {
2408 : case SvtSaveOptions::ODFVER_011: // fall thru
2409 0 : case SvtSaveOptions::ODFVER_010: break;
2410 : default: // ODF 1.2: xml:id
2411 0 : AddAttribute(XML_NAMESPACE_XML, XML_ID, rValue);
2412 : }
2413 : // in ODF 1.1 this was form:id, anim:id, draw:id, or text:id
2414 : // backward compatibility: in ODF 1.2 write _both_ id attrs
2415 0 : AddAttribute(nLegacyPrefix, XML_ID, rValue);
2416 : // FIXME: this function simply assumes that rValue is unique
2417 0 : }
2418 :
2419 : void
2420 0 : SvXMLExport::AddAttributeXmlId(uno::Reference<uno::XInterface> const & i_xIfc)
2421 : {
2422 : // check version >= 1.2
2423 0 : switch (getDefaultVersion()) {
2424 : case SvtSaveOptions::ODFVER_011: // fall thru
2425 0 : case SvtSaveOptions::ODFVER_010: return;
2426 0 : default: break;
2427 : }
2428 : const uno::Reference<rdf::XMetadatable> xMeta(i_xIfc,
2429 0 : uno::UNO_QUERY);
2430 : //FIXME not yet...
2431 0 : if ( xMeta.is() )
2432 : {
2433 0 : const beans::StringPair mdref( xMeta->getMetadataReference() );
2434 0 : if ( !mdref.Second.isEmpty() )
2435 : {
2436 0 : const OUString streamName( GetStreamName() );
2437 0 : if ( !streamName.isEmpty() )
2438 : {
2439 0 : if ( streamName.equals(mdref.First) )
2440 : {
2441 0 : AddAttribute( XML_NAMESPACE_XML, XML_ID, mdref.Second );
2442 : }
2443 : else
2444 : {
2445 : SAL_WARN("xmloff.core","SvXMLExport::AddAttributeXmlId: invalid stream name");
2446 : }
2447 : }
2448 : else
2449 : {
2450 : // FIXME: this is ugly
2451 : // there is no stream name (e.g. XSLT, flat-xml format)!
2452 : // but how do we ensure uniqueness in this case?
2453 : // a) just omit styles.xml ids -- they are unlikely anyway...
2454 : // b) somehow find out whether we are currently exporting styles
2455 : // or content, and prefix "s" or "c" => unique
2456 0 : if ( mdref.First == "content.xml" )
2457 : {
2458 0 : AddAttribute( XML_NAMESPACE_XML, XML_ID, mdref.Second );
2459 : }
2460 : else
2461 : {
2462 : SAL_INFO("xmloff.core", "SvXMLExport::AddAttributeXmlId: no stream name given: dropping styles.xml xml:id");
2463 : }
2464 0 : }
2465 0 : }
2466 0 : }
2467 : }
2468 :
2469 : void
2470 0 : SvXMLExport::AddAttributesRDFa(
2471 : uno::Reference<text::XTextContent> const & i_xTextContent)
2472 : {
2473 : // check version >= 1.2
2474 0 : switch (getDefaultVersion()) {
2475 : case SvtSaveOptions::ODFVER_011: // fall thru
2476 0 : case SvtSaveOptions::ODFVER_010: return;
2477 0 : default: break;
2478 : }
2479 :
2480 : const uno::Reference<rdf::XMetadatable> xMeta(
2481 0 : i_xTextContent, uno::UNO_QUERY);
2482 0 : if (!xMeta.is() || xMeta->getMetadataReference().Second.isEmpty())
2483 : {
2484 0 : return; // no xml:id => no RDFa
2485 : }
2486 :
2487 0 : if (!mpImpl->mpRDFaHelper.get())
2488 : {
2489 0 : mpImpl->mpRDFaHelper.reset( new ::xmloff::RDFaExportHelper(*this) );
2490 : }
2491 0 : mpImpl->mpRDFaHelper->AddRDFa(xMeta);
2492 : }
2493 :
2494 0 : bool SvXMLExport::exportTextNumberElement() const
2495 : {
2496 0 : return mpImpl->mbExportTextNumberElement;
2497 : }
2498 :
2499 0 : bool SvXMLExport::SetNullDateOnUnitConverter()
2500 : {
2501 : // if the null date has already been set, don't set it again (performance)
2502 0 : if (!mpImpl->mbNullDateInitialized)
2503 0 : mpImpl->mbNullDateInitialized = GetMM100UnitConverter().setNullDate(GetModel());
2504 :
2505 0 : return mpImpl->mbNullDateInitialized;
2506 : }
2507 :
2508 :
2509 :
2510 0 : void SvXMLElementExport::StartElement(
2511 : const sal_uInt16 nPrefixKey,
2512 : const OUString& rLName,
2513 : const bool bIgnoreWhitespaceOutside )
2514 : {
2515 0 : maElementName = mrExport.GetNamespaceMap().GetQNameByKey(nPrefixKey, rLName);
2516 0 : mrExport.StartElement(maElementName, bIgnoreWhitespaceOutside);
2517 0 : }
2518 :
2519 0 : SvXMLElementExport::SvXMLElementExport(
2520 : SvXMLExport& rExp,
2521 : sal_uInt16 nPrefixKey,
2522 : const sal_Char *pLName,
2523 : bool bIWSOutside,
2524 : bool bIWSInside )
2525 : : mrExport( rExp )
2526 : , maElementName()
2527 : , mbIgnoreWhitespaceInside( bIWSInside )
2528 0 : , mbDoSomething( true )
2529 : {
2530 0 : const OUString sLName( OUString::createFromAscii( pLName ) );
2531 0 : StartElement( nPrefixKey, sLName, bIWSOutside );
2532 0 : }
2533 :
2534 0 : SvXMLElementExport::SvXMLElementExport(
2535 : SvXMLExport& rExp,
2536 : sal_uInt16 nPrefixKey,
2537 : const OUString& rLName,
2538 : bool bIWSOutside,
2539 : bool bIWSInside )
2540 : : mrExport( rExp )
2541 : , maElementName()
2542 : , mbIgnoreWhitespaceInside( bIWSInside )
2543 0 : , mbDoSomething( true )
2544 : {
2545 0 : StartElement( nPrefixKey, rLName, bIWSOutside );
2546 0 : }
2547 :
2548 0 : SvXMLElementExport::SvXMLElementExport(
2549 : SvXMLExport& rExp,
2550 : sal_uInt16 nPrefixKey,
2551 : enum XMLTokenEnum eLName,
2552 : bool bIWSOutside,
2553 : bool bIWSInside )
2554 : : mrExport( rExp )
2555 : , maElementName()
2556 : , mbIgnoreWhitespaceInside( bIWSInside )
2557 0 : , mbDoSomething( true )
2558 : {
2559 0 : StartElement( nPrefixKey, GetXMLToken(eLName), bIWSOutside );
2560 0 : }
2561 :
2562 0 : SvXMLElementExport::SvXMLElementExport(
2563 : SvXMLExport& rExp,
2564 : bool bDoSth,
2565 : sal_uInt16 nPrefixKey,
2566 : enum XMLTokenEnum eLName,
2567 : bool bIWSOutside,
2568 : bool bIWSInside )
2569 : : mrExport( rExp )
2570 : , maElementName()
2571 : , mbIgnoreWhitespaceInside( bIWSInside )
2572 0 : , mbDoSomething( bDoSth )
2573 : {
2574 0 : if ( mbDoSomething )
2575 0 : StartElement( nPrefixKey, GetXMLToken( eLName ), bIWSOutside );
2576 0 : }
2577 :
2578 0 : SvXMLElementExport::SvXMLElementExport(
2579 : SvXMLExport& rExp,
2580 : const OUString& rQName,
2581 : bool bIWSOutside,
2582 : bool bIWSInside )
2583 : : mrExport( rExp )
2584 : , maElementName()
2585 : , mbIgnoreWhitespaceInside( bIWSInside )
2586 0 : , mbDoSomething( true )
2587 : {
2588 0 : maElementName = rQName;
2589 0 : rExp.StartElement( rQName, bIWSOutside );
2590 0 : }
2591 :
2592 0 : SvXMLElementExport::~SvXMLElementExport()
2593 : {
2594 0 : if ( mbDoSomething )
2595 : {
2596 0 : mrExport.EndElement( maElementName, mbIgnoreWhitespaceInside );
2597 : }
2598 0 : }
2599 :
2600 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|