1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_XMLOFF_XMLEXP_HXX
21 #define INCLUDED_XMLOFF_XMLEXP_HXX
22 
23 #include <sal/config.h>
24 #include <xmloff/dllapi.h>
25 #include <sal/types.h>
26 
27 #include <com/sun/star/lang/XUnoTunnel.hpp>
28 #include <rtl/ustring.hxx>
29 #include <xmloff/attrlist.hxx>
30 #include <xmloff/txtparae.hxx>
31 #include <xmloff/formlayerexport.hxx>
32 #include <xmloff/xmlnumfe.hxx>
33 #include <xmloff/xmlaustp.hxx>
34 #include <xmloff/shapeexport.hxx>
35 #include <xmloff/xmltoken.hxx>
36 #include <xmloff/SchXMLExportHelper.hxx>
37 #include <xmloff/XMLFontAutoStylePool.hxx>
38 #include <xmloff/xmluconv.hxx>
39 #include <com/sun/star/document/XFilter.hpp>
40 #include <com/sun/star/lang/XServiceInfo.hpp>
41 #include <com/sun/star/document/XExporter.hpp>
42 #include <com/sun/star/lang/XInitialization.hpp>
43 #include <com/sun/star/container/XNamed.hpp>
44 
45 #include <unotools/saveopt.hxx>
46 
47 #include <xmloff/XMLPageExport.hxx>
48 #include <comphelper/servicehelper.hxx>
49 #include <cppuhelper/implbase.hxx>
50 #include <tools/fldunit.hxx>
51 #include <vcl/errcode.hxx>
52 
53 #include <vector>
54 #include <memory>
55 #include <o3tl/typed_flags_set.hxx>
56 
57 namespace com { namespace sun { namespace star { namespace beans { class XPropertySet; } } } }
58 namespace com { namespace sun { namespace star { namespace document { class XEmbeddedObjectResolver; } } } }
59 namespace com { namespace sun { namespace star { namespace document { class XGraphicStorageHandler; } } } }
60 namespace com { namespace sun { namespace star { namespace embed { class XStorage; } } } }
61 namespace com { namespace sun { namespace star { namespace graphic { class XGraphic; } } } }
62 namespace com { namespace sun { namespace star { namespace lang { class XEventListener; } } } }
63 namespace com { namespace sun { namespace star { namespace task { class XStatusIndicator; } } } }
64 namespace com { namespace sun { namespace star { namespace uno { class XComponentContext; } } } }
65 namespace com { namespace sun { namespace star { namespace util { class XNumberFormatsSupplier; } } } }
66 namespace com { namespace sun { namespace star { namespace xml { namespace sax { class XAttributeList; } } } } }
67 namespace com { namespace sun { namespace star { namespace xml { namespace sax { class XDocumentHandler; } } } } }
68 namespace com { namespace sun { namespace star { namespace xml { namespace sax { class XExtendedDocumentHandler; } } } } }
69 namespace com { namespace sun { namespace star { namespace xml { namespace sax { class XLocator; } } } } }
70 
71 class SvXMLNamespaceMap;
72 class SvXMLExport_Impl;
73 class ProgressBarHelper;
74 class XMLEventExport;
75 class XMLImageMapExport;
76 class XMLErrors;
77 class LanguageTag;
78 enum class SvXMLErrorFlags;
79 
80 // Shapes in Writer cannot be named via context menu (#i51726#)
81 #include <unotools/moduleoptions.hxx>
82 
83 namespace com { namespace sun { namespace star {
84     namespace frame { class XModel; }
85     namespace lang { struct Locale; }
86 } } }
87 namespace comphelper { class UnoInterfaceToUniqueIdentifierMapper; }
88 
89 enum class SvXMLExportFlags {
90     NONE                     = 0,
91     META                     = 0x0001,
92     STYLES                   = 0x0002,
93     MASTERSTYLES             = 0x0004,
94     AUTOSTYLES               = 0x0008,
95     CONTENT                  = 0x0010,
96     SCRIPTS                  = 0x0020,
97     SETTINGS                 = 0x0040,
98     FONTDECLS                = 0x0080,
99     EMBEDDED                 = 0x0100,
100     PRETTY                   = 0x0400,
101     SAVEBACKWARDCOMPATIBLE   = 0x0800,
102     OASIS                    = 0x8000,
103     ALL                      = 0x0dff
104 };
105 namespace o3tl
106 {
107     template<> struct typed_flags<SvXMLExportFlags> : is_typed_flags<SvXMLExportFlags, 0x8dff> {};
108 }
109 
110 class XMLOFF_DLLPUBLIC SvXMLExport : public cppu::WeakImplHelper<
111              css::document::XFilter,
112              css::lang::XServiceInfo,
113              css::document::XExporter,
114              css::lang::XInitialization,
115              css::container::XNamed,
116              css::lang::XUnoTunnel>
117 {
118     std::unique_ptr<SvXMLExport_Impl>            mpImpl;            // dummy
119 
120     css::uno::Reference< css::uno::XComponentContext > m_xContext;
121     OUString const m_implementationName;
122 
123     css::uno::Reference< css::frame::XModel > mxModel;
124     css::uno::Reference< css::xml::sax::XDocumentHandler >            mxHandler;      // the handlers
125     css::uno::Reference< css::xml::sax::XExtendedDocumentHandler >    mxExtHandler;
126     css::uno::Reference< css::util::XNumberFormatsSupplier > mxNumberFormatsSupplier;
127     css::uno::Reference< css::document::XGraphicStorageHandler > mxGraphicStorageHandler;
128     css::uno::Reference< css::document::XEmbeddedObjectResolver > mxEmbeddedResolver;
129     css::uno::Reference< css::task::XStatusIndicator > mxStatusIndicator;
130     css::uno::Reference< css::beans::XPropertySet > mxExportInfo;
131     css::uno::Reference< css::lang::XEventListener > mxEventListener;
132 
133     rtl::Reference<SvXMLAttributeList>          mxAttrList;        // a common attribute list
134 
135     OUString     msOrigFileName; // the original URL
136     OUString     msFilterName;
137     OUString     msImgFilterName;
138     std::unique_ptr<SvXMLNamespaceMap> mpNamespaceMap;    // the namepspace map
139     SvXMLUnitConverter          maUnitConv;        // the unit converter
140     std::unique_ptr<SvXMLNumFmtExport> mpNumExport;
141     std::unique_ptr<ProgressBarHelper> mpProgressBarHelper;
142 
143     rtl::Reference< XMLTextParagraphExport > mxTextParagraphExport;
144     rtl::Reference< XMLShapeExport > mxShapeExport;
145     rtl::Reference< SvXMLAutoStylePoolP > mxAutoStylePool;
146     rtl::Reference< SchXMLExportHelper > mxChartExport;
147     rtl::Reference< XMLPageExport > mxPageExport;
148     rtl::Reference< XMLFontAutoStylePool > mxFontAutoStylePool;
149     rtl::Reference< xmloff::OFormLayerXMLExport > mxFormExport;
150     std::unique_ptr<XMLEventExport> mpEventExport;
151     std::unique_ptr<XMLImageMapExport> mpImageMapExport;
152     std::unique_ptr<XMLErrors>  mpXMLErrors;
153 
154     const enum ::xmloff::token::XMLTokenEnum meClass;
155     SAL_DLLPRIVATE void InitCtor_();
156 
157     SvXMLExportFlags  mnExportFlags;
158     SvXMLErrorFlags   mnErrorFlags;
159 
160     const OUString               msWS;           // " "
161 
162     // Shapes in Writer cannot be named via context menu (#i51726#)
163     SvtModuleOptions::EFactory meModelType;
164     SAL_DLLPRIVATE void DetermineModelType_();
165 
166     SAL_DLLPRIVATE void ImplExportMeta(); // <office:meta>
167     SAL_DLLPRIVATE void ImplExportSettings(); // <office:settings>
168     SAL_DLLPRIVATE void ImplExportStyles(); // <office:styles>
169     SAL_DLLPRIVATE void ImplExportAutoStyles();
170         // <office:automatic-styles>
171     SAL_DLLPRIVATE void ImplExportMasterStyles();
172         // <office:master-styles>
173     SAL_DLLPRIVATE void ImplExportContent(); // <office:body>
174     virtual void SetBodyAttributes();
175     void GetViewSettingsAndViews(css::uno::Sequence<css::beans::PropertyValue>& rProps);
176 
177 protected:
setExportFlags(SvXMLExportFlags nExportFlags)178     void setExportFlags( SvXMLExportFlags nExportFlags ) { mnExportFlags = nExportFlags; }
179 
180     // Get (modifiable) namespace map
GetNamespaceMap_()181     SvXMLNamespaceMap& GetNamespaceMap_() { return *mpNamespaceMap; }
182 
183     // get a new namespave map (used in starmath to have a default namespace)
184     void ResetNamespaceMap();
185 
186     /// Override this method to export the content of <office:meta>.
187     /// There is a default implementation.
188     virtual void ExportMeta_();
189 
190     /// Override this method to export the content of <office:scripts>.
191     /// There is a default implementation.
192     virtual void ExportScripts_();
193 
194     /// Override this method to export the font declarations
195     /// The default implementation will export the contents of the
196     /// XMLFontAutoStylePool if it has been created.
197     virtual void ExportFontDecls_();
198 
199     /// Override this method to export the content of <style:styles>.
200     /// If bUsed is set, used styles should be exported only.
201     /// Overriding Methods must call this method !
202     virtual void ExportStyles_( bool bUsed );
203 
204     /// Override this method to export the contents of <style:auto-styles>.
205     virtual void ExportAutoStyles_() = 0;
206 
207     /// Override this method to export the contents of <style:master-styles>.
208     virtual void ExportMasterStyles_() = 0;
209 
210     /// Override this method to export the content of <office:body>.
211     virtual void ExportContent_() = 0;
212 
213     OUString const & GetSourceShellID() const;
214     OUString const & GetDestinationShellID() const;
215 
216     // save linked sections? (may be false in global documents)
217     bool mbSaveLinkedSections;
218 
219     virtual XMLTextParagraphExport* CreateTextParagraphExport();
220     virtual XMLShapeExport* CreateShapeExport();
221     virtual SvXMLAutoStylePoolP* CreateAutoStylePool();
222     SchXMLExportHelper* CreateChartExport();
223     virtual XMLPageExport* CreatePageExport();
224     virtual XMLFontAutoStylePool* CreateFontAutoStylePool();
225     xmloff::OFormLayerXMLExport* CreateFormExport();
226     virtual void GetViewSettings(css::uno::Sequence<css::beans::PropertyValue>& aProps);
227     virtual void GetConfigurationSettings(css::uno::Sequence<css::beans::PropertyValue>& aProps);
228 
229     struct SettingsGroup
230     {
231         ::xmloff::token::XMLTokenEnum const                     eGroupName;
232         css::uno::Sequence< css::beans::PropertyValue > const   aSettings;
233 
SettingsGroupSvXMLExport::SettingsGroup234         SettingsGroup(
235                 const ::xmloff::token::XMLTokenEnum _eGroupName,
236                 const css::uno::Sequence< css::beans::PropertyValue >& _rSettings )
237             :eGroupName( _eGroupName )
238             ,aSettings( _rSettings )
239         {
240         }
241     };
242     /** returns the current document settings
243 
244         The default implementation will obtain the view settings by calling GetViewSettingsAndViews, and the
245         configuration settings by calling GetConfigurationSettings, and return them together with the proper XML token.
246 
247         @return
248             the accumulated count of all settings in all groups
249     */
250     virtual sal_Int32 GetDocumentSpecificSettings( ::std::vector< SettingsGroup >& _out_rSettings );
251 
GetEmbeddedResolver() const252     const css::uno::Reference< css::document::XEmbeddedObjectResolver >& GetEmbeddedResolver() const { return mxEmbeddedResolver; }
253     inline void SetEmbeddedResolver( css::uno::Reference< css::document::XEmbeddedObjectResolver > const & _xEmbeddedResolver );
254 
GetGraphicStorageHandler() const255     const css::uno::Reference<css::document::XGraphicStorageHandler> & GetGraphicStorageHandler() const
256     {
257         return mxGraphicStorageHandler;
258     }
259     void SetGraphicStorageHandler(css::uno::Reference<css::document::XGraphicStorageHandler> const & rxGraphicStorageHandler);
260 
261     void SetDocHandler( const css::uno::Reference< css::xml::sax::XDocumentHandler > &rHandler );
262 
263     bool mbAutoStylesCollected;
264 public:
265 
266     SvXMLExport(
267         sal_Int16 const eDefaultMeasureUnit /*css::util::MeasureUnit*/,
268         const css::uno::Reference< css::uno::XComponentContext >& xContext,
269         OUString const & implementationName,
270         const enum ::xmloff::token::XMLTokenEnum eClass,
271         SvXMLExportFlags nExportFlag );
272 
273     SvXMLExport(
274         const css::uno::Reference< css::uno::XComponentContext >& xContext,
275         OUString const & implementationName,
276         const OUString& rFileName,
277         sal_Int16 const eDefaultMeasureUnit /*css::util::MeasureUnit*/,
278         const css::uno::Reference< css::xml::sax::XDocumentHandler > & rHandler);
279 
280     SvXMLExport(
281         const css::uno::Reference< css::uno::XComponentContext >& xContext,
282         OUString const & implementationName,
283         const OUString& rFileName,
284         const css::uno::Reference< css::xml::sax::XDocumentHandler > & rHandler,
285         const css::uno::Reference< css::frame::XModel > &,
286         FieldUnit const eDefaultFieldUnit,
287         SvXMLExportFlags nExportFlag );
288 
289     virtual ~SvXMLExport() override;
290 
291     virtual void collectAutoStyles();
292 
293     // XExporter
294     virtual void SAL_CALL setSourceDocument( const css::uno::Reference< css::lang::XComponent >& xDoc ) override;
295 
296     // XFilter
297     virtual sal_Bool SAL_CALL filter( const css::uno::Sequence< css::beans::PropertyValue >& aDescriptor ) override;
298     virtual void SAL_CALL cancel() override;
299 
300     // XInitialization
301     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
302 
303     // XNamed
304     virtual OUString SAL_CALL getName(  ) override;
305     virtual void SAL_CALL setName( const OUString& aName ) override;
306 
307     // XServiceInfo
308     virtual OUString SAL_CALL getImplementationName(  ) final override;
309     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) final override;
310     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames(  ) final override;
311 
312     // XUnoTunnel
313     UNO3_GETIMPLEMENTATION_DECL(SvXMLExport)
314 
315     /** ensures that the given namespace is in scope at the next started
316         element.
317 
318         <p>If the namespace is not yet declared, the necessary attribute will
319         be added, as well.</p>
320 
321         @param i_rNamespace         the namespace to be declared
322 
323         @returns the actual prefix that the namespace is associated with
324       */
325     OUString EnsureNamespace(OUString const & i_rNamespace );
326 
327     // Check if common attribute list is empty.
328 #ifndef DBG_UTIL
CheckAttrList()329     void CheckAttrList() { (void) this; /* avoid loplugin:staticmethods */ }
330 #else
331     void CheckAttrList();
332 #endif
333 
334     // Clear common attribute list.
335     void ClearAttrList();
336 
337     // Add an attribute to the common attribute list.
338     void AddAttributeASCII( sal_uInt16 nPrefix, const sal_Char *pName,
339                             const sal_Char *pValue );
340     void AddAttribute( sal_uInt16 nPrefix, const sal_Char *pName,
341                        const OUString& rValue );
342     void AddAttribute( sal_uInt16 nPrefix, const OUString& rName,
343                        const OUString& rValue );
344     void AddAttribute( sal_uInt16 nPrefix,
345                        enum ::xmloff::token::XMLTokenEnum eName,
346                        const OUString& rValue );
347     void AddAttribute( sal_uInt16 nPrefix,
348                        enum ::xmloff::token::XMLTokenEnum eName,
349                        enum ::xmloff::token::XMLTokenEnum eValue );
350     void AddAttribute( const OUString& rQName,
351                        const OUString& rValue );
352     void AddAttribute( const OUString& rQName,
353                        enum ::xmloff::token::XMLTokenEnum eValue );
354 
355     /** Add language tag attributes, deciding which are necessary.
356 
357         @param  nPrefix
358                 Namespace prefix for *:language, *:script and *:country
359 
360         @param  nPrefixRfc
361                 Namespace prefix for *:rfc-language-tag
362 
363         @param  bWriteEmpty
364                 Whether to write empty *:language and *:country attribute
365                 values in case of an empty locale (denoting system).
366      */
367     void AddLanguageTagAttributes( sal_uInt16 nPrefix, sal_uInt16 nPrefixRfc,
368             const css::lang::Locale& rLocale, bool bWriteEmpty);
369 
370     /** Same as AddLanguageTagAttributes() but with LanguageTag parameter
371         instead of Locale.
372      */
373     void AddLanguageTagAttributes( sal_uInt16 nPrefix, sal_uInt16 nPrefixRfc,
374             const LanguageTag& rLanguageTag, bool bWriteEmpty );
375 
376     // add several attributes to the common attribute list
377     void AddAttributeList( const css::uno::Reference<
378                                   css::xml::sax::XAttributeList >& xAttrList );
379 
380     // Get common attribute list as implementation or interface.
GetAttrList()381     SvXMLAttributeList &GetAttrList() { return *mxAttrList; }
GetXAttrList()382     css::uno::Reference< css::xml::sax::XAttributeList > GetXAttrList() { return mxAttrList.get(); }
383 
384     // Get document handler. This methods are not const, because the
385     // reference allows modifications through the handler.
GetDocHandler() const386     const css::uno::Reference< css::xml::sax::XDocumentHandler > & GetDocHandler() const { return mxHandler; }
387 
388     // Get original URL.
GetOrigFileName() const389     const OUString& GetOrigFileName() const { return msOrigFileName; }
390 
391     // Get (const) namespace map.
GetNamespaceMap() const392     const SvXMLNamespaceMap& GetNamespaceMap() const { return *mpNamespaceMap; }
393 
394     // Get unit converter
GetMM100UnitConverter() const395     const SvXMLUnitConverter& GetMM100UnitConverter() const { return maUnitConv; }
396 
GetMM100UnitConverter()397     SvXMLUnitConverter& GetMM100UnitConverter() { return maUnitConv; }
398 
399     void addChaffWhenEncryptedStorage();
400 
401     // Export the document.
402     virtual ErrCode exportDoc( enum ::xmloff::token::XMLTokenEnum eClass = ::xmloff::token::XML_TOKEN_INVALID );
403 
404     void collectDataStyles(bool bFromUsedStyles);
405     virtual void addDataStyle(const sal_Int32 nNumberFormat, bool bTimeFormat = false );
406     virtual void exportDataStyles();
407     virtual void exportAutoDataStyles();
408     virtual OUString getDataStyleName(const sal_Int32 nNumberFormat, bool bTimeFormat = false ) const;
409     sal_Int32 dataStyleForceSystemLanguage(sal_Int32 nFormat) const;
410 
411     virtual void exportAnnotationMeta( const css::uno::Reference < css::drawing::XShape >& xShape);
412 
413     // Get XModel
414     const css::uno::Reference< css::frame::XModel > &
GetModel() const415                GetModel() const { return mxModel; }
416     // Get XNumberFormatsSupplier
GetNumberFormatsSupplier()417     css::uno::Reference< css::util::XNumberFormatsSupplier > & GetNumberFormatsSupplier() { return mxNumberFormatsSupplier; }
SetNumberFormatsSupplier(const css::uno::Reference<css::util::XNumberFormatsSupplier> & _xNumberFormatSupplier)418     void SetNumberFormatsSupplier(const css::uno::Reference< css::util::XNumberFormatsSupplier >& _xNumberFormatSupplier)
419     {
420         mxNumberFormatsSupplier = _xNumberFormatSupplier;
421         if ( mxNumberFormatsSupplier.is() && mxHandler.is() )
422             mpNumExport.reset( new SvXMLNumFmtExport(*this, mxNumberFormatsSupplier) );
423     }
424 
425     // get export helper for text
426     inline rtl::Reference< XMLTextParagraphExport > const & GetTextParagraphExport();
427 
428     // get export helper for shapes
429     inline rtl::Reference< XMLShapeExport > const & GetShapeExport();
430 
431     // get auto style pool
432     inline rtl::Reference< SvXMLAutoStylePoolP > const & GetAutoStylePool();
433 
434     // get Page Export
435     inline rtl::Reference< XMLPageExport > const & GetPageExport();
436 
437     // get chart export helper
438     inline rtl::Reference< SchXMLExportHelper > const & GetChartExport();
439 
440     // get font auto style pool
441     inline rtl::Reference< XMLFontAutoStylePool > const & GetFontAutoStylePool();
442 
443     ProgressBarHelper*  GetProgressBarHelper();
444 
445     // get Formlayer Export
446     inline rtl::Reference< xmloff::OFormLayerXMLExport > const & GetFormExport();
447     inline bool HasFormExport() const;
448 
449     // get XPropertySet with export information
getExportInfo() const450     const css::uno::Reference< css::beans::XPropertySet >& getExportInfo() const { return mxExportInfo; }
451 
GetStatusIndicator() const452     const css::uno::Reference< css::task::XStatusIndicator >& GetStatusIndicator() const { return mxStatusIndicator; }
453 
454     /// get Event export, with handlers for script types "None" and
455     /// "StarBasic" already registered; other handlers may be registered, too.
456     XMLEventExport& GetEventExport();
457 
458     /// get the export for image maps
459     XMLImageMapExport& GetImageMapExport();
460 
461     OUString AddEmbeddedXGraphic(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic, OUString & rOutMimeType, OUString const & rRequestedName = OUString());
462     bool AddEmbeddedXGraphicAsBase64(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic);
463     bool GetGraphicMimeTypeFromStream(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic, OUString & rOutMimeType);
464 
465     OUString AddEmbeddedObject(
466                             const OUString& rEmbeddedObjectURL );
467     bool AddEmbeddedObjectAsBase64(
468                             const OUString& rEmbeddedObjectURL );
469 
470     OUString EncodeStyleName( const OUString& rName,
471                                      bool *pEncoded=nullptr ) const;
472 
473     // save linked sections?
IsSaveLinkedSections() const474     bool IsSaveLinkedSections() const { return mbSaveLinkedSections; }
475 
476     // get export flags
getExportFlags() const477     SvXMLExportFlags getExportFlags() const { return mnExportFlags; }
478 
479     void ExportEmbeddedOwnObject(
480         css::uno::Reference<css::lang::XComponent > const & rComp );
481 
482     OUString GetRelativeReference(const OUString& rValue);
483 
484     // methods for accessing the document handler and handling SAX errors
485     void StartElement(sal_uInt16 nPrefix,
486                         enum ::xmloff::token::XMLTokenEnum eName,
487                         bool bIgnWSOutside );
488     void StartElement(const OUString& rName,
489                         bool bIgnWSOutside );
490     void Characters(const OUString& rChars);
491     void EndElement(sal_uInt16 nPrefix,
492                         enum ::xmloff::token::XMLTokenEnum eName,
493                         bool bIgnWSInside );
494     void EndElement(const OUString& rName,
495                         bool bIgnWSInside );
496     void IgnorableWhitespace();
497 
498     /**
499      * Record an error condition that occurred during export. The
500      * behavior of SetError can be modified using the error flag
501      * constants.
502      */
503     void SetError(
504         /// error ID, may contain an error flag
505         sal_Int32 nId,
506         /// string parameters for the error message
507         const css::uno::Sequence< OUString> & rMsgParams,
508         /// original exception message (if applicable)
509         const OUString& rExceptionMessage,
510         /// error location (if applicable)
511         const css::uno::Reference<css::xml::sax::XLocator> & rLocator );
512 
513     void SetError(
514         sal_Int32 nId,
515         const css::uno::Sequence< OUString> & rMsgParams);
516 
517     virtual void DisposingModel();
518 
519     ::comphelper::UnoInterfaceToUniqueIdentifierMapper& getInterfaceToIdentifierMapper();
520 
getComponentContext() const521     const css::uno::Reference< css::uno::XComponentContext >& getComponentContext() const { return m_xContext;}
522 
523     // Shapes in Writer cannot be named via context menu (#i51726#)
GetModelType() const524     SvtModuleOptions::EFactory GetModelType() const
525     {
526         return meModelType;
527     }
528 
529     // Written OpenDocument file format doesn't fit to the created text document (#i69627#)
530     bool writeOutlineStyleAsNormalListStyle() const;
531 
532     css::uno::Reference< css::embed::XStorage > const & GetTargetStorage() const;
533 
534     /// returns the currently configured default version for odf export
535     SvtSaveOptions::ODFDefaultVersion getDefaultVersion() const;
536 
537     /// returns the deterministic version for odf export
538     SvtSaveOptions::ODFSaneDefaultVersion getSaneDefaultVersion() const;
539 
540     // FIXME: this is only for legacy stuff that has not yet been adapted
541     //        to implement XMetadatable; this can write duplicate IDs!
542     /// add xml:id and legacy namespace id
543     void SAL_DLLPRIVATE AddAttributeIdLegacy(
544             sal_uInt16 const nLegacyPrefix, OUString const& rValue);
545 
546     /// add xml:id attribute (for RDF metadata)
547     void AddAttributeXmlId(css::uno::Reference<css::uno::XInterface> const & i_xIfc);
548 
549     /// add RDFa attributes for a metadatable text content
550     void AddAttributesRDFa( css::uno::Reference<css::text::XTextContent> const & i_xTextContent);
551 
552     bool exportTextNumberElement() const;
553 
554     /// set null date from model to unit converter, if not already done
555     bool SetNullDateOnUnitConverter();
556 
557     /// Get clamped mimetype for image export (empty if none)
558     OUString const & GetImageFilterName() const;
559 };
560 
GetTextParagraphExport()561 inline rtl::Reference< XMLTextParagraphExport > const & SvXMLExport::GetTextParagraphExport()
562 {
563     if( !mxTextParagraphExport.is() )
564         mxTextParagraphExport = CreateTextParagraphExport();
565 
566     return mxTextParagraphExport;
567 }
568 
GetShapeExport()569 inline rtl::Reference< XMLShapeExport > const & SvXMLExport::GetShapeExport()
570 {
571     if( !mxShapeExport.is() )
572         mxShapeExport = CreateShapeExport();
573 
574     return mxShapeExport;
575 }
576 
GetAutoStylePool()577 inline rtl::Reference< SvXMLAutoStylePoolP > const & SvXMLExport::GetAutoStylePool()
578 {
579     if( !mxAutoStylePool.is() )
580         mxAutoStylePool = CreateAutoStylePool();
581 
582     return mxAutoStylePool;
583 }
584 
GetChartExport()585 inline rtl::Reference< SchXMLExportHelper > const & SvXMLExport::GetChartExport()
586 {
587     if( !mxChartExport.is() )
588         mxChartExport = CreateChartExport();
589 
590     return mxChartExport;
591 }
592 
GetPageExport()593 inline rtl::Reference< XMLPageExport > const & SvXMLExport::GetPageExport()
594 {
595     if( !mxPageExport.is() )
596         mxPageExport = CreatePageExport();
597 
598     return mxPageExport;
599 }
600 
GetFontAutoStylePool()601 inline rtl::Reference< XMLFontAutoStylePool > const & SvXMLExport::GetFontAutoStylePool()
602 {
603     if( !mxFontAutoStylePool.is() )
604         mxFontAutoStylePool = CreateFontAutoStylePool();
605 
606     return mxFontAutoStylePool;
607 }
608 
GetFormExport()609 inline rtl::Reference< xmloff::OFormLayerXMLExport > const & SvXMLExport::GetFormExport()
610 {
611     if( !mxFormExport.is() )
612         mxFormExport = CreateFormExport();
613 
614     return mxFormExport;
615 }
616 
HasFormExport() const617 inline bool SvXMLExport::HasFormExport() const
618 {
619     return mxFormExport.is();
620 }
621 
SetEmbeddedResolver(css::uno::Reference<css::document::XEmbeddedObjectResolver> const & _xEmbeddedResolver)622 inline void SvXMLExport::SetEmbeddedResolver(
623     css::uno::Reference< css::document::XEmbeddedObjectResolver > const & _xEmbeddedResolver )
624 {
625     mxEmbeddedResolver = _xEmbeddedResolver;
626 }
627 
SetGraphicStorageHandler(css::uno::Reference<css::document::XGraphicStorageHandler> const & rxGraphicStorageHandler)628 inline void SvXMLExport::SetGraphicStorageHandler(
629     css::uno::Reference<css::document::XGraphicStorageHandler> const & rxGraphicStorageHandler)
630 {
631     mxGraphicStorageHandler = rxGraphicStorageHandler;
632 }
633 
634 // Helper class to export an element.
635 class XMLOFF_DLLPUBLIC SvXMLElementExport
636 {
637     SvXMLExport& mrExport;
638     OUString maElementName;
639     const bool mbIgnoreWhitespaceInside :1;
640     const bool mbDoSomething :1;
641 
642     SAL_DLLPRIVATE
643     void StartElement(
644         const sal_uInt16 nPrefix,
645         const OUString& rName,
646         const bool bIgnoreWhitespaceOutside );
647 
648 public:
649 
650     // The constructor prints a start tag that has the common attributes
651     // of the XMLExport instance attached.
652     SvXMLElementExport( SvXMLExport& rExp, sal_uInt16 nPrefix,
653                         const sal_Char *pName,
654                         bool bIgnWSOutside, bool bIgnWSInside );
655     SvXMLElementExport( SvXMLExport& rExp, sal_uInt16 nPrefix,
656                         const OUString& rName,
657                         bool bIgnWSOutside, bool bIgnWSInside );
658     SvXMLElementExport( SvXMLExport& rExp, sal_uInt16 nPrefix,
659                         enum ::xmloff::token::XMLTokenEnum eName,
660                         bool bIgnWSOutside, bool bIgnWSInside );
661     SvXMLElementExport( SvXMLExport& rExp, const OUString& rQName,
662                         bool bIgnWSOutside, bool bIgnWSInside );
663 
664     // These constructors do nothing if bDoSomething is not set
665     SvXMLElementExport( SvXMLExport& rExp, bool bDoSomething,
666                         sal_uInt16 nPrefix,
667                         enum ::xmloff::token::XMLTokenEnum eName,
668                         bool bIgnWSOutside, bool bIgnWSInside );
669 
670     // The destructor prints an end tag.
671     ~SvXMLElementExport();
672 };
673 
674 #endif  //  _XMLOFF_SVXMLEXP_HXX
675 
676 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
677