LCOV - code coverage report
Current view: top level - libreoffice/xmloff/source/core - DocumentSettingsContext.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 302 407 74.2 %
Date: 2012-12-27 Functions: 38 43 88.4 %
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 <officecfg/Office/Common.hxx>
      23             : #include <sax/tools/converter.hxx>
      24             : 
      25             : #include <com/sun/star/util/PathSubstitution.hpp>
      26             : #include <com/sun/star/util/XStringSubstitution.hpp>
      27             : #include <xmloff/DocumentSettingsContext.hxx>
      28             : #include <xmloff/xmlimp.hxx>
      29             : #include <xmloff/xmltoken.hxx>
      30             : #include "xmloff/xmlnmspe.hxx"
      31             : #include <xmloff/nmspmap.hxx>
      32             : #include <xmloff/xmluconv.hxx>
      33             : #include <tools/debug.hxx>
      34             : #include <comphelper/processfactory.hxx>
      35             : 
      36             : #include <list>
      37             : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
      38             : #include <com/sun/star/container/XIndexContainer.hpp>
      39             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      40             : #include <com/sun/star/formula/SymbolDescriptor.hpp>
      41             : #include <com/sun/star/util/DateTime.hpp>
      42             : #include <com/sun/star/document/XViewDataSupplier.hpp>
      43             : #include <com/sun/star/document/PrinterIndependentLayout.hpp>
      44             : #include <rtl/ustrbuf.hxx>
      45             : #include <xmlenums.hxx>
      46             : 
      47             : using namespace com::sun::star;
      48             : using namespace ::xmloff::token;
      49             : 
      50             : class XMLMyList
      51             : {
      52             :     std::list<beans::PropertyValue> aProps;
      53             :     sal_uInt32                      nCount;
      54             : 
      55             :     // #110680#
      56             :     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory;
      57             : 
      58             : public:
      59             :     // #110680#
      60             :     XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory);
      61             :     ~XMLMyList();
      62             : 
      63        3578 :     void push_back(beans::PropertyValue& aProp) { aProps.push_back(aProp); nCount++; }
      64             :     uno::Sequence<beans::PropertyValue> GetSequence();
      65             :     uno::Reference<container::XNameContainer> GetNameContainer();
      66             :     uno::Reference<container::XIndexContainer> GetIndexContainer();
      67             : };
      68             : 
      69             : // #110680#
      70         233 : XMLMyList::XMLMyList(const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory)
      71             : :   nCount(0),
      72         233 :     mxServiceFactory(xServiceFactory)
      73             : {
      74             :     DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
      75         233 : }
      76             : 
      77             : // #110680#
      78         233 : XMLMyList::~XMLMyList()
      79             : {
      80         233 : }
      81             : 
      82         169 : uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
      83             : {
      84         169 :     uno::Sequence<beans::PropertyValue> aSeq;
      85         169 :     if(nCount)
      86             :     {
      87             :         DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue");
      88         169 :         aSeq.realloc(nCount);
      89         169 :         beans::PropertyValue* pProps = aSeq.getArray();
      90         169 :         std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
      91        3831 :         while (aItr != aProps.end())
      92             :         {
      93        3493 :             *pProps = *aItr;
      94        3493 :             ++pProps;
      95        3493 :             ++aItr;
      96             :         }
      97             :     }
      98         169 :     return aSeq;
      99             : }
     100             : 
     101          20 : uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
     102             : {
     103          20 :     uno::Reference<container::XNameContainer> xNameContainer;
     104             : 
     105             :     // #110680#
     106             : 
     107          20 :     if( mxServiceFactory.is() )
     108             :     {
     109          20 :         rtl::OUString sName("com.sun.star.document.NamedPropertyValues");
     110          20 :         xNameContainer = uno::Reference<container::XNameContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY);
     111          20 :         if (xNameContainer.is())
     112             :         {
     113          20 :             std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
     114          79 :             while (aItr != aProps.end())
     115             :             {
     116          39 :                 xNameContainer->insertByName(aItr->Name, aItr->Value);
     117          39 :                 ++aItr;
     118             :             }
     119          20 :         }
     120             :     }
     121          20 :     return xNameContainer;
     122             : }
     123             : 
     124          44 : uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
     125             : {
     126          44 :     uno::Reference<container::XIndexContainer> xIndexContainer;
     127             :     // #110680#
     128             : 
     129          44 :     if( mxServiceFactory.is() )
     130             :     {
     131          44 :         rtl::OUString sName("com.sun.star.document.IndexedPropertyValues");
     132          44 :         xIndexContainer = uno::Reference<container::XIndexContainer>(mxServiceFactory->createInstance(sName), uno::UNO_QUERY);
     133          44 :         if (xIndexContainer.is())
     134             :         {
     135          44 :             std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
     136          44 :             sal_uInt32 i(0);
     137         134 :             while (aItr != aProps.end())
     138             :             {
     139          46 :                 xIndexContainer->insertByIndex(i, aItr->Value);
     140          46 :                 ++aItr;
     141          46 :                 ++i;
     142             :             }
     143          44 :         }
     144             :     }
     145          44 :     return xIndexContainer;
     146             : }
     147             : 
     148             : //=============================================================================
     149             : 
     150             : class XMLConfigBaseContext : public SvXMLImportContext
     151             : {
     152             : protected:
     153             :     XMLMyList                   maProps;
     154             :     beans::PropertyValue        maProp;
     155             :     com::sun::star::uno::Any&   mrAny;
     156             :     XMLConfigBaseContext*       mpBaseContext;
     157             : public:
     158             :     XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     159             :                                     com::sun::star::uno::Any& rAny,
     160             :                                     XMLConfigBaseContext* pBaseContext);
     161             :     virtual ~XMLConfigBaseContext();
     162             : 
     163        3578 :     void AddPropertyValue() { maProps.push_back(maProp); }
     164             : };
     165             : 
     166             : //=============================================================================
     167             : 
     168             : class XMLConfigItemContext : public SvXMLImportContext
     169             : {
     170             :     rtl::OUString               msType;
     171             :     rtl::OUString               msValue;
     172             :     uno::Sequence<sal_Int8>     maDecoded;
     173             :     com::sun::star::uno::Any&   mrAny;
     174             :     const rtl::OUString         mrItemName;
     175             :     XMLConfigBaseContext*       mpBaseContext;
     176             : 
     177             : public:
     178             :     XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     179             :                                     const ::com::sun::star::uno::Reference<
     180             :                                     ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
     181             :                                     com::sun::star::uno::Any& rAny,
     182             :                                     const rtl::OUString& rItemName,
     183             :                                     XMLConfigBaseContext* pBaseContext);
     184             :     virtual ~XMLConfigItemContext();
     185             : 
     186             :     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
     187             :                                                     const rtl::OUString& rLocalName,
     188             :                                                     const ::com::sun::star::uno::Reference<
     189             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
     190             :     virtual void Characters( const ::rtl::OUString& rChars );
     191             : 
     192             :     virtual void EndElement();
     193             : 
     194             :     virtual void ManipulateConfigItem();
     195             : };
     196             : 
     197             : //=============================================================================
     198             : 
     199             : class XMLConfigItemSetContext : public XMLConfigBaseContext
     200             : {
     201             : public:
     202             :     XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     203             :                                     const ::com::sun::star::uno::Reference<
     204             :                                     ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
     205             :                                     com::sun::star::uno::Any& rAny,
     206             :                                     XMLConfigBaseContext* pBaseContext);
     207             :     virtual ~XMLConfigItemSetContext();
     208             : 
     209             :     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
     210             :                                                     const rtl::OUString& rLocalName,
     211             :                                                     const ::com::sun::star::uno::Reference<
     212             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
     213             : 
     214             :     virtual void EndElement();
     215             : };
     216             : 
     217             : //=============================================================================
     218             : 
     219             : class XMLConfigItemMapNamedContext : public XMLConfigBaseContext
     220             : {
     221             : public:
     222             :     XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     223             :                                     const ::com::sun::star::uno::Reference<
     224             :                                     ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
     225             :                                     com::sun::star::uno::Any& rAny,
     226             :                                     XMLConfigBaseContext* pBaseContext);
     227             :     virtual ~XMLConfigItemMapNamedContext();
     228             : 
     229             :     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
     230             :                                                     const rtl::OUString& rLocalName,
     231             :                                                     const ::com::sun::star::uno::Reference<
     232             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
     233             : 
     234             :     virtual void EndElement();
     235             : };
     236             : 
     237             : //=============================================================================
     238             : 
     239             : class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext
     240             : {
     241             : private:
     242             :     rtl::OUString maConfigItemName;
     243             : 
     244             : public:
     245             :     XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
     246             :                                     const rtl::OUString& rLName,
     247             :                                     const ::com::sun::star::uno::Reference<
     248             :                                     ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
     249             :                                     com::sun::star::uno::Any& rAny,
     250             :                                     const rtl::OUString& rConfigItemName,
     251             :                                     XMLConfigBaseContext* pBaseContext);
     252             :     virtual ~XMLConfigItemMapIndexedContext();
     253             : 
     254             :     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
     255             :                                                     const rtl::OUString& rLocalName,
     256             :                                                     const ::com::sun::star::uno::Reference<
     257             :                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList );
     258             : 
     259             :     virtual void EndElement();
     260             : };
     261             : 
     262             : //=============================================================================
     263             : 
     264        3578 : SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_uInt16 p_nPrefix,
     265             :                         const rtl::OUString& rLocalName,
     266             :                         const uno::Reference<xml::sax::XAttributeList>& xAttrList,
     267             :                         beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext)
     268             : {
     269        3578 :     SvXMLImportContext *pContext = 0;
     270             : 
     271        3578 :     rProp.Name = rtl::OUString();
     272        3578 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     273       10539 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     274             :     {
     275        6961 :         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
     276        6961 :         rtl::OUString aLocalName;
     277        6961 :         sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
     278        6961 :                                             sAttrName, &aLocalName );
     279        6961 :         rtl::OUString sValue = xAttrList->getValueByIndex( i );
     280             : 
     281        6961 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     282             :         {
     283        6961 :             if (IsXMLToken(aLocalName, XML_NAME))
     284        3532 :                 rProp.Name = sValue;
     285             :         }
     286        6961 :     }
     287             : 
     288        3578 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     289             :     {
     290        3578 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
     291        3429 :             pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     292         298 :         else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
     293         149 :                 (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
     294          85 :             pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     295          64 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
     296          20 :             pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     297          44 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
     298          44 :             pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     299             :     }
     300             : 
     301        3578 :     if( !pContext )
     302           0 :         pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
     303             : 
     304        3578 :     return pContext;
     305             : }
     306             : 
     307             : //=============================================================================
     308             : namespace
     309             : {
     310           0 :     struct SettingsGroup
     311             :     {
     312             :         ::rtl::OUString sGroupName;
     313             :         uno::Any        aSettings;
     314             : 
     315             :         SettingsGroup()
     316             :             :sGroupName()
     317             :             ,aSettings()
     318             :         {
     319             :         }
     320             : 
     321           0 :         SettingsGroup( const ::rtl::OUString& _rGroupName, const uno::Any& _rSettings )
     322             :             :sGroupName( _rGroupName )
     323           0 :             ,aSettings( _rSettings )
     324             :         {
     325           0 :         }
     326             :     };
     327             : }
     328             : 
     329          84 : struct XMLDocumentSettingsContext_Data
     330             : {
     331             :     com::sun::star::uno::Any        aViewProps;
     332             :     com::sun::star::uno::Any        aConfigProps;
     333             :     ::std::list< SettingsGroup >    aDocSpecificSettings;
     334             : };
     335             : 
     336             : //=============================================================================
     337             : 
     338          42 : XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     339             :                     const uno::Reference<xml::sax::XAttributeList>& )
     340             :     : SvXMLImportContext( rImport, nPrfx, rLName )
     341          42 :     , m_pData( new XMLDocumentSettingsContext_Data )
     342             : {
     343             :     // here are no attributes
     344          42 : }
     345             : 
     346          84 : XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
     347             : {
     348          84 : }
     349             : 
     350          84 : SvXMLImportContext *XMLDocumentSettingsContext::CreateChildContext( sal_uInt16 p_nPrefix,
     351             :                                      const rtl::OUString& rLocalName,
     352             :                                      const ::com::sun::star::uno::Reference<
     353             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     354             : {
     355          84 :     SvXMLImportContext *pContext = 0;
     356          84 :     rtl::OUString sName;
     357             : 
     358          84 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     359         168 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     360             :     {
     361          84 :         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
     362          84 :         rtl::OUString aLocalName;
     363          84 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     364          84 :                                             sAttrName, &aLocalName );
     365          84 :         rtl::OUString sValue = xAttrList->getValueByIndex( i );
     366             : 
     367          84 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     368             :         {
     369          84 :             if (IsXMLToken(aLocalName, XML_NAME))
     370          84 :                 sName = sValue;
     371             :         }
     372          84 :     }
     373             : 
     374          84 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     375             :     {
     376          84 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
     377             :         {
     378          84 :             ::rtl::OUString aLocalConfigName;
     379             :             sal_uInt16 nConfigPrefix =
     380          84 :                 GetImport().GetNamespaceMap().GetKeyByAttrName(
     381          84 :                                             sName, &aLocalConfigName );
     382             : 
     383          84 :             if( XML_NAMESPACE_OOO == nConfigPrefix )
     384             :             {
     385          84 :                 if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
     386          42 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     387             :                                         p_nPrefix, rLocalName, xAttrList,
     388          42 :                                         m_pData->aViewProps, NULL);
     389          42 :                 else if (IsXMLToken(aLocalConfigName,
     390          42 :                                                 XML_CONFIGURATION_SETTINGS))
     391          42 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     392             :                                         p_nPrefix, rLocalName, xAttrList,
     393          42 :                                         m_pData->aConfigProps, NULL);
     394             :                 else
     395             :                 {
     396           0 :                     m_pData->aDocSpecificSettings.push_back( SettingsGroup( aLocalConfigName, uno::Any() ) );
     397             : 
     398             :                     ::std::list< SettingsGroup >::reverse_iterator settingsPos =
     399           0 :                         m_pData->aDocSpecificSettings.rbegin();
     400             : 
     401           0 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     402             :                                         p_nPrefix, rLocalName, xAttrList,
     403           0 :                                         settingsPos->aSettings, NULL);
     404             :                 }
     405          84 :             }
     406             :         }
     407             :     }
     408             : 
     409          84 :     if( !pContext )
     410           0 :         pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
     411             : 
     412          84 :     return pContext;
     413             : }
     414             : 
     415          42 : void XMLDocumentSettingsContext::EndElement()
     416             : {
     417          42 :     uno::Sequence<beans::PropertyValue> aSeqViewProps;
     418          42 :     if (m_pData->aViewProps >>= aSeqViewProps)
     419             :     {
     420          42 :         GetImport().SetViewSettings(aSeqViewProps);
     421          42 :         sal_Int32 i(aSeqViewProps.getLength() - 1);
     422          42 :         sal_Bool bFound(sal_False);
     423         132 :         while((i >= 0) && !bFound)
     424             :         {
     425          48 :             if (aSeqViewProps[i].Name.compareToAscii("Views") == 0)
     426             :             {
     427          40 :                 bFound = sal_True;
     428          40 :                 uno::Reference<container::XIndexAccess> xIndexAccess;
     429          40 :                 if (aSeqViewProps[i].Value >>= xIndexAccess)
     430             :                 {
     431          40 :                     uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
     432          40 :                     if (xViewDataSupplier.is())
     433          40 :                         xViewDataSupplier->setViewData(xIndexAccess);
     434          40 :                 }
     435             :             }
     436             :             else
     437           8 :                 i--;
     438             :         }
     439             :     }
     440             : 
     441          42 :     uno::Sequence<beans::PropertyValue> aSeqConfigProps;
     442          42 :     if ( m_pData->aConfigProps >>= aSeqConfigProps )
     443             :     {
     444          84 :         if (!officecfg::Office::Common::Save::Document::LoadPrinter::get())
     445             :         {
     446           0 :             sal_Int32 i = aSeqConfigProps.getLength() - 1;
     447           0 :             int nFound = 0;
     448             : 
     449           0 :             while ( ( i >= 0 ) && nFound < 2 )
     450             :             {
     451           0 :                 rtl::OUString sProp( aSeqConfigProps[i].Name );
     452             : 
     453           0 :                 if ( sProp.compareToAscii("PrinterName") == 0 )
     454             :                 {
     455           0 :                     rtl::OUString sEmpty;
     456           0 :                     aSeqConfigProps[i].Value = uno::makeAny( sEmpty );
     457           0 :                     nFound++;
     458             :                 }
     459           0 :                 else if ( sProp.compareToAscii("PrinterSetup") == 0 )
     460             :                 {
     461           0 :                     uno::Sequence< sal_Int8 > aEmpty;
     462           0 :                     aSeqConfigProps[i].Value = uno::makeAny( aEmpty );
     463           0 :                     nFound++;
     464             :                 }
     465             : 
     466           0 :                 i--;
     467           0 :             }
     468             :         }
     469             : 
     470          42 :         GetImport().SetConfigurationSettings( aSeqConfigProps );
     471             :     }
     472             : 
     473         126 :     for (   ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
     474          84 :             settings != m_pData->aDocSpecificSettings.end();
     475             :             ++settings
     476             :         )
     477             :     {
     478           0 :         uno::Sequence< beans::PropertyValue > aDocSettings;
     479           0 :         OSL_VERIFY( settings->aSettings >>= aDocSettings );
     480           0 :         GetImport().SetDocumentSpecificSettings( settings->sGroupName, aDocSettings );
     481          42 :     }
     482          42 : }
     483             : 
     484             : //=============================================================================
     485             : 
     486         233 : XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
     487             :         const rtl::OUString& rLName, com::sun::star::uno::Any& rTempAny,
     488             :         XMLConfigBaseContext* pTempBaseContext)
     489             :     : SvXMLImportContext( rImport, nPrfx, rLName ),
     490             :     // #110680#
     491             :     maProps(rImport.getServiceFactory()),
     492             :     maProp(),
     493             :     mrAny(rTempAny),
     494         233 :     mpBaseContext(pTempBaseContext)
     495             : {
     496         233 : }
     497             : 
     498         233 : XMLConfigBaseContext::~XMLConfigBaseContext()
     499             : {
     500         233 : }
     501             : 
     502             : //=============================================================================
     503             : 
     504         169 : XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
     505             :                                     const rtl::OUString& rLName,
     506             :                                     const ::com::sun::star::uno::Reference<
     507             :                                     ::com::sun::star::xml::sax::XAttributeList>&,
     508             :                                     com::sun::star::uno::Any& rAny,
     509             :                                     XMLConfigBaseContext* pBaseContext)
     510         169 :     : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
     511             : {
     512             :     // here are no attributes
     513         169 : }
     514             : 
     515         338 : XMLConfigItemSetContext::~XMLConfigItemSetContext()
     516             : {
     517         338 : }
     518             : 
     519        3493 : SvXMLImportContext *XMLConfigItemSetContext::CreateChildContext( sal_uInt16 nPrefix,
     520             :                                      const rtl::OUString& rLocalName,
     521             :                                      const ::com::sun::star::uno::Reference<
     522             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     523             : {
     524        3493 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     525             : }
     526             : 
     527         169 : void XMLConfigItemSetContext::EndElement()
     528             : {
     529         169 :     mrAny <<= maProps.GetSequence();
     530         169 :     if (mpBaseContext)
     531          85 :         mpBaseContext->AddPropertyValue();
     532         169 : }
     533             : 
     534             : //=============================================================================
     535             : 
     536        3429 : XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     537             :                                     const ::com::sun::star::uno::Reference<
     538             :                                     ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
     539             :                                     com::sun::star::uno::Any& rTempAny,
     540             :                                     const rtl::OUString& rTempItemName,
     541             :                                     XMLConfigBaseContext* pTempBaseContext)
     542             :     : SvXMLImportContext(rImport, nPrfx, rLName),
     543             :     mrAny(rTempAny),
     544             :     mrItemName(rTempItemName),
     545        3429 :     mpBaseContext(pTempBaseContext)
     546             : {
     547        3429 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     548       10287 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     549             :     {
     550        6858 :         rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
     551        6858 :         rtl::OUString aLocalName;
     552        6858 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     553        6858 :                                             sAttrName, &aLocalName );
     554        6858 :         rtl::OUString sValue = xAttrList->getValueByIndex( i );
     555             : 
     556        6858 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     557             :         {
     558        6858 :             if (IsXMLToken(aLocalName, XML_TYPE))
     559        3429 :                 msType = sValue;
     560             :         }
     561        6858 :     }
     562        3429 : }
     563             : 
     564        6858 : XMLConfigItemContext::~XMLConfigItemContext()
     565             : {
     566        6858 : }
     567             : 
     568           0 : SvXMLImportContext *XMLConfigItemContext::CreateChildContext( sal_uInt16 nPrefix,
     569             :                                                     const rtl::OUString& rLocalName,
     570             :                                                     const ::com::sun::star::uno::Reference<
     571             :                                           ::com::sun::star::xml::sax::XAttributeList>& )
     572             : {
     573           0 :     SvXMLImportContext* pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
     574           0 :     return pContext;
     575             : }
     576             : 
     577        3267 : void XMLConfigItemContext::Characters( const ::rtl::OUString& rChars )
     578             : {
     579        3267 :     if (IsXMLToken(msType, XML_BASE64BINARY))
     580             :     {
     581           9 :         rtl::OUString sTrimmedChars( rChars.trim() );
     582           9 :         if( !sTrimmedChars.isEmpty() )
     583             :         {
     584           9 :             rtl::OUString sChars;
     585           9 :             if( !msValue.isEmpty() )
     586             :             {
     587           0 :                 sChars = msValue;
     588           0 :                 sChars += sTrimmedChars;
     589           0 :                 msValue = rtl::OUString();
     590             :             }
     591             :             else
     592             :             {
     593           9 :                 sChars = sTrimmedChars;
     594             :             }
     595           9 :             uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
     596             :                         sal_Int32 const nCharsDecoded =
     597           9 :                 ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
     598           9 :             sal_uInt32 nStartPos(maDecoded.getLength());
     599           9 :             sal_uInt32 nCount(aBuffer.getLength());
     600           9 :             maDecoded.realloc(nStartPos + nCount);
     601           9 :             sal_Int8* pDecoded = maDecoded.getArray();
     602           9 :             sal_Int8* pBuffer = aBuffer.getArray();
     603        2265 :             for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
     604        2256 :                 pDecoded[nStartPos + i] = *pBuffer;
     605           9 :             if( nCharsDecoded != sChars.getLength() )
     606           0 :                 msValue = sChars.copy( nCharsDecoded );
     607           9 :         }
     608             :     }
     609             :     else
     610        3258 :         msValue += rChars;
     611        3267 : }
     612             : 
     613             : 
     614        3429 : void XMLConfigItemContext::EndElement()
     615             : {
     616        3429 :     if (mpBaseContext)
     617             :     {
     618        3429 :         if (IsXMLToken(msType, XML_BOOLEAN))
     619             :         {
     620        1791 :             sal_Bool bValue(sal_False);
     621        1791 :             if (IsXMLToken(msValue, XML_TRUE))
     622         878 :                 bValue = sal_True;
     623        1791 :             mrAny <<= bValue;
     624             :         }
     625        1638 :         else if (IsXMLToken(msType, XML_BYTE))
     626             :         {
     627           0 :             sal_Int32 nValue(0);
     628           0 :                         ::sax::Converter::convertNumber(nValue, msValue);
     629           0 :             mrAny <<= static_cast<sal_Int8>(nValue);
     630             :         }
     631        1638 :         else if (IsXMLToken(msType, XML_SHORT))
     632             :         {
     633         337 :             sal_Int32 nValue(0);
     634         337 :                         ::sax::Converter::convertNumber(nValue, msValue);
     635         337 :             mrAny <<= static_cast<sal_Int16>(nValue);
     636             :         }
     637        1301 :         else if (IsXMLToken(msType, XML_INT))
     638             :         {
     639         876 :             sal_Int32 nValue(0);
     640         876 :                         ::sax::Converter::convertNumber(nValue, msValue);
     641         876 :             mrAny <<= nValue;
     642             :         }
     643         425 :         else if (IsXMLToken(msType, XML_LONG))
     644             :         {
     645         142 :             sal_Int64 nValue(msValue.toInt64());
     646         142 :             mrAny <<= nValue;
     647             :         }
     648         283 :         else if (IsXMLToken(msType, XML_DOUBLE))
     649             :         {
     650           0 :             double fValue(0.0);
     651           0 :                         ::sax::Converter::convertDouble(fValue, msValue);
     652           0 :             mrAny <<= fValue;
     653             :         }
     654         283 :         else if (IsXMLToken(msType, XML_STRING))
     655             :         {
     656         218 :             mrAny <<= msValue;
     657             :         }
     658          65 :         else if (IsXMLToken(msType, XML_DATETIME))
     659             :         {
     660           0 :             util::DateTime aDateTime;
     661           0 :                         ::sax::Converter::convertDateTime(aDateTime, msValue);
     662           0 :             mrAny <<= aDateTime;
     663             :         }
     664          65 :         else if (IsXMLToken(msType, XML_BASE64BINARY))
     665             :         {
     666          65 :             mrAny <<= maDecoded;
     667             :         }
     668             :         else {
     669             :             OSL_FAIL("wrong type");
     670             :         }
     671             : 
     672        3429 :         ManipulateConfigItem();
     673             : 
     674        3429 :         mpBaseContext->AddPropertyValue();
     675             :     }
     676             :     else {
     677             :         OSL_FAIL("no BaseContext");
     678             :     }
     679        3429 : }
     680             : 
     681             : /** There are some instances where there is a mismatch between API and
     682             :  * XML mapping of a setting. In this case, this method allows us to
     683             :  * manipulate the values accordingly. */
     684        3429 : void XMLConfigItemContext::ManipulateConfigItem()
     685             : {
     686        3429 :     if( mrItemName == "PrinterIndependentLayout" )
     687             :     {
     688          20 :         rtl::OUString sValue;
     689          20 :         mrAny >>= sValue;
     690             : 
     691          20 :         sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
     692             : 
     693          20 :         if( sValue == "enabled" || sValue == "low-resolution" )
     694             :         {
     695           1 :             nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
     696             :         }
     697          19 :         else if ( sValue == "disabled" )
     698             :         {
     699           3 :             nTmp = document::PrinterIndependentLayout::DISABLED;
     700             :         }
     701             :         // else: default to high_resolution
     702             : 
     703          20 :         mrAny <<= nTmp;
     704             :     }
     705       13612 :     else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
     706       10203 :           || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
     707             :     {
     708          12 :         if( GetImport().getServiceFactory().is() ) try
     709             :         {
     710          12 :             uno::Reference< uno::XComponentContext > xContext( comphelper::getComponentContext(GetImport().getServiceFactory()) );
     711          12 :             uno::Reference< util::XStringSubstitution > xStringSubsitution( util::PathSubstitution::create(xContext) );
     712             : 
     713          12 :             rtl::OUString aURL;
     714          12 :             mrAny >>= aURL;
     715          12 :             aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
     716          12 :             mrAny <<= aURL;
     717             :         }
     718           0 :         catch( uno::Exception& )
     719             :         {
     720             :         }
     721             :     }
     722        3429 : }
     723             : 
     724             : 
     725             : //=============================================================================
     726             : 
     727          20 : XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
     728             :                                     const ::com::sun::star::uno::Reference<
     729             :                                     ::com::sun::star::xml::sax::XAttributeList>&,
     730             :                                     com::sun::star::uno::Any& rAny,
     731             :                                     XMLConfigBaseContext* pBaseContext)
     732          20 :     : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
     733             : {
     734          20 : }
     735             : 
     736          40 : XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
     737             : {
     738          40 : }
     739             : 
     740          39 : SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix,
     741             :                                                     const rtl::OUString& rLocalName,
     742             :                                                     const ::com::sun::star::uno::Reference<
     743             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     744             : {
     745          39 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     746             : }
     747             : 
     748          20 : void XMLConfigItemMapNamedContext::EndElement()
     749             : {
     750          20 :     if (mpBaseContext)
     751             :     {
     752          20 :         mrAny <<= maProps.GetNameContainer();
     753          20 :         mpBaseContext->AddPropertyValue();
     754             :     }
     755             :     else {
     756             :         OSL_FAIL("no BaseContext");
     757             :     }
     758          20 : }
     759             : 
     760             : //=============================================================================
     761             : 
     762          44 : XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
     763             :                                     const rtl::OUString& rLName,
     764             :                                     const ::com::sun::star::uno::Reference<
     765             :                                     ::com::sun::star::xml::sax::XAttributeList>&,
     766             :                                     com::sun::star::uno::Any& rAny,
     767             :                                     const ::rtl::OUString& rConfigItemName,
     768             :                                     XMLConfigBaseContext* pBaseContext)
     769             :     : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext),
     770          44 :       maConfigItemName( rConfigItemName )
     771             : {
     772          44 : }
     773             : 
     774          88 : XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
     775             : {
     776          88 : }
     777             : 
     778          46 : SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix,
     779             :                                                     const rtl::OUString& rLocalName,
     780             :                                                     const ::com::sun::star::uno::Reference<
     781             :                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     782             : {
     783          46 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     784             : }
     785             : 
     786          44 : void XMLConfigItemMapIndexedContext::EndElement()
     787             : {
     788          44 :     if (mpBaseContext)
     789             :     {
     790          44 :         if ( maConfigItemName == "ForbiddenCharacters" )
     791             :         {
     792           4 :             uno::Reference< i18n::XForbiddenCharacters > xForbChars;
     793             : 
     794             :             // get the forbidden characters from the document
     795           4 :             uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
     796           4 :             if( xFac.is() )
     797             :             {
     798           4 :                 uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
     799           4 :                 if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
     800             :                 {
     801           4 :                     xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
     802           4 :                 }
     803             :             }
     804             : 
     805           4 :             if( xForbChars.is() )
     806             :             {
     807             : 
     808           4 :                 uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     809             : 
     810           4 :                 const sal_Int32 nCount = xIndex->getCount();
     811           4 :                 uno::Sequence < beans::PropertyValue > aProps;
     812          10 :                 for (sal_Int32 i = 0; i < nCount; i++)
     813             :                 {
     814           6 :                     if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
     815             :                     {
     816           6 :                         beans::PropertyValue *pForChar = aProps.getArray();
     817           6 :                         i18n::ForbiddenCharacters aForbid;
     818           6 :                         lang::Locale aLocale;
     819           6 :                         const rtl::OUString sLanguage  ( "Language" );
     820           6 :                         const rtl::OUString sCountry   ( "Country" );
     821           6 :                         const rtl::OUString sVariant   ( "Variant" );
     822           6 :                         const rtl::OUString sBeginLine ( "BeginLine" );
     823           6 :                         const rtl::OUString sEndLine   ( "EndLine" );
     824           6 :                         sal_Bool bHaveLanguage = sal_False, bHaveCountry = sal_False, bHaveVariant = sal_False,
     825           6 :                                  bHaveBegin = sal_False, bHaveEnd = sal_False;
     826             : 
     827          36 :                         for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
     828             :                         {
     829          30 :                             if (pForChar->Name.equals (sLanguage ) )
     830             :                             {
     831           6 :                                 pForChar->Value >>= aLocale.Language;
     832           6 :                                 bHaveLanguage = sal_True;
     833             :                             }
     834          24 :                             else if (pForChar->Name.equals (sCountry ) )
     835             :                             {
     836           6 :                                 pForChar->Value >>= aLocale.Country;
     837           6 :                                 bHaveCountry = sal_True;
     838             :                             }
     839          18 :                             else if (pForChar->Name.equals (sVariant ) )
     840             :                             {
     841           6 :                                 pForChar->Value >>= aLocale.Variant;
     842           6 :                                 bHaveVariant = sal_True;
     843             :                             }
     844          12 :                             else if (pForChar->Name.equals (sBeginLine ) )
     845             :                             {
     846           6 :                                 pForChar->Value >>= aForbid.beginLine;
     847           6 :                                 bHaveBegin = sal_True;
     848             :                             }
     849           6 :                             else if (pForChar->Name.equals (sEndLine ) )
     850             :                             {
     851           6 :                                 pForChar->Value >>= aForbid.endLine;
     852           6 :                                 bHaveEnd = sal_True;
     853             :                             }
     854          30 :                             pForChar++;
     855             :                         }
     856             : 
     857           6 :                         if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
     858             :                         {
     859             :                             try
     860             :                             {
     861           6 :                                 xForbChars->setForbiddenCharacters( aLocale, aForbid );
     862             :                             }
     863           0 :                             catch( uno::Exception& )
     864             :                             {
     865             :                                 OSL_FAIL( "Exception while importing forbidden characters" );
     866             :                             }
     867           6 :                         }
     868             :                     }
     869           4 :                 }
     870             :             }
     871             :             else
     872             :             {
     873             :                 OSL_FAIL( "could not get the XForbiddenCharacters from document!" );
     874           0 :                 mrAny <<= maProps.GetIndexContainer();
     875           4 :             }
     876             :         }
     877          40 :         else if ( maConfigItemName == "Symbols" )
     878             :         {
     879           0 :             uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     880             : 
     881           0 :             const sal_Int32 nCount = xIndex->getCount();
     882           0 :             uno::Sequence < beans::PropertyValue > aProps;
     883           0 :             uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
     884             : 
     885           0 :             formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
     886             : 
     887           0 :             const rtl::OUString sName     ( "Name" );
     888           0 :             const rtl::OUString sExportName ( "ExportName" );
     889           0 :             const rtl::OUString sFontName ( "FontName" );
     890           0 :             const rtl::OUString sSymbolSet ( "SymbolSet" );
     891           0 :             const rtl::OUString sCharacter ( "Character" );
     892           0 :             const rtl::OUString sCharSet  ( "CharSet" );
     893           0 :             const rtl::OUString sFamily   ( "Family" );
     894           0 :             const rtl::OUString sPitch    ( "Pitch" );
     895           0 :             const rtl::OUString sWeight   ( "Weight" );
     896           0 :             const rtl::OUString sItalic   ( "Italic" );
     897           0 :             sal_Int16 nNumFullEntries = 0;
     898             : 
     899           0 :             for ( sal_Int32 i = 0; i < nCount; i++ )
     900             :             {
     901           0 :                 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
     902             :                 {
     903           0 :                     sal_Bool bHaveName = sal_False, bHaveExportName = sal_False, bHaveCharSet = sal_False,
     904           0 :                               bHaveFontName = sal_False, bHaveFamily = sal_False, bHavePitch = sal_False,
     905           0 :                               bHaveWeight = sal_False, bHaveItalic = sal_False, bHaveSymbolSet = sal_False,
     906           0 :                              bHaveCharacter = sal_False;
     907           0 :                     beans::PropertyValue *pSymbol = aProps.getArray();
     908             : 
     909           0 :                     for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
     910             :                     {
     911           0 :                         if (pSymbol->Name.equals ( sName ) )
     912             :                         {
     913           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
     914           0 :                             bHaveName = sal_True;
     915             :                         }
     916           0 :                         else if (pSymbol->Name.equals (sExportName ) )
     917             :                         {
     918           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
     919           0 :                             bHaveExportName = sal_True;
     920             :                         }
     921           0 :                         else if (pSymbol->Name.equals (sFontName ) )
     922             :                         {
     923           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
     924           0 :                             bHaveFontName = sal_True;
     925             :                         }
     926           0 :                         else if (pSymbol->Name.equals (sCharSet ) )
     927             :                         {
     928           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
     929           0 :                             bHaveCharSet = sal_True;
     930             :                         }
     931           0 :                         else if (pSymbol->Name.equals (sFamily ) )
     932             :                         {
     933           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
     934           0 :                             bHaveFamily = sal_True;
     935             :                         }
     936           0 :                         else if (pSymbol->Name.equals (sPitch ) )
     937             :                         {
     938           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
     939           0 :                             bHavePitch = sal_True;
     940             :                         }
     941           0 :                         else if (pSymbol->Name.equals (sWeight ) )
     942             :                         {
     943           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
     944           0 :                             bHaveWeight = sal_True;
     945             :                         }
     946           0 :                         else if (pSymbol->Name.equals (sItalic ) )
     947             :                         {
     948           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
     949           0 :                             bHaveItalic = sal_True;
     950             :                         }
     951           0 :                         else if (pSymbol->Name.equals (sSymbolSet ) )
     952             :                         {
     953           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
     954           0 :                             bHaveSymbolSet = sal_True;
     955             :                         }
     956           0 :                         else if (pSymbol->Name.equals (sCharacter ) )
     957             :                         {
     958           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
     959           0 :                             bHaveCharacter = sal_True;
     960             :                         }
     961           0 :                         pSymbol++;
     962             :                     }
     963           0 :                     if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
     964             :                          && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
     965           0 :                         nNumFullEntries++;
     966             :                 }
     967             :             }
     968           0 :             aSymbolList.realloc (nNumFullEntries);
     969           0 :             mrAny <<= aSymbolList;
     970             :         }
     971             :         else
     972             :         {
     973          40 :             mrAny <<= maProps.GetIndexContainer();
     974             :         }
     975          44 :         mpBaseContext->AddPropertyValue();
     976             :     }
     977             :     else {
     978             :         OSL_FAIL("no BaseContext");
     979             :     }
     980          44 : }
     981             : 
     982             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10