163bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
363bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
463bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
563bba73cSAndrew Rist  * distributed with this work for additional information
663bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
763bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
863bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
963bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
1063bba73cSAndrew Rist  *
1163bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1263bba73cSAndrew Rist  *
1363bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1463bba73cSAndrew Rist  * software distributed under the License is distributed on an
1563bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1663bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
1763bba73cSAndrew Rist  * specific language governing permissions and limitations
1863bba73cSAndrew Rist  * under the License.
1963bba73cSAndrew Rist  *
2063bba73cSAndrew Rist  *************************************************************/
2163bba73cSAndrew Rist 
2263bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include "EventOASISTContext.hxx"
27cdf0e10cSrcweir #include "EventMap.hxx"
28cdf0e10cSrcweir #include "MutableAttrList.hxx"
29cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
30cdf0e10cSrcweir #include "ActionMapTypesOASIS.hxx"
31cdf0e10cSrcweir #include "AttrTransformerAction.hxx"
32cdf0e10cSrcweir #include "TransformerActions.hxx"
33cdf0e10cSrcweir #ifndef _XMLOFF_TRANSFORMERBASE_HXX
34cdf0e10cSrcweir #include "TransformerBase.hxx"
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #ifndef OASIS_FILTER_OOO_1X
38cdf0e10cSrcweir // Used to parse Scripting Framework URLs
39cdf0e10cSrcweir #include <com/sun/star/uri/XUriReferenceFactory.hpp>
40cdf0e10cSrcweir #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
41cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
42cdf0e10cSrcweir #endif
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <hash_map>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using ::rtl::OUString;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir using namespace ::com::sun::star::uno;
49cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
50cdf0e10cSrcweir using namespace ::xmloff::token;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir class XMLTransformerOASISEventMap_Impl:
53cdf0e10cSrcweir 	public ::std::hash_map< NameKey_Impl, ::rtl::OUString,
54cdf0e10cSrcweir 						    NameHash_Impl, NameHash_Impl >
55cdf0e10cSrcweir {
56cdf0e10cSrcweir public:
57cdf0e10cSrcweir 	XMLTransformerOASISEventMap_Impl( XMLTransformerEventMapEntry *pInit );
58cdf0e10cSrcweir 	~XMLTransformerOASISEventMap_Impl();
59cdf0e10cSrcweir };
60cdf0e10cSrcweir 
61cdf0e10cSrcweir XMLTransformerOASISEventMap_Impl::XMLTransformerOASISEventMap_Impl( XMLTransformerEventMapEntry *pInit )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir 	if( pInit )
64cdf0e10cSrcweir 	{
65cdf0e10cSrcweir 		XMLTransformerOASISEventMap_Impl::key_type aKey;
66*2fb14843SHerbert Dürr 		XMLTransformerOASISEventMap_Impl::mapped_type aData;
67cdf0e10cSrcweir 		while( pInit->m_pOASISName )
68cdf0e10cSrcweir 		{
69cdf0e10cSrcweir 			aKey.m_nPrefix = pInit->m_nOASISPrefix;
70cdf0e10cSrcweir 			aKey.m_aLocalName = OUString::createFromAscii(pInit->m_pOASISName);
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 			OSL_ENSURE( find( aKey ) == end(), "duplicate event map entry" );
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 			aData = OUString::createFromAscii(pInit->m_pOOoName);
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 			XMLTransformerOASISEventMap_Impl::value_type aVal( aKey, aData );
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 			insert( aVal );
79cdf0e10cSrcweir 			++pInit;
80cdf0e10cSrcweir 		}
81cdf0e10cSrcweir 	}
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
84cdf0e10cSrcweir XMLTransformerOASISEventMap_Impl::~XMLTransformerOASISEventMap_Impl()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir // -----------------------------------------------------------------------------
89cdf0e10cSrcweir 
90cdf0e10cSrcweir TYPEINIT1( XMLEventOASISTransformerContext, XMLRenameElemTransformerContext);
91cdf0e10cSrcweir 
92cdf0e10cSrcweir XMLEventOASISTransformerContext::XMLEventOASISTransformerContext(
93cdf0e10cSrcweir 		XMLTransformerBase& rImp,
94cdf0e10cSrcweir 		const OUString& rQName ) :
95cdf0e10cSrcweir 	XMLRenameElemTransformerContext( rImp, rQName,
96cdf0e10cSrcweir 		 rImp.GetNamespaceMap().GetKeyByAttrName( rQName ), XML_EVENT )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir XMLEventOASISTransformerContext::~XMLEventOASISTransformerContext()
101cdf0e10cSrcweir {
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir XMLTransformerOASISEventMap_Impl
105cdf0e10cSrcweir 	*XMLEventOASISTransformerContext::CreateEventMap()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	return new XMLTransformerOASISEventMap_Impl( aTransformerEventMap );
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir XMLTransformerOASISEventMap_Impl
111cdf0e10cSrcweir 	*XMLEventOASISTransformerContext::CreateFormEventMap()
112cdf0e10cSrcweir {
113cdf0e10cSrcweir 	return new XMLTransformerOASISEventMap_Impl( aFormTransformerEventMap );
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir void XMLEventOASISTransformerContext::FlushEventMap(
117cdf0e10cSrcweir 		XMLTransformerOASISEventMap_Impl *p )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir 	delete p;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir OUString XMLEventOASISTransformerContext::GetEventName(
123cdf0e10cSrcweir 		sal_uInt16 nPrefix,
124cdf0e10cSrcweir 		const OUString& rName,
125cdf0e10cSrcweir 	   	XMLTransformerOASISEventMap_Impl& rMap,
126cdf0e10cSrcweir 	   	XMLTransformerOASISEventMap_Impl *pMap2)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir 	XMLTransformerOASISEventMap_Impl::key_type aKey( nPrefix, rName );
129cdf0e10cSrcweir 	if( pMap2 )
130cdf0e10cSrcweir 	{
131cdf0e10cSrcweir 		XMLTransformerOASISEventMap_Impl::const_iterator aIter =
132cdf0e10cSrcweir 			pMap2->find( aKey );
133cdf0e10cSrcweir 		if( !(aIter == pMap2->end()) )
134cdf0e10cSrcweir 			return (*aIter).second;
135cdf0e10cSrcweir 	}
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 	XMLTransformerOASISEventMap_Impl::const_iterator aIter = rMap.find( aKey );
138cdf0e10cSrcweir 	if( aIter == rMap.end() )
139cdf0e10cSrcweir 		return rName;
140cdf0e10cSrcweir 	else
141cdf0e10cSrcweir 		return (*aIter).second;
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir bool ParseURLAsString(
145cdf0e10cSrcweir 	const OUString& rAttrValue,
146cdf0e10cSrcweir 	OUString* pName, OUString* pLocation )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir 	OUString SCHEME( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:" ) );
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	sal_Int32 params = rAttrValue.indexOf( '?' );
151cdf0e10cSrcweir 	if ( rAttrValue.indexOf( SCHEME ) != 0 || params < 0 )
152cdf0e10cSrcweir 	{
153cdf0e10cSrcweir 		return sal_False;
154cdf0e10cSrcweir 	}
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 	sal_Int32 start = SCHEME.getLength();
157cdf0e10cSrcweir 	*pName = rAttrValue.copy( start, params - start );
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 	OUString aToken;
160cdf0e10cSrcweir 	OUString aLanguage;
161cdf0e10cSrcweir 	params++;
162cdf0e10cSrcweir 	do
163cdf0e10cSrcweir 	{
164cdf0e10cSrcweir 		aToken = rAttrValue.getToken( 0, '&', params );
165cdf0e10cSrcweir 		sal_Int32 dummy = 0;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 		if ( aToken.match( GetXMLToken( XML_LANGUAGE ) ) )
168cdf0e10cSrcweir 		{
169cdf0e10cSrcweir 			aLanguage = aToken.getToken( 1, '=', dummy );
170cdf0e10cSrcweir 		}
171cdf0e10cSrcweir 		else if ( aToken.match( GetXMLToken( XML_LOCATION ) ) )
172cdf0e10cSrcweir 		{
173cdf0e10cSrcweir 			OUString tmp = aToken.getToken( 1, '=', dummy );
174cdf0e10cSrcweir 			if ( tmp.equalsIgnoreAsciiCase( GetXMLToken( XML_DOCUMENT ) ) )
175cdf0e10cSrcweir 			{
176cdf0e10cSrcweir 				*pLocation = GetXMLToken( XML_DOCUMENT );
177cdf0e10cSrcweir 			}
178cdf0e10cSrcweir 			else
179cdf0e10cSrcweir 			{
180cdf0e10cSrcweir 				*pLocation = GetXMLToken( XML_APPLICATION );
181cdf0e10cSrcweir 			}
182cdf0e10cSrcweir 		}
183cdf0e10cSrcweir 	} while ( params >= 0 );
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	if ( aLanguage.equalsIgnoreAsciiCaseAscii( "basic" ) )
186cdf0e10cSrcweir 	{
187cdf0e10cSrcweir 		return sal_True;
188cdf0e10cSrcweir 	}
189cdf0e10cSrcweir 	return sal_False;
190cdf0e10cSrcweir }
191cdf0e10cSrcweir 
192cdf0e10cSrcweir bool ParseURL(
193cdf0e10cSrcweir 	const OUString& rAttrValue,
194cdf0e10cSrcweir 	OUString* pName, OUString* pLocation )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir #ifdef OASIS_FILTER_OOO_1X
197cdf0e10cSrcweir 	return ParseURLAsString( rAttrValue, pName, pLocation );
198cdf0e10cSrcweir #else
199cdf0e10cSrcweir 	Reference< com::sun::star::lang::XMultiServiceFactory >
200cdf0e10cSrcweir 		xSMgr = ::comphelper::getProcessServiceFactory();
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	Reference< com::sun::star::uri::XUriReferenceFactory >
203cdf0e10cSrcweir 		xFactory( xSMgr->createInstance( OUString::createFromAscii(
204cdf0e10cSrcweir 			"com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY );
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	if ( xFactory.is() )
207cdf0e10cSrcweir 	{
208cdf0e10cSrcweir 		Reference< com::sun::star::uri::XVndSunStarScriptUrl > xUrl (
209cdf0e10cSrcweir 			xFactory->parse( rAttrValue ), UNO_QUERY );
210cdf0e10cSrcweir 
211cdf0e10cSrcweir 		if ( xUrl.is() )
212cdf0e10cSrcweir 		{
213cdf0e10cSrcweir 			OUString aLanguageKey = GetXMLToken( XML_LANGUAGE );
214cdf0e10cSrcweir 			if ( xUrl.is() && xUrl->hasParameter( aLanguageKey ) )
215cdf0e10cSrcweir 			{
216cdf0e10cSrcweir 				OUString aLanguage = xUrl->getParameter( aLanguageKey );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 				if ( aLanguage.equalsIgnoreAsciiCaseAscii( "basic" ) )
219cdf0e10cSrcweir 				{
220cdf0e10cSrcweir 					*pName = xUrl->getName();
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 					OUString tmp =
223cdf0e10cSrcweir 						xUrl->getParameter( GetXMLToken( XML_LOCATION ) );
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 					OUString doc = GetXMLToken( XML_DOCUMENT );
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 					if ( tmp.equalsIgnoreAsciiCase( doc ) )
228cdf0e10cSrcweir 					{
229cdf0e10cSrcweir 						*pLocation = doc;
230cdf0e10cSrcweir 					}
231cdf0e10cSrcweir 					else
232cdf0e10cSrcweir 					{
233cdf0e10cSrcweir 						*pLocation = GetXMLToken( XML_APPLICATION );
234cdf0e10cSrcweir 					}
235cdf0e10cSrcweir 					return sal_True;
236cdf0e10cSrcweir 				}
237cdf0e10cSrcweir 			}
238cdf0e10cSrcweir 		}
239cdf0e10cSrcweir 		return sal_False;
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 	else
242cdf0e10cSrcweir 	{
243cdf0e10cSrcweir 		return ParseURLAsString( rAttrValue, pName, pLocation );
244cdf0e10cSrcweir 	}
245cdf0e10cSrcweir #endif
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir void XMLEventOASISTransformerContext::StartElement(
249cdf0e10cSrcweir 	const Reference< XAttributeList >& rAttrList )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir 	OSL_TRACE("XMLEventOASISTransformerContext::StartElement");
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	XMLTransformerActions *pActions =
254cdf0e10cSrcweir 		GetTransformer().GetUserDefinedActions( OASIS_EVENT_ACTIONS );
255cdf0e10cSrcweir 	OSL_ENSURE( pActions, "go no actions" );
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	Reference< XAttributeList > xAttrList( rAttrList );
258cdf0e10cSrcweir 	XMLMutableAttributeList *pMutableAttrList = 0;
259cdf0e10cSrcweir 	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
260cdf0e10cSrcweir 	for( sal_Int16 i=0; i < nAttrCount; i++ )
261cdf0e10cSrcweir 	{
262cdf0e10cSrcweir 		const OUString& rAttrName = xAttrList->getNameByIndex( i );
263cdf0e10cSrcweir 		OUString aLocalName;
264cdf0e10cSrcweir 		sal_uInt16 nPrefix =
265cdf0e10cSrcweir 			GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
266cdf0e10cSrcweir 																 &aLocalName );
267cdf0e10cSrcweir 		XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
268cdf0e10cSrcweir 		XMLTransformerActions::const_iterator aIter =
269cdf0e10cSrcweir 			pActions->find( aKey );
270cdf0e10cSrcweir 		if( !(aIter == pActions->end() ) )
271cdf0e10cSrcweir 		{
272cdf0e10cSrcweir 			if( !pMutableAttrList )
273cdf0e10cSrcweir 			{
274cdf0e10cSrcweir 				pMutableAttrList =
275cdf0e10cSrcweir 						new XMLMutableAttributeList( xAttrList );
276cdf0e10cSrcweir 				xAttrList = pMutableAttrList;
277cdf0e10cSrcweir 			}
278cdf0e10cSrcweir 			const OUString& rAttrValue = xAttrList->getValueByIndex( i );
279cdf0e10cSrcweir 			switch( (*aIter).second.m_nActionType )
280cdf0e10cSrcweir 			{
281cdf0e10cSrcweir 			case XML_ATACTION_HREF:
282cdf0e10cSrcweir 				{
283cdf0e10cSrcweir 					OUString aAttrValue( rAttrValue );
284cdf0e10cSrcweir 					OUString aName, aLocation;
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 					bool bNeedsTransform =
287cdf0e10cSrcweir 						ParseURL( rAttrValue, &aName, &aLocation );
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 					if ( bNeedsTransform )
290cdf0e10cSrcweir 					{
291cdf0e10cSrcweir 						pMutableAttrList->RemoveAttributeByIndex( i );
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 						OUString aAttrQName(
294cdf0e10cSrcweir 							GetTransformer().GetNamespaceMap().GetQNameByKey(
295cdf0e10cSrcweir 								XML_NAMESPACE_SCRIPT,
296cdf0e10cSrcweir 							::xmloff::token::GetXMLToken( XML_MACRO_NAME ) ) );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 						pMutableAttrList->AddAttribute( aAttrQName, aName );
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 						sal_Int16 idx = pMutableAttrList->GetIndexByName(
301cdf0e10cSrcweir 							GetTransformer().GetNamespaceMap().GetQNameByKey(
302cdf0e10cSrcweir 								XML_NAMESPACE_SCRIPT,
303cdf0e10cSrcweir 							GetXMLToken( XML_LANGUAGE ) ) );
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 						pMutableAttrList->SetValueByIndex( idx,
306cdf0e10cSrcweir 							OUString::createFromAscii("StarBasic") );
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 						OUString aLocQName(
309cdf0e10cSrcweir 							GetTransformer().GetNamespaceMap().GetQNameByKey(
310cdf0e10cSrcweir 								XML_NAMESPACE_SCRIPT,
311cdf0e10cSrcweir 								GetXMLToken( XML_LOCATION ) ) );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 						pMutableAttrList->AddAttribute( aLocQName, aLocation );
314cdf0e10cSrcweir 					}
315cdf0e10cSrcweir 				}
316cdf0e10cSrcweir 				break;
317cdf0e10cSrcweir 			case XML_ATACTION_EVENT_NAME:
318cdf0e10cSrcweir 				{
319cdf0e10cSrcweir 					// Check if the event belongs to a form or control by
320cdf0e10cSrcweir 					// cehcking the 2nd ancestor element, f.i.:
321cdf0e10cSrcweir 					// <form:button><form:event-listeners><form:event-listener>
322cdf0e10cSrcweir 					const XMLTransformerContext *pObjContext =
323cdf0e10cSrcweir 						GetTransformer().GetAncestorContext( 1 );
324cdf0e10cSrcweir 					sal_Bool bForm = pObjContext &&
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 						pObjContext->HasNamespace(XML_NAMESPACE_FORM );
327cdf0e10cSrcweir 					pMutableAttrList->SetValueByIndex( i,
328cdf0e10cSrcweir 								   GetTransformer().GetEventName( rAttrValue,
329cdf0e10cSrcweir 									  							  bForm ) );
330cdf0e10cSrcweir 				}
331cdf0e10cSrcweir 				break;
332cdf0e10cSrcweir 			case XML_ATACTION_REMOVE_NAMESPACE_PREFIX:
333cdf0e10cSrcweir 				{
334cdf0e10cSrcweir 					OUString aAttrValue( rAttrValue );
335cdf0e10cSrcweir 					sal_uInt16 nValPrefix =
336cdf0e10cSrcweir 						static_cast<sal_uInt16>((*aIter).second.m_nParam1);
337cdf0e10cSrcweir 					if( GetTransformer().RemoveNamespacePrefix(
338cdf0e10cSrcweir 								aAttrValue, nValPrefix ) )
339cdf0e10cSrcweir 						pMutableAttrList->SetValueByIndex( i, aAttrValue );
340cdf0e10cSrcweir 				}
341cdf0e10cSrcweir 				break;
342cdf0e10cSrcweir 			case XML_ATACTION_MACRO_NAME:
343cdf0e10cSrcweir             {
344cdf0e10cSrcweir                 OUString aName, aLocation;
345cdf0e10cSrcweir                 bool bNeedsTransform =
346cdf0e10cSrcweir                 ParseURL( rAttrValue, &aName, &aLocation );
347cdf0e10cSrcweir 
348cdf0e10cSrcweir                 if ( bNeedsTransform )
349cdf0e10cSrcweir                 {
350cdf0e10cSrcweir                     pMutableAttrList->SetValueByIndex( i, aName );
351cdf0e10cSrcweir 
352cdf0e10cSrcweir                     sal_Int16 idx = pMutableAttrList->GetIndexByName(
353cdf0e10cSrcweir                     GetTransformer().GetNamespaceMap().GetQNameByKey(
354cdf0e10cSrcweir                     XML_NAMESPACE_SCRIPT,
355cdf0e10cSrcweir                     GetXMLToken( XML_LANGUAGE ) ) );
356cdf0e10cSrcweir 
357cdf0e10cSrcweir                     pMutableAttrList->SetValueByIndex( idx,
358cdf0e10cSrcweir                     OUString::createFromAscii("StarBasic") );
359cdf0e10cSrcweir 
360cdf0e10cSrcweir                     OUString aLocQName(
361cdf0e10cSrcweir                     GetTransformer().GetNamespaceMap().GetQNameByKey(
362cdf0e10cSrcweir                     XML_NAMESPACE_SCRIPT,
363cdf0e10cSrcweir                     GetXMLToken( XML_LOCATION ) ) );
364cdf0e10cSrcweir 
365cdf0e10cSrcweir                     pMutableAttrList->AddAttribute( aLocQName, aLocation );
366cdf0e10cSrcweir                 }
367cdf0e10cSrcweir                 else
368cdf0e10cSrcweir                 {
369cdf0e10cSrcweir                     const OUString& rApp = GetXMLToken( XML_APPLICATION );
370cdf0e10cSrcweir                     const OUString& rDoc = GetXMLToken( XML_DOCUMENT );
371cdf0e10cSrcweir                     OUString aAttrValue;
372cdf0e10cSrcweir                     if( rAttrValue.getLength() > rApp.getLength()+1 &&
373cdf0e10cSrcweir                         rAttrValue.copy(0,rApp.getLength()).
374cdf0e10cSrcweir                             equalsIgnoreAsciiCase( rApp ) &&
375cdf0e10cSrcweir                         ':' == rAttrValue[rApp.getLength()] )
376cdf0e10cSrcweir                     {
377cdf0e10cSrcweir                         aLocation = rApp;
378cdf0e10cSrcweir                         aAttrValue = rAttrValue.copy( rApp.getLength()+1 );
379cdf0e10cSrcweir                     }
380cdf0e10cSrcweir                     else if( rAttrValue.getLength() > rDoc.getLength()+1 &&
381cdf0e10cSrcweir                              rAttrValue.copy(0,rDoc.getLength()).
382cdf0e10cSrcweir                                 equalsIgnoreAsciiCase( rDoc ) &&
383cdf0e10cSrcweir                              ':' == rAttrValue[rDoc.getLength()] )
384cdf0e10cSrcweir                     {
385cdf0e10cSrcweir                         aLocation= rDoc;
386cdf0e10cSrcweir                         aAttrValue = rAttrValue.copy( rDoc.getLength()+1 );
387cdf0e10cSrcweir                     }
388cdf0e10cSrcweir                     if( aAttrValue.getLength() )
389cdf0e10cSrcweir                         pMutableAttrList->SetValueByIndex( i,
390cdf0e10cSrcweir                     aAttrValue );
391cdf0e10cSrcweir                     if( aLocation.getLength() )
392cdf0e10cSrcweir                     {
393cdf0e10cSrcweir                         OUString aAttrQName( GetTransformer().GetNamespaceMap().
394cdf0e10cSrcweir                         GetQNameByKey( XML_NAMESPACE_SCRIPT,
395cdf0e10cSrcweir                         ::xmloff::token::GetXMLToken( XML_LOCATION ) ) );
396cdf0e10cSrcweir                         pMutableAttrList->AddAttribute( aAttrQName, aLocation );
397cdf0e10cSrcweir                         // draw bug
398cdf0e10cSrcweir                         aAttrQName = GetTransformer().GetNamespaceMap().
399cdf0e10cSrcweir                         GetQNameByKey( XML_NAMESPACE_SCRIPT,
400cdf0e10cSrcweir                         ::xmloff::token::GetXMLToken( XML_LIBRARY ) );
401cdf0e10cSrcweir                         pMutableAttrList->AddAttribute( aAttrQName, aLocation );
402cdf0e10cSrcweir                     }
403cdf0e10cSrcweir                 }
404cdf0e10cSrcweir             }
405cdf0e10cSrcweir             break;
406cdf0e10cSrcweir 			case XML_ATACTION_COPY:
407cdf0e10cSrcweir 				break;
408cdf0e10cSrcweir 			default:
409cdf0e10cSrcweir 				OSL_ENSURE( !this, "unknown action" );
410cdf0e10cSrcweir 				break;
411cdf0e10cSrcweir 			}
412cdf0e10cSrcweir 		}
413cdf0e10cSrcweir 	}
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 	XMLRenameElemTransformerContext::StartElement( xAttrList );
416cdf0e10cSrcweir }
417