LCOV - code coverage report
Current view: top level - xmloff/source/core - DocumentSettingsContext.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 288 380 75.8 %
Date: 2015-06-13 12:38:46 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 <comphelper/processfactory.hxx>
      34             : 
      35             : #include <list>
      36             : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
      37             : #include <com/sun/star/container/XIndexContainer.hpp>
      38             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      39             : #include <com/sun/star/formula/SymbolDescriptor.hpp>
      40             : #include <com/sun/star/util/DateTime.hpp>
      41             : #include <com/sun/star/document/XViewDataSupplier.hpp>
      42             : #include <com/sun/star/document/PrinterIndependentLayout.hpp>
      43             : #include <com/sun/star/document/IndexedPropertyValues.hpp>
      44             : #include <com/sun/star/document/NamedPropertyValues.hpp>
      45             : #include <rtl/ustrbuf.hxx>
      46             : #include <osl/diagnose.h>
      47             : #include <xmlenums.hxx>
      48             : 
      49             : using namespace com::sun::star;
      50             : using namespace ::xmloff::token;
      51             : 
      52        2527 : 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             :     explicit XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext);
      61             : 
      62       44070 :     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        2527 : XMLMyList::XMLMyList(const uno::Reference<uno::XComponentContext>& rxContext)
      69             : :   nCount(0),
      70        2527 :     m_xContext(rxContext)
      71             : {
      72             :     assert(m_xContext.is());
      73        2527 : }
      74             : 
      75        1836 : uno::Sequence<beans::PropertyValue> XMLMyList::GetSequence()
      76             : {
      77        1836 :     uno::Sequence<beans::PropertyValue> aSeq;
      78        1836 :     if(nCount)
      79             :     {
      80             :         assert(nCount == aProps.size());
      81        1832 :         aSeq.realloc(nCount);
      82        1832 :         beans::PropertyValue* pProps = aSeq.getArray();
      83        1832 :         std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
      84       46947 :         while (aItr != aProps.end())
      85             :         {
      86       43283 :             *pProps = *aItr;
      87       43283 :             ++pProps;
      88       43283 :             ++aItr;
      89             :         }
      90             :     }
      91        1836 :     return aSeq;
      92             : }
      93             : 
      94         147 : uno::Reference<container::XNameContainer> XMLMyList::GetNameContainer()
      95             : {
      96         147 :     uno::Reference<container::XNameContainer> xNameContainer = document::NamedPropertyValues::create(m_xContext);
      97         147 :     std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
      98         519 :     while (aItr != aProps.end())
      99             :     {
     100         225 :         xNameContainer->insertByName(aItr->Name, aItr->Value);
     101         225 :         ++aItr;
     102             :     }
     103             : 
     104         147 :     return xNameContainer;
     105             : }
     106             : 
     107         544 : uno::Reference<container::XIndexContainer> XMLMyList::GetIndexContainer()
     108             : {
     109         544 :     uno::Reference<container::XIndexContainer> xIndexContainer = document::IndexedPropertyValues::create(m_xContext);
     110         544 :     std::list<beans::PropertyValue>::iterator aItr = aProps.begin();
     111         544 :     sal_uInt32 i(0);
     112        1650 :     while (aItr != aProps.end())
     113             :     {
     114         562 :         xIndexContainer->insertByIndex(i, aItr->Value);
     115         562 :         ++aItr;
     116         562 :         ++i;
     117             :     }
     118             : 
     119         544 :     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       44070 :     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             :     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       44070 : 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       44070 :     SvXMLImportContext *pContext = 0;
     232             : 
     233       44070 :     rProp.Name.clear();
     234       44070 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     235      130165 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     236             :     {
     237       86095 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     238      172190 :         OUString aLocalName;
     239       86095 :         sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName(
     240       86095 :                                             sAttrName, &aLocalName );
     241      172190 :         OUString sValue = xAttrList->getValueByIndex( i );
     242             : 
     243       86095 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     244             :         {
     245       86095 :             if (IsXMLToken(aLocalName, XML_NAME))
     246       43508 :                 rProp.Name = sValue;
     247             :         }
     248       86095 :     }
     249             : 
     250       44070 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     251             :     {
     252       44070 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM))
     253       42587 :             pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     254        2961 :         else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) ||
     255        1478 :                 (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) )
     256         792 :             pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     257         691 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED))
     258         147 :             pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext);
     259         544 :         else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED))
     260         544 :             pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext);
     261             :     }
     262             : 
     263       44070 :     if( !pContext )
     264           0 :         pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName );
     265             : 
     266       44070 :     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        1092 : 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         546 : XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
     292             :                     const uno::Reference<xml::sax::XAttributeList>& )
     293             :     : SvXMLImportContext( rImport, nPrfx, rLName )
     294         546 :     , m_pData( new XMLDocumentSettingsContext_Data )
     295             : {
     296             :     // here are no attributes
     297         546 : }
     298             : 
     299        1092 : XMLDocumentSettingsContext::~XMLDocumentSettingsContext()
     300             : {
     301        1092 : }
     302             : 
     303        1044 : 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        1044 :     SvXMLImportContext *pContext = 0;
     309        1044 :     OUString sName;
     310             : 
     311        1044 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     312        2088 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     313             :     {
     314        1044 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     315        2088 :         OUString aLocalName;
     316        1044 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     317        1044 :                                             sAttrName, &aLocalName );
     318        2088 :         OUString sValue = xAttrList->getValueByIndex( i );
     319             : 
     320        1044 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     321             :         {
     322        1044 :             if (IsXMLToken(aLocalName, XML_NAME))
     323        1044 :                 sName = sValue;
     324             :         }
     325        1044 :     }
     326             : 
     327        1044 :     if (p_nPrefix == XML_NAMESPACE_CONFIG)
     328             :     {
     329        1044 :         if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET))
     330             :         {
     331        1044 :             OUString aLocalConfigName;
     332             :             sal_uInt16 nConfigPrefix =
     333        1044 :                 GetImport().GetNamespaceMap().GetKeyByAttrName(
     334        1044 :                                             sName, &aLocalConfigName );
     335             : 
     336        1044 :             if( XML_NAMESPACE_OOO == nConfigPrefix )
     337             :             {
     338        1044 :                 if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS))
     339         545 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     340             :                                         p_nPrefix, rLocalName, xAttrList,
     341         545 :                                         m_pData->aViewProps, NULL);
     342         499 :                 else if (IsXMLToken(aLocalConfigName,
     343             :                                                 XML_CONFIGURATION_SETTINGS))
     344         499 :                     pContext = new XMLConfigItemSetContext(GetImport(),
     345             :                                         p_nPrefix, rLocalName, xAttrList,
     346         499 :                                         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        1044 :             }
     359             :         }
     360             :     }
     361             : 
     362        1044 :     if( !pContext )
     363           0 :         pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
     364             : 
     365        1044 :     return pContext;
     366             : }
     367             : 
     368         546 : void XMLDocumentSettingsContext::EndElement()
     369             : {
     370         546 :     uno::Sequence<beans::PropertyValue> aSeqViewProps;
     371         546 :     if (m_pData->aViewProps >>= aSeqViewProps)
     372             :     {
     373         545 :         GetImport().SetViewSettings(aSeqViewProps);
     374         545 :         sal_Int32 i(aSeqViewProps.getLength() - 1);
     375         545 :         bool bFound(false);
     376        1931 :         while((i >= 0) && !bFound)
     377             :         {
     378         841 :             if (aSeqViewProps[i].Name == "Views")
     379             :             {
     380         463 :                 bFound = true;
     381         463 :                 uno::Reference<container::XIndexAccess> xIndexAccess;
     382         463 :                 if (aSeqViewProps[i].Value >>= xIndexAccess)
     383             :                 {
     384         463 :                     uno::Reference<document::XViewDataSupplier> xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY);
     385         463 :                     if (xViewDataSupplier.is())
     386         463 :                         xViewDataSupplier->setViewData(xIndexAccess);
     387         463 :                 }
     388             :             }
     389             :             else
     390         378 :                 i--;
     391             :         }
     392             :     }
     393             : 
     394        1092 :     uno::Sequence<beans::PropertyValue> aSeqConfigProps;
     395         546 :     if ( m_pData->aConfigProps >>= aSeqConfigProps )
     396             :     {
     397         499 :         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 == "PrinterName" )
     407             :                 {
     408           0 :                     OUString sEmpty;
     409           0 :                     aSeqConfigProps[i].Value = uno::makeAny( sEmpty );
     410           0 :                     nFound++;
     411             :                 }
     412           0 :                 else if ( sProp == "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         499 :         GetImport().SetConfigurationSettings( aSeqConfigProps );
     424             :     }
     425             : 
     426        1638 :     for (   ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin();
     427        1092 :             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         546 :     }
     435         546 : }
     436             : 
     437        2527 : 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        2527 :     mpBaseContext(pTempBaseContext)
     445             : {
     446        2527 : }
     447             : 
     448        2527 : XMLConfigBaseContext::~XMLConfigBaseContext()
     449             : {
     450        2527 : }
     451             : 
     452        1836 : 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        1836 :     : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext )
     459             : {
     460             :     // here are no attributes
     461        1836 : }
     462             : 
     463        3672 : XMLConfigItemSetContext::~XMLConfigItemSetContext()
     464             : {
     465        3672 : }
     466             : 
     467       43283 : 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       43283 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     473             : }
     474             : 
     475        1836 : void XMLConfigItemSetContext::EndElement()
     476             : {
     477        1836 :     mrAny <<= maProps.GetSequence();
     478        1836 :     if (mpBaseContext)
     479         792 :         mpBaseContext->AddPropertyValue();
     480        1836 : }
     481             : 
     482       42587 : 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       42587 :     mpBaseContext(pTempBaseContext)
     492             : {
     493       42587 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     494      127761 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     495             :     {
     496       85174 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     497      170348 :         OUString aLocalName;
     498       85174 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName(
     499       85174 :                                             sAttrName, &aLocalName );
     500      170348 :         OUString sValue = xAttrList->getValueByIndex( i );
     501             : 
     502       85174 :         if (nPrefix == XML_NAMESPACE_CONFIG)
     503             :         {
     504       85174 :             if (IsXMLToken(aLocalName, XML_TYPE))
     505       42587 :                 msType = sValue;
     506             :         }
     507       85174 :     }
     508       42587 : }
     509             : 
     510       85174 : XMLConfigItemContext::~XMLConfigItemContext()
     511             : {
     512       85174 : }
     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       40486 : void XMLConfigItemContext::Characters( const OUString& rChars )
     524             : {
     525       40486 :     if (IsXMLToken(msType, XML_BASE64BINARY))
     526             :     {
     527         230 :         OUString sTrimmedChars( rChars.trim() );
     528         230 :         if( !sTrimmedChars.isEmpty() )
     529             :         {
     530         230 :             OUString sChars;
     531         230 :             if( !msValue.isEmpty() )
     532             :             {
     533           0 :                 sChars = msValue;
     534           0 :                 sChars += sTrimmedChars;
     535           0 :                 msValue.clear();
     536             :             }
     537             :             else
     538             :             {
     539         230 :                 sChars = sTrimmedChars;
     540             :             }
     541         460 :             uno::Sequence<sal_Int8> aBuffer((sChars.getLength() / 4) * 3 );
     542             :                         sal_Int32 const nCharsDecoded =
     543         230 :                 ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
     544         230 :             sal_uInt32 nStartPos(maDecoded.getLength());
     545         230 :             sal_uInt32 nCount(aBuffer.getLength());
     546         230 :             maDecoded.realloc(nStartPos + nCount);
     547         230 :             sal_Int8* pDecoded = maDecoded.getArray();
     548         230 :             sal_Int8* pBuffer = aBuffer.getArray();
     549       81183 :             for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++)
     550       80953 :                 pDecoded[nStartPos + i] = *pBuffer;
     551         230 :             if( nCharsDecoded != sChars.getLength() )
     552         230 :                 msValue = sChars.copy( nCharsDecoded );
     553         230 :         }
     554             :     }
     555             :     else
     556       40256 :         msValue += rChars;
     557       40486 : }
     558             : 
     559       42587 : void XMLConfigItemContext::EndElement()
     560             : {
     561       42587 :     if (mpBaseContext)
     562             :     {
     563       42587 :         if (IsXMLToken(msType, XML_BOOLEAN))
     564             :         {
     565       25698 :             bool bValue(false);
     566       25698 :             if (IsXMLToken(msValue, XML_TRUE))
     567       10830 :                 bValue = true;
     568       25698 :             mrAny <<= bValue;
     569             :         }
     570       16889 :         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       16889 :         else if (IsXMLToken(msType, XML_SHORT))
     577             :         {
     578        3263 :             sal_Int32 nValue(0);
     579        3263 :                         ::sax::Converter::convertNumber(nValue, msValue);
     580        3263 :             mrAny <<= static_cast<sal_Int16>(nValue);
     581             :         }
     582       13626 :         else if (IsXMLToken(msType, XML_INT))
     583             :         {
     584        7095 :             sal_Int32 nValue(0);
     585        7095 :                         ::sax::Converter::convertNumber(nValue, msValue);
     586        7095 :             mrAny <<= nValue;
     587             :         }
     588        6531 :         else if (IsXMLToken(msType, XML_LONG))
     589             :         {
     590        2497 :             sal_Int64 nValue(msValue.toInt64());
     591        2497 :             mrAny <<= nValue;
     592             :         }
     593        4034 :         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        4034 :         else if (IsXMLToken(msType, XML_STRING))
     600             :         {
     601        3128 :             mrAny <<= msValue;
     602             :         }
     603         906 :         else if (IsXMLToken(msType, XML_DATETIME))
     604             :         {
     605           2 :             util::DateTime aDateTime;
     606           2 :             ::sax::Converter::parseDateTime(aDateTime, 0, msValue);
     607           2 :             mrAny <<= aDateTime;
     608             :         }
     609         904 :         else if (IsXMLToken(msType, XML_BASE64BINARY))
     610             :         {
     611         904 :             mrAny <<= maDecoded;
     612             :         }
     613             :         else {
     614             :             SAL_INFO("xmloff.core",
     615             :                     "XMLConfigItemContext: unknown type: " << msType);
     616             :         }
     617             : 
     618       42587 :         ManipulateConfigItem();
     619             : 
     620       42587 :         mpBaseContext->AddPropertyValue();
     621             :     }
     622             :     else {
     623             :         assert(false && "no BaseContext");
     624             :     }
     625       42587 : }
     626             : 
     627             : /** There are some instances where there is a mismatch between API and
     628             :  * XML mapping of a setting. In this case, this method allows us to
     629             :  * manipulate the values accordingly. */
     630       42587 : void XMLConfigItemContext::ManipulateConfigItem()
     631             : {
     632       42587 :     if( mrItemName == "PrinterIndependentLayout" )
     633             :     {
     634         328 :         OUString sValue;
     635         328 :         mrAny >>= sValue;
     636             : 
     637         328 :         sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION;
     638             : 
     639         328 :         if( sValue == "enabled" || sValue == "low-resolution" )
     640             :         {
     641          46 :             nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION;
     642             :         }
     643         282 :         else if ( sValue == "disabled" )
     644             :         {
     645          15 :             nTmp = document::PrinterIndependentLayout::DISABLED;
     646             :         }
     647             :         // else: default to high_resolution
     648             : 
     649         328 :         mrAny <<= nTmp;
     650             :     }
     651      126733 :     else if( (mrItemName == "ColorTableURL") || (mrItemName == "LineEndTableURL") || (mrItemName == "HatchTableURL")
     652       84386 :           || (mrItemName == "DashTableURL") || (mrItemName == "GradientTableURL") || (mrItemName == "BitmapTableURL") )
     653             :     {
     654             :         try
     655             :         {
     656         264 :             uno::Reference< uno::XComponentContext > xContext( GetImport().GetComponentContext() );
     657         528 :             uno::Reference< util::XStringSubstitution > xStringSubsitution( util::PathSubstitution::create(xContext) );
     658             : 
     659         528 :             OUString aURL;
     660         264 :             mrAny >>= aURL;
     661         264 :             aURL = xStringSubsitution->substituteVariables( aURL, sal_False );
     662         528 :             mrAny <<= aURL;
     663             :         }
     664           0 :         catch( uno::Exception& )
     665             :         {
     666             :         }
     667             :     }
     668       42587 : }
     669             : 
     670         147 : XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
     671             :                                     const ::com::sun::star::uno::Reference<
     672             :                                     ::com::sun::star::xml::sax::XAttributeList>&,
     673             :                                     com::sun::star::uno::Any& rAny,
     674             :                                     XMLConfigBaseContext* pBaseContext)
     675         147 :     : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext)
     676             : {
     677         147 : }
     678             : 
     679         294 : XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext()
     680             : {
     681         294 : }
     682             : 
     683         225 : SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix,
     684             :                                                     const OUString& rLocalName,
     685             :                                                     const ::com::sun::star::uno::Reference<
     686             :                                           ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     687             : {
     688         225 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     689             : }
     690             : 
     691         147 : void XMLConfigItemMapNamedContext::EndElement()
     692             : {
     693         147 :     if (mpBaseContext)
     694             :     {
     695         147 :         mrAny <<= maProps.GetNameContainer();
     696         147 :         mpBaseContext->AddPropertyValue();
     697             :     }
     698             :     else {
     699             :         assert(false && "no BaseContext");
     700             :     }
     701         147 : }
     702             : 
     703         544 : XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx,
     704             :                                     const OUString& rLName,
     705             :                                     const ::com::sun::star::uno::Reference<
     706             :                                     ::com::sun::star::xml::sax::XAttributeList>&,
     707             :                                     com::sun::star::uno::Any& rAny,
     708             :                                     const OUString& rConfigItemName,
     709             :                                     XMLConfigBaseContext* pBaseContext)
     710             :     : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext),
     711         544 :       maConfigItemName( rConfigItemName )
     712             : {
     713         544 : }
     714             : 
     715        1088 : XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext()
     716             : {
     717        1088 : }
     718             : 
     719         562 : SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix,
     720             :                                                     const OUString& rLocalName,
     721             :                                                     const ::com::sun::star::uno::Reference<
     722             :                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
     723             : {
     724         562 :     return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this);
     725             : }
     726             : 
     727         544 : void XMLConfigItemMapIndexedContext::EndElement()
     728             : {
     729         544 :     if (mpBaseContext)
     730             :     {
     731         544 :         if ( maConfigItemName == "ForbiddenCharacters" )
     732             :         {
     733          81 :             uno::Reference< i18n::XForbiddenCharacters > xForbChars;
     734             : 
     735             :             // get the forbidden characters from the document
     736         162 :             uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY );
     737          81 :             if( xFac.is() )
     738             :             {
     739          81 :                 uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( "com.sun.star.document.Settings" ), uno::UNO_QUERY );
     740          81 :                 if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) )
     741             :                 {
     742          81 :                     xProps->getPropertyValue( maConfigItemName ) >>= xForbChars;
     743          81 :                 }
     744             :             }
     745             : 
     746          81 :             if( xForbChars.is() )
     747             :             {
     748             : 
     749          81 :                 uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     750             : 
     751          81 :                 const sal_Int32 nCount = xIndex->getCount();
     752         162 :                 uno::Sequence < beans::PropertyValue > aProps;
     753         180 :                 for (sal_Int32 i = 0; i < nCount; i++)
     754             :                 {
     755          99 :                     if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) )
     756             :                     {
     757             :                         /* FIXME-BCP47: this stupid and counterpart in
     758             :                          * xmloff/source/core/SettingsExportHelper.cxx
     759             :                          * XMLSettingsExportHelper::exportForbiddenCharacters()
     760             :                          * */
     761             : 
     762          99 :                         beans::PropertyValue *pForChar = aProps.getArray();
     763          99 :                         i18n::ForbiddenCharacters aForbid;
     764         198 :                         lang::Locale aLocale;
     765          99 :                         bool bHaveLanguage = false, bHaveCountry = false, bHaveVariant = false,
     766          99 :                              bHaveBegin = false, bHaveEnd = false;
     767             : 
     768         594 :                         for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ )
     769             :                         {
     770         495 :                             if (pForChar->Name == "Language")
     771             :                             {
     772          99 :                                 pForChar->Value >>= aLocale.Language;
     773          99 :                                 bHaveLanguage = true;
     774             :                             }
     775         396 :                             else if (pForChar->Name == "Country")
     776             :                             {
     777          99 :                                 pForChar->Value >>= aLocale.Country;
     778          99 :                                 bHaveCountry = true;
     779             :                             }
     780         297 :                             else if (pForChar->Name == "Variant")
     781             :                             {
     782          99 :                                 pForChar->Value >>= aLocale.Variant;
     783          99 :                                 bHaveVariant = true;
     784             :                             }
     785         198 :                             else if (pForChar->Name == "BeginLine")
     786             :                             {
     787          99 :                                 pForChar->Value >>= aForbid.beginLine;
     788          99 :                                 bHaveBegin = true;
     789             :                             }
     790          99 :                             else if (pForChar->Name == "EndLine")
     791             :                             {
     792          99 :                                 pForChar->Value >>= aForbid.endLine;
     793          99 :                                 bHaveEnd = true;
     794             :                             }
     795         495 :                             pForChar++;
     796             :                         }
     797             : 
     798          99 :                         if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd )
     799             :                         {
     800             :                             try
     801             :                             {
     802          99 :                                 xForbChars->setForbiddenCharacters( aLocale, aForbid );
     803             :                             }
     804           0 :                             catch (uno::Exception const& e)
     805             :                             {
     806             :                                 SAL_WARN("xmloff.core",
     807             :                                     "Exception while importing forbidden characters: " << e.Message);
     808             :                             }
     809          99 :                         }
     810             :                     }
     811          81 :                 }
     812             :             }
     813             :             else
     814             :             {
     815             :                 SAL_WARN("xmloff.core", "could not get the XForbiddenCharacters from document!");
     816           0 :                 mrAny <<= maProps.GetIndexContainer();
     817          81 :             }
     818             :         }
     819         463 :         else if ( maConfigItemName == "Symbols" )
     820             :         {
     821           0 :             uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY );
     822             : 
     823           0 :             const sal_Int32 nCount = xIndex->getCount();
     824           0 :             uno::Sequence < beans::PropertyValue > aProps;
     825           0 :             uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount );
     826             : 
     827           0 :             formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray();
     828             : 
     829           0 :             sal_Int16 nNumFullEntries = 0;
     830             : 
     831           0 :             for ( sal_Int32 i = 0; i < nCount; i++ )
     832             :             {
     833           0 :                 if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) )
     834             :                 {
     835           0 :                     bool bHaveName = false, bHaveExportName = false, bHaveCharSet = false,
     836           0 :                          bHaveFontName = false, bHaveFamily = false, bHavePitch = false,
     837           0 :                          bHaveWeight = false, bHaveItalic = false, bHaveSymbolSet = false,
     838           0 :                          bHaveCharacter = false;
     839           0 :                     beans::PropertyValue *pSymbol = aProps.getArray();
     840             : 
     841           0 :                     for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ )
     842             :                     {
     843           0 :                         if (pSymbol->Name == "Name")
     844             :                         {
     845           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sName;
     846           0 :                             bHaveName = true;
     847             :                         }
     848           0 :                         else if (pSymbol->Name == "ExportName")
     849             :                         {
     850           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName;
     851           0 :                             bHaveExportName = true;
     852             :                         }
     853           0 :                         else if (pSymbol->Name == "FontName")
     854             :                         {
     855           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName;
     856           0 :                             bHaveFontName = true;
     857             :                         }
     858           0 :                         else if (pSymbol->Name == "CharSet")
     859             :                         {
     860           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet;
     861           0 :                             bHaveCharSet = true;
     862             :                         }
     863           0 :                         else if (pSymbol->Name == "Family")
     864             :                         {
     865           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily;
     866           0 :                             bHaveFamily = true;
     867             :                         }
     868           0 :                         else if (pSymbol->Name == "Pitch")
     869             :                         {
     870           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch;
     871           0 :                             bHavePitch = true;
     872             :                         }
     873           0 :                         else if (pSymbol->Name == "Weight")
     874             :                         {
     875           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight;
     876           0 :                             bHaveWeight = true;
     877             :                         }
     878           0 :                         else if (pSymbol->Name == "Italic")
     879             :                         {
     880           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic;
     881           0 :                             bHaveItalic = true;
     882             :                         }
     883           0 :                         else if (pSymbol->Name == "SymbolSet")
     884             :                         {
     885           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet;
     886           0 :                             bHaveSymbolSet = true;
     887             :                         }
     888           0 :                         else if (pSymbol->Name == "Character")
     889             :                         {
     890           0 :                             pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter;
     891           0 :                             bHaveCharacter = true;
     892             :                         }
     893           0 :                         pSymbol++;
     894             :                     }
     895           0 :                     if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter
     896           0 :                          && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet)
     897           0 :                         nNumFullEntries++;
     898             :                 }
     899             :             }
     900           0 :             aSymbolList.realloc (nNumFullEntries);
     901           0 :             mrAny <<= aSymbolList;
     902             :         }
     903             :         else
     904             :         {
     905         463 :             mrAny <<= maProps.GetIndexContainer();
     906             :         }
     907         544 :         mpBaseContext->AddPropertyValue();
     908             :     }
     909             :     else {
     910             :         assert(false && "no BaseContext");
     911             :     }
     912         544 : }
     913             : 
     914             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11