LCOV - code coverage report
Current view: top level - xmloff/source/core - xmlexp.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 984 1201 81.9 %
Date: 2015-06-13 12:38:46 Functions: 105 119 88.2 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11