LCOV - code coverage report
Current view: top level - xmloff/source/core - DocumentSettingsContext.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 288 380 75.8 %
Date: 2014-11-03 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 <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        3292 : 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       53360 :     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        3292 : XMLMyList::XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext)
      69             : :   nCount(0),
      70        3292 :     m_xContext(rxContext)
      71             : {
      72             :     DBG_ASSERT( rxContext.is(), "got no service manager" );
      73        3292 : }
      74             : 
      75        2382 : uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
      76             : {
      77        2382 :     uno::Sequence<beans::PropertyValue> aSeq;
      78        2382 :     if(nCount)
      79             :     {
      80             :         DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue");
      81        2376 :         aSeq.realloc(nCount);
      82        2376 :         beans::PropertyValue* pProps = aSeq.getArray();
      83        2376 :         std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
      84       57050 :         while (aItr != aProps.end())
      85             :         {
      86       52298 :             *pProps = *aItr;
      87       52298 :             ++pProps;
      88       52298 :             ++aItr;
      89             :         }
      90             :     }
      91        2382 :     return aSeq;
      92             : }
      93             : 
      94         234 : uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
      95             : {
      96         234 :     uno::Reference<container::XNameContainer> xNameContainer = document::NamedPropertyValues::create(m_xContext);
      97         234 :     std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
      98         846 :     while (aItr != aProps.end())
      99             :     {
     100         378 :         xNameContainer->insertByName(aItr->Name, aItr->Value);
     101         378 :         ++aItr;
     102             :     }
     103             : 
     104         234 :     return xNameContainer;
     105             : }
     106             : 
     107         676 : uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
     108             : {
     109         676 :     uno::Reference<container::XIndexContainer> xIndexContainer = document::IndexedPropertyValues::create(m_xContext);
     110         676 :     std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
     111         676 :     sal_uInt32 i(0);
     112        2036 :     while (aItr != aProps.end())
     113             :     {
     114         684 :         xIndexContainer->insertByIndex(i, aItr->Value);
     115         684 :         ++aItr;
     116         684 :         ++i;
     117             :     }
     118             : 
     119         676 :     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       53360 :     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       53360 : 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       53360 :     SvXMLImportContext *pContext = 0;
     232             : 
     233       53360 :     rProp.Name = OUString();
     234       53360 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     235      157418 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     236             :     {
     237      104058 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     238      208116 :         OUString aLocalName;
     239      104058 :         sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
     240      104058 :                                             sAttrName, &aLocalName );
     241      208116 :         OUString sValue = xAttrList->getValueByIndex( i );
     242             : 
     243      104058 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     244             :         {
     245      104058 :             if (IsXMLToken(aLocalName, XML_NAME))
     246       52676 :                 rProp.Name = sValue;
     247             :         }
     248      104058 :     }
     249             : 
     250       53360 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     251             :     {
     252       53360 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
     253       51382 :             pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     254        3950 :         else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
     255        1972 :                 (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
     256        1068 :             pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     257         910 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
     258         234 :             pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     259         676 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
     260         676 :             pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     261             :     }
     262             : 
     263       53360 :     if( !pContext )
     264           0 :         pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
     265             : 
     266       53360 :     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        1400 : 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         700 : XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
     292             :                     const uno::Reference<xml::sax::XAttributeList>& )
     293             :     : SvXMLImportContext( rImport, nPrfx, rLName )
     294         700 :     , m_pData( new XMLDocumentSettingsContext_Data )
     295             : {
     296             :     // here are no attributes
     297         700 : }
     298             : 
     299        1400 : XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
     300             : {
     301        1400 : }
     302             : 
     303        1314 : 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        1314 :     SvXMLImportContext *pContext = 0;
     309        1314 :     OUString sName;
     310             : 
     311        1314 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     312        2628 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     313             :     {
     314        1314 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     315        2628 :         OUString aLocalName;
     316        1314 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     317        1314 :                                             sAttrName, &aLocalName );
     318        2628 :         OUString sValue = xAttrList->getValueByIndex( i );
     319             : 
     320        1314 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     321             :         {
     322        1314 :             if (IsXMLToken(aLocalName, XML_NAME))
     323        1314 :                 sName = sValue;
     324             :         }
     325        1314 :     }
     326             : 
     327        1314 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     328             :     {
     329        1314 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
     330             :         {
     331        1314 :             OUString aLocalConfigName;
     332             :             sal_uInt16 nConfigPrefix =
     333        1314 :                 GetImport().GetNamespaceMap().GetKeyByAttrName(
     334        1314 :                                             sName, &aLocalConfigName );
     335             : 
     336        1314 :             if( XML_NAMESPACE_OOO == nConfigPrefix )
     337             :             {
     338        1314 :                 if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
     339         698 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     340             :                                         p_nPrefix, rLocalName, xAttrList,
     341         698 :                                         m_pData->aViewProps, NULL);
     342         616 :                 else if (IsXMLToken(aLocalConfigName,
     343             :                                                 XML_CONFIGURATION_SETTINGS))
     344         616 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     345             :                                         p_nPrefix, rLocalName, xAttrList,
     346         616 :                                         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        1314 :             }
     359             :         }
     360             :     }
     361             : 
     362        1314 :     if( !pContext )
     363           0 :         pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
     364             : 
     365        1314 :     return pContext;
     366             : }
     367             : 
     368         700 : void XMLDocumentSettingsContext::EndElement()
     369             : {
     370         700 :     uno::Sequence<beans::PropertyValue> aSeqViewProps;
     371         700 :     if (m_pData->aViewProps >>= aSeqViewProps)
     372             :     {
     373         698 :         GetImport().SetViewSettings(aSeqViewProps);
     374         698 :         sal_Int32 i(aSeqViewProps.getLength() - 1);
     375         698 :         bool bFound(false);
     376        2418 :         while((i >= 0) && !bFound)
     377             :         {
     378        1022 :             if (aSeqViewProps[i].Name.equalsAscii("Views"))
     379             :             {
     380         592 :                 bFound = true;
     381         592 :                 uno::Reference<container::XIndexAccess> xIndexAccess;
     382         592 :                 if (aSeqViewProps[i].Value >>= xIndexAccess)
     383             :                 {
     384         592 :                     uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
     385         592 :                     if (xViewDataSupplier.is())
     386         592 :                         xViewDataSupplier->setViewData(xIndexAccess);
     387         592 :                 }
     388             :             }
     389             :             else
     390         430 :                 i--;
     391             :         }
     392             :     }
     393             : 
     394        1400 :     uno::Sequence<beans::PropertyValue> aSeqConfigProps;
     395         700 :     if ( m_pData->aConfigProps >>= aSeqConfigProps )
     396             :     {
     397         616 :         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         616 :         GetImport().SetConfigurationSettings( aSeqConfigProps );
     424             :     }
     425             : 
     426        2100 :     for (   ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
     427        1400 :             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         700 :     }
     435         700 : }
     436             : 
     437        3292 : 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        3292 :     mpBaseContext(pTempBaseContext)
     445             : {
     446        3292 : }
     447             : 
     448        3292 : XMLConfigBaseContext::~XMLConfigBaseContext()
     449             : {
     450        3292 : }
     451             : 
     452        2382 : 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        2382 :     : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
     459             : {
     460             :     // here are no attributes
     461        2382 : }
     462             : 
     463        4764 : XMLConfigItemSetContext::~XMLConfigItemSetContext()
     464             : {
     465        4764 : }
     466             : 
     467       52298 : 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       52298 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     473             : }
     474             : 
     475        2382 : void XMLConfigItemSetContext::EndElement()
     476             : {
     477        2382 :     mrAny <<= maProps.GetSequence();
     478        2382 :     if (mpBaseContext)
     479        1068 :         mpBaseContext->AddPropertyValue();
     480        2382 : }
     481             : 
     482       51382 : 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       51382 :     mpBaseContext(pTempBaseContext)
     492             : {
     493       51382 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     494      154146 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     495             :     {
     496      102764 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     497      205528 :         OUString aLocalName;
     498      102764 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     499      102764 :                                             sAttrName, &aLocalName );
     500      205528 :         OUString sValue = xAttrList->getValueByIndex( i );
     501             : 
     502      102764 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     503             :         {
     504      102764 :             if (IsXMLToken(aLocalName, XML_TYPE))
     505       51382 :                 msType = sValue;
     506             :         }
     507      102764 :     }
     508       51382 : }
     509             : 
     510      102764 : XMLConfigItemContext::~XMLConfigItemContext()
     511             : {
     512      102764 : }
     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       49094 : void XMLConfigItemContext::Characters( const OUString& rChars )
     524             : {
     525       49094 :     if (IsXMLToken(msType, XML_BASE64BINARY))
     526             :     {
     527         258 :         OUString sTrimmedChars( rChars.trim() );
     528         258 :         if( !sTrimmedChars.isEmpty() )
     529             :         {
     530         258 :             OUString sChars;
     531         258 :             if( !msValue.isEmpty() )
     532             :             {
     533           4 :                 sChars = msValue;
     534           4 :                 sChars += sTrimmedChars;
     535           4 :                 msValue = OUString();
     536             :             }
     537             :             else
     538             :             {
     539         254 :                 sChars = sTrimmedChars;
     540             :             }
     541         516 :             uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
     542             :                         sal_Int32 const nCharsDecoded =
     543         258 :                 ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
     544         258 :             sal_uInt32 nStartPos(maDecoded.getLength());
     545         258 :             sal_uInt32 nCount(aBuffer.getLength());
     546         258 :             maDecoded.realloc(nStartPos + nCount);
     547         258 :             sal_Int8* pDecoded = maDecoded.getArray();
     548         258 :             sal_Int8* pBuffer = aBuffer.getArray();
     549      125440 :             for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
     550      125182 :                 pDecoded[nStartPos + i] = *pBuffer;
     551         258 :             if( nCharsDecoded != sChars.getLength() )
     552         262 :                 msValue = sChars.copy( nCharsDecoded );
     553         258 :         }
     554             :     }
     555             :     else
     556       48836 :         msValue += rChars;
     557       49094 : }
     558             : 
     559       51382 : void XMLConfigItemContext::EndElement()
     560             : {
     561       51382 :     if (mpBaseContext)
     562             :     {
     563       51382 :         if (IsXMLToken(msType, XML_BOOLEAN))
     564             :         {
     565       29516 :             bool bValue(false);
     566       29516 :             if (IsXMLToken(msValue, XML_TRUE))
     567       13362 :                 bValue = true;
     568       29516 :             mrAny <<= bValue;
     569             :         }
     570       21866 :         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       21866 :         else if (IsXMLToken(msType, XML_SHORT))
     577             :         {
     578        4382 :             sal_Int32 nValue(0);
     579        4382 :                         ::sax::Converter::convertNumber(nValue, msValue);
     580        4382 :             mrAny <<= static_cast<sal_Int16>(nValue);
     581             :         }
     582       17484 :         else if (IsXMLToken(msType, XML_INT))
     583             :         {
     584       10208 :             sal_Int32 nValue(0);
     585       10208 :                         ::sax::Converter::convertNumber(nValue, msValue);
     586       10208 :             mrAny <<= nValue;
     587             :         }
     588        7276 :         else if (IsXMLToken(msType, XML_LONG))
     589             :         {
     590        2844 :             sal_Int64 nValue(msValue.toInt64());
     591        2844 :             mrAny <<= nValue;
     592             :         }
     593        4432 :         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        4432 :         else if (IsXMLToken(msType, XML_STRING))
     600             :         {
     601        3412 :             mrAny <<= msValue;
     602             :         }
     603        1020 :         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        1020 :         else if (IsXMLToken(msType, XML_BASE64BINARY))
     610             :         {
     611        1020 :             mrAny <<= maDecoded;
     612             :         }
     613             :         else {
     614             :             OSL_FAIL("wrong type");
     615             :         }
     616             : 
     617       51382 :         ManipulateConfigItem();
     618             : 
     619       51382 :         mpBaseContext->AddPropertyValue();
     620             :     }
     621             :     else {
     622             :         OSL_FAIL("no BaseContext");
     623             :     }
     624       51382 : }
     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       51382 : void XMLConfigItemContext::ManipulateConfigItem()
     630             : {
     631       51382 :     if( mrItemName == "PrinterIndependentLayout" )
     632             :     {
     633         344 :         OUString sValue;
     634         344 :         mrAny >>= sValue;
     635             : 
     636         344 :         sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
     637             : 
     638         344 :         if( sValue == "enabled" || sValue == "low-resolution" )
     639             :         {
     640          36 :             nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
     641             :         }
     642         308 :         else if ( sValue == "disabled" )
     643             :         {
     644          14 :             nTmp = document::PrinterIndependentLayout::DISABLED;
     645             :         }
     646             :         // else: default to high_resolution
     647             : 
     648         344 :         mrAny <<= nTmp;
     649             :     }
     650      153078 :     else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
     651      101968 :           || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
     652             :     {
     653             :         try
     654             :         {
     655         216 :             uno::Reference< uno::XComponentContext > xContext( GetImport().GetComponentContext() );
     656         432 :             uno::Reference< util::XStringSubstitution > xStringSubsitution( util::PathSubstitution::create(xContext) );
     657             : 
     658         432 :             OUString aURL;
     659         216 :             mrAny >>= aURL;
     660         216 :             aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
     661         432 :             mrAny <<= aURL;
     662             :         }
     663           0 :         catch( uno::Exception& )
     664             :         {
     665             :         }
     666             :     }
     667       51382 : }
     668             : 
     669         234 : 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         234 :     : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
     675             : {
     676         234 : }
     677             : 
     678         468 : XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
     679             : {
     680         468 : }
     681             : 
     682         378 : 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         378 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     688             : }
     689             : 
     690         234 : void XMLConfigItemMapNamedContext::EndElement()
     691             : {
     692         234 :     if (mpBaseContext)
     693             :     {
     694         234 :         mrAny <<= maProps.GetNameContainer();
     695         234 :         mpBaseContext->AddPropertyValue();
     696             :     }
     697             :     else {
     698             :         OSL_FAIL("no BaseContext");
     699             :     }
     700         234 : }
     701             : 
     702         676 : 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         676 :       maConfigItemName( rConfigItemName )
     711             : {
     712         676 : }
     713             : 
     714        1352 : XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
     715             : {
     716        1352 : }
     717             : 
     718         684 : 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         684 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     724             : }
     725             : 
     726         676 : void XMLConfigItemMapIndexedContext::EndElement()
     727             : {
     728         676 :     if (mpBaseContext)
     729             :     {
     730         676 :         if ( maConfigItemName == "ForbiddenCharacters" )
     731             :         {
     732          84 :             uno::Reference< i18n::XForbiddenCharacters > xForbChars;
     733             : 
     734             :             // get the forbidden characters from the document
     735         168 :             uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
     736          84 :             if( xFac.is() )
     737             :             {
     738          84 :                 uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
     739          84 :                 if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
     740             :                 {
     741          84 :                     xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
     742          84 :                 }
     743             :             }
     744             : 
     745          84 :             if( xForbChars.is() )
     746             :             {
     747             : 
     748          84 :                 uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     749             : 
     750          84 :                 const sal_Int32 nCount = xIndex->getCount();
     751         168 :                 uno::Sequence < beans::PropertyValue > aProps;
     752         176 :                 for (sal_Int32 i = 0; i < nCount; i++)
     753             :                 {
     754          92 :                     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          92 :                         beans::PropertyValue *pForChar = aProps.getArray();
     762          92 :                         i18n::ForbiddenCharacters aForbid;
     763         184 :                         lang::Locale aLocale;
     764          92 :                         bool bHaveLanguage = false, bHaveCountry = false, bHaveVariant = false,
     765          92 :                              bHaveBegin = false, bHaveEnd = false;
     766             : 
     767         552 :                         for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
     768             :                         {
     769         460 :                             if (pForChar->Name.equals ( "Language" ) )
     770             :                             {
     771          92 :                                 pForChar->Value >>= aLocale.Language;
     772          92 :                                 bHaveLanguage = true;
     773             :                             }
     774         368 :                             else if (pForChar->Name.equals ( "Country" ) )
     775             :                             {
     776          92 :                                 pForChar->Value >>= aLocale.Country;
     777          92 :                                 bHaveCountry = true;
     778             :                             }
     779         276 :                             else if (pForChar->Name.equals ( "Variant" ) )
     780             :                             {
     781          92 :                                 pForChar->Value >>= aLocale.Variant;
     782          92 :                                 bHaveVariant = true;
     783             :                             }
     784         184 :                             else if (pForChar->Name.equals ( "BeginLine" ) )
     785             :                             {
     786          92 :                                 pForChar->Value >>= aForbid.beginLine;
     787          92 :                                 bHaveBegin = true;
     788             :                             }
     789          92 :                             else if (pForChar->Name.equals ( "EndLine" ) )
     790             :                             {
     791          92 :                                 pForChar->Value >>= aForbid.endLine;
     792          92 :                                 bHaveEnd = true;
     793             :                             }
     794         460 :                             pForChar++;
     795             :                         }
     796             : 
     797          92 :                         if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
     798             :                         {
     799             :                             try
     800             :                             {
     801          92 :                                 xForbChars->setForbiddenCharacters( aLocale, aForbid );
     802             :                             }
     803           0 :                             catch( uno::Exception& )
     804             :                             {
     805             :                                 OSL_FAIL( "Exception while importing forbidden characters" );
     806             :                             }
     807          92 :                         }
     808             :                     }
     809          84 :                 }
     810             :             }
     811             :             else
     812             :             {
     813             :                 OSL_FAIL( "could not get the XForbiddenCharacters from document!" );
     814           0 :                 mrAny <<= maProps.GetIndexContainer();
     815          84 :             }
     816             :         }
     817         592 :         else if ( maConfigItemName == "Symbols" )
     818             :         {
     819           0 :             uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     820             : 
     821           0 :             const sal_Int32 nCount = xIndex->getCount();
     822           0 :             uno::Sequence < beans::PropertyValue > aProps;
     823           0 :             uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
     824             : 
     825           0 :             formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
     826             : 
     827           0 :             sal_Int16 nNumFullEntries = 0;
     828             : 
     829           0 :             for ( sal_Int32 i = 0; i < nCount; i++ )
     830             :             {
     831           0 :                 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
     832             :                 {
     833           0 :                     bool bHaveName = false, bHaveExportName = false, bHaveCharSet = false,
     834           0 :                          bHaveFontName = false, bHaveFamily = false, bHavePitch = false,
     835           0 :                          bHaveWeight = false, bHaveItalic = false, bHaveSymbolSet = false,
     836           0 :                          bHaveCharacter = false;
     837           0 :                     beans::PropertyValue *pSymbol = aProps.getArray();
     838             : 
     839           0 :                     for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
     840             :                     {
     841           0 :                         if (pSymbol->Name.equals ( "Name" ) )
     842             :                         {
     843           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
     844           0 :                             bHaveName = true;
     845             :                         }
     846           0 :                         else if (pSymbol->Name.equals ( "ExportName" ) )
     847             :                         {
     848           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
     849           0 :                             bHaveExportName = true;
     850             :                         }
     851           0 :                         else if (pSymbol->Name.equals ( "FontName" ) )
     852             :                         {
     853           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
     854           0 :                             bHaveFontName = true;
     855             :                         }
     856           0 :                         else if (pSymbol->Name.equals ( "CharSet" ) )
     857             :                         {
     858           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
     859           0 :                             bHaveCharSet = true;
     860             :                         }
     861           0 :                         else if (pSymbol->Name.equals ( "Family" ) )
     862             :                         {
     863           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
     864           0 :                             bHaveFamily = true;
     865             :                         }
     866           0 :                         else if (pSymbol->Name.equals ( "Pitch" ) )
     867             :                         {
     868           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
     869           0 :                             bHavePitch = true;
     870             :                         }
     871           0 :                         else if (pSymbol->Name.equals ( "Weight" ) )
     872             :                         {
     873           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
     874           0 :                             bHaveWeight = true;
     875             :                         }
     876           0 :                         else if (pSymbol->Name.equals ( "Italic" ) )
     877             :                         {
     878           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
     879           0 :                             bHaveItalic = true;
     880             :                         }
     881           0 :                         else if (pSymbol->Name.equals ( "SymbolSet" ) )
     882             :                         {
     883           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
     884           0 :                             bHaveSymbolSet = true;
     885             :                         }
     886           0 :                         else if (pSymbol->Name.equals ( "Character" ) )
     887             :                         {
     888           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
     889           0 :                             bHaveCharacter = true;
     890             :                         }
     891           0 :                         pSymbol++;
     892             :                     }
     893           0 :                     if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
     894           0 :                          && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
     895           0 :                         nNumFullEntries++;
     896             :                 }
     897             :             }
     898           0 :             aSymbolList.realloc (nNumFullEntries);
     899           0 :             mrAny <<= aSymbolList;
     900             :         }
     901             :         else
     902             :         {
     903         592 :             mrAny <<= maProps.GetIndexContainer();
     904             :         }
     905         676 :         mpBaseContext->AddPropertyValue();
     906             :     }
     907             :     else {
     908             :         OSL_FAIL("no BaseContext");
     909             :     }
     910         676 : }
     911             : 
     912             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10