/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_xmloff.hxx" #include #include #include #include #include "xmloff/xmlnmspe.hxx" #include #include #include #ifndef __SGI_STL_LIST #include #endif #include #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; using namespace ::xmloff::token; #define C2U(cChar) ::rtl::OUString::createFromAscii(cChar) //------------------------------------------------------------------ class XMLMyList { std::list aProps; sal_uInt32 nCount; // #110680# ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory; public: // #110680# XMLMyList(const uno::Reference& xServiceFactory); ~XMLMyList(); void push_back(beans::PropertyValue& aProp) { aProps.push_back(aProp); nCount++; } uno::Sequence GetSequence(); uno::Reference GetNameContainer(); uno::Reference GetIndexContainer(); }; // #110680# XMLMyList::XMLMyList(const uno::Reference& xServiceFactory) : nCount(0), mxServiceFactory(xServiceFactory) { DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); } // #110680# XMLMyList::~XMLMyList() { } uno::Sequence XMLMyList::GetSequence() { uno::Sequence aSeq; if(nCount) { DBG_ASSERT(nCount == aProps.size(), "wrong count of PropertyValue"); aSeq.realloc(nCount); beans::PropertyValue* pProps = aSeq.getArray(); std::list::iterator aItr = aProps.begin(); while (aItr != aProps.end()) { *pProps = *aItr; pProps++; aItr++; } } return aSeq; } uno::Reference XMLMyList::GetNameContainer() { uno::Reference xNameContainer; // #110680# // uno::Reference xServiceFactory = comphelper::getProcessServiceFactory(); // DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); if( mxServiceFactory.is() ) { rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.NamedPropertyValues")); xNameContainer = uno::Reference(mxServiceFactory->createInstance(sName), uno::UNO_QUERY); if (xNameContainer.is()) { std::list::iterator aItr = aProps.begin(); while (aItr != aProps.end()) { xNameContainer->insertByName(aItr->Name, aItr->Value); aItr++; } } } return xNameContainer; } uno::Reference XMLMyList::GetIndexContainer() { uno::Reference xIndexContainer; // #110680# // uno::Reference xServiceFactory = comphelper::getProcessServiceFactory(); // DBG_ASSERT( xServiceFactory.is(), "got no service manager" ); if( mxServiceFactory.is() ) { rtl::OUString sName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.IndexedPropertyValues")); xIndexContainer = uno::Reference(mxServiceFactory->createInstance(sName), uno::UNO_QUERY); if (xIndexContainer.is()) { std::list::iterator aItr = aProps.begin(); sal_uInt32 i(0); while (aItr != aProps.end()) { xIndexContainer->insertByIndex(i, aItr->Value); aItr++; i++; } } } return xIndexContainer; } //============================================================================= class XMLConfigBaseContext : public SvXMLImportContext { protected: XMLMyList maProps; beans::PropertyValue maProp; com::sun::star::uno::Any& mrAny; XMLConfigBaseContext* mpBaseContext; public: XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, com::sun::star::uno::Any& rAny, XMLConfigBaseContext* pBaseContext); virtual ~XMLConfigBaseContext(); void AddPropertyValue() { maProps.push_back(maProp); } }; //============================================================================= class XMLConfigItemContext : public SvXMLImportContext { rtl::OUString msType; rtl::OUString msValue; uno::Sequence maDecoded; com::sun::star::uno::Any& mrAny; const rtl::OUString mrItemName; XMLConfigBaseContext* mpBaseContext; public: XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Any& rAny, const rtl::OUString& rItemName, XMLConfigBaseContext* pBaseContext); virtual ~XMLConfigItemContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void Characters( const ::rtl::OUString& rChars ); virtual void EndElement(); virtual void ManipulateConfigItem(); }; //============================================================================= class XMLConfigItemSetContext : public XMLConfigBaseContext { public: XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Any& rAny, XMLConfigBaseContext* pBaseContext); virtual ~XMLConfigItemSetContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; //============================================================================= class XMLConfigItemMapNamedContext : public XMLConfigBaseContext { public: XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Any& rAny, XMLConfigBaseContext* pBaseContext); virtual ~XMLConfigItemMapNamedContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; //============================================================================= class XMLConfigItemMapIndexedContext : public XMLConfigBaseContext { private: rtl::OUString maConfigItemName; public: XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Any& rAny, const rtl::OUString& rConfigItemName, XMLConfigBaseContext* pBaseContext); virtual ~XMLConfigItemMapIndexedContext(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); virtual void EndElement(); }; //============================================================================= SvXMLImportContext *CreateSettingsContext(SvXMLImport& rImport, sal_uInt16 p_nPrefix, const rtl::OUString& rLocalName, const uno::Reference& xAttrList, beans::PropertyValue& rProp, XMLConfigBaseContext* pBaseContext) { SvXMLImportContext *pContext = 0; rProp.Name = rtl::OUString(); sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); rtl::OUString aLocalName; sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); rtl::OUString sValue = xAttrList->getValueByIndex( i ); if (nPrefix == XML_NAMESPACE_CONFIG) { if (IsXMLToken(aLocalName, XML_NAME)) rProp.Name = sValue; } } if (p_nPrefix == XML_NAMESPACE_CONFIG) { if (IsXMLToken(rLocalName, XML_CONFIG_ITEM)) pContext = new XMLConfigItemContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext); else if((IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) || (IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_ENTRY)) ) pContext = new XMLConfigItemSetContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext); else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_NAMED)) pContext = new XMLConfigItemMapNamedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, pBaseContext); else if(IsXMLToken(rLocalName, XML_CONFIG_ITEM_MAP_INDEXED)) pContext = new XMLConfigItemMapIndexedContext(rImport, p_nPrefix, rLocalName, xAttrList, rProp.Value, rProp.Name, pBaseContext); } if( !pContext ) pContext = new SvXMLImportContext( rImport, p_nPrefix, rLocalName ); return pContext; } //============================================================================= namespace { struct SettingsGroup { ::rtl::OUString sGroupName; uno::Any aSettings; SettingsGroup() :sGroupName() ,aSettings() { } SettingsGroup( const ::rtl::OUString& _rGroupName, const uno::Any& _rSettings ) :sGroupName( _rGroupName ) ,aSettings( _rSettings ) { } }; } struct XMLDocumentSettingsContext_Data { com::sun::star::uno::Any aViewProps; com::sun::star::uno::Any aConfigProps; ::std::list< SettingsGroup > aDocSpecificSettings; }; //============================================================================= XMLDocumentSettingsContext::XMLDocumentSettingsContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const uno::Reference& ) : SvXMLImportContext( rImport, nPrfx, rLName ) , m_pData( new XMLDocumentSettingsContext_Data ) { // here are no attributes } XMLDocumentSettingsContext::~XMLDocumentSettingsContext() { } SvXMLImportContext *XMLDocumentSettingsContext::CreateChildContext( sal_uInt16 p_nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext *pContext = 0; rtl::OUString sName; sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); rtl::OUString sValue = xAttrList->getValueByIndex( i ); if (nPrefix == XML_NAMESPACE_CONFIG) { if (IsXMLToken(aLocalName, XML_NAME)) sName = sValue; } } if (p_nPrefix == XML_NAMESPACE_CONFIG) { if (IsXMLToken(rLocalName, XML_CONFIG_ITEM_SET)) { ::rtl::OUString aLocalConfigName; sal_uInt16 nConfigPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sName, &aLocalConfigName ); if( XML_NAMESPACE_OOO == nConfigPrefix ) { if (IsXMLToken(aLocalConfigName, XML_VIEW_SETTINGS)) pContext = new XMLConfigItemSetContext(GetImport(), p_nPrefix, rLocalName, xAttrList, m_pData->aViewProps, NULL); else if (IsXMLToken(aLocalConfigName, XML_CONFIGURATION_SETTINGS)) pContext = new XMLConfigItemSetContext(GetImport(), p_nPrefix, rLocalName, xAttrList, m_pData->aConfigProps, NULL); else { m_pData->aDocSpecificSettings.push_back( SettingsGroup( aLocalConfigName, uno::Any() ) ); ::std::list< SettingsGroup >::reverse_iterator settingsPos = m_pData->aDocSpecificSettings.rbegin(); pContext = new XMLConfigItemSetContext(GetImport(), p_nPrefix, rLocalName, xAttrList, settingsPos->aSettings, NULL); } } } } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName ); return pContext; } void XMLDocumentSettingsContext::EndElement() { uno::Sequence aSeqViewProps; if (m_pData->aViewProps >>= aSeqViewProps) { GetImport().SetViewSettings(aSeqViewProps); sal_Int32 i(aSeqViewProps.getLength() - 1); sal_Bool bFound(sal_False); while((i >= 0) && !bFound) { if (aSeqViewProps[i].Name.compareToAscii("Views") == 0) { bFound = sal_True; uno::Reference xIndexAccess; if (aSeqViewProps[i].Value >>= xIndexAccess) { uno::Reference xViewDataSupplier(GetImport().GetModel(), uno::UNO_QUERY); if (xViewDataSupplier.is()) xViewDataSupplier->setViewData(xIndexAccess); } } else i--; } } sal_Bool bLoadDocPrinter( sal_True ); ::comphelper::ConfigurationHelper::readDirectKey( ::comphelper::getProcessServiceFactory(), C2U("org.openoffice.Office.Common/"), C2U("Save/Document"), C2U("LoadPrinter"), ::comphelper::ConfigurationHelper::E_READONLY ) >>= bLoadDocPrinter; uno::Sequence aSeqConfigProps; if ( m_pData->aConfigProps >>= aSeqConfigProps ) { if ( !bLoadDocPrinter ) { sal_Int32 i = aSeqConfigProps.getLength() - 1; int nFound = 0; while ( ( i >= 0 ) && nFound < 2 ) { rtl::OUString sProp( aSeqConfigProps[i].Name ); if ( sProp.compareToAscii("PrinterName") == 0 ) { rtl::OUString sEmpty; aSeqConfigProps[i].Value = uno::makeAny( sEmpty ); nFound++; } else if ( sProp.compareToAscii("PrinterSetup") == 0 ) { uno::Sequence< sal_Int8 > aEmpty; aSeqConfigProps[i].Value = uno::makeAny( aEmpty ); nFound++; } i--; } } GetImport().SetConfigurationSettings( aSeqConfigProps ); } for ( ::std::list< SettingsGroup >::const_iterator settings = m_pData->aDocSpecificSettings.begin(); settings != m_pData->aDocSpecificSettings.end(); ++settings ) { uno::Sequence< beans::PropertyValue > aDocSettings; OSL_VERIFY( settings->aSettings >>= aDocSettings ); GetImport().SetDocumentSpecificSettings( settings->sGroupName, aDocSettings ); } } //============================================================================= XMLConfigBaseContext::XMLConfigBaseContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, com::sun::star::uno::Any& rTempAny, XMLConfigBaseContext* pTempBaseContext) : SvXMLImportContext( rImport, nPrfx, rLName ), // #110680# maProps(rImport.getServiceFactory()), maProp(), mrAny(rTempAny), mpBaseContext(pTempBaseContext) { } XMLConfigBaseContext::~XMLConfigBaseContext() { } //============================================================================= XMLConfigItemSetContext::XMLConfigItemSetContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>&, com::sun::star::uno::Any& rAny, XMLConfigBaseContext* pBaseContext) : XMLConfigBaseContext( rImport, nPrfx, rLName, rAny, pBaseContext ) { // here are no attributes } XMLConfigItemSetContext::~XMLConfigItemSetContext() { } SvXMLImportContext *XMLConfigItemSetContext::CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); } void XMLConfigItemSetContext::EndElement() { mrAny <<= maProps.GetSequence(); if (mpBaseContext) mpBaseContext->AddPropertyValue(); } //============================================================================= XMLConfigItemContext::XMLConfigItemContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList, com::sun::star::uno::Any& rTempAny, const rtl::OUString& rTempItemName, XMLConfigBaseContext* pTempBaseContext) : SvXMLImportContext(rImport, nPrfx, rLName), mrAny(rTempAny), mrItemName(rTempItemName), mpBaseContext(pTempBaseContext) { sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; for( sal_Int16 i=0; i < nAttrCount; i++ ) { rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); rtl::OUString aLocalName; sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); rtl::OUString sValue = xAttrList->getValueByIndex( i ); if (nPrefix == XML_NAMESPACE_CONFIG) { if (IsXMLToken(aLocalName, XML_TYPE)) msType = sValue; } } } XMLConfigItemContext::~XMLConfigItemContext() { } SvXMLImportContext *XMLConfigItemContext::CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& ) { SvXMLImportContext* pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName); return pContext; } void XMLConfigItemContext::Characters( const ::rtl::OUString& rChars ) { if (IsXMLToken(msType, XML_BASE64BINARY)) { rtl::OUString sTrimmedChars( rChars.trim() ); if( sTrimmedChars.getLength() ) { rtl::OUString sChars; if( !msValue.isEmpty() ) { sChars = msValue; sChars += sTrimmedChars; msValue = rtl::OUString(); } else { sChars = sTrimmedChars; } uno::Sequence aBuffer((sChars.getLength() / 4) * 3 ); sal_Int32 nCharsDecoded = GetImport().GetMM100UnitConverter(). decodeBase64SomeChars( aBuffer, sChars ); sal_uInt32 nStartPos(maDecoded.getLength()); sal_uInt32 nCount(aBuffer.getLength()); maDecoded.realloc(nStartPos + nCount); sal_Int8* pDecoded = maDecoded.getArray(); sal_Int8* pBuffer = aBuffer.getArray(); for (sal_uInt32 i = 0; i < nCount; i++, pBuffer++) pDecoded[nStartPos + i] = *pBuffer; if( nCharsDecoded != sChars.getLength() ) msValue = sChars.copy( nCharsDecoded ); } } else msValue += rChars; } void XMLConfigItemContext::EndElement() { if (mpBaseContext) { if (IsXMLToken(msType, XML_BOOLEAN)) { sal_Bool bValue(sal_False); if (IsXMLToken(msValue, XML_TRUE)) bValue = sal_True; mrAny <<= bValue; } else if (IsXMLToken(msType, XML_BYTE)) { sal_Int32 nValue(0); SvXMLUnitConverter::convertNumber(nValue, msValue); mrAny <<= static_cast(nValue); } else if (IsXMLToken(msType, XML_SHORT)) { sal_Int32 nValue(0); SvXMLUnitConverter::convertNumber(nValue, msValue); mrAny <<= static_cast(nValue); } else if (IsXMLToken(msType, XML_INT)) { sal_Int32 nValue(0); SvXMLUnitConverter::convertNumber(nValue, msValue); mrAny <<= nValue; } else if (IsXMLToken(msType, XML_LONG)) { sal_Int64 nValue(msValue.toInt64()); mrAny <<= nValue; } else if (IsXMLToken(msType, XML_DOUBLE)) { double fValue(0.0); SvXMLUnitConverter::convertDouble(fValue, msValue); mrAny <<= fValue; } else if (IsXMLToken(msType, XML_STRING)) { mrAny <<= msValue; } else if (IsXMLToken(msType, XML_DATETIME)) { util::DateTime aDateTime; SvXMLUnitConverter::convertDateTime(aDateTime, msValue); mrAny <<= aDateTime; } else if (IsXMLToken(msType, XML_BASE64BINARY)) { mrAny <<= maDecoded; } else { DBG_ERROR("wrong type"); } ManipulateConfigItem(); mpBaseContext->AddPropertyValue(); } else { DBG_ERROR("no BaseContext"); } } /** There are some instances where there is a mismatch between API and * XML mapping of a setting. In this case, this method allows us to * manipulate the values accordingly. */ void XMLConfigItemContext::ManipulateConfigItem() { if( mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrinterIndependentLayout" ) ) ) { rtl::OUString sValue; mrAny >>= sValue; sal_Int16 nTmp = document::PrinterIndependentLayout::HIGH_RESOLUTION; if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("enabled")) || sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("low-resolution")) ) { nTmp = document::PrinterIndependentLayout::LOW_RESOLUTION; } else if( sValue.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("disabled")) ) { nTmp = document::PrinterIndependentLayout::DISABLED; } // else: default to high_resolution mrAny <<= nTmp; } else if( (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ColorTableURL" ) ) ) || (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LineEndTableURL" ) ) ) || (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HatchTableURL" ) ) ) || (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DashTableURL" ) ) ) || (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GradientTableURL") ) ) || (mrItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BitmapTableURL" ) ) ) ) { if( GetImport().getServiceFactory().is() ) try { uno::Reference< util::XStringSubstitution > xStringSubsitution( GetImport().getServiceFactory()-> createInstance(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.PathSubstitution" ) ) ), uno::UNO_QUERY ); if( xStringSubsitution.is() ) { rtl::OUString aURL; mrAny >>= aURL; aURL = xStringSubsitution->substituteVariables( aURL, sal_False ); mrAny <<= aURL; } } catch( uno::Exception& ) { } } } //============================================================================= XMLConfigItemMapNamedContext::XMLConfigItemMapNamedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>&, com::sun::star::uno::Any& rAny, XMLConfigBaseContext* pBaseContext) : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext) { } XMLConfigItemMapNamedContext::~XMLConfigItemMapNamedContext() { } SvXMLImportContext *XMLConfigItemMapNamedContext::CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); } void XMLConfigItemMapNamedContext::EndElement() { if (mpBaseContext) { mrAny <<= maProps.GetNameContainer(); mpBaseContext->AddPropertyValue(); } else { DBG_ERROR("no BaseContext"); } } //============================================================================= XMLConfigItemMapIndexedContext::XMLConfigItemMapIndexedContext(SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>&, com::sun::star::uno::Any& rAny, const ::rtl::OUString& rConfigItemName, XMLConfigBaseContext* pBaseContext) : XMLConfigBaseContext(rImport, nPrfx, rLName, rAny, pBaseContext), maConfigItemName( rConfigItemName ) { } XMLConfigItemMapIndexedContext::~XMLConfigItemMapIndexedContext() { } SvXMLImportContext *XMLConfigItemMapIndexedContext::CreateChildContext( sal_uInt16 nPrefix, const rtl::OUString& rLocalName, const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) { return CreateSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList, maProp, this); } void XMLConfigItemMapIndexedContext::EndElement() { if (mpBaseContext) { if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ForbiddenCharacters" ) ) ) { uno::Reference< i18n::XForbiddenCharacters > xForbChars; // get the forbidden characters from the document uno::Reference< lang::XMultiServiceFactory > xFac( GetImport().GetModel(), uno::UNO_QUERY ); if( xFac.is() ) { uno::Reference< beans::XPropertySet > xProps( xFac->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), uno::UNO_QUERY ); if( xProps.is() && xProps->getPropertySetInfo()->hasPropertyByName( maConfigItemName ) ) { xProps->getPropertyValue( maConfigItemName ) >>= xForbChars; } } if( xForbChars.is() ) { uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY ); const sal_Int32 nCount = xIndex->getCount(); uno::Sequence < beans::PropertyValue > aProps; for (sal_Int32 i = 0; i < nCount; i++) { if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_FORBIDDEN_CHARACTER_MAX ) ) { beans::PropertyValue *pForChar = aProps.getArray(); i18n::ForbiddenCharacters aForbid; lang::Locale aLocale; const rtl::OUString sLanguage ( RTL_CONSTASCII_USTRINGPARAM ( "Language" ) ); const rtl::OUString sCountry ( RTL_CONSTASCII_USTRINGPARAM ( "Country" ) ); const rtl::OUString sVariant ( RTL_CONSTASCII_USTRINGPARAM ( "Variant" ) ); const rtl::OUString sBeginLine ( RTL_CONSTASCII_USTRINGPARAM ( "BeginLine" ) ); const rtl::OUString sEndLine ( RTL_CONSTASCII_USTRINGPARAM ( "EndLine" ) ); sal_Bool bHaveLanguage = sal_False, bHaveCountry = sal_False, bHaveVariant = sal_False, bHaveBegin = sal_False, bHaveEnd = sal_False; for ( sal_Int32 j = 0 ; j < XML_FORBIDDEN_CHARACTER_MAX ; j++ ) { if (pForChar->Name.equals (sLanguage ) ) { pForChar->Value >>= aLocale.Language; bHaveLanguage = sal_True; } else if (pForChar->Name.equals (sCountry ) ) { pForChar->Value >>= aLocale.Country; bHaveCountry = sal_True; } else if (pForChar->Name.equals (sVariant ) ) { pForChar->Value >>= aLocale.Variant; bHaveVariant = sal_True; } else if (pForChar->Name.equals (sBeginLine ) ) { pForChar->Value >>= aForbid.beginLine; bHaveBegin = sal_True; } else if (pForChar->Name.equals (sEndLine ) ) { pForChar->Value >>= aForbid.endLine; bHaveEnd = sal_True; } pForChar++; } if ( bHaveLanguage && bHaveCountry && bHaveVariant && bHaveBegin && bHaveEnd ) { try { xForbChars->setForbiddenCharacters( aLocale, aForbid ); } catch( uno::Exception& ) { DBG_ERROR( "Exception while importing forbidden characters" ); } } } } } else { DBG_ERROR( "could not get the XForbiddenCharacters from document!" ); mrAny <<= maProps.GetIndexContainer(); } } else if( maConfigItemName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Symbols" ) ) ) { uno::Reference< container::XIndexAccess > xIndex( maProps.GetIndexContainer(), uno::UNO_QUERY ); const sal_Int32 nCount = xIndex->getCount(); uno::Sequence < beans::PropertyValue > aProps; uno::Sequence < formula::SymbolDescriptor > aSymbolList ( nCount ); formula::SymbolDescriptor *pDescriptor = aSymbolList.getArray(); const rtl::OUString sName ( RTL_CONSTASCII_USTRINGPARAM ( "Name" ) ); const rtl::OUString sExportName ( RTL_CONSTASCII_USTRINGPARAM ( "ExportName" ) ); const rtl::OUString sFontName ( RTL_CONSTASCII_USTRINGPARAM ( "FontName" ) ); const rtl::OUString sSymbolSet ( RTL_CONSTASCII_USTRINGPARAM ( "SymbolSet" ) ); const rtl::OUString sCharacter ( RTL_CONSTASCII_USTRINGPARAM ( "Character" ) ); const rtl::OUString sCharSet ( RTL_CONSTASCII_USTRINGPARAM ( "CharSet" ) ); const rtl::OUString sFamily ( RTL_CONSTASCII_USTRINGPARAM ( "Family" ) ); const rtl::OUString sPitch ( RTL_CONSTASCII_USTRINGPARAM ( "Pitch" ) ); const rtl::OUString sWeight ( RTL_CONSTASCII_USTRINGPARAM ( "Weight" ) ); const rtl::OUString sItalic ( RTL_CONSTASCII_USTRINGPARAM ( "Italic" ) ); sal_Int16 nNumFullEntries = 0; for ( sal_Int32 i = 0; i < nCount; i++ ) { if ((xIndex->getByIndex( i ) >>= aProps) && (aProps.getLength() == XML_SYMBOL_DESCRIPTOR_MAX ) ) { sal_Bool bHaveName = sal_False, bHaveExportName = sal_False, bHaveCharSet = sal_False, bHaveFontName = sal_False, bHaveFamily = sal_False, bHavePitch = sal_False, bHaveWeight = sal_False, bHaveItalic = sal_False, bHaveSymbolSet = sal_False, bHaveCharacter = sal_False; beans::PropertyValue *pSymbol = aProps.getArray(); for ( sal_Int32 j = 0 ; j < XML_SYMBOL_DESCRIPTOR_MAX ; j++ ) { if (pSymbol->Name.equals ( sName ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].sName; bHaveName = sal_True; } else if (pSymbol->Name.equals (sExportName ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].sExportName; bHaveExportName = sal_True; } else if (pSymbol->Name.equals (sFontName ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].sFontName; bHaveFontName = sal_True; } else if (pSymbol->Name.equals (sCharSet ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharSet; bHaveCharSet = sal_True; } else if (pSymbol->Name.equals (sFamily ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nFamily; bHaveFamily = sal_True; } else if (pSymbol->Name.equals (sPitch ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nPitch; bHavePitch = sal_True; } else if (pSymbol->Name.equals (sWeight ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nWeight; bHaveWeight = sal_True; } else if (pSymbol->Name.equals (sItalic ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nItalic; bHaveItalic = sal_True; } else if (pSymbol->Name.equals (sSymbolSet ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].sSymbolSet; bHaveSymbolSet = sal_True; } else if (pSymbol->Name.equals (sCharacter ) ) { pSymbol->Value >>= pDescriptor[nNumFullEntries].nCharacter; bHaveCharacter = sal_True; } pSymbol++; } if ( bHaveName && bHaveExportName && bHaveCharSet && bHaveFontName && bHaveCharacter && bHaveFamily && bHavePitch && bHaveWeight && bHaveItalic && bHaveSymbolSet) nNumFullEntries++; } } aSymbolList.realloc (nNumFullEntries); mrAny <<= aSymbolList; } else { mrAny <<= maProps.GetIndexContainer(); } mpBaseContext->AddPropertyValue(); } else { DBG_ERROR("no BaseContext"); } }