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

Generated by: LCOV version 1.10