xref: /AOO41X/main/xmloff/source/transform/TransformerBase.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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