1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 30*cdf0e10cSrcweir #include <rtl/ref.hxx> 31*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 32*cdf0e10cSrcweir #include <com/sun/star/i18n/XCharacterClassification.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/i18n/UnicodeType.hpp> 34*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 35*cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 36*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 37*cdf0e10cSrcweir #include "IgnoreTContext.hxx" 38*cdf0e10cSrcweir #include "RenameElemTContext.hxx" 39*cdf0e10cSrcweir #include "ProcAttrTContext.hxx" 40*cdf0e10cSrcweir #include "ProcAddAttrTContext.hxx" 41*cdf0e10cSrcweir #include "MergeElemTContext.hxx" 42*cdf0e10cSrcweir #include "CreateElemTContext.hxx" 43*cdf0e10cSrcweir #include "MutableAttrList.hxx" 44*cdf0e10cSrcweir #include "TransformerActions.hxx" 45*cdf0e10cSrcweir #include "ElemTransformerAction.hxx" 46*cdf0e10cSrcweir // --> OD 2005-06-29 #i50322# 47*cdf0e10cSrcweir #include "PropertyActionsOOo.hxx" 48*cdf0e10cSrcweir // <-- 49*cdf0e10cSrcweir #ifndef _XMLOFF_TRANSFORMERTOKENMAP_HXX 50*cdf0e10cSrcweir #include "TransformerTokenMap.hxx" 51*cdf0e10cSrcweir #endif 52*cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir #ifndef _XMLOFF_TRANSFORMERBASE_HXX 55*cdf0e10cSrcweir #include "TransformerBase.hxx" 56*cdf0e10cSrcweir #endif 57*cdf0e10cSrcweir #include "TContextVector.hxx" 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir using ::rtl::OUString; 60*cdf0e10cSrcweir using ::rtl::OUStringBuffer; 61*cdf0e10cSrcweir using namespace ::osl; 62*cdf0e10cSrcweir using namespace ::xmloff::token; 63*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 64*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 65*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 66*cdf0e10cSrcweir using namespace ::com::sun::star::i18n; 67*cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax; 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir namespace 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir bool lcl_ConvertAttr( OUString & rOutAttribute, sal_Int32 nParam ) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir bool bResult = false; 76*cdf0e10cSrcweir enum XMLTokenEnum eTokenToRename = 77*cdf0e10cSrcweir static_cast< enum XMLTokenEnum >( nParam & 0xffff ); 78*cdf0e10cSrcweir if( eTokenToRename != XML_TOKEN_INVALID && 79*cdf0e10cSrcweir IsXMLToken( rOutAttribute, eTokenToRename )) 80*cdf0e10cSrcweir { 81*cdf0e10cSrcweir enum XMLTokenEnum eReplacementToken = 82*cdf0e10cSrcweir static_cast< enum XMLTokenEnum >( nParam >> 16 ); 83*cdf0e10cSrcweir rOutAttribute = GetXMLToken( eReplacementToken ); 84*cdf0e10cSrcweir bResult = true; 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir return bResult; 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir } // anonymous namespace 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir XMLTransformerContext *XMLTransformerBase::CreateContext( sal_uInt16 nPrefix, 93*cdf0e10cSrcweir const OUString& rLocalName, const OUString& rQName ) 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir XMLTransformerActions::key_type aKey( nPrefix, rLocalName ); 96*cdf0e10cSrcweir XMLTransformerActions::const_iterator aIter = 97*cdf0e10cSrcweir GetElemActions().find( aKey ); 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir if( !(aIter == GetElemActions().end()) ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir sal_uInt32 nActionType = (*aIter).second.m_nActionType; 102*cdf0e10cSrcweir if( (nActionType & XML_ETACTION_USER_DEFINED) != 0 ) 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir XMLTransformerContext *pContext = 105*cdf0e10cSrcweir CreateUserDefinedContext( (*aIter).second, 106*cdf0e10cSrcweir rQName ); 107*cdf0e10cSrcweir OSL_ENSURE( pContext && !pContext->IsPersistent(), 108*cdf0e10cSrcweir "unknown or not persistent action" ); 109*cdf0e10cSrcweir return pContext; 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir switch( nActionType ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir case XML_ETACTION_COPY_CONTENT: 115*cdf0e10cSrcweir return new XMLIgnoreTransformerContext( *this, rQName, sal_False, 116*cdf0e10cSrcweir sal_False ); 117*cdf0e10cSrcweir case XML_ETACTION_COPY: 118*cdf0e10cSrcweir return new XMLTransformerContext( *this, rQName ); 119*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM: 120*cdf0e10cSrcweir return new XMLRenameElemTransformerContext( *this, rQName, 121*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 122*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1() ); 123*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM_ADD_ATTR: 124*cdf0e10cSrcweir return new XMLRenameElemTransformerContext( *this, rQName, 125*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 126*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1(), 127*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam2(), 128*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam2(), 129*cdf0e10cSrcweir static_cast< XMLTokenEnum >( (*aIter).second.m_nParam3 ) ); 130*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM_PROC_ATTRS: 131*cdf0e10cSrcweir return new XMLProcAttrTransformerContext( *this, rQName, 132*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 133*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1(), 134*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam2 ) ); 135*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM_ADD_PROC_ATTR: 136*cdf0e10cSrcweir return new XMLProcAddAttrTransformerContext( *this, rQName, 137*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 138*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1(), 139*cdf0e10cSrcweir static_cast< sal_uInt16 >( 140*cdf0e10cSrcweir (*aIter).second.m_nParam3 >> 16 ), 141*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam2(), 142*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam2(), 143*cdf0e10cSrcweir static_cast< XMLTokenEnum >( 144*cdf0e10cSrcweir (*aIter).second.m_nParam3 & 0xffff ) ); 145*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM_COND: 146*cdf0e10cSrcweir { 147*cdf0e10cSrcweir const XMLTransformerContext *pCurrent = GetCurrentContext(); 148*cdf0e10cSrcweir if( pCurrent->HasQName( 149*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam2(), 150*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam2() ) ) 151*cdf0e10cSrcweir return new XMLRenameElemTransformerContext( *this, rQName, 152*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 153*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1() ); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir break; 156*cdf0e10cSrcweir case XML_ETACTION_RENAME_ELEM_PROC_ATTRS_COND: 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir const XMLTransformerContext *pCurrent = GetCurrentContext(); 159*cdf0e10cSrcweir if( pCurrent->HasQName( 160*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam3(), 161*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam3() ) ) 162*cdf0e10cSrcweir return new XMLProcAttrTransformerContext( *this, rQName, 163*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 164*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1(), 165*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam2 ) ); 166*cdf0e10cSrcweir else 167*cdf0e10cSrcweir return new XMLProcAttrTransformerContext( *this, rQName, 168*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam2 ) ); 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir case XML_ETACTION_PROC_ATTRS: 171*cdf0e10cSrcweir return new XMLProcAttrTransformerContext( *this, rQName, 172*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam1 ) ); 173*cdf0e10cSrcweir case XML_ETACTION_PROC_ATTRS_COND: 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir const XMLTransformerContext *pCurrent = GetCurrentContext(); 176*cdf0e10cSrcweir if( pCurrent->HasQName( 177*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 178*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1() ) ) 179*cdf0e10cSrcweir return new XMLProcAttrTransformerContext( *this, rQName, 180*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam2 ) ); 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir break; 183*cdf0e10cSrcweir case XML_ETACTION_MOVE_ATTRS_TO_ELEMS: 184*cdf0e10cSrcweir return new XMLCreateElemTransformerContext( *this, rQName, 185*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam1 ) ); 186*cdf0e10cSrcweir case XML_ETACTION_MOVE_ELEMS_TO_ATTRS: 187*cdf0e10cSrcweir return new XMLMergeElemTransformerContext( *this, rQName, 188*cdf0e10cSrcweir static_cast< sal_uInt16 >( (*aIter).second.m_nParam1 ) ); 189*cdf0e10cSrcweir default: 190*cdf0e10cSrcweir OSL_ENSURE( !this, "unknown action" ); 191*cdf0e10cSrcweir break; 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir // default is copying 196*cdf0e10cSrcweir return new XMLTransformerContext( *this, rQName ); 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir XMLTransformerActions *XMLTransformerBase::GetUserDefinedActions( sal_uInt16 ) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir return 0; 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir XMLTransformerBase::XMLTransformerBase( XMLTransformerActionInit *pInit, 205*cdf0e10cSrcweir ::xmloff::token::XMLTokenEnum *pTKMapInit ) 206*cdf0e10cSrcweir throw () : 207*cdf0e10cSrcweir m_pNamespaceMap( new SvXMLNamespaceMap ), 208*cdf0e10cSrcweir m_pReplaceNamespaceMap( new SvXMLNamespaceMap ), 209*cdf0e10cSrcweir m_pContexts( new XMLTransformerContextVector ), 210*cdf0e10cSrcweir m_pElemActions( new XMLTransformerActions( pInit ) ), 211*cdf0e10cSrcweir m_pTokenMap( new XMLTransformerTokenMap( pTKMapInit ) ) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); 214*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_DC), GetXMLToken(XML_N_DC), XML_NAMESPACE_DC ); 215*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_MATH), GetXMLToken(XML_N_MATH), XML_NAMESPACE_MATH ); 216*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); 217*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_DOM), GetXMLToken(XML_N_DOM), XML_NAMESPACE_DOM ); 218*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_OOOW), GetXMLToken(XML_N_OOOW), XML_NAMESPACE_OOOW ); 219*cdf0e10cSrcweir GetNamespaceMap().Add( GetXMLToken(XML_NP_OOOC), GetXMLToken(XML_N_OOOC), XML_NAMESPACE_OOOC ); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir XMLTransformerBase::~XMLTransformerBase() throw () 223*cdf0e10cSrcweir { 224*cdf0e10cSrcweir ResetTokens(); 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir delete m_pNamespaceMap; 227*cdf0e10cSrcweir delete m_pReplaceNamespaceMap; 228*cdf0e10cSrcweir delete m_pContexts; 229*cdf0e10cSrcweir delete m_pElemActions; 230*cdf0e10cSrcweir delete m_pTokenMap; 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::startDocument( void ) 234*cdf0e10cSrcweir throw( SAXException, RuntimeException ) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir m_xHandler->startDocument(); 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::endDocument( void ) 240*cdf0e10cSrcweir throw( SAXException, RuntimeException) 241*cdf0e10cSrcweir { 242*cdf0e10cSrcweir m_xHandler->endDocument(); 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::startElement( const OUString& rName, 246*cdf0e10cSrcweir const Reference< XAttributeList >& rAttrList ) 247*cdf0e10cSrcweir throw(SAXException, RuntimeException) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir SvXMLNamespaceMap *pRewindMap = 0; 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir bool bRect = rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "presentation:show-shape" ) ); 252*cdf0e10cSrcweir (void)bRect; 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir // Process namespace attributes. This must happen before creating the 255*cdf0e10cSrcweir // context, because namespace decaration apply to the element name itself. 256*cdf0e10cSrcweir XMLMutableAttributeList *pMutableAttrList = 0; 257*cdf0e10cSrcweir Reference< XAttributeList > xAttrList( rAttrList ); 258*cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 259*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir const OUString& rAttrName = xAttrList->getNameByIndex( i ); 262*cdf0e10cSrcweir if( ( rAttrName.getLength() >= 5 ) && 263*cdf0e10cSrcweir ( rAttrName.compareTo( GetXMLToken(XML_XMLNS), 5 ) == 0 ) && 264*cdf0e10cSrcweir ( rAttrName.getLength() == 5 || ':' == rAttrName[5] ) ) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir if( !pRewindMap ) 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir pRewindMap = m_pNamespaceMap; 269*cdf0e10cSrcweir m_pNamespaceMap = new SvXMLNamespaceMap( *m_pNamespaceMap ); 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir const OUString& rAttrValue = xAttrList->getValueByIndex( i ); 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir OUString aPrefix( ( rAttrName.getLength() == 5 ) 274*cdf0e10cSrcweir ? OUString() 275*cdf0e10cSrcweir : rAttrName.copy( 6 ) ); 276*cdf0e10cSrcweir // Add namespace, but only if it is known. 277*cdf0e10cSrcweir sal_uInt16 nKey = m_pNamespaceMap->AddIfKnown( aPrefix, rAttrValue ); 278*cdf0e10cSrcweir // If namespace is unknwon, try to match a name with similar 279*cdf0e10cSrcweir // TC Id an version 280*cdf0e10cSrcweir if( XML_NAMESPACE_UNKNOWN == nKey ) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir OUString aTestName( rAttrValue ); 283*cdf0e10cSrcweir if( SvXMLNamespaceMap::NormalizeOasisURN( aTestName ) ) 284*cdf0e10cSrcweir nKey = m_pNamespaceMap->AddIfKnown( aPrefix, aTestName ); 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir // If that namespace is not known, too, add it as unknown 287*cdf0e10cSrcweir if( XML_NAMESPACE_UNKNOWN == nKey ) 288*cdf0e10cSrcweir nKey = m_pNamespaceMap->Add( aPrefix, rAttrValue ); 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir const OUString& rRepName = m_pReplaceNamespaceMap->GetNameByKey( nKey ); 291*cdf0e10cSrcweir if( rRepName.getLength() ) 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir if( !pMutableAttrList ) 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir pMutableAttrList = new XMLMutableAttributeList( xAttrList ); 296*cdf0e10cSrcweir xAttrList = pMutableAttrList; 297*cdf0e10cSrcweir } 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, rRepName ); 300*cdf0e10cSrcweir } 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir } 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir // Get element's namespace and local name. 305*cdf0e10cSrcweir OUString aLocalName; 306*cdf0e10cSrcweir sal_uInt16 nPrefix = 307*cdf0e10cSrcweir m_pNamespaceMap->GetKeyByAttrName( rName, &aLocalName ); 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir // If there are contexts already, call a CreateChildContext at the topmost 310*cdf0e10cSrcweir // context. Otherwise, create a default context. 311*cdf0e10cSrcweir ::rtl::Reference < XMLTransformerContext > xContext; 312*cdf0e10cSrcweir if( !m_pContexts->empty() ) 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir xContext = m_pContexts->back()->CreateChildContext( nPrefix, 315*cdf0e10cSrcweir aLocalName, 316*cdf0e10cSrcweir rName, 317*cdf0e10cSrcweir xAttrList ); 318*cdf0e10cSrcweir } 319*cdf0e10cSrcweir else 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir xContext = CreateContext( nPrefix, aLocalName, rName ); 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir OSL_ENSURE( xContext.is(), "XMLTransformerBase::startElement: missing context" ); 325*cdf0e10cSrcweir if( !xContext.is() ) 326*cdf0e10cSrcweir xContext = new XMLTransformerContext( *this, rName ); 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir // Remeber old namespace map. 329*cdf0e10cSrcweir if( pRewindMap ) 330*cdf0e10cSrcweir xContext->SetRewindMap( pRewindMap ); 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir // Push context on stack. 333*cdf0e10cSrcweir m_pContexts->push_back( xContext ); 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir // Call a startElement at the new context. 336*cdf0e10cSrcweir xContext->StartElement( xAttrList ); 337*cdf0e10cSrcweir } 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::endElement( const OUString& 340*cdf0e10cSrcweir #ifdef DBG_UTIL 341*cdf0e10cSrcweir rName 342*cdf0e10cSrcweir #endif 343*cdf0e10cSrcweir ) 344*cdf0e10cSrcweir throw(SAXException, RuntimeException) 345*cdf0e10cSrcweir { 346*cdf0e10cSrcweir if( !m_pContexts->empty() ) 347*cdf0e10cSrcweir { 348*cdf0e10cSrcweir // Get topmost context 349*cdf0e10cSrcweir ::rtl::Reference< XMLTransformerContext > xContext = m_pContexts->back(); 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir #ifdef DBG_UTIL 352*cdf0e10cSrcweir OSL_ENSURE( xContext->GetQName() == rName, 353*cdf0e10cSrcweir "XMLTransformerBase::endElement: popped context has wrong lname" ); 354*cdf0e10cSrcweir #endif 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir // Call a EndElement at the current context. 357*cdf0e10cSrcweir xContext->EndElement(); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir // and remove it from the stack. 360*cdf0e10cSrcweir m_pContexts->pop_back(); 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir // Get a namespace map to rewind. 363*cdf0e10cSrcweir SvXMLNamespaceMap *pRewindMap = xContext->GetRewindMap(); 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir // Delete the current context. 366*cdf0e10cSrcweir xContext = 0; 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir // Rewind a namespace map. 369*cdf0e10cSrcweir if( pRewindMap ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir delete m_pNamespaceMap; 372*cdf0e10cSrcweir m_pNamespaceMap = pRewindMap; 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::characters( const OUString& rChars ) 378*cdf0e10cSrcweir throw(SAXException, RuntimeException) 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir if( !m_pContexts->empty() ) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir m_pContexts->back()->Characters( rChars ); 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::ignorableWhitespace( const OUString& rWhitespaces ) 387*cdf0e10cSrcweir throw(SAXException, RuntimeException) 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir m_xHandler->ignorableWhitespace( rWhitespaces ); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::processingInstruction( const OUString& rTarget, 393*cdf0e10cSrcweir const OUString& rData ) 394*cdf0e10cSrcweir throw(SAXException, RuntimeException) 395*cdf0e10cSrcweir { 396*cdf0e10cSrcweir m_xHandler->processingInstruction( rTarget, rData ); 397*cdf0e10cSrcweir } 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::setDocumentLocator( const Reference< XLocator >& rLocator ) 400*cdf0e10cSrcweir throw(SAXException, RuntimeException) 401*cdf0e10cSrcweir { 402*cdf0e10cSrcweir m_xLocator = rLocator; 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir // XExtendedDocumentHandler 406*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::startCDATA( void ) throw(SAXException, RuntimeException) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir if( m_xExtHandler.is() ) 409*cdf0e10cSrcweir m_xExtHandler->startCDATA(); 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir 412*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::endCDATA( void ) throw(RuntimeException) 413*cdf0e10cSrcweir { 414*cdf0e10cSrcweir if( m_xExtHandler.is() ) 415*cdf0e10cSrcweir m_xExtHandler->endCDATA(); 416*cdf0e10cSrcweir } 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::comment( const OUString& rComment ) 419*cdf0e10cSrcweir throw(SAXException, RuntimeException) 420*cdf0e10cSrcweir { 421*cdf0e10cSrcweir if( m_xExtHandler.is() ) 422*cdf0e10cSrcweir m_xExtHandler->comment( rComment ); 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::allowLineBreak( void ) 426*cdf0e10cSrcweir throw(SAXException, RuntimeException) 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir if( m_xExtHandler.is() ) 429*cdf0e10cSrcweir m_xExtHandler->allowLineBreak(); 430*cdf0e10cSrcweir } 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::unknown( const OUString& rString ) 433*cdf0e10cSrcweir throw(SAXException, RuntimeException) 434*cdf0e10cSrcweir { 435*cdf0e10cSrcweir if( m_xExtHandler.is() ) 436*cdf0e10cSrcweir m_xExtHandler->unknown( rString ); 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir // XInitialize 440*cdf0e10cSrcweir void SAL_CALL XMLTransformerBase::initialize( const Sequence< Any >& aArguments ) 441*cdf0e10cSrcweir throw(Exception, RuntimeException) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir const sal_Int32 nAnyCount = aArguments.getLength(); 444*cdf0e10cSrcweir const Any* pAny = aArguments.getConstArray(); 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir for( sal_Int32 nIndex = 0; nIndex < nAnyCount; nIndex++, pAny++ ) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir // #b6236750# use isAssignableFrom instead of comparing the types to 449*cdf0e10cSrcweir // allow XExtendedDocumentHandler instead of XDocumentHandler (used in 450*cdf0e10cSrcweir // writeOasis2OOoLibraryElement in sfx2). 451*cdf0e10cSrcweir // The Any shift operator can't be used to query the type because it 452*cdf0e10cSrcweir // uses queryInterface, and the model also has a XPropertySet interface. 453*cdf0e10cSrcweir 454*cdf0e10cSrcweir // document handler 455*cdf0e10cSrcweir if( ::getCppuType( (const Reference< XDocumentHandler >*) 0 ).isAssignableFrom( pAny->getValueType() ) ) 456*cdf0e10cSrcweir m_xHandler.set( *pAny, UNO_QUERY ); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir // property set to transport data across 459*cdf0e10cSrcweir if( ::getCppuType( (const Reference< XPropertySet >*) 0 ).isAssignableFrom( pAny->getValueType() ) ) 460*cdf0e10cSrcweir m_xPropSet.set( *pAny, UNO_QUERY ); 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir // xmodel 463*cdf0e10cSrcweir if( ::getCppuType( (const Reference< ::com::sun::star::frame::XModel >*) 0 ).isAssignableFrom( pAny->getValueType() ) ) 464*cdf0e10cSrcweir mxModel.set( *pAny, UNO_QUERY ); 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir if( m_xPropSet.is() ) 468*cdf0e10cSrcweir { 469*cdf0e10cSrcweir Any aAny; 470*cdf0e10cSrcweir OUString sRelPath, sName; 471*cdf0e10cSrcweir Reference< XPropertySetInfo > xPropSetInfo = 472*cdf0e10cSrcweir m_xPropSet->getPropertySetInfo(); 473*cdf0e10cSrcweir OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("StreamRelPath" ) ); 474*cdf0e10cSrcweir if( xPropSetInfo->hasPropertyByName(sPropName) ) 475*cdf0e10cSrcweir { 476*cdf0e10cSrcweir aAny = m_xPropSet->getPropertyValue(sPropName); 477*cdf0e10cSrcweir aAny >>= sRelPath; 478*cdf0e10cSrcweir } 479*cdf0e10cSrcweir sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("StreamName" ) ); 480*cdf0e10cSrcweir if( xPropSetInfo->hasPropertyByName(sPropName) ) 481*cdf0e10cSrcweir { 482*cdf0e10cSrcweir aAny = m_xPropSet->getPropertyValue(sPropName); 483*cdf0e10cSrcweir aAny >>= sName; 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir if( sName.getLength() ) 486*cdf0e10cSrcweir { 487*cdf0e10cSrcweir m_aExtPathPrefix = OUString( RTL_CONSTASCII_USTRINGPARAM("../" ) ); 488*cdf0e10cSrcweir 489*cdf0e10cSrcweir // If there is a rel path within a package, then append 490*cdf0e10cSrcweir // additional '../'. If the rel path contains an ':', then it is 491*cdf0e10cSrcweir // an absolute URI (or invalid URI, because zip files don't 492*cdf0e10cSrcweir // permit ':'), and it will be ignored. 493*cdf0e10cSrcweir if( sRelPath.getLength() ) 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir sal_Int32 nColPos = sRelPath.indexOf( ':' ); 496*cdf0e10cSrcweir OSL_ENSURE( -1 == nColPos, 497*cdf0e10cSrcweir "StreamRelPath contains ':', absolute URI?" ); 498*cdf0e10cSrcweir 499*cdf0e10cSrcweir if( -1 == nColPos ) 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir OUString sTmp = m_aExtPathPrefix; 502*cdf0e10cSrcweir sal_Int32 nPos = 0; 503*cdf0e10cSrcweir do 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir m_aExtPathPrefix += sTmp; 506*cdf0e10cSrcweir nPos = sRelPath.indexOf( '/', nPos + 1 ); 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir while( -1 != nPos ); 509*cdf0e10cSrcweir } 510*cdf0e10cSrcweir } 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir } 514*cdf0e10cSrcweir } 515*cdf0e10cSrcweir 516*cdf0e10cSrcweir static MapUnit lcl_getUnit( const OUString& rValue ) 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir MapUnit nDestUnit; 519*cdf0e10cSrcweir if( rValue.endsWithIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "cm" ) ) ) 520*cdf0e10cSrcweir nDestUnit = MAP_CM; 521*cdf0e10cSrcweir else if ( rValue.endsWithIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "mm" ) ) ) 522*cdf0e10cSrcweir nDestUnit = MAP_MM; 523*cdf0e10cSrcweir else 524*cdf0e10cSrcweir nDestUnit = MAP_INCH; 525*cdf0e10cSrcweir return nDestUnit; 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir XMLMutableAttributeList *XMLTransformerBase::ProcessAttrList( 529*cdf0e10cSrcweir Reference< XAttributeList >& rAttrList, sal_uInt16 nActionMap, 530*cdf0e10cSrcweir sal_Bool bClone ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir XMLMutableAttributeList *pMutableAttrList = 0; 533*cdf0e10cSrcweir XMLTransformerActions *pActions = GetUserDefinedActions( nActionMap ); 534*cdf0e10cSrcweir OSL_ENSURE( pActions, "go no actions" ); 535*cdf0e10cSrcweir if( pActions ) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0; 538*cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; ++i ) 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir const OUString& rAttrName = rAttrList->getNameByIndex( i ); 541*cdf0e10cSrcweir const OUString& rAttrValue = rAttrList->getValueByIndex( i ); 542*cdf0e10cSrcweir OUString aLocalName; 543*cdf0e10cSrcweir sal_uInt16 nPrefix = GetNamespaceMap().GetKeyByAttrName( rAttrName, 544*cdf0e10cSrcweir &aLocalName ); 545*cdf0e10cSrcweir 546*cdf0e10cSrcweir XMLTransformerActions::key_type aKey( nPrefix, aLocalName ); 547*cdf0e10cSrcweir XMLTransformerActions::const_iterator aIter = 548*cdf0e10cSrcweir pActions->find( aKey ); 549*cdf0e10cSrcweir if( !(aIter == pActions->end() ) ) 550*cdf0e10cSrcweir { 551*cdf0e10cSrcweir if( !pMutableAttrList ) 552*cdf0e10cSrcweir { 553*cdf0e10cSrcweir pMutableAttrList = new XMLMutableAttributeList( rAttrList, 554*cdf0e10cSrcweir bClone ); 555*cdf0e10cSrcweir rAttrList = pMutableAttrList; 556*cdf0e10cSrcweir } 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir sal_uInt32 nAction = (*aIter).second.m_nActionType; 559*cdf0e10cSrcweir sal_Bool bRename = sal_False; 560*cdf0e10cSrcweir switch( nAction ) 561*cdf0e10cSrcweir { 562*cdf0e10cSrcweir case XML_ATACTION_RENAME: 563*cdf0e10cSrcweir bRename = sal_True; 564*cdf0e10cSrcweir break; 565*cdf0e10cSrcweir case XML_ATACTION_COPY: 566*cdf0e10cSrcweir break; 567*cdf0e10cSrcweir case XML_ATACTION_REMOVE: 568*cdf0e10cSrcweir case XML_ATACTION_STYLE_DISPLAY_NAME: 569*cdf0e10cSrcweir pMutableAttrList->RemoveAttributeByIndex( i ); 570*cdf0e10cSrcweir --i; 571*cdf0e10cSrcweir --nAttrCount; 572*cdf0e10cSrcweir break; 573*cdf0e10cSrcweir case XML_ATACTION_RENAME_IN2INCH: 574*cdf0e10cSrcweir bRename = sal_True; 575*cdf0e10cSrcweir case XML_ATACTION_IN2INCH: 576*cdf0e10cSrcweir { 577*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 578*cdf0e10cSrcweir if( ReplaceSingleInWithInch( aAttrValue ) ) 579*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 580*cdf0e10cSrcweir } 581*cdf0e10cSrcweir break; 582*cdf0e10cSrcweir case XML_ATACTION_INS2INCHS: 583*cdf0e10cSrcweir { 584*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 585*cdf0e10cSrcweir if( ReplaceInWithInch( aAttrValue ) ) 586*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir break; 589*cdf0e10cSrcweir case XML_ATACTION_RENAME_INCH2IN: 590*cdf0e10cSrcweir bRename = sal_True; 591*cdf0e10cSrcweir case XML_ATACTION_INCH2IN: 592*cdf0e10cSrcweir { 593*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 594*cdf0e10cSrcweir if( ReplaceSingleInchWithIn( aAttrValue ) ) 595*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir break; 598*cdf0e10cSrcweir case XML_ATACTION_INCHS2INS: 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 601*cdf0e10cSrcweir if( ReplaceInchWithIn( aAttrValue ) ) 602*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir break; 605*cdf0e10cSrcweir case XML_ATACTION_TWIPS2IN: 606*cdf0e10cSrcweir { 607*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 608*cdf0e10cSrcweir 609*cdf0e10cSrcweir XMLTransformerBase::ReplaceSingleInchWithIn( aAttrValue ); 610*cdf0e10cSrcweir if( isWriter() ) 611*cdf0e10cSrcweir { 612*cdf0e10cSrcweir MapUnit nDestUnit = lcl_getUnit( aAttrValue ); 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir // convert twips value to inch 615*cdf0e10cSrcweir sal_Int32 nMeasure; 616*cdf0e10cSrcweir if( SvXMLUnitConverter::convertMeasure(nMeasure, aAttrValue, MAP_100TH_MM ) ) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir // --> OD 2004-10-29 #i13778#,#i36248# 620*cdf0e10cSrcweir // apply correct twip-to-1/100mm 621*cdf0e10cSrcweir nMeasure = (sal_Int32)( nMeasure >= 0 622*cdf0e10cSrcweir ? ((nMeasure*127+36)/72) 623*cdf0e10cSrcweir : ((nMeasure*127-36)/72) ); 624*cdf0e10cSrcweir // <-- 625*cdf0e10cSrcweir 626*cdf0e10cSrcweir rtl::OUStringBuffer aBuffer; 627*cdf0e10cSrcweir SvXMLUnitConverter::convertMeasure( aBuffer, nMeasure, MAP_100TH_MM, nDestUnit ); 628*cdf0e10cSrcweir aAttrValue = aBuffer.makeStringAndClear(); 629*cdf0e10cSrcweir } 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 633*cdf0e10cSrcweir } 634*cdf0e10cSrcweir break; 635*cdf0e10cSrcweir case XML_ATACTION_RENAME_DECODE_STYLE_NAME_REF: 636*cdf0e10cSrcweir bRename = sal_True; 637*cdf0e10cSrcweir case XML_ATACTION_DECODE_STYLE_NAME: 638*cdf0e10cSrcweir case XML_ATACTION_DECODE_STYLE_NAME_REF: 639*cdf0e10cSrcweir { 640*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 641*cdf0e10cSrcweir if( DecodeStyleName(aAttrValue) ) 642*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 643*cdf0e10cSrcweir } 644*cdf0e10cSrcweir break; 645*cdf0e10cSrcweir case XML_ATACTION_ENCODE_STYLE_NAME: 646*cdf0e10cSrcweir { 647*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 648*cdf0e10cSrcweir if( EncodeStyleName(aAttrValue) ) 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 651*cdf0e10cSrcweir OUString aNewAttrQName( 652*cdf0e10cSrcweir GetNamespaceMap().GetQNameByKey( 653*cdf0e10cSrcweir nPrefix, 654*cdf0e10cSrcweir ::xmloff::token::GetXMLToken( 655*cdf0e10cSrcweir XML_DISPLAY_NAME ) ) ); 656*cdf0e10cSrcweir pMutableAttrList->AddAttribute( aNewAttrQName, 657*cdf0e10cSrcweir rAttrValue ); 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir break; 661*cdf0e10cSrcweir case XML_ATACTION_RENAME_ENCODE_STYLE_NAME_REF: 662*cdf0e10cSrcweir bRename = sal_True; 663*cdf0e10cSrcweir case XML_ATACTION_ENCODE_STYLE_NAME_REF: 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 666*cdf0e10cSrcweir if( EncodeStyleName(aAttrValue) ) 667*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 668*cdf0e10cSrcweir } 669*cdf0e10cSrcweir break; 670*cdf0e10cSrcweir case XML_ATACTION_RENAME_NEG_PERCENT: 671*cdf0e10cSrcweir bRename = sal_True; 672*cdf0e10cSrcweir case XML_ATACTION_NEG_PERCENT: 673*cdf0e10cSrcweir { 674*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 675*cdf0e10cSrcweir if( NegPercent( aAttrValue ) ) 676*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 677*cdf0e10cSrcweir } 678*cdf0e10cSrcweir break; 679*cdf0e10cSrcweir case XML_ATACTION_RENAME_ADD_NAMESPACE_PREFIX: 680*cdf0e10cSrcweir bRename = sal_True; 681*cdf0e10cSrcweir case XML_ATACTION_ADD_NAMESPACE_PREFIX: 682*cdf0e10cSrcweir { 683*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 684*cdf0e10cSrcweir sal_uInt16 nValPrefix = 685*cdf0e10cSrcweir static_cast<sal_uInt16>( 686*cdf0e10cSrcweir bRename ? (*aIter).second.m_nParam2 687*cdf0e10cSrcweir : (*aIter).second.m_nParam1); 688*cdf0e10cSrcweir if( AddNamespacePrefix( aAttrValue, nValPrefix ) ) 689*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 690*cdf0e10cSrcweir } 691*cdf0e10cSrcweir break; 692*cdf0e10cSrcweir case XML_ATACTION_ADD_APP_NAMESPACE_PREFIX: 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 695*cdf0e10cSrcweir sal_uInt16 nValPrefix = 696*cdf0e10cSrcweir static_cast<sal_uInt16>((*aIter).second.m_nParam1); 697*cdf0e10cSrcweir if( IsXMLToken( GetClass(), XML_SPREADSHEET ) ) 698*cdf0e10cSrcweir nValPrefix = XML_NAMESPACE_OOOC; 699*cdf0e10cSrcweir else if( IsXMLToken( GetClass(), XML_TEXT ) ) 700*cdf0e10cSrcweir nValPrefix = XML_NAMESPACE_OOOW; 701*cdf0e10cSrcweir if( AddNamespacePrefix( aAttrValue, nValPrefix ) ) 702*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir break; 705*cdf0e10cSrcweir case XML_ATACTION_RENAME_REMOVE_NAMESPACE_PREFIX: 706*cdf0e10cSrcweir bRename = sal_True; 707*cdf0e10cSrcweir case XML_ATACTION_REMOVE_NAMESPACE_PREFIX: 708*cdf0e10cSrcweir { 709*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 710*cdf0e10cSrcweir sal_uInt16 nValPrefix = 711*cdf0e10cSrcweir static_cast<sal_uInt16>( 712*cdf0e10cSrcweir bRename ? (*aIter).second.m_nParam2 713*cdf0e10cSrcweir : (*aIter).second.m_nParam1); 714*cdf0e10cSrcweir if( RemoveNamespacePrefix( aAttrValue, nValPrefix ) ) 715*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 716*cdf0e10cSrcweir } 717*cdf0e10cSrcweir break; 718*cdf0e10cSrcweir case XML_ATACTION_REMOVE_ANY_NAMESPACE_PREFIX: 719*cdf0e10cSrcweir { 720*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 721*cdf0e10cSrcweir if( RemoveNamespacePrefix( aAttrValue ) ) 722*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 723*cdf0e10cSrcweir } 724*cdf0e10cSrcweir break; 725*cdf0e10cSrcweir case XML_ATACTION_URI_OOO: 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 728*cdf0e10cSrcweir if( ConvertURIToOASIS( aAttrValue, 729*cdf0e10cSrcweir static_cast< sal_Bool >((*aIter).second.m_nParam1))) 730*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 731*cdf0e10cSrcweir } 732*cdf0e10cSrcweir break; 733*cdf0e10cSrcweir case XML_ATACTION_URI_OASIS: 734*cdf0e10cSrcweir { 735*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 736*cdf0e10cSrcweir if( ConvertURIToOOo( aAttrValue, 737*cdf0e10cSrcweir static_cast< sal_Bool >((*aIter).second.m_nParam1))) 738*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir break; 741*cdf0e10cSrcweir case XML_ATACTION_RENAME_ATTRIBUTE: 742*cdf0e10cSrcweir { 743*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 744*cdf0e10cSrcweir RenameAttributeValue( 745*cdf0e10cSrcweir aAttrValue, 746*cdf0e10cSrcweir (*aIter).second.m_nParam1, 747*cdf0e10cSrcweir (*aIter).second.m_nParam2, 748*cdf0e10cSrcweir (*aIter).second.m_nParam3 ); 749*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 750*cdf0e10cSrcweir } 751*cdf0e10cSrcweir break; 752*cdf0e10cSrcweir case XML_ATACTION_RNG2ISO_DATETIME: 753*cdf0e10cSrcweir { 754*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 755*cdf0e10cSrcweir if( ConvertRNGDateTimeToISO( aAttrValue )) 756*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 757*cdf0e10cSrcweir } 758*cdf0e10cSrcweir break; 759*cdf0e10cSrcweir case XML_ATACTION_RENAME_RNG2ISO_DATETIME: 760*cdf0e10cSrcweir { 761*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 762*cdf0e10cSrcweir if( ConvertRNGDateTimeToISO( aAttrValue )) 763*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 764*cdf0e10cSrcweir bRename = sal_True; 765*cdf0e10cSrcweir } 766*cdf0e10cSrcweir break; 767*cdf0e10cSrcweir case XML_ATACTION_IN2TWIPS: 768*cdf0e10cSrcweir { 769*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 770*cdf0e10cSrcweir XMLTransformerBase::ReplaceSingleInWithInch( aAttrValue ); 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir if( isWriter() ) 773*cdf0e10cSrcweir { 774*cdf0e10cSrcweir MapUnit nDestUnit = lcl_getUnit( aAttrValue ); 775*cdf0e10cSrcweir 776*cdf0e10cSrcweir // convert inch value to twips and export as faked inch 777*cdf0e10cSrcweir sal_Int32 nMeasure; 778*cdf0e10cSrcweir if( SvXMLUnitConverter::convertMeasure(nMeasure, aAttrValue, MAP_100TH_MM ) ) 779*cdf0e10cSrcweir { 780*cdf0e10cSrcweir 781*cdf0e10cSrcweir // --> OD 2004-10-29 #i13778#,#i36248# 782*cdf0e10cSrcweir // apply correct 1/100mm-to-twip conversion 783*cdf0e10cSrcweir nMeasure = (sal_Int32)( nMeasure >= 0 784*cdf0e10cSrcweir ? ((nMeasure*72+63)/127) 785*cdf0e10cSrcweir : ((nMeasure*72-63)/127) ); 786*cdf0e10cSrcweir // <-- 787*cdf0e10cSrcweir 788*cdf0e10cSrcweir OUStringBuffer aBuffer; 789*cdf0e10cSrcweir SvXMLUnitConverter::convertMeasure( aBuffer, nMeasure, MAP_100TH_MM, nDestUnit ); 790*cdf0e10cSrcweir aAttrValue = aBuffer.makeStringAndClear(); 791*cdf0e10cSrcweir } 792*cdf0e10cSrcweir } 793*cdf0e10cSrcweir 794*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 795*cdf0e10cSrcweir } 796*cdf0e10cSrcweir break; 797*cdf0e10cSrcweir case XML_ATACTION_SVG_WIDTH_HEIGHT_OOO: 798*cdf0e10cSrcweir { 799*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 800*cdf0e10cSrcweir ReplaceSingleInchWithIn( aAttrValue ); 801*cdf0e10cSrcweir 802*cdf0e10cSrcweir MapUnit nDestUnit = lcl_getUnit( aAttrValue ); 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir sal_Int32 nMeasure; 805*cdf0e10cSrcweir if( SvXMLUnitConverter::convertMeasure(nMeasure, aAttrValue, MAP_100TH_MM ) ) 806*cdf0e10cSrcweir { 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir if( nMeasure > 0 ) 809*cdf0e10cSrcweir nMeasure -= 1; 810*cdf0e10cSrcweir else if( nMeasure < 0 ) 811*cdf0e10cSrcweir nMeasure += 1; 812*cdf0e10cSrcweir 813*cdf0e10cSrcweir 814*cdf0e10cSrcweir OUStringBuffer aBuffer; 815*cdf0e10cSrcweir SvXMLUnitConverter::convertMeasure( aBuffer, nMeasure, MAP_100TH_MM, nDestUnit ); 816*cdf0e10cSrcweir aAttrValue = aBuffer.makeStringAndClear(); 817*cdf0e10cSrcweir } 818*cdf0e10cSrcweir 819*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 820*cdf0e10cSrcweir } 821*cdf0e10cSrcweir break; 822*cdf0e10cSrcweir case XML_ATACTION_SVG_WIDTH_HEIGHT_OASIS: 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 825*cdf0e10cSrcweir ReplaceSingleInWithInch( aAttrValue ); 826*cdf0e10cSrcweir 827*cdf0e10cSrcweir MapUnit nDestUnit = lcl_getUnit( aAttrValue ); 828*cdf0e10cSrcweir 829*cdf0e10cSrcweir sal_Int32 nMeasure; 830*cdf0e10cSrcweir if( SvXMLUnitConverter::convertMeasure(nMeasure, aAttrValue, MAP_100TH_MM ) ) 831*cdf0e10cSrcweir { 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir if( nMeasure > 0 ) 834*cdf0e10cSrcweir nMeasure += 1; 835*cdf0e10cSrcweir else if( nMeasure < 0 ) 836*cdf0e10cSrcweir nMeasure -= 1; 837*cdf0e10cSrcweir 838*cdf0e10cSrcweir 839*cdf0e10cSrcweir OUStringBuffer aBuffer; 840*cdf0e10cSrcweir SvXMLUnitConverter::convertMeasure( aBuffer, nMeasure, MAP_100TH_MM, nDestUnit ); 841*cdf0e10cSrcweir aAttrValue = aBuffer.makeStringAndClear(); 842*cdf0e10cSrcweir } 843*cdf0e10cSrcweir 844*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 845*cdf0e10cSrcweir } 846*cdf0e10cSrcweir break; 847*cdf0e10cSrcweir case XML_ATACTION_DECODE_ID: 848*cdf0e10cSrcweir { 849*cdf0e10cSrcweir OUString aAttrValue; 850*cdf0e10cSrcweir 851*cdf0e10cSrcweir const sal_Int32 nLen = rAttrValue.getLength(); 852*cdf0e10cSrcweir OUStringBuffer aBuffer; 853*cdf0e10cSrcweir 854*cdf0e10cSrcweir sal_Int32 pos; 855*cdf0e10cSrcweir for( pos = 0; pos < nLen; pos++ ) 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir sal_Unicode c = rAttrValue[pos]; 858*cdf0e10cSrcweir if( (c >= '0') && (c <= '9') ) 859*cdf0e10cSrcweir aBuffer.append( c ); 860*cdf0e10cSrcweir else 861*cdf0e10cSrcweir aBuffer.append( (sal_Int32)c ); 862*cdf0e10cSrcweir } 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aBuffer.makeStringAndClear() ); 865*cdf0e10cSrcweir } 866*cdf0e10cSrcweir break; 867*cdf0e10cSrcweir // --> OD 2005-06-10 #i50322# - special handling for the 868*cdf0e10cSrcweir // transparency of writer background graphics. 869*cdf0e10cSrcweir case XML_ATACTION_WRITER_BACK_GRAPHIC_TRANSPARENCY: 870*cdf0e10cSrcweir { 871*cdf0e10cSrcweir // determine, if it's the transparency of a document style 872*cdf0e10cSrcweir XMLTransformerContext* pFirstContext = (*m_pContexts)[0].get(); 873*cdf0e10cSrcweir OUString aFirstContextLocalName; 874*cdf0e10cSrcweir /* sal_uInt16 nFirstContextPrefix = */ 875*cdf0e10cSrcweir GetNamespaceMap().GetKeyByAttrName( pFirstContext->GetQName(), 876*cdf0e10cSrcweir &aFirstContextLocalName ); 877*cdf0e10cSrcweir bool bIsDocumentStyle( 878*cdf0e10cSrcweir ::xmloff::token::IsXMLToken( aFirstContextLocalName, 879*cdf0e10cSrcweir XML_DOCUMENT_STYLES ) ); 880*cdf0e10cSrcweir // no conversion of transparency value for document 881*cdf0e10cSrcweir // styles, because former OpenOffice.org version writes 882*cdf0e10cSrcweir // writes always a transparency value of 100% and doesn't 883*cdf0e10cSrcweir // read the value. Thus, it's intepreted as 0% 884*cdf0e10cSrcweir if ( !bIsDocumentStyle ) 885*cdf0e10cSrcweir { 886*cdf0e10cSrcweir OUString aAttrValue( rAttrValue ); 887*cdf0e10cSrcweir NegPercent(aAttrValue); 888*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, aAttrValue ); 889*cdf0e10cSrcweir } 890*cdf0e10cSrcweir bRename = sal_True; 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir break; 893*cdf0e10cSrcweir // <-- 894*cdf0e10cSrcweir case XML_ATACTION_SHAPEID: 895*cdf0e10cSrcweir { 896*cdf0e10cSrcweir OUString sNewValue( RTL_CONSTASCII_USTRINGPARAM( "shape" ) ); 897*cdf0e10cSrcweir sNewValue += rAttrValue; 898*cdf0e10cSrcweir pMutableAttrList->SetValueByIndex( i, sNewValue ); 899*cdf0e10cSrcweir break; 900*cdf0e10cSrcweir } 901*cdf0e10cSrcweir 902*cdf0e10cSrcweir default: 903*cdf0e10cSrcweir OSL_ENSURE( !this, "unknown action" ); 904*cdf0e10cSrcweir break; 905*cdf0e10cSrcweir } 906*cdf0e10cSrcweir 907*cdf0e10cSrcweir if( bRename ) 908*cdf0e10cSrcweir { 909*cdf0e10cSrcweir OUString aNewAttrQName( 910*cdf0e10cSrcweir GetNamespaceMap().GetQNameByKey( 911*cdf0e10cSrcweir (*aIter).second.GetQNamePrefixFromParam1(), 912*cdf0e10cSrcweir ::xmloff::token::GetXMLToken( 913*cdf0e10cSrcweir (*aIter).second.GetQNameTokenFromParam1()) ) ); 914*cdf0e10cSrcweir pMutableAttrList->RenameAttributeByIndex( i, 915*cdf0e10cSrcweir aNewAttrQName ); 916*cdf0e10cSrcweir } 917*cdf0e10cSrcweir } 918*cdf0e10cSrcweir } 919*cdf0e10cSrcweir } 920*cdf0e10cSrcweir 921*cdf0e10cSrcweir return pMutableAttrList; 922*cdf0e10cSrcweir } 923*cdf0e10cSrcweir 924*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ReplaceSingleInchWithIn( OUString& rValue ) 925*cdf0e10cSrcweir { 926*cdf0e10cSrcweir sal_Bool bRet = sal_False; 927*cdf0e10cSrcweir sal_Int32 nPos = rValue.getLength(); 928*cdf0e10cSrcweir while( nPos && rValue[nPos-1] <= ' ' ) 929*cdf0e10cSrcweir --nPos; 930*cdf0e10cSrcweir if( nPos > 2 && 931*cdf0e10cSrcweir ('c'==rValue[nPos-2] || 'C'==rValue[nPos-2]) && 932*cdf0e10cSrcweir ('h'==rValue[nPos-1] || 'H'==rValue[nPos-1]) ) 933*cdf0e10cSrcweir { 934*cdf0e10cSrcweir rValue =rValue.copy( 0, nPos-2 ); 935*cdf0e10cSrcweir bRet = sal_True; 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir 938*cdf0e10cSrcweir return bRet; 939*cdf0e10cSrcweir } 940*cdf0e10cSrcweir 941*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ReplaceInchWithIn( OUString& rValue ) 942*cdf0e10cSrcweir { 943*cdf0e10cSrcweir sal_Bool bRet = sal_False; 944*cdf0e10cSrcweir sal_Int32 nPos = 1; 945*cdf0e10cSrcweir while( nPos < rValue.getLength()-3 ) 946*cdf0e10cSrcweir { 947*cdf0e10cSrcweir sal_Unicode c = rValue[nPos]; 948*cdf0e10cSrcweir if( 'i'==c || 'I'==c ) 949*cdf0e10cSrcweir { 950*cdf0e10cSrcweir c = rValue[nPos-1]; 951*cdf0e10cSrcweir if( (c >= '0' && c <= '9') || '.' == c ) 952*cdf0e10cSrcweir { 953*cdf0e10cSrcweir c = rValue[nPos+1]; 954*cdf0e10cSrcweir if( 'n'==c || 'N'==c ) 955*cdf0e10cSrcweir { 956*cdf0e10cSrcweir c = rValue[nPos+2]; 957*cdf0e10cSrcweir if( 'c'==c || 'C'==c ) 958*cdf0e10cSrcweir { 959*cdf0e10cSrcweir c = rValue[nPos+3]; 960*cdf0e10cSrcweir if( 'h'==c || 'H'==c ) 961*cdf0e10cSrcweir { 962*cdf0e10cSrcweir rValue = rValue.replaceAt( nPos, 963*cdf0e10cSrcweir 4, GetXMLToken(XML_UNIT_INCH) ); 964*cdf0e10cSrcweir nPos += 2; 965*cdf0e10cSrcweir bRet = sal_True; 966*cdf0e10cSrcweir continue; 967*cdf0e10cSrcweir } 968*cdf0e10cSrcweir } 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir } 971*cdf0e10cSrcweir } 972*cdf0e10cSrcweir ++nPos; 973*cdf0e10cSrcweir } 974*cdf0e10cSrcweir 975*cdf0e10cSrcweir return bRet; 976*cdf0e10cSrcweir } 977*cdf0e10cSrcweir 978*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ReplaceSingleInWithInch( OUString& rValue ) 979*cdf0e10cSrcweir { 980*cdf0e10cSrcweir sal_Bool bRet = sal_False; 981*cdf0e10cSrcweir 982*cdf0e10cSrcweir sal_Int32 nPos = rValue.getLength(); 983*cdf0e10cSrcweir while( nPos && rValue[nPos-1] <= ' ' ) 984*cdf0e10cSrcweir --nPos; 985*cdf0e10cSrcweir if( nPos > 2 && 986*cdf0e10cSrcweir ('i'==rValue[nPos-2] || 987*cdf0e10cSrcweir 'I'==rValue[nPos-2]) && 988*cdf0e10cSrcweir ('n'==rValue[nPos-1] || 989*cdf0e10cSrcweir 'N'==rValue[nPos-1]) ) 990*cdf0e10cSrcweir { 991*cdf0e10cSrcweir nPos -= 2; 992*cdf0e10cSrcweir rValue = rValue.replaceAt( nPos, rValue.getLength() - nPos, 993*cdf0e10cSrcweir GetXMLToken(XML_INCH) ); 994*cdf0e10cSrcweir bRet = sal_True; 995*cdf0e10cSrcweir } 996*cdf0e10cSrcweir 997*cdf0e10cSrcweir return bRet; 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir 1000*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ReplaceInWithInch( OUString& rValue ) 1001*cdf0e10cSrcweir { 1002*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1003*cdf0e10cSrcweir sal_Int32 nPos = 1; 1004*cdf0e10cSrcweir while( nPos < rValue.getLength()-1 ) 1005*cdf0e10cSrcweir { 1006*cdf0e10cSrcweir sal_Unicode c = rValue[nPos]; 1007*cdf0e10cSrcweir if( 'i'==c || 'I'==c ) 1008*cdf0e10cSrcweir { 1009*cdf0e10cSrcweir c = rValue[nPos-1]; 1010*cdf0e10cSrcweir if( (c >= '0' && c <= '9') || '.' == c ) 1011*cdf0e10cSrcweir { 1012*cdf0e10cSrcweir c = rValue[nPos+1]; 1013*cdf0e10cSrcweir if( 'n'==c || 'N'==c ) 1014*cdf0e10cSrcweir { 1015*cdf0e10cSrcweir rValue = rValue.replaceAt( nPos, 1016*cdf0e10cSrcweir 2, GetXMLToken(XML_INCH) ); 1017*cdf0e10cSrcweir nPos += 4; 1018*cdf0e10cSrcweir bRet = sal_True; 1019*cdf0e10cSrcweir continue; 1020*cdf0e10cSrcweir } 1021*cdf0e10cSrcweir } 1022*cdf0e10cSrcweir } 1023*cdf0e10cSrcweir ++nPos; 1024*cdf0e10cSrcweir } 1025*cdf0e10cSrcweir 1026*cdf0e10cSrcweir return bRet; 1027*cdf0e10cSrcweir } 1028*cdf0e10cSrcweir 1029*cdf0e10cSrcweir sal_Bool XMLTransformerBase::EncodeStyleName( OUString& rName ) const 1030*cdf0e10cSrcweir { 1031*cdf0e10cSrcweir static sal_Char aHexTab[] = "0123456789abcdef"; 1032*cdf0e10cSrcweir 1033*cdf0e10cSrcweir sal_Bool bEncoded = sal_False; 1034*cdf0e10cSrcweir 1035*cdf0e10cSrcweir sal_Int32 nLen = rName.getLength(); 1036*cdf0e10cSrcweir OUStringBuffer aBuffer( nLen ); 1037*cdf0e10cSrcweir 1038*cdf0e10cSrcweir for( sal_Int32 i = 0; i < nLen; i++ ) 1039*cdf0e10cSrcweir { 1040*cdf0e10cSrcweir sal_Unicode c = rName[i]; 1041*cdf0e10cSrcweir sal_Bool bValidChar = sal_False; 1042*cdf0e10cSrcweir if( c < 0x00ffU ) 1043*cdf0e10cSrcweir { 1044*cdf0e10cSrcweir bValidChar = 1045*cdf0e10cSrcweir (c >= 0x0041 && c <= 0x005a) || 1046*cdf0e10cSrcweir (c >= 0x0061 && c <= 0x007a) || 1047*cdf0e10cSrcweir (c >= 0x00c0 && c <= 0x00d6) || 1048*cdf0e10cSrcweir (c >= 0x00d8 && c <= 0x00f6) || 1049*cdf0e10cSrcweir (c >= 0x00f8 && c <= 0x00ff) || 1050*cdf0e10cSrcweir ( i > 0 && ( (c >= 0x0030 && c <= 0x0039) || 1051*cdf0e10cSrcweir c == 0x00b7 || c == '-' || c == '.') ); 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir else 1054*cdf0e10cSrcweir { 1055*cdf0e10cSrcweir if( (c >= 0xf900U && c <= 0xfffeU) || 1056*cdf0e10cSrcweir (c >= 0x20ddU && c <= 0x20e0U)) 1057*cdf0e10cSrcweir { 1058*cdf0e10cSrcweir bValidChar = sal_False; 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir else if( (c >= 0x02bbU && c <= 0x02c1U) || c == 0x0559 || 1061*cdf0e10cSrcweir c == 0x06e5 || c == 0x06e6 ) 1062*cdf0e10cSrcweir { 1063*cdf0e10cSrcweir bValidChar = sal_True; 1064*cdf0e10cSrcweir } 1065*cdf0e10cSrcweir else if( c == 0x0387 ) 1066*cdf0e10cSrcweir { 1067*cdf0e10cSrcweir bValidChar = i > 0; 1068*cdf0e10cSrcweir } 1069*cdf0e10cSrcweir else 1070*cdf0e10cSrcweir { 1071*cdf0e10cSrcweir if( !xCharClass.is() ) 1072*cdf0e10cSrcweir { 1073*cdf0e10cSrcweir Reference< XMultiServiceFactory > xFactory = 1074*cdf0e10cSrcweir comphelper::getProcessServiceFactory(); 1075*cdf0e10cSrcweir if( xFactory.is() ) 1076*cdf0e10cSrcweir { 1077*cdf0e10cSrcweir try 1078*cdf0e10cSrcweir { 1079*cdf0e10cSrcweir const_cast < XMLTransformerBase * >(this) 1080*cdf0e10cSrcweir ->xCharClass = 1081*cdf0e10cSrcweir Reference < XCharacterClassification >( 1082*cdf0e10cSrcweir xFactory->createInstance( 1083*cdf0e10cSrcweir OUString::createFromAscii( 1084*cdf0e10cSrcweir "com.sun.star.i18n.CharacterClassification_Unicode") ), 1085*cdf0e10cSrcweir UNO_QUERY ); 1086*cdf0e10cSrcweir 1087*cdf0e10cSrcweir OSL_ENSURE( xCharClass.is(), 1088*cdf0e10cSrcweir "can't instantiate character clossification component" ); 1089*cdf0e10cSrcweir } 1090*cdf0e10cSrcweir catch( com::sun::star::uno::Exception& ) 1091*cdf0e10cSrcweir { 1092*cdf0e10cSrcweir } 1093*cdf0e10cSrcweir } 1094*cdf0e10cSrcweir } 1095*cdf0e10cSrcweir if( xCharClass.is() ) 1096*cdf0e10cSrcweir { 1097*cdf0e10cSrcweir sal_Int16 nType = xCharClass->getType( rName, i ); 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir switch( nType ) 1100*cdf0e10cSrcweir { 1101*cdf0e10cSrcweir case UnicodeType::UPPERCASE_LETTER: // Lu 1102*cdf0e10cSrcweir case UnicodeType::LOWERCASE_LETTER: // Ll 1103*cdf0e10cSrcweir case UnicodeType::TITLECASE_LETTER: // Lt 1104*cdf0e10cSrcweir case UnicodeType::OTHER_LETTER: // Lo 1105*cdf0e10cSrcweir case UnicodeType::LETTER_NUMBER: // Nl 1106*cdf0e10cSrcweir bValidChar = sal_True; 1107*cdf0e10cSrcweir break; 1108*cdf0e10cSrcweir case UnicodeType::NON_SPACING_MARK: // Ms 1109*cdf0e10cSrcweir case UnicodeType::ENCLOSING_MARK: // Me 1110*cdf0e10cSrcweir case UnicodeType::COMBINING_SPACING_MARK: //Mc 1111*cdf0e10cSrcweir case UnicodeType::MODIFIER_LETTER: // Lm 1112*cdf0e10cSrcweir case UnicodeType::DECIMAL_DIGIT_NUMBER: // Nd 1113*cdf0e10cSrcweir bValidChar = i > 0; 1114*cdf0e10cSrcweir break; 1115*cdf0e10cSrcweir } 1116*cdf0e10cSrcweir } 1117*cdf0e10cSrcweir } 1118*cdf0e10cSrcweir } 1119*cdf0e10cSrcweir if( bValidChar ) 1120*cdf0e10cSrcweir { 1121*cdf0e10cSrcweir aBuffer.append( c ); 1122*cdf0e10cSrcweir } 1123*cdf0e10cSrcweir else 1124*cdf0e10cSrcweir { 1125*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( '_' ) ); 1126*cdf0e10cSrcweir if( c > 0x0fff ) 1127*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( 1128*cdf0e10cSrcweir aHexTab[ (c >> 12) & 0x0f ] ) ); 1129*cdf0e10cSrcweir if( c > 0x00ff ) 1130*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( 1131*cdf0e10cSrcweir aHexTab[ (c >> 8) & 0x0f ] ) ); 1132*cdf0e10cSrcweir if( c > 0x000f ) 1133*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( 1134*cdf0e10cSrcweir aHexTab[ (c >> 4) & 0x0f ] ) ); 1135*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( 1136*cdf0e10cSrcweir aHexTab[ c & 0x0f ] ) ); 1137*cdf0e10cSrcweir aBuffer.append( static_cast< sal_Unicode >( '_' ) ); 1138*cdf0e10cSrcweir bEncoded = sal_True; 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir } 1141*cdf0e10cSrcweir 1142*cdf0e10cSrcweir if( aBuffer.getLength() > (1<<15)-1 ) 1143*cdf0e10cSrcweir bEncoded = sal_False; 1144*cdf0e10cSrcweir 1145*cdf0e10cSrcweir if( bEncoded ) 1146*cdf0e10cSrcweir rName = aBuffer.makeStringAndClear(); 1147*cdf0e10cSrcweir return bEncoded; 1148*cdf0e10cSrcweir } 1149*cdf0e10cSrcweir 1150*cdf0e10cSrcweir sal_Bool XMLTransformerBase::DecodeStyleName( OUString& rName ) 1151*cdf0e10cSrcweir { 1152*cdf0e10cSrcweir sal_Bool bEncoded = sal_False; 1153*cdf0e10cSrcweir 1154*cdf0e10cSrcweir sal_Int32 nLen = rName.getLength(); 1155*cdf0e10cSrcweir OUStringBuffer aBuffer( nLen ); 1156*cdf0e10cSrcweir 1157*cdf0e10cSrcweir sal_Bool bWithinHex = sal_False; 1158*cdf0e10cSrcweir sal_Unicode cEnc = 0; 1159*cdf0e10cSrcweir for( sal_Int32 i = 0; i < nLen; i++ ) 1160*cdf0e10cSrcweir { 1161*cdf0e10cSrcweir sal_Unicode c = rName[i]; 1162*cdf0e10cSrcweir if( '_' == c ) 1163*cdf0e10cSrcweir { 1164*cdf0e10cSrcweir if( bWithinHex ) 1165*cdf0e10cSrcweir { 1166*cdf0e10cSrcweir aBuffer.append( cEnc ); 1167*cdf0e10cSrcweir cEnc = 0; 1168*cdf0e10cSrcweir } 1169*cdf0e10cSrcweir else 1170*cdf0e10cSrcweir { 1171*cdf0e10cSrcweir bEncoded = sal_True; 1172*cdf0e10cSrcweir } 1173*cdf0e10cSrcweir bWithinHex = !bWithinHex; 1174*cdf0e10cSrcweir } 1175*cdf0e10cSrcweir else if( bWithinHex ) 1176*cdf0e10cSrcweir { 1177*cdf0e10cSrcweir sal_Unicode cDigit; 1178*cdf0e10cSrcweir if( c >= '0' && c <= '9' ) 1179*cdf0e10cSrcweir { 1180*cdf0e10cSrcweir cDigit = c - '0'; 1181*cdf0e10cSrcweir } 1182*cdf0e10cSrcweir else if( c >= 'a' && c <= 'f' ) 1183*cdf0e10cSrcweir { 1184*cdf0e10cSrcweir cDigit = c - 'a' + 10; 1185*cdf0e10cSrcweir } 1186*cdf0e10cSrcweir else if( c >= 'A' && c <= 'F' ) 1187*cdf0e10cSrcweir { 1188*cdf0e10cSrcweir cDigit = c - 'A' + 10; 1189*cdf0e10cSrcweir } 1190*cdf0e10cSrcweir else 1191*cdf0e10cSrcweir { 1192*cdf0e10cSrcweir // error 1193*cdf0e10cSrcweir bEncoded = sal_False; 1194*cdf0e10cSrcweir break; 1195*cdf0e10cSrcweir } 1196*cdf0e10cSrcweir cEnc = (cEnc << 4) + cDigit; 1197*cdf0e10cSrcweir } 1198*cdf0e10cSrcweir else 1199*cdf0e10cSrcweir { 1200*cdf0e10cSrcweir aBuffer.append( c ); 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir 1204*cdf0e10cSrcweir if( bEncoded ) 1205*cdf0e10cSrcweir rName = aBuffer.makeStringAndClear(); 1206*cdf0e10cSrcweir return bEncoded; 1207*cdf0e10cSrcweir } 1208*cdf0e10cSrcweir 1209*cdf0e10cSrcweir sal_Bool XMLTransformerBase::NegPercent( OUString& rValue ) 1210*cdf0e10cSrcweir { 1211*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1212*cdf0e10cSrcweir sal_Bool bNeg = sal_False; 1213*cdf0e10cSrcweir double nVal = 0; 1214*cdf0e10cSrcweir 1215*cdf0e10cSrcweir sal_Int32 nPos = 0; 1216*cdf0e10cSrcweir sal_Int32 nLen = rValue.getLength(); 1217*cdf0e10cSrcweir 1218*cdf0e10cSrcweir // skip white space 1219*cdf0e10cSrcweir while( nPos < nLen && sal_Unicode(' ') == rValue[nPos] ) 1220*cdf0e10cSrcweir nPos++; 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir if( nPos < nLen && sal_Unicode('-') == rValue[nPos] ) 1223*cdf0e10cSrcweir { 1224*cdf0e10cSrcweir bNeg = sal_True; 1225*cdf0e10cSrcweir nPos++; 1226*cdf0e10cSrcweir } 1227*cdf0e10cSrcweir 1228*cdf0e10cSrcweir // get number 1229*cdf0e10cSrcweir while( nPos < nLen && 1230*cdf0e10cSrcweir sal_Unicode('0') <= rValue[nPos] && 1231*cdf0e10cSrcweir sal_Unicode('9') >= rValue[nPos] ) 1232*cdf0e10cSrcweir { 1233*cdf0e10cSrcweir // TODO: check overflow! 1234*cdf0e10cSrcweir nVal *= 10; 1235*cdf0e10cSrcweir nVal += (rValue[nPos] - sal_Unicode('0')); 1236*cdf0e10cSrcweir nPos++; 1237*cdf0e10cSrcweir } 1238*cdf0e10cSrcweir double nDiv = 1.; 1239*cdf0e10cSrcweir if( nPos < nLen && sal_Unicode('.') == rValue[nPos] ) 1240*cdf0e10cSrcweir { 1241*cdf0e10cSrcweir nPos++; 1242*cdf0e10cSrcweir 1243*cdf0e10cSrcweir while( nPos < nLen && 1244*cdf0e10cSrcweir sal_Unicode('0') <= rValue[nPos] && 1245*cdf0e10cSrcweir sal_Unicode('9') >= rValue[nPos] ) 1246*cdf0e10cSrcweir { 1247*cdf0e10cSrcweir // TODO: check overflow! 1248*cdf0e10cSrcweir nDiv *= 10; 1249*cdf0e10cSrcweir nVal += ( static_cast<double>(rValue[nPos] - sal_Unicode('0')) / nDiv ); 1250*cdf0e10cSrcweir nPos++; 1251*cdf0e10cSrcweir } 1252*cdf0e10cSrcweir } 1253*cdf0e10cSrcweir 1254*cdf0e10cSrcweir // skip white space 1255*cdf0e10cSrcweir while( nPos < nLen && sal_Unicode(' ') == rValue[nPos] ) 1256*cdf0e10cSrcweir nPos++; 1257*cdf0e10cSrcweir 1258*cdf0e10cSrcweir if( nPos < nLen && sal_Unicode('%') == rValue[nPos] ) 1259*cdf0e10cSrcweir { 1260*cdf0e10cSrcweir if( bNeg ) 1261*cdf0e10cSrcweir nVal = -nVal; 1262*cdf0e10cSrcweir nVal += .5; 1263*cdf0e10cSrcweir 1264*cdf0e10cSrcweir sal_Int32 nIntVal = 100 - static_cast<sal_Int32>( nVal ); 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir OUStringBuffer aNewValBuffer; 1267*cdf0e10cSrcweir aNewValBuffer.append( nIntVal ); 1268*cdf0e10cSrcweir aNewValBuffer.append( sal_Unicode('%' ) ); 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir rValue = aNewValBuffer.makeStringAndClear(); 1271*cdf0e10cSrcweir bRet = sal_True; 1272*cdf0e10cSrcweir } 1273*cdf0e10cSrcweir 1274*cdf0e10cSrcweir return bRet; 1275*cdf0e10cSrcweir } 1276*cdf0e10cSrcweir 1277*cdf0e10cSrcweir sal_Bool XMLTransformerBase::AddNamespacePrefix( ::rtl::OUString& rName, 1278*cdf0e10cSrcweir sal_uInt16 nPrefix ) const 1279*cdf0e10cSrcweir { 1280*cdf0e10cSrcweir rName = GetNamespaceMap().GetQNameByKey( nPrefix, rName, sal_False ); 1281*cdf0e10cSrcweir return sal_True; 1282*cdf0e10cSrcweir } 1283*cdf0e10cSrcweir 1284*cdf0e10cSrcweir sal_Bool XMLTransformerBase::RemoveNamespacePrefix( ::rtl::OUString& rName, 1285*cdf0e10cSrcweir sal_uInt16 nPrefixOnly ) const 1286*cdf0e10cSrcweir { 1287*cdf0e10cSrcweir OUString aLocalName; 1288*cdf0e10cSrcweir sal_uInt16 nPrefix = 1289*cdf0e10cSrcweir GetNamespaceMap()._GetKeyByAttrName( rName, &aLocalName, sal_False ); 1290*cdf0e10cSrcweir sal_Bool bRet = XML_NAMESPACE_UNKNOWN != nPrefix && 1291*cdf0e10cSrcweir (USHRT_MAX == nPrefixOnly || nPrefix == nPrefixOnly); 1292*cdf0e10cSrcweir if( bRet ) 1293*cdf0e10cSrcweir rName = aLocalName; 1294*cdf0e10cSrcweir 1295*cdf0e10cSrcweir return bRet; 1296*cdf0e10cSrcweir } 1297*cdf0e10cSrcweir 1298*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ConvertURIToOASIS( ::rtl::OUString& rURI, 1299*cdf0e10cSrcweir sal_Bool bSupportPackage ) const 1300*cdf0e10cSrcweir { 1301*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1302*cdf0e10cSrcweir if( m_aExtPathPrefix.getLength() && rURI.getLength() ) 1303*cdf0e10cSrcweir { 1304*cdf0e10cSrcweir sal_Bool bRel = sal_False; 1305*cdf0e10cSrcweir switch( rURI[0] ) 1306*cdf0e10cSrcweir { 1307*cdf0e10cSrcweir case '#': 1308*cdf0e10cSrcweir // no rel path, but 1309*cdf0e10cSrcweir // for package URIs, the '#' has to be removed 1310*cdf0e10cSrcweir if( bSupportPackage ) 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir rURI = rURI.copy( 1 ); 1313*cdf0e10cSrcweir bRet = sal_True; 1314*cdf0e10cSrcweir } 1315*cdf0e10cSrcweir break; 1316*cdf0e10cSrcweir case '/': 1317*cdf0e10cSrcweir // no rel path; nothing to do 1318*cdf0e10cSrcweir break; 1319*cdf0e10cSrcweir case '.': 1320*cdf0e10cSrcweir // a rel path; to keep URI simple, remove './', if there 1321*cdf0e10cSrcweir bRel = sal_True; 1322*cdf0e10cSrcweir if( rURI.getLength() > 1 && '/' == rURI[1] ) 1323*cdf0e10cSrcweir { 1324*cdf0e10cSrcweir rURI = rURI.copy( 2 ); 1325*cdf0e10cSrcweir bRet = sal_True; 1326*cdf0e10cSrcweir } 1327*cdf0e10cSrcweir break; 1328*cdf0e10cSrcweir default: 1329*cdf0e10cSrcweir // check for a RFC2396 schema 1330*cdf0e10cSrcweir { 1331*cdf0e10cSrcweir bRel = sal_True; 1332*cdf0e10cSrcweir sal_Int32 nPos = 1; 1333*cdf0e10cSrcweir sal_Int32 nLen = rURI.getLength(); 1334*cdf0e10cSrcweir while( nPos < nLen ) 1335*cdf0e10cSrcweir { 1336*cdf0e10cSrcweir switch( rURI[nPos] ) 1337*cdf0e10cSrcweir { 1338*cdf0e10cSrcweir case '/': 1339*cdf0e10cSrcweir // a relative path segement 1340*cdf0e10cSrcweir nPos = nLen; // leave loop 1341*cdf0e10cSrcweir break; 1342*cdf0e10cSrcweir case ':': 1343*cdf0e10cSrcweir // a schema 1344*cdf0e10cSrcweir bRel = sal_False; 1345*cdf0e10cSrcweir nPos = nLen; // leave loop 1346*cdf0e10cSrcweir break; 1347*cdf0e10cSrcweir default: 1348*cdf0e10cSrcweir // we don't care about any other characters 1349*cdf0e10cSrcweir break; 1350*cdf0e10cSrcweir } 1351*cdf0e10cSrcweir ++nPos; 1352*cdf0e10cSrcweir } 1353*cdf0e10cSrcweir } 1354*cdf0e10cSrcweir } 1355*cdf0e10cSrcweir 1356*cdf0e10cSrcweir if( bRel ) 1357*cdf0e10cSrcweir { 1358*cdf0e10cSrcweir OUString sTmp( m_aExtPathPrefix ); 1359*cdf0e10cSrcweir sTmp += rURI; 1360*cdf0e10cSrcweir rURI = sTmp; 1361*cdf0e10cSrcweir bRet = sal_True; 1362*cdf0e10cSrcweir } 1363*cdf0e10cSrcweir } 1364*cdf0e10cSrcweir 1365*cdf0e10cSrcweir return bRet; 1366*cdf0e10cSrcweir } 1367*cdf0e10cSrcweir 1368*cdf0e10cSrcweir sal_Bool XMLTransformerBase::ConvertURIToOOo( ::rtl::OUString& rURI, 1369*cdf0e10cSrcweir sal_Bool bSupportPackage ) const 1370*cdf0e10cSrcweir { 1371*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1372*cdf0e10cSrcweir if( rURI.getLength() ) 1373*cdf0e10cSrcweir { 1374*cdf0e10cSrcweir sal_Bool bPackage = sal_False; 1375*cdf0e10cSrcweir switch( rURI[0] ) 1376*cdf0e10cSrcweir { 1377*cdf0e10cSrcweir case '/': 1378*cdf0e10cSrcweir // no rel path; nothing to to 1379*cdf0e10cSrcweir break; 1380*cdf0e10cSrcweir case '.': 1381*cdf0e10cSrcweir // a rel path 1382*cdf0e10cSrcweir if( 0 == rURI.compareTo( m_aExtPathPrefix, 1383*cdf0e10cSrcweir m_aExtPathPrefix.getLength() ) ) 1384*cdf0e10cSrcweir { 1385*cdf0e10cSrcweir // an external URI; remove '../' 1386*cdf0e10cSrcweir rURI = rURI.copy( m_aExtPathPrefix.getLength() ); 1387*cdf0e10cSrcweir bRet = sal_True; 1388*cdf0e10cSrcweir } 1389*cdf0e10cSrcweir else 1390*cdf0e10cSrcweir { 1391*cdf0e10cSrcweir bPackage = sal_True; 1392*cdf0e10cSrcweir } 1393*cdf0e10cSrcweir break; 1394*cdf0e10cSrcweir default: 1395*cdf0e10cSrcweir // check for a RFC2396 schema 1396*cdf0e10cSrcweir { 1397*cdf0e10cSrcweir bPackage = sal_True; 1398*cdf0e10cSrcweir sal_Int32 nPos = 1; 1399*cdf0e10cSrcweir sal_Int32 nLen = rURI.getLength(); 1400*cdf0e10cSrcweir while( nPos < nLen ) 1401*cdf0e10cSrcweir { 1402*cdf0e10cSrcweir switch( rURI[nPos] ) 1403*cdf0e10cSrcweir { 1404*cdf0e10cSrcweir case '/': 1405*cdf0e10cSrcweir // a relative path segement within the package 1406*cdf0e10cSrcweir nPos = nLen; // leave loop 1407*cdf0e10cSrcweir break; 1408*cdf0e10cSrcweir case ':': 1409*cdf0e10cSrcweir // a schema 1410*cdf0e10cSrcweir bPackage = sal_False; 1411*cdf0e10cSrcweir nPos = nLen; // leave loop 1412*cdf0e10cSrcweir break; 1413*cdf0e10cSrcweir default: 1414*cdf0e10cSrcweir // we don't care about any other characters 1415*cdf0e10cSrcweir break; 1416*cdf0e10cSrcweir } 1417*cdf0e10cSrcweir ++nPos; 1418*cdf0e10cSrcweir } 1419*cdf0e10cSrcweir } 1420*cdf0e10cSrcweir } 1421*cdf0e10cSrcweir 1422*cdf0e10cSrcweir if( bPackage && bSupportPackage ) 1423*cdf0e10cSrcweir { 1424*cdf0e10cSrcweir OUString sTmp( OUString::valueOf( sal_Unicode( '#' ) ) ); 1425*cdf0e10cSrcweir if( 0 == rURI.compareToAscii( "./", 2 ) ) 1426*cdf0e10cSrcweir rURI = rURI.copy( 2 ); 1427*cdf0e10cSrcweir sTmp += rURI; 1428*cdf0e10cSrcweir rURI = sTmp; 1429*cdf0e10cSrcweir bRet = sal_True; 1430*cdf0e10cSrcweir } 1431*cdf0e10cSrcweir } 1432*cdf0e10cSrcweir 1433*cdf0e10cSrcweir return bRet; 1434*cdf0e10cSrcweir } 1435*cdf0e10cSrcweir 1436*cdf0e10cSrcweir sal_Bool XMLTransformerBase::RenameAttributeValue( 1437*cdf0e10cSrcweir OUString& rOutAttributeValue, 1438*cdf0e10cSrcweir sal_Int32 nParam1, 1439*cdf0e10cSrcweir sal_Int32 nParam2, 1440*cdf0e10cSrcweir sal_Int32 nParam3 ) 1441*cdf0e10cSrcweir { 1442*cdf0e10cSrcweir return ( lcl_ConvertAttr( rOutAttributeValue, nParam1) || 1443*cdf0e10cSrcweir lcl_ConvertAttr( rOutAttributeValue, nParam2) || 1444*cdf0e10cSrcweir lcl_ConvertAttr( rOutAttributeValue, nParam3) ); 1445*cdf0e10cSrcweir } 1446*cdf0e10cSrcweir 1447*cdf0e10cSrcweir // static 1448*cdf0e10cSrcweir bool XMLTransformerBase::ConvertRNGDateTimeToISO( ::rtl::OUString& rDateTime ) 1449*cdf0e10cSrcweir { 1450*cdf0e10cSrcweir if( rDateTime.getLength() > 0 && 1451*cdf0e10cSrcweir rDateTime.indexOf( sal_Unicode('.')) != -1 ) 1452*cdf0e10cSrcweir { 1453*cdf0e10cSrcweir rDateTime = rDateTime.replace( sal_Unicode('.'), sal_Unicode(',')); 1454*cdf0e10cSrcweir return true; 1455*cdf0e10cSrcweir } 1456*cdf0e10cSrcweir 1457*cdf0e10cSrcweir return false; 1458*cdf0e10cSrcweir } 1459*cdf0e10cSrcweir 1460*cdf0e10cSrcweir XMLTokenEnum XMLTransformerBase::GetToken( const OUString& rStr ) const 1461*cdf0e10cSrcweir { 1462*cdf0e10cSrcweir XMLTransformerTokenMap::const_iterator aIter = 1463*cdf0e10cSrcweir m_pTokenMap->find( rStr ); 1464*cdf0e10cSrcweir if( aIter == m_pTokenMap->end() ) 1465*cdf0e10cSrcweir return XML_TOKEN_END; 1466*cdf0e10cSrcweir else 1467*cdf0e10cSrcweir return (*aIter).second; 1468*cdf0e10cSrcweir } 1469*cdf0e10cSrcweir 1470*cdf0e10cSrcweir 1471*cdf0e10cSrcweir 1472*cdf0e10cSrcweir const XMLTransformerContext *XMLTransformerBase::GetCurrentContext() const 1473*cdf0e10cSrcweir { 1474*cdf0e10cSrcweir OSL_ENSURE( !m_pContexts->empty(), "empty stack" ); 1475*cdf0e10cSrcweir 1476*cdf0e10cSrcweir 1477*cdf0e10cSrcweir return m_pContexts->empty() ? 0 : m_pContexts->back().get(); 1478*cdf0e10cSrcweir } 1479*cdf0e10cSrcweir 1480*cdf0e10cSrcweir const XMLTransformerContext *XMLTransformerBase::GetAncestorContext( 1481*cdf0e10cSrcweir sal_uInt32 n ) const 1482*cdf0e10cSrcweir { 1483*cdf0e10cSrcweir XMLTransformerContextVector::size_type nSize = 1484*cdf0e10cSrcweir m_pContexts->size(); 1485*cdf0e10cSrcweir XMLTransformerContextVector::size_type nPos = 1486*cdf0e10cSrcweir static_cast<XMLTransformerContextVector::size_type>( n ); 1487*cdf0e10cSrcweir 1488*cdf0e10cSrcweir OSL_ENSURE( nSize >nPos+2 , "invalid context" ); 1489*cdf0e10cSrcweir 1490*cdf0e10cSrcweir return nSize > nPos+2 ? (*m_pContexts)[nSize-(nPos+2)].get() : 0; 1491*cdf0e10cSrcweir } 1492*cdf0e10cSrcweir 1493*cdf0e10cSrcweir bool XMLTransformerBase::isWriter() const 1494*cdf0e10cSrcweir { 1495*cdf0e10cSrcweir Reference< XServiceInfo > xSI( mxModel, UNO_QUERY ); 1496*cdf0e10cSrcweir return xSI.is() && 1497*cdf0e10cSrcweir ( xSI->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ) ) || 1498*cdf0e10cSrcweir xSI->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.WebDocument" ) ) ) || 1499*cdf0e10cSrcweir xSI->supportsService( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.GlobalDocument" ) ) ) ); 1500*cdf0e10cSrcweir } 1501