1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include "EventOOoTContext.hxx"
27 #include "EventMap.hxx"
28 #include "MutableAttrList.hxx"
29 #include "xmloff/xmlnmspe.hxx"
30 #ifndef _XMLOFF_ACTIONMAPTYPESOOo_HXX
31 #include "ActionMapTypesOOo.hxx"
32 #endif
33 #include "AttrTransformerAction.hxx"
34 #include "TransformerActions.hxx"
35 #ifndef _XMLOFF_TRANSFORMERBASE_HXX
36 #include "TransformerBase.hxx"
37 #endif
38 #include <comphelper/stl_types.hxx>
39 #include <rtl/ustrbuf.hxx>
40
41 #include <hash_map>
42
43 using ::rtl::OUString;
44 using ::rtl::OUStringBuffer;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::xml::sax;
47 using namespace ::xmloff::token;
48
49 class XMLTransformerOOoEventMap_Impl:
50 public ::std::hash_map< ::rtl::OUString, NameKey_Impl,
51 ::rtl::OUStringHash, ::comphelper::UStringEqual >
52 {
53 public:
54
55 void AddMap( XMLTransformerEventMapEntry *pInit );
56
57 XMLTransformerOOoEventMap_Impl( XMLTransformerEventMapEntry *pInit,
58 XMLTransformerEventMapEntry *pInit2 );
59 ~XMLTransformerOOoEventMap_Impl();
60 };
61
AddMap(XMLTransformerEventMapEntry * pInit)62 void XMLTransformerOOoEventMap_Impl::AddMap( XMLTransformerEventMapEntry *pInit )
63 {
64 XMLTransformerOOoEventMap_Impl::key_type aKey;
65 XMLTransformerOOoEventMap_Impl::mapped_type aData;
66 while( pInit->m_pOOoName )
67 {
68 aKey = OUString::createFromAscii(pInit->m_pOOoName);
69
70 OSL_ENSURE( find( aKey ) == end(), "duplicate event map entry" );
71
72 aData.m_nPrefix = pInit->m_nOASISPrefix;
73 aData.m_aLocalName = OUString::createFromAscii(pInit->m_pOASISName);
74
75 XMLTransformerOOoEventMap_Impl::value_type aVal( aKey, aData );
76
77 if( !insert( aVal ).second )
78 {
79 OSL_ENSURE( false, "duplicate OOo event name extry" );
80 }
81
82 ++pInit;
83 }
84 }
85
XMLTransformerOOoEventMap_Impl(XMLTransformerEventMapEntry * pInit,XMLTransformerEventMapEntry * pInit2)86 XMLTransformerOOoEventMap_Impl::XMLTransformerOOoEventMap_Impl(
87 XMLTransformerEventMapEntry *pInit,
88 XMLTransformerEventMapEntry *pInit2 )
89 {
90 if( pInit )
91 AddMap( pInit );
92 if( pInit )
93 AddMap( pInit2 );
94 }
95
~XMLTransformerOOoEventMap_Impl()96 XMLTransformerOOoEventMap_Impl::~XMLTransformerOOoEventMap_Impl()
97 {
98 }
99
100 // -----------------------------------------------------------------------------
101
102 TYPEINIT1( XMLEventOOoTransformerContext, XMLPersElemContentTContext );
103
XMLEventOOoTransformerContext(XMLTransformerBase & rImp,const OUString & rQName,sal_Bool bPersistent)104 XMLEventOOoTransformerContext::XMLEventOOoTransformerContext(
105 XMLTransformerBase& rImp,
106 const OUString& rQName,
107 sal_Bool bPersistent ) :
108 XMLPersElemContentTContext( rImp, rQName,
109 rImp.GetNamespaceMap().GetKeyByAttrName( rQName ), XML_EVENT_LISTENER ),
110 m_bPersistent( bPersistent )
111 {
112 }
113
~XMLEventOOoTransformerContext()114 XMLEventOOoTransformerContext::~XMLEventOOoTransformerContext()
115 {
116 }
117
118 XMLTransformerOOoEventMap_Impl
CreateEventMap()119 *XMLEventOOoTransformerContext::CreateEventMap()
120 {
121 return new XMLTransformerOOoEventMap_Impl( aTransformerEventMap,
122 aFormTransformerEventMap );
123 }
124
FlushEventMap(XMLTransformerOOoEventMap_Impl * p)125 void XMLEventOOoTransformerContext::FlushEventMap(
126 XMLTransformerOOoEventMap_Impl *p )
127 {
128 delete p;
129 }
130
GetEventName(const OUString & rName,OUString & rNewName,XMLTransformerOOoEventMap_Impl & rMap)131 sal_uInt16 XMLEventOOoTransformerContext::GetEventName(
132 const OUString& rName,
133 OUString& rNewName,
134 XMLTransformerOOoEventMap_Impl& rMap )
135 {
136 XMLTransformerOOoEventMap_Impl::key_type aKey( rName );
137 XMLTransformerOOoEventMap_Impl::const_iterator aIter = rMap.find( aKey );
138 if( aIter == rMap.end() )
139 {
140 rNewName = rName;
141 return XML_NAMESPACE_UNKNOWN;
142 }
143 else
144 {
145 rNewName = (*aIter).second.m_aLocalName;
146 return (*aIter).second.m_nPrefix;
147 }
148 }
149
150
StartElement(const Reference<XAttributeList> & rAttrList)151 void XMLEventOOoTransformerContext::StartElement(
152 const Reference< XAttributeList >& rAttrList )
153 {
154 XMLTransformerActions *pActions =
155 GetTransformer().GetUserDefinedActions( OOO_EVENT_ACTIONS );
156 OSL_ENSURE( pActions, "go no actions" );
157
158 OUString aLocation, aMacroName;
159 sal_Int16 nMacroName = -1;
160 Reference< XAttributeList > xAttrList( rAttrList );
161 XMLMutableAttributeList *pMutableAttrList = 0;
162 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
163 for( sal_Int16 i=0; i < nAttrCount; i++ )
164 {
165 const OUString& rAttrName = xAttrList->getNameByIndex( i );
166 OUString aLocalName;
167 sal_uInt16 nPrefix =
168 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
169 &aLocalName );
170 XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
171 XMLTransformerActions::const_iterator aIter =
172 pActions->find( aKey );
173 if( !(aIter == pActions->end() ) )
174 {
175 if( !pMutableAttrList )
176 {
177 pMutableAttrList =
178 new XMLMutableAttributeList( xAttrList );
179 xAttrList = pMutableAttrList;
180 }
181 const OUString& rAttrValue = xAttrList->getValueByIndex( i );
182 switch( (*aIter).second.m_nActionType )
183 {
184 case XML_ATACTION_HREF:
185 // TODO
186 break;
187 case XML_ATACTION_EVENT_NAME:
188 pMutableAttrList->SetValueByIndex( i,
189 GetTransformer().GetEventName( rAttrValue ) );
190 break;
191 case XML_ATACTION_ADD_NAMESPACE_PREFIX:
192 {
193 OUString aAttrValue( rAttrValue );
194 sal_uInt16 nValPrefix =
195 static_cast<sal_uInt16>((*aIter).second.m_nParam1);
196 if( GetTransformer().AddNamespacePrefix( aAttrValue,
197 nValPrefix ) )
198 pMutableAttrList->SetValueByIndex( i, aAttrValue );
199 }
200 break;
201 case XML_ATACTION_MACRO_LOCATION:
202 aLocation = rAttrValue;
203 pMutableAttrList->RemoveAttributeByIndex( i );
204 --i;
205 --nAttrCount;
206 break;
207 case XML_ATACTION_MACRO_NAME:
208 aMacroName = rAttrValue;
209 nMacroName = i;
210 break;
211 case XML_ATACTION_COPY:
212 break;
213 default:
214 OSL_ENSURE( sal_False, "unknown action" );
215 break;
216 }
217 }
218 }
219
220 if( nMacroName != -1 && aLocation.getLength() > 0 )
221 {
222 if( !IsXMLToken( aLocation, XML_APPLICATION ) )
223 aLocation = GetXMLToken( XML_DOCUMENT );
224 OUStringBuffer sTmp( aLocation.getLength() + aMacroName.getLength() + 1 );
225 sTmp = aLocation;
226 sTmp.append( sal_Unicode( ':' ) );
227 sTmp.append( aMacroName );
228 pMutableAttrList->SetValueByIndex( nMacroName,
229 sTmp.makeStringAndClear() );
230 }
231
232 if( m_bPersistent )
233 XMLPersElemContentTContext::StartElement( xAttrList );
234 else
235 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
236 xAttrList );
237 }
238
EndElement()239 void XMLEventOOoTransformerContext::EndElement()
240 {
241 if( m_bPersistent )
242 XMLPersElemContentTContext::EndElement();
243 else
244 GetTransformer().GetDocHandler()->endElement( GetExportQName() );
245 }
246
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const OUString & rQName,const Reference<XAttributeList> & xAttrList)247 XMLTransformerContext * XMLEventOOoTransformerContext::CreateChildContext(
248 sal_uInt16 nPrefix,
249 const OUString& rLocalName,
250 const OUString& rQName,
251 const Reference< XAttributeList >& xAttrList )
252 {
253 if( m_bPersistent )
254 return XMLPersElemContentTContext::CreateChildContext(nPrefix, rLocalName, rQName, xAttrList);
255 else
256 return XMLTransformerContext::CreateChildContext(nPrefix, rLocalName, rQName, xAttrList);
257 }
258
IsPersistent() const259 sal_Bool XMLEventOOoTransformerContext::IsPersistent() const
260 {
261 return m_bPersistent;
262 }
263