16d739b60SAndrew Rist /**************************************************************
2*52209341Smseidel  *
36d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
46d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
56d739b60SAndrew Rist  * distributed with this work for additional information
66d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
76d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
86d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
96d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*52209341Smseidel  *
116d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*52209341Smseidel  *
136d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
146d739b60SAndrew Rist  * software distributed under the License is distributed on an
156d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
176d739b60SAndrew Rist  * specific language governing permissions and limitations
186d739b60SAndrew Rist  * under the License.
19*52209341Smseidel  *
206d739b60SAndrew Rist  *************************************************************/
216d739b60SAndrew Rist 
226d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <framework/fwedllapi.h>
28cdf0e10cSrcweir #include <stdio.h>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir //_________________________________________________________________________________________________________________
31cdf0e10cSrcweir //	my own includes
32cdf0e10cSrcweir //_________________________________________________________________________________________________________________
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
35cdf0e10cSrcweir #include <xml/eventsdocumenthandler.hxx>
36cdf0e10cSrcweir #include <macros/debug.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //_________________________________________________________________________________________________________________
39cdf0e10cSrcweir //	interface includes
40cdf0e10cSrcweir //_________________________________________________________________________________________________________________
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #ifndef __COM_SUN_STAR_XML_SAX_XEXTENDEDDOCUMENTHANDLER_HPP_
43cdf0e10cSrcweir #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir 
46cdf0e10cSrcweir //_________________________________________________________________________________________________________________
47cdf0e10cSrcweir //	other includes
48cdf0e10cSrcweir //_________________________________________________________________________________________________________________
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include <sal/config.h>
51cdf0e10cSrcweir #include <vcl/svapp.hxx>
52cdf0e10cSrcweir #include <vcl/toolbox.hxx>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #include <comphelper/attributelist.hxx>
55cdf0e10cSrcweir 
56cdf0e10cSrcweir //_________________________________________________________________________________________________________________
57cdf0e10cSrcweir //	namespace
58cdf0e10cSrcweir //_________________________________________________________________________________________________________________
59cdf0e10cSrcweir 
60cdf0e10cSrcweir using namespace ::com::sun::star::uno;
61cdf0e10cSrcweir using namespace ::com::sun::star::beans;
62cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #define XMLNS_EVENT				"http://openoffice.org/2001/event"
66cdf0e10cSrcweir #define XMLNS_XLINK				"http://www.w3.org/1999/xlink"
67cdf0e10cSrcweir #define XMLNS_EVENT_PREFIX		"event:"
68cdf0e10cSrcweir #define XMLNS_XLINK_PREFIX		"xlink:"
69cdf0e10cSrcweir 
70cdf0e10cSrcweir #define ATTRIBUTE_XMLNS_EVENT	"xmlns:event"
71cdf0e10cSrcweir #define ATTRIBUTE_XMLNS_XLINK	"xmlns:xlink"
72cdf0e10cSrcweir 
73cdf0e10cSrcweir #define XMLNS_FILTER_SEPARATOR	"^"
74cdf0e10cSrcweir 
75cdf0e10cSrcweir #define ELEMENT_EVENTS			"events"
76cdf0e10cSrcweir #define ELEMENT_EVENT			"event"
77cdf0e10cSrcweir 
78cdf0e10cSrcweir #define ATTRIBUTE_LANGUAGE		"language"
79cdf0e10cSrcweir #define ATTRIBUTE_LIBRARY		"library"
80cdf0e10cSrcweir #define ATTRIBUTE_NAME			"name"
81cdf0e10cSrcweir #define ATTRIBUTE_HREF			"href"
82cdf0e10cSrcweir #define ATTRIBUTE_TYPE			"type"
83cdf0e10cSrcweir #define ATTRIBUTE_MACRONAME		"macro-name"
84cdf0e10cSrcweir 
85cdf0e10cSrcweir #define ELEMENT_NS_EVENTS		"event:events"
86cdf0e10cSrcweir #define ELEMENT_NS_EVENT		"event:event"
87cdf0e10cSrcweir 
88cdf0e10cSrcweir #define ATTRIBUTE_TYPE_CDATA	"CDATA"
89cdf0e10cSrcweir 
90cdf0e10cSrcweir #define EVENTS_DOCTYPE			"<!DOCTYPE event:events PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"event.dtd\">"
91cdf0e10cSrcweir 
92cdf0e10cSrcweir // Property names for events
93cdf0e10cSrcweir #define	PROP_EVENT_TYPE		"EventType"
94cdf0e10cSrcweir #define PROP_LIBRARY		"Library"
95cdf0e10cSrcweir #define PROP_SCRIPT			"Script"
96cdf0e10cSrcweir #define PROP_MACRO_NAME		"MacroName"
97cdf0e10cSrcweir #define STAR_BASIC			"StarBasic"
98cdf0e10cSrcweir #define JAVA_SCRIPT			"JavaScript"
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 
101cdf0e10cSrcweir namespace framework
102cdf0e10cSrcweir {
103cdf0e10cSrcweir 
104cdf0e10cSrcweir struct EventEntryProperty
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	OReadEventsDocumentHandler::Event_XML_Namespace	nNamespace;
107cdf0e10cSrcweir 	char											aEntryName[20];
108cdf0e10cSrcweir };
109cdf0e10cSrcweir 
110cdf0e10cSrcweir static EventEntryProperty EventEntries[OReadEventsDocumentHandler::EV_XML_ENTRY_COUNT] =
111cdf0e10cSrcweir {
112cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ELEMENT_EVENTS			},
113cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ELEMENT_EVENT			},
114cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ATTRIBUTE_LANGUAGE		},
115cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ATTRIBUTE_NAME			},
116cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_XLINK,	ATTRIBUTE_HREF			},
117cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_XLINK,	ATTRIBUTE_TYPE			},
118cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ATTRIBUTE_MACRONAME		},
119cdf0e10cSrcweir 	{ OReadEventsDocumentHandler::EV_NS_EVENT,	ATTRIBUTE_LIBRARY		}
120cdf0e10cSrcweir };
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 
OReadEventsDocumentHandler(EventsConfig & aItems)123cdf0e10cSrcweir OReadEventsDocumentHandler::OReadEventsDocumentHandler( EventsConfig& aItems ) :
124cdf0e10cSrcweir 	ThreadHelpBase( &Application::GetSolarMutex() ),
125cdf0e10cSrcweir 	m_aEventItems( aItems )
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	::rtl::OUString aNamespaceEvent( RTL_CONSTASCII_USTRINGPARAM( XMLNS_EVENT ));
128cdf0e10cSrcweir 	::rtl::OUString aNamespaceXLink( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK ));
129cdf0e10cSrcweir 	::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( XMLNS_FILTER_SEPARATOR ));
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	// create hash map
132cdf0e10cSrcweir 	for ( int i = 0; i < (int)EV_XML_ENTRY_COUNT; i++ )
133cdf0e10cSrcweir 	{
134cdf0e10cSrcweir 		if ( EventEntries[i].nNamespace == EV_NS_EVENT )
135cdf0e10cSrcweir 		{
136cdf0e10cSrcweir 			::rtl::OUString temp( aNamespaceEvent );
137cdf0e10cSrcweir 			temp += aSeparator;
138cdf0e10cSrcweir 			temp += ::rtl::OUString::createFromAscii( EventEntries[i].aEntryName );
139cdf0e10cSrcweir 			m_aEventsMap.insert( EventsHashMap::value_type( temp, (Events_XML_Entry)i ) );
140cdf0e10cSrcweir 		}
141cdf0e10cSrcweir 		else
142cdf0e10cSrcweir 		{
143cdf0e10cSrcweir 			::rtl::OUString temp( aNamespaceXLink );
144cdf0e10cSrcweir 			temp += aSeparator;
145cdf0e10cSrcweir 			temp += ::rtl::OUString::createFromAscii( EventEntries[i].aEntryName );
146cdf0e10cSrcweir 			m_aEventsMap.insert( EventsHashMap::value_type( temp, (Events_XML_Entry)i ) );
147cdf0e10cSrcweir 		}
148cdf0e10cSrcweir 	}
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	m_bEventsStartFound				= sal_False;
151cdf0e10cSrcweir 	m_bEventsEndFound				= sal_False;
152cdf0e10cSrcweir 	m_bEventStartFound				= sal_False;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
~OReadEventsDocumentHandler()155cdf0e10cSrcweir OReadEventsDocumentHandler::~OReadEventsDocumentHandler()
156cdf0e10cSrcweir {
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir // XDocumentHandler
startDocument(void)160cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::startDocument(void)
161cdf0e10cSrcweir throw (	SAXException, RuntimeException )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
endDocument(void)165cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::endDocument(void)
166cdf0e10cSrcweir throw(	SAXException, RuntimeException )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	if (( m_bEventsStartFound && !m_bEventsEndFound ) ||
171cdf0e10cSrcweir 		( !m_bEventsStartFound && m_bEventsEndFound )		)
172cdf0e10cSrcweir 	{
173cdf0e10cSrcweir 		::rtl::OUString aErrorMessage = getErrorLineString();
174cdf0e10cSrcweir 		aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No matching start or end element 'event:events' found!" ));
175cdf0e10cSrcweir 		throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
startElement(const::rtl::OUString & aName,const Reference<XAttributeList> & xAttribs)179cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::startElement(
180cdf0e10cSrcweir 	const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttribs )
181cdf0e10cSrcweir throw(	SAXException, RuntimeException )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	EventsHashMap::const_iterator pEventEntry = m_aEventsMap.find( aName );
186cdf0e10cSrcweir 	if ( pEventEntry != m_aEventsMap.end() )
187cdf0e10cSrcweir 	{
188cdf0e10cSrcweir 		switch ( pEventEntry->second )
189cdf0e10cSrcweir 		{
190cdf0e10cSrcweir 			case EV_ELEMENT_EVENTS:
191cdf0e10cSrcweir 			{
192cdf0e10cSrcweir 				if ( m_bEventsStartFound )
193cdf0e10cSrcweir 				{
194cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
19507a3d7f1SPedro Giffuni 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'event:events' cannot be embedded into 'event:events'!" ));
196cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
197cdf0e10cSrcweir 				}
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 				m_bEventsStartFound = sal_True;
200cdf0e10cSrcweir 			}
201cdf0e10cSrcweir 			break;
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 			case EV_ELEMENT_EVENT:
204cdf0e10cSrcweir 			{
205cdf0e10cSrcweir 				if ( !m_bEventsStartFound )
206cdf0e10cSrcweir 				{
207cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
20807a3d7f1SPedro Giffuni 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'event:event' must be embedded into element 'event:events'!" ));
209cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
210cdf0e10cSrcweir 				}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 				if ( m_bEventStartFound )
213cdf0e10cSrcweir 				{
214cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
215cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element event:event is not a container!" ));
216cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
217cdf0e10cSrcweir 				}
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 				::rtl::OUString aLanguage;
220cdf0e10cSrcweir 				::rtl::OUString aURL;
221cdf0e10cSrcweir 				::rtl::OUString aMacroName;
222cdf0e10cSrcweir 				::rtl::OUString aLibrary;
223cdf0e10cSrcweir 				::rtl::OUString aEventName;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 				m_bEventStartFound = sal_True;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 				long					  nIndex = m_aEventItems.aEventNames.getLength();
228cdf0e10cSrcweir 				long					  nPropCount = 2; // every event config entry needs at least 2 properties
229cdf0e10cSrcweir 				Sequence< PropertyValue > aEventProperties( nPropCount );
230cdf0e10cSrcweir 
231*52209341Smseidel 				m_aEventItems.aEventNames.realloc( nIndex + 1 );
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 				for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ )
234cdf0e10cSrcweir 				{
235cdf0e10cSrcweir 					pEventEntry = m_aEventsMap.find( xAttribs->getNameByIndex( n ) );
236cdf0e10cSrcweir 					if ( pEventEntry != m_aEventsMap.end() )
237cdf0e10cSrcweir 					{
238cdf0e10cSrcweir 						switch ( pEventEntry->second )
239cdf0e10cSrcweir 						{
240cdf0e10cSrcweir 							case EV_ATTRIBUTE_TYPE:
241cdf0e10cSrcweir 							{
242cdf0e10cSrcweir 								aLanguage = xAttribs->getValueByIndex( n );
243cdf0e10cSrcweir 							}
244cdf0e10cSrcweir 							break;
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 							case EV_ATTRIBUTE_NAME:
247cdf0e10cSrcweir 							{
248cdf0e10cSrcweir 								aEventName = xAttribs->getValueByIndex( n );
249cdf0e10cSrcweir 							}
250cdf0e10cSrcweir 							break;
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 							case XL_ATTRIBUTE_HREF:
253cdf0e10cSrcweir 							{
254cdf0e10cSrcweir 								aURL = xAttribs->getValueByIndex( n );
255cdf0e10cSrcweir 							}
256cdf0e10cSrcweir 							break;
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 							case EV_ATTRIBUTE_MACRONAME:
259cdf0e10cSrcweir 							{
260cdf0e10cSrcweir 								aMacroName = xAttribs->getValueByIndex( n );
261cdf0e10cSrcweir 							}
262cdf0e10cSrcweir 							break;
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 							case EV_ATTRIBUTE_LIBRARY:
265cdf0e10cSrcweir 							{
266cdf0e10cSrcweir 								aLibrary = xAttribs->getValueByIndex( n );
267cdf0e10cSrcweir 							}
268cdf0e10cSrcweir 							break;
269cdf0e10cSrcweir 
270*52209341Smseidel 								default:
271*52209341Smseidel 									break; // nothing to do
272cdf0e10cSrcweir 						}
273cdf0e10cSrcweir 					}
274cdf0e10cSrcweir 				} // for
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 				::rtl::OUString aRequiredAttributeName;
277cdf0e10cSrcweir 				if ( aLanguage.getLength() == 0 )
278cdf0e10cSrcweir 					aRequiredAttributeName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE ));
279cdf0e10cSrcweir 				else if ( aEventName.getLength() == 0 )
280cdf0e10cSrcweir 					aRequiredAttributeName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NAME ));
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 				// check for missing attribute values
283cdf0e10cSrcweir 				if ( aRequiredAttributeName.getLength() > 0 )
284cdf0e10cSrcweir 				{
285cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
286cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute "));
287cdf0e10cSrcweir 					aErrorMessage += aRequiredAttributeName;
288cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " must have a value!" ));
289cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
290cdf0e10cSrcweir 				}
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 				Any a;
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 				// set properties
295cdf0e10cSrcweir 				a <<= aLanguage;
296cdf0e10cSrcweir 				aEventProperties[0].Value <<= a;
297cdf0e10cSrcweir 				aEventProperties[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( PROP_EVENT_TYPE ));
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 				a <<= aMacroName;
300cdf0e10cSrcweir 				aEventProperties[1].Value <<= a;
301cdf0e10cSrcweir 				aEventProperties[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( PROP_MACRO_NAME ));
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 				if ( aLibrary.getLength() > 0 )
304cdf0e10cSrcweir 				{
305cdf0e10cSrcweir 					++nPropCount;
306cdf0e10cSrcweir 					aEventProperties.realloc( nPropCount );
307cdf0e10cSrcweir 					a <<= aLibrary;
308cdf0e10cSrcweir 					aEventProperties[nPropCount-1].Value <<= a;
309cdf0e10cSrcweir 					aEventProperties[nPropCount-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( PROP_LIBRARY ));
310cdf0e10cSrcweir 				}
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 				if ( aURL.getLength() > 0 )
313cdf0e10cSrcweir 				{
314cdf0e10cSrcweir 					++nPropCount;
315cdf0e10cSrcweir 					aEventProperties.realloc( nPropCount );
316cdf0e10cSrcweir 					a <<= aURL;
317cdf0e10cSrcweir 					aEventProperties[nPropCount-1].Value <<= a;
318cdf0e10cSrcweir 					aEventProperties[nPropCount-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( PROP_SCRIPT ));
319cdf0e10cSrcweir 				}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 				// set event name
322cdf0e10cSrcweir 				m_aEventItems.aEventNames[ nIndex ] = aEventName;
323cdf0e10cSrcweir 
324cdf0e10cSrcweir 				m_aEventItems.aEventsProperties.realloc( nIndex + 1 );
325cdf0e10cSrcweir 				a <<= aEventProperties;
326cdf0e10cSrcweir 				m_aEventItems.aEventsProperties[ nIndex ] = a;
327cdf0e10cSrcweir 			}
328cdf0e10cSrcweir 			break;
329cdf0e10cSrcweir 
330*52209341Smseidel 				default:
331*52209341Smseidel 					break;
332cdf0e10cSrcweir 		}
333cdf0e10cSrcweir 	}
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
endElement(const::rtl::OUString & aName)336cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::endElement(const ::rtl::OUString& aName)
337cdf0e10cSrcweir throw(	SAXException, RuntimeException )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
340cdf0e10cSrcweir 
341cdf0e10cSrcweir 	EventsHashMap::const_iterator pEventEntry = m_aEventsMap.find( aName );
342cdf0e10cSrcweir 	if ( pEventEntry != m_aEventsMap.end() )
343cdf0e10cSrcweir 	{
344cdf0e10cSrcweir 		switch ( pEventEntry->second )
345cdf0e10cSrcweir 		{
346cdf0e10cSrcweir 			case EV_ELEMENT_EVENTS:
347cdf0e10cSrcweir 			{
348cdf0e10cSrcweir 				if ( !m_bEventsStartFound )
349cdf0e10cSrcweir 				{
350cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
351cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'event:events' found, but no start element" ));
352cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
353cdf0e10cSrcweir 				}
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 				m_bEventsStartFound = sal_False;
356cdf0e10cSrcweir 			}
357cdf0e10cSrcweir 			break;
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 			case EV_ELEMENT_EVENT:
360cdf0e10cSrcweir 			{
361cdf0e10cSrcweir 				if ( !m_bEventStartFound )
362cdf0e10cSrcweir 				{
363cdf0e10cSrcweir 					::rtl::OUString aErrorMessage = getErrorLineString();
364cdf0e10cSrcweir 					aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'event:event' found, but no start element" ));
365cdf0e10cSrcweir 					throw SAXException( aErrorMessage, Reference< XInterface >(), Any() );
366cdf0e10cSrcweir 				}
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 				m_bEventStartFound = sal_False;
369cdf0e10cSrcweir 			}
370cdf0e10cSrcweir 			break;
371cdf0e10cSrcweir 
372*52209341Smseidel 				default:
373*52209341Smseidel 					break; // impossible case
374cdf0e10cSrcweir 		}
375cdf0e10cSrcweir 	}
376cdf0e10cSrcweir }
377cdf0e10cSrcweir 
characters(const::rtl::OUString &)378cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::characters(const ::rtl::OUString&)
379cdf0e10cSrcweir throw(	SAXException, RuntimeException )
380cdf0e10cSrcweir {
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
ignorableWhitespace(const::rtl::OUString &)383cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::ignorableWhitespace(const ::rtl::OUString&)
384cdf0e10cSrcweir throw(	SAXException, RuntimeException )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
processingInstruction(const::rtl::OUString &,const::rtl::OUString &)388cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::processingInstruction(
389cdf0e10cSrcweir 	const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
390cdf0e10cSrcweir throw(	SAXException, RuntimeException )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir }
393cdf0e10cSrcweir 
setDocumentLocator(const Reference<XLocator> & xLocator)394cdf0e10cSrcweir void SAL_CALL OReadEventsDocumentHandler::setDocumentLocator(
395cdf0e10cSrcweir 	const Reference< XLocator > &xLocator)
396cdf0e10cSrcweir throw(	SAXException, RuntimeException )
397cdf0e10cSrcweir {
398cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
399cdf0e10cSrcweir 
400cdf0e10cSrcweir 	m_xLocator = xLocator;
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
getErrorLineString()403cdf0e10cSrcweir ::rtl::OUString OReadEventsDocumentHandler::getErrorLineString()
404cdf0e10cSrcweir {
405cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 	char buffer[32];
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 	if ( m_xLocator.is() )
410cdf0e10cSrcweir 	{
411cdf0e10cSrcweir 		snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>(m_xLocator->getLineNumber() ));
412cdf0e10cSrcweir 		return ::rtl::OUString::createFromAscii( buffer );
413cdf0e10cSrcweir 	}
414cdf0e10cSrcweir 	else
415cdf0e10cSrcweir 		return ::rtl::OUString();
416cdf0e10cSrcweir }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir 
419cdf0e10cSrcweir //_________________________________________________________________________________________________________________
420cdf0e10cSrcweir //	OWriteEventsDocumentHandler
421cdf0e10cSrcweir //_________________________________________________________________________________________________________________
422cdf0e10cSrcweir 
OWriteEventsDocumentHandler(const EventsConfig & aItems,Reference<XDocumentHandler> rWriteDocumentHandler)423cdf0e10cSrcweir OWriteEventsDocumentHandler::OWriteEventsDocumentHandler(
424cdf0e10cSrcweir 	const EventsConfig& aItems,
425cdf0e10cSrcweir 	Reference< XDocumentHandler > rWriteDocumentHandler ) :
426*52209341Smseidel 	ThreadHelpBase( &Application::GetSolarMutex() ),
427cdf0e10cSrcweir 	m_aItems( aItems ),
428cdf0e10cSrcweir 	m_xWriteDocumentHandler( rWriteDocumentHandler )
429cdf0e10cSrcweir {
430*52209341Smseidel 	::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
431cdf0e10cSrcweir 	m_xEmptyList		= Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY );
432cdf0e10cSrcweir 	m_aAttributeType	= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA ));
433cdf0e10cSrcweir 	m_aXMLXlinkNS		= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX ));
434cdf0e10cSrcweir 	m_aXMLEventNS		= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_EVENT_PREFIX ));
435cdf0e10cSrcweir }
436cdf0e10cSrcweir 
~OWriteEventsDocumentHandler()437cdf0e10cSrcweir OWriteEventsDocumentHandler::~OWriteEventsDocumentHandler()
438cdf0e10cSrcweir {
439cdf0e10cSrcweir }
440cdf0e10cSrcweir 
WriteEventsDocument()441cdf0e10cSrcweir void OWriteEventsDocumentHandler::WriteEventsDocument() throw
442cdf0e10cSrcweir ( SAXException, RuntimeException )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 	m_xWriteDocumentHandler->startDocument();
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	// write DOCTYPE line!
449cdf0e10cSrcweir 	Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY );
450cdf0e10cSrcweir 	if ( xExtendedDocHandler.is() )
451cdf0e10cSrcweir 	{
452cdf0e10cSrcweir 		xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( EVENTS_DOCTYPE )) );
453cdf0e10cSrcweir 		m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
454cdf0e10cSrcweir 	}
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 	::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
457cdf0e10cSrcweir 	Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY );
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_EVENT )),
460cdf0e10cSrcweir 						 m_aAttributeType,
461cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_EVENT )) );
462cdf0e10cSrcweir 	pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_XLINK )),
463cdf0e10cSrcweir 						 m_aAttributeType,
464cdf0e10cSrcweir 						 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )) );
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EVENTS )), pList );
467cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
468cdf0e10cSrcweir 
469cdf0e10cSrcweir 	Sequence< PropertyValue > aEventProperties;
470cdf0e10cSrcweir 
471cdf0e10cSrcweir 	for ( int i = 0; i < m_aItems.aEventNames.getLength(); i++ )
472cdf0e10cSrcweir 	{
473cdf0e10cSrcweir 		if ( m_aItems.aEventsProperties[i] >>= aEventProperties )
474cdf0e10cSrcweir 			WriteEvent( m_aItems.aEventNames[i], aEventProperties );
475cdf0e10cSrcweir 	}
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
478cdf0e10cSrcweir 	m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EVENTS )) );
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 	m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
481cdf0e10cSrcweir 	m_xWriteDocumentHandler->endDocument();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir 
484cdf0e10cSrcweir //_________________________________________________________________________________________________________________
485cdf0e10cSrcweir //	protected member functions
486cdf0e10cSrcweir //_________________________________________________________________________________________________________________
487cdf0e10cSrcweir 
WriteEvent(const::rtl::OUString & aEventName,const Sequence<PropertyValue> & aPropertyValues)488cdf0e10cSrcweir void OWriteEventsDocumentHandler::WriteEvent( const ::rtl::OUString& aEventName, const Sequence< PropertyValue >& aPropertyValues ) throw
489cdf0e10cSrcweir ( SAXException, RuntimeException )
490cdf0e10cSrcweir {
491cdf0e10cSrcweir 	if ( aPropertyValues.getLength() > 0 )
492cdf0e10cSrcweir 	{
493cdf0e10cSrcweir 		::comphelper::AttributeList* pList = new ::comphelper::AttributeList;
494cdf0e10cSrcweir 		Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY );
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 		if ( m_aAttributeURL.getLength() == 0 )
497cdf0e10cSrcweir 		{
498cdf0e10cSrcweir 			m_aAttributeURL = m_aXMLXlinkNS;
499cdf0e10cSrcweir 			m_aAttributeURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HREF ));
500cdf0e10cSrcweir 			m_aAttributeLinkType = m_aXMLXlinkNS;
501cdf0e10cSrcweir 			m_aAttributeLinkType += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE ));
502cdf0e10cSrcweir 			m_aAttributeLanguage = m_aXMLEventNS;
503cdf0e10cSrcweir 			m_aAttributeLanguage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_LANGUAGE ));
504cdf0e10cSrcweir 			m_aAttributeMacroName = m_aXMLEventNS;
505cdf0e10cSrcweir 			m_aAttributeMacroName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MACRONAME ));
506cdf0e10cSrcweir 			m_aAttributeLibrary = m_aXMLEventNS;
507cdf0e10cSrcweir 			m_aAttributeLibrary += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_LIBRARY ));
508cdf0e10cSrcweir 			m_aAttributeName = m_aXMLEventNS;
509cdf0e10cSrcweir 			m_aAttributeName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_NAME ));
510cdf0e10cSrcweir 		}
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 		pList->AddAttribute( m_aAttributeName, m_aAttributeType, aEventName );
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 		sal_Bool	bURLSet = sal_False;
515cdf0e10cSrcweir 		::rtl::OUString	aValue;
516cdf0e10cSrcweir 		::rtl::OUString	aName;
517cdf0e10cSrcweir 
518cdf0e10cSrcweir 		// save attributes
519cdf0e10cSrcweir 		for ( int i = 0; i < aPropertyValues.getLength(); i++ )
520cdf0e10cSrcweir 		{
521cdf0e10cSrcweir 			aPropertyValues[i].Value >>= aValue;
522cdf0e10cSrcweir 			if ( aPropertyValues[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PROP_EVENT_TYPE )))
523cdf0e10cSrcweir 				pList->AddAttribute( m_aAttributeLanguage, m_aAttributeType, aValue );
524cdf0e10cSrcweir 			else if ( aPropertyValues[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PROP_MACRO_NAME )) &&
525cdf0e10cSrcweir 					  aValue.getLength() > 0 )
526cdf0e10cSrcweir 				pList->AddAttribute( m_aAttributeMacroName, m_aAttributeType, aValue );
527cdf0e10cSrcweir 			else if ( aPropertyValues[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PROP_LIBRARY )) &&
528cdf0e10cSrcweir 					  aValue.getLength() > 0 )
529cdf0e10cSrcweir 				pList->AddAttribute( m_aAttributeLibrary, m_aAttributeType, aValue );
530cdf0e10cSrcweir 			else if ( aPropertyValues[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PROP_SCRIPT )))
531cdf0e10cSrcweir 			{
532cdf0e10cSrcweir 				pList->AddAttribute( m_aAttributeURL, m_aAttributeType, aValue );
533cdf0e10cSrcweir 				bURLSet = sal_True;
534cdf0e10cSrcweir 			}
535cdf0e10cSrcweir 		}
536cdf0e10cSrcweir 
537cdf0e10cSrcweir 		if ( bURLSet )
538cdf0e10cSrcweir 			pList->AddAttribute( m_aAttributeLinkType, m_aAttributeType, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "simple" )) );
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 		m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EVENT )), xList );
541cdf0e10cSrcweir 		m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
542cdf0e10cSrcweir 
543cdf0e10cSrcweir 		m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EVENT )) );
544cdf0e10cSrcweir 		m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() );
545cdf0e10cSrcweir 	}
546cdf0e10cSrcweir }
547cdf0e10cSrcweir 
548cdf0e10cSrcweir } // namespace framework
549