1dde7d3faSAndrew Rist /**************************************************************
2*d75c37aeSmseidel  *
3dde7d3faSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4dde7d3faSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5dde7d3faSAndrew Rist  * distributed with this work for additional information
6dde7d3faSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7dde7d3faSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8dde7d3faSAndrew Rist  * "License"); you may not use this file except in compliance
9dde7d3faSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d75c37aeSmseidel  *
11dde7d3faSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d75c37aeSmseidel  *
13dde7d3faSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14dde7d3faSAndrew Rist  * software distributed under the License is distributed on an
15dde7d3faSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16dde7d3faSAndrew Rist  * KIND, either express or implied.  See the License for the
17dde7d3faSAndrew Rist  * specific language governing permissions and limitations
18dde7d3faSAndrew Rist  * under the License.
19*d75c37aeSmseidel  *
20dde7d3faSAndrew Rist  *************************************************************/
21dde7d3faSAndrew Rist 
22dde7d3faSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_comphelper.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <deque>
28cdf0e10cSrcweir 
29*d75c37aeSmseidel #if defined( OS2 ) || defined( UNX )
30cdf0e10cSrcweir #include <wchar.h>
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir #include <osl/mutex.hxx>
33cdf0e10cSrcweir #ifndef _VOS_DIAGNOSE_HXX_
34cdf0e10cSrcweir #include <vos/diagnose.hxx>
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir #include <vos/macros.hxx>
37cdf0e10cSrcweir #include <comphelper/eventattachermgr.hxx>
38cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp>
39cdf0e10cSrcweir #include <com/sun/star/io/XObjectInputStream.hpp>
40cdf0e10cSrcweir #include <com/sun/star/io/XPersistObject.hpp>
41cdf0e10cSrcweir #include <com/sun/star/io/XObjectOutputStream.hpp>
42cdf0e10cSrcweir #include <com/sun/star/io/XMarkableStream.hpp>
43cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp>
44cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
45cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlClass.hpp>
46cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlReflection.hpp>
47cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlMethod.hpp>
48cdf0e10cSrcweir #include <com/sun/star/script/XTypeConverter.hpp>
49cdf0e10cSrcweir #include <com/sun/star/script/XEngineListener.hpp>
50cdf0e10cSrcweir #include <com/sun/star/script/XEventAttacher.hpp>
51cdf0e10cSrcweir #include <com/sun/star/script/XEventAttacherManager.hpp>
52cdf0e10cSrcweir #include <com/sun/star/script/XScriptListener.hpp>
53cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
54cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx>
55cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
56cdf0e10cSrcweir #include <cppuhelper/implbase2.hxx>
57cdf0e10cSrcweir 
58cdf0e10cSrcweir using namespace com::sun::star::uno;
59cdf0e10cSrcweir using namespace com::sun::star::io;
60cdf0e10cSrcweir using namespace com::sun::star::lang;
61cdf0e10cSrcweir using namespace com::sun::star::beans;
62cdf0e10cSrcweir using namespace com::sun::star::script;
63cdf0e10cSrcweir using namespace com::sun::star::reflection;
64cdf0e10cSrcweir using namespace cppu;
65cdf0e10cSrcweir using namespace osl;
66cdf0e10cSrcweir using namespace rtl;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir namespace comphelper
69cdf0e10cSrcweir {
70cdf0e10cSrcweir 
71cdf0e10cSrcweir //-----------------------------------------------------------------------------
72cdf0e10cSrcweir struct AttachedObject_Impl
73cdf0e10cSrcweir {
74*d75c37aeSmseidel 	Reference< XInterface >					xTarget;
75*d75c37aeSmseidel 	Sequence< Reference< XEventListener > > aAttachedListenerSeq;
76*d75c37aeSmseidel 	Any										aHelper;
77cdf0e10cSrcweir 
78*d75c37aeSmseidel 	bool operator<( const AttachedObject_Impl & ) const;
79*d75c37aeSmseidel 	bool operator==( const AttachedObject_Impl & ) const;
80cdf0e10cSrcweir };
81cdf0e10cSrcweir 
82cdf0e10cSrcweir struct AttacherIndex_Impl
83cdf0e10cSrcweir {
84cdf0e10cSrcweir #ifdef DEQUE_OK
85*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor > aEventList;
86cdf0e10cSrcweir #else
87*d75c37aeSmseidel 	Sequence< ScriptEventDescriptor > aEventList;
88cdf0e10cSrcweir #endif
89*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aObjList;
90cdf0e10cSrcweir 
91*d75c37aeSmseidel 	bool operator<( const AttacherIndex_Impl & ) const;
92*d75c37aeSmseidel 	bool operator==( const AttacherIndex_Impl & ) const;
93cdf0e10cSrcweir };
94cdf0e10cSrcweir 
95cdf0e10cSrcweir #if 0
96cdf0e10cSrcweir bool AttachedObject_Impl::operator<( const AttachedObject_Impl & r ) const
97cdf0e10cSrcweir {
98*d75c37aeSmseidel 	VOS_ENSHURE( FALSE, "not implemented" );
99*d75c37aeSmseidel 	return FALSE;
100*d75c37aeSmseidel 	return this < &r;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir bool AttachedObject_Impl::operator==( const AttachedObject_Impl & r ) const
104cdf0e10cSrcweir {
105*d75c37aeSmseidel 	VOS_ENSHURE( FALSE, "not implemented" );
106*d75c37aeSmseidel 	return this == &r;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir bool AttacherIndex_Impl::operator<( const AttacherIndex_Impl & r ) const
110cdf0e10cSrcweir {
111*d75c37aeSmseidel 	VOS_ENSHURE( FALSE, "not implemented" );
112*d75c37aeSmseidel 	return this < &r;
113cdf0e10cSrcweir }
114cdf0e10cSrcweir bool AttacherIndex_Impl::operator==( const AttacherIndex_Impl & r ) const
115cdf0e10cSrcweir {
116*d75c37aeSmseidel 	VOS_ENSHURE( FALSE, "not implemented" );
117*d75c37aeSmseidel 	return this == &r;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir #endif
120cdf0e10cSrcweir 
121cdf0e10cSrcweir //-----------------------------------------------------------------------------
122cdf0e10cSrcweir class ImplEventAttacherManager
123*d75c37aeSmseidel 	: public WeakImplHelper2< XEventAttacherManager, XPersistObject >
124cdf0e10cSrcweir {
125*d75c37aeSmseidel 	friend class AttacherAllListener_Impl;
126*d75c37aeSmseidel 	::std::deque< AttacherIndex_Impl >	aIndex;
127*d75c37aeSmseidel 	Mutex aLock;
128*d75c37aeSmseidel 	// Container fuer die ScriptListener
129*d75c37aeSmseidel 	OInterfaceContainerHelper			aScriptListeners;
130*d75c37aeSmseidel 	// EventAttacher-Instanz
131*d75c37aeSmseidel 	Reference< XEventAttacher >			xAttacher;
132cdf0e10cSrcweir 	Reference< XMultiServiceFactory > 	mxSMgr;
133cdf0e10cSrcweir 	Reference< XIdlReflection > 		mxCoreReflection;
134*d75c37aeSmseidel 	Reference< XIntrospection > 		mxIntrospection;
135*d75c37aeSmseidel 	Reference< XTypeConverter > 		xConverter;
136*d75c37aeSmseidel 	sal_Int16							nVersion;
137cdf0e10cSrcweir public:
138*d75c37aeSmseidel 	ImplEventAttacherManager( const Reference< XIntrospection > & rIntrospection,
139cdf0e10cSrcweir 							  const Reference< XMultiServiceFactory > rSMgr );
140*d75c37aeSmseidel 	~ImplEventAttacherManager();
141*d75c37aeSmseidel 
142*d75c37aeSmseidel 	// Methoden von XEventAttacherManager
143*d75c37aeSmseidel 	virtual void SAL_CALL registerScriptEvent(sal_Int32 Index, const ScriptEventDescriptor& ScriptEvent)
144*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
145*d75c37aeSmseidel 	virtual void SAL_CALL registerScriptEvents(sal_Int32 Index, const Sequence< ScriptEventDescriptor >& ScriptEvents)
146*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
147*d75c37aeSmseidel 	virtual void SAL_CALL revokeScriptEvent(sal_Int32 Index, const OUString& ListenerType, const OUString& EventMethod, const OUString& removeListenerParam)
148*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
149*d75c37aeSmseidel 	virtual void SAL_CALL revokeScriptEvents(sal_Int32 Index)
150*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
151*d75c37aeSmseidel 	virtual void SAL_CALL insertEntry(sal_Int32 Index)
152*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
153*d75c37aeSmseidel 	virtual void SAL_CALL removeEntry(sal_Int32 Index)
154*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
155*d75c37aeSmseidel 	virtual Sequence< ScriptEventDescriptor > SAL_CALL getScriptEvents(sal_Int32 Index)
156*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
157*d75c37aeSmseidel 	virtual void SAL_CALL attach(sal_Int32 Index, const Reference< XInterface >& Object, const Any& Helper)
158*d75c37aeSmseidel 		throw( IllegalArgumentException, ServiceNotRegisteredException, RuntimeException );
159*d75c37aeSmseidel 	virtual void SAL_CALL detach(sal_Int32 nIndex, const Reference< XInterface >& xObject)
160*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
161*d75c37aeSmseidel 	virtual void SAL_CALL addScriptListener(const Reference< XScriptListener >& aListener)
162*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
163*d75c37aeSmseidel 	virtual void SAL_CALL removeScriptListener(const Reference< XScriptListener >& Listener)
164*d75c37aeSmseidel 		throw( IllegalArgumentException, RuntimeException );
165*d75c37aeSmseidel 
166*d75c37aeSmseidel 	// Methoden von XPersistObject
167*d75c37aeSmseidel 	virtual OUString SAL_CALL getServiceName(void) throw( RuntimeException );
168*d75c37aeSmseidel 	virtual void SAL_CALL write(const Reference< XObjectOutputStream >& OutStream) throw( IOException, RuntimeException );
169*d75c37aeSmseidel 	virtual void SAL_CALL read(const Reference< XObjectInputStream >& InStream) throw( IOException, RuntimeException );
170cdf0e10cSrcweir 
171cdf0e10cSrcweir private:
172cdf0e10cSrcweir 	Reference< XIdlReflection >	getReflection() throw( Exception );
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	/** checks if <arg>_nIndex</arg> is a valid index, throws an <type>IllegalArgumentException</type> if not
175cdf0e10cSrcweir 	@param _nIndex
176cdf0e10cSrcweir 		the index to check
177cdf0e10cSrcweir 	@return
178cdf0e10cSrcweir 		the iterator pointing to the position indicated by the index
179cdf0e10cSrcweir 	*/
180cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator implCheckIndex( sal_Int32 _nIndex ) SAL_THROW ( ( IllegalArgumentException ) );
181cdf0e10cSrcweir };
182cdf0e10cSrcweir 
183cdf0e10cSrcweir //========================================================================
184cdf0e10cSrcweir //========================================================================
185cdf0e10cSrcweir //========================================================================
186cdf0e10cSrcweir 
187cdf0e10cSrcweir // Implementation eines EventAttacher-bezogenen AllListeners, der
188cdf0e10cSrcweir // nur einzelne Events an einen allgemeinen AllListener weiterleitet
189cdf0e10cSrcweir class AttacherAllListener_Impl : public WeakImplHelper1< XAllListener >
190cdf0e10cSrcweir {
191*d75c37aeSmseidel 	ImplEventAttacherManager*			mpManager;
192*d75c37aeSmseidel 	Reference< XEventAttacherManager >	xManager;
193*d75c37aeSmseidel 	OUString							aScriptType;
194*d75c37aeSmseidel 	OUString							aScriptCode;
195*d75c37aeSmseidel 	sal_Int16							nVersion;
196*d75c37aeSmseidel 
197*d75c37aeSmseidel 	void convertToEventReturn( Any & rRet, const Type & rRetType )
198*d75c37aeSmseidel 		throw( CannotConvertException );
199cdf0e10cSrcweir public:
200*d75c37aeSmseidel 	AttacherAllListener_Impl( ImplEventAttacherManager* pManager_, const OUString &rScriptType_,
201*d75c37aeSmseidel 								const OUString & rScriptCode_ );
202cdf0e10cSrcweir 
203*d75c37aeSmseidel 	// Methoden von XAllListener
204*d75c37aeSmseidel 	virtual void SAL_CALL firing(const AllEventObject& Event) throw( RuntimeException );
205*d75c37aeSmseidel 	virtual Any SAL_CALL approveFiring(const AllEventObject& Event) throw( InvocationTargetException, RuntimeException );
206cdf0e10cSrcweir 
207*d75c37aeSmseidel 	// Methoden von XEventListener
208*d75c37aeSmseidel 	virtual void SAL_CALL disposing(const EventObject& Source) throw( RuntimeException );
209cdf0e10cSrcweir };
210cdf0e10cSrcweir 
211cdf0e10cSrcweir //========================================================================
AttacherAllListener_Impl(ImplEventAttacherManager * pManager_,const OUString & rScriptType_,const OUString & rScriptCode_)212cdf0e10cSrcweir AttacherAllListener_Impl::AttacherAllListener_Impl
213cdf0e10cSrcweir (
214*d75c37aeSmseidel 	ImplEventAttacherManager*	pManager_,
215*d75c37aeSmseidel 	const OUString &			rScriptType_,
216*d75c37aeSmseidel 	const OUString &			rScriptCode_
217cdf0e10cSrcweir )
218*d75c37aeSmseidel 	: mpManager( pManager_ )
219*d75c37aeSmseidel 	, xManager( pManager_ )
220*d75c37aeSmseidel 	, aScriptType( rScriptType_ )
221*d75c37aeSmseidel 	, aScriptCode( rScriptCode_ )
222*d75c37aeSmseidel 	, nVersion( 2 )
223cdf0e10cSrcweir {
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 
227cdf0e10cSrcweir //========================================================================
228cdf0e10cSrcweir // Methoden von XAllListener
firing(const AllEventObject & Event)229cdf0e10cSrcweir void SAL_CALL AttacherAllListener_Impl::firing(const AllEventObject& Event)
230*d75c37aeSmseidel 	throw( RuntimeException )
231cdf0e10cSrcweir {
232*d75c37aeSmseidel 	ScriptEvent aScriptEvent;
233*d75c37aeSmseidel 	aScriptEvent.Source			= (OWeakObject *)mpManager; // get correct XInterface
234*d75c37aeSmseidel 	aScriptEvent.ListenerType	= Event.ListenerType;
235*d75c37aeSmseidel 	aScriptEvent.MethodName		= Event.MethodName;
236*d75c37aeSmseidel 	aScriptEvent.Arguments		= Event.Arguments;
237*d75c37aeSmseidel 	aScriptEvent.Helper			= Event.Helper;
238*d75c37aeSmseidel 	aScriptEvent.ScriptType		= aScriptType;
239*d75c37aeSmseidel 	aScriptEvent.ScriptCode		= aScriptCode;
240*d75c37aeSmseidel 
241*d75c37aeSmseidel 	// ueber alle Listener iterieren und Events senden
242*d75c37aeSmseidel 	OInterfaceIteratorHelper aIt( mpManager->aScriptListeners );
243*d75c37aeSmseidel 	while( aIt.hasMoreElements() )
244*d75c37aeSmseidel 		((XScriptListener *)aIt.next())->firing( aScriptEvent );
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir //========================================================================
248cdf0e10cSrcweir // Convert to the standard event return
convertToEventReturn(Any & rRet,const Type & rRetType)249cdf0e10cSrcweir void AttacherAllListener_Impl::convertToEventReturn( Any & rRet, const Type & rRetType )
250*d75c37aeSmseidel 	throw( CannotConvertException )
251cdf0e10cSrcweir {
252*d75c37aeSmseidel 	// no return value? Set to the specified values
253*d75c37aeSmseidel 	if( rRet.getValueType().getTypeClass() == TypeClass_VOID )
254*d75c37aeSmseidel 	{
255*d75c37aeSmseidel 		switch( rRetType.getTypeClass() )
256*d75c37aeSmseidel 		{
257*d75c37aeSmseidel 			case TypeClass_INTERFACE:
258*d75c37aeSmseidel 				{
259*d75c37aeSmseidel 				rRet <<= Reference< XInterface >();
260*d75c37aeSmseidel 				}
261*d75c37aeSmseidel 				break;
262*d75c37aeSmseidel 
263*d75c37aeSmseidel 			case TypeClass_BOOLEAN:
264*d75c37aeSmseidel 				rRet <<= sal_True;
265*d75c37aeSmseidel 				break;
266*d75c37aeSmseidel 
267*d75c37aeSmseidel 			case TypeClass_STRING:
268*d75c37aeSmseidel 				rRet <<= OUString();
269*d75c37aeSmseidel 				break;
270*d75c37aeSmseidel 
271*d75c37aeSmseidel 			case TypeClass_FLOAT:			rRet <<= float(0);			break;
272*d75c37aeSmseidel 			case TypeClass_DOUBLE:			rRet <<= double(0.0);		break;
273*d75c37aeSmseidel 			case TypeClass_BYTE:			rRet <<= sal_uInt8(0);		break;
274cdf0e10cSrcweir 			case TypeClass_SHORT:			rRet <<= sal_Int16( 0 );	break;
275cdf0e10cSrcweir 			case TypeClass_LONG:			rRet <<= sal_Int32( 0 );	break;
276cdf0e10cSrcweir 			case TypeClass_UNSIGNED_SHORT:	rRet <<= sal_uInt16( 0 );	break;
277cdf0e10cSrcweir 			case TypeClass_UNSIGNED_LONG:	rRet <<= sal_uInt32( 0 );	break;
278cdf0e10cSrcweir 
279*d75c37aeSmseidel 			default:
280*d75c37aeSmseidel 				OSL_ASSERT(false);
281*d75c37aeSmseidel 				break;
282*d75c37aeSmseidel 		}
283*d75c37aeSmseidel 	}
284*d75c37aeSmseidel 	else if( !rRet.getValueType().equals( rRetType ) )
285*d75c37aeSmseidel 	{
286*d75c37aeSmseidel 		if( mpManager->xConverter.is() )
287*d75c37aeSmseidel 			rRet = mpManager->xConverter->convertTo( rRet, rRetType );
288*d75c37aeSmseidel 		else
289*d75c37aeSmseidel 			throw CannotConvertException();
290*d75c37aeSmseidel 	}
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir //========================================================================
294cdf0e10cSrcweir // Methoden von XAllListener
approveFiring(const AllEventObject & Event)295cdf0e10cSrcweir Any SAL_CALL AttacherAllListener_Impl::approveFiring( const AllEventObject& Event )
296*d75c37aeSmseidel 	throw( InvocationTargetException, RuntimeException )
297cdf0e10cSrcweir {
298*d75c37aeSmseidel 	ScriptEvent aScriptEvent;
299*d75c37aeSmseidel 	aScriptEvent.Source			= (OWeakObject *)mpManager; // get correct XInterface
300*d75c37aeSmseidel 	aScriptEvent.ListenerType	= Event.ListenerType;
301*d75c37aeSmseidel 	aScriptEvent.MethodName		= Event.MethodName;
302*d75c37aeSmseidel 	aScriptEvent.Arguments		= Event.Arguments;
303*d75c37aeSmseidel 	aScriptEvent.Helper			= Event.Helper;
304*d75c37aeSmseidel 	aScriptEvent.ScriptType		= aScriptType;
305*d75c37aeSmseidel 	aScriptEvent.ScriptCode		= aScriptCode;
306*d75c37aeSmseidel 
307*d75c37aeSmseidel 	Any aRet;
308*d75c37aeSmseidel 	// ueber alle Listener iterieren und Events senden
309*d75c37aeSmseidel 	OInterfaceIteratorHelper aIt( mpManager->aScriptListeners );
310*d75c37aeSmseidel 	while( aIt.hasMoreElements() )
311*d75c37aeSmseidel 	{
312*d75c37aeSmseidel 		aRet = ((XScriptListener *)aIt.next())->approveFiring( aScriptEvent );
313*d75c37aeSmseidel 		try
314*d75c37aeSmseidel 		{
315cdf0e10cSrcweir 			Reference< XIdlClass > xListenerType = mpManager->getReflection()->
316cdf0e10cSrcweir 						forName( Event.ListenerType.getTypeName() );
317*d75c37aeSmseidel 			Reference< XIdlMethod > xMeth = xListenerType->getMethod( Event.MethodName );
318*d75c37aeSmseidel 			if( xMeth.is() )
319*d75c37aeSmseidel 			{
320*d75c37aeSmseidel 				Reference< XIdlClass > xRetType = xMeth->getReturnType();
321cdf0e10cSrcweir 				Type aRetType(xRetType->getTypeClass(), xRetType->getName());
322*d75c37aeSmseidel 				convertToEventReturn( aRet, aRetType );
323*d75c37aeSmseidel 			}
324*d75c37aeSmseidel 
325*d75c37aeSmseidel 			switch( aRet.getValueType().getTypeClass() )
326*d75c37aeSmseidel 			{
327*d75c37aeSmseidel 				case TypeClass_INTERFACE:
328*d75c37aeSmseidel 					{
329*d75c37aeSmseidel 					// Interface not null, return
330*d75c37aeSmseidel 					Reference< XInterface > x;
331cdf0e10cSrcweir 					aRet >>= x;
332*d75c37aeSmseidel 					if( x.is() )
333*d75c37aeSmseidel 						return aRet;
334*d75c37aeSmseidel 					}
335*d75c37aeSmseidel 					break;
336*d75c37aeSmseidel 
337*d75c37aeSmseidel 				case TypeClass_BOOLEAN:
338*d75c37aeSmseidel 					// FALSE -> Return
339*d75c37aeSmseidel 					if( !(*(sal_Bool*)aRet.getValue()) )
340*d75c37aeSmseidel 						return aRet;
341*d75c37aeSmseidel 					break;
342*d75c37aeSmseidel 
343*d75c37aeSmseidel 				case TypeClass_STRING:
344*d75c37aeSmseidel 					// none empty string -> return
345*d75c37aeSmseidel 					if( ((OUString*)aRet.getValue())->isEmpty() == false )
346*d75c37aeSmseidel 						return aRet;
347*d75c37aeSmseidel 					break;
348*d75c37aeSmseidel 
349*d75c37aeSmseidel 					// none zero number -> return
350*d75c37aeSmseidel 				case TypeClass_FLOAT:			if( *((float*)aRet.getValue()) )		return aRet; break;
351*d75c37aeSmseidel 				case TypeClass_DOUBLE:			if( *((double*)aRet.getValue()) )		return aRet; break;
352*d75c37aeSmseidel 				case TypeClass_BYTE:			if( *((sal_uInt8*)aRet.getValue()) )	return aRet; break;
353*d75c37aeSmseidel 				case TypeClass_SHORT:			if( *((sal_Int16*)aRet.getValue()) )	return aRet; break;
354*d75c37aeSmseidel 				case TypeClass_LONG:			if( *((sal_Int32*)aRet.getValue()) )	return aRet; break;
355*d75c37aeSmseidel 				case TypeClass_UNSIGNED_SHORT:	if( *((sal_uInt16*)aRet.getValue()) )	return aRet; break;
356*d75c37aeSmseidel 				case TypeClass_UNSIGNED_LONG:	if( *((sal_uInt32*)aRet.getValue()) )	return aRet; break;
357*d75c37aeSmseidel 
358*d75c37aeSmseidel 				default:
359*d75c37aeSmseidel 					OSL_ASSERT(false);
360*d75c37aeSmseidel 					break;
361*d75c37aeSmseidel 			}
362*d75c37aeSmseidel 		}
363*d75c37aeSmseidel 		catch( CannotConvertException& )
364*d75c37aeSmseidel 		{
365*d75c37aeSmseidel 			// silent ignore conversions errors from a script call
366cdf0e10cSrcweir 			Reference< XIdlClass > xListenerType = mpManager->getReflection()->
367cdf0e10cSrcweir 						forName( Event.ListenerType.getTypeName() );
368*d75c37aeSmseidel 			Reference< XIdlMethod > xMeth = xListenerType->getMethod( Event.MethodName );
369*d75c37aeSmseidel 			if( xMeth.is() )
370*d75c37aeSmseidel 			{
371*d75c37aeSmseidel 				Reference< XIdlClass > xRetType = xMeth->getReturnType();
372cdf0e10cSrcweir 				Type aRetType(xRetType->getTypeClass(), xRetType->getName());
373*d75c37aeSmseidel 				aRet.clear();
374*d75c37aeSmseidel 				convertToEventReturn( aRet, aRetType );
375*d75c37aeSmseidel 			}
376*d75c37aeSmseidel 		}
377*d75c37aeSmseidel 	}
378*d75c37aeSmseidel 	return aRet;
379cdf0e10cSrcweir }
380cdf0e10cSrcweir 
381cdf0e10cSrcweir //========================================================================
382cdf0e10cSrcweir // Methoden von XEventListener
disposing(const EventObject &)383cdf0e10cSrcweir void SAL_CALL AttacherAllListener_Impl::disposing(const EventObject& )
384*d75c37aeSmseidel 	throw( RuntimeException )
385cdf0e10cSrcweir {
386*d75c37aeSmseidel 	// It is up to the container to release the object
387cdf0e10cSrcweir }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 
390cdf0e10cSrcweir //========================================================================
391cdf0e10cSrcweir //========================================================================
392cdf0e10cSrcweir //========================================================================
393cdf0e10cSrcweir 
394cdf0e10cSrcweir // Create-Methode fuer EventAttacherManager
createEventAttacherManager(const Reference<XIntrospection> & rIntrospection,const Reference<XMultiServiceFactory> & rSMgr)395cdf0e10cSrcweir Reference< XEventAttacherManager > createEventAttacherManager( const Reference< XIntrospection > & rIntrospection,
396cdf0e10cSrcweir 															   const Reference< XMultiServiceFactory > & rSMgr )
397cdf0e10cSrcweir 	throw( Exception )
398cdf0e10cSrcweir {
399*d75c37aeSmseidel 	return new ImplEventAttacherManager( rIntrospection, rSMgr );
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir // Create-Methode fuer EventAttacherManager
createEventAttacherManager(const Reference<XMultiServiceFactory> & rSMgr)403cdf0e10cSrcweir Reference< XEventAttacherManager > createEventAttacherManager( const Reference< XMultiServiceFactory > & rSMgr )
404cdf0e10cSrcweir 	throw( Exception )
405cdf0e10cSrcweir {
406cdf0e10cSrcweir 	if ( rSMgr.is() )
407cdf0e10cSrcweir 	{
408cdf0e10cSrcweir 		Reference< XInterface > xIFace( rSMgr->createInstance( OUString::createFromAscii("com.sun.star.beans.Introspection") ) );
409cdf0e10cSrcweir 		if ( xIFace.is() )
410cdf0e10cSrcweir 		{
411*d75c37aeSmseidel 			Reference< XIntrospection > xIntrospection( xIFace, UNO_QUERY);
412*d75c37aeSmseidel 			return new ImplEventAttacherManager( xIntrospection, rSMgr );
413cdf0e10cSrcweir 		}
414cdf0e10cSrcweir 	}
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 	return Reference< XEventAttacherManager >();
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir //-----------------------------------------------------------------------------
ImplEventAttacherManager(const Reference<XIntrospection> & rIntrospection,const Reference<XMultiServiceFactory> rSMgr)420cdf0e10cSrcweir ImplEventAttacherManager::ImplEventAttacherManager( const Reference< XIntrospection > & rIntrospection,
421cdf0e10cSrcweir 													const Reference< XMultiServiceFactory > rSMgr )
422*d75c37aeSmseidel 	: aScriptListeners( aLock )
423cdf0e10cSrcweir 	, mxSMgr( rSMgr )
424*d75c37aeSmseidel 	, mxIntrospection( rIntrospection )
425cdf0e10cSrcweir {
426cdf0e10cSrcweir 	if ( rSMgr.is() )
427cdf0e10cSrcweir 	{
428*d75c37aeSmseidel 		Reference< XInterface > xIFace( rSMgr->createInstance( OUString::createFromAscii("com.sun.star.script.EventAttacher") ) );
429cdf0e10cSrcweir 		if ( xIFace.is() )
430cdf0e10cSrcweir 		{
431cdf0e10cSrcweir 			xAttacher = Reference< XEventAttacher >::query( xIFace );
432cdf0e10cSrcweir 		}
433*d75c37aeSmseidel 		xIFace = rSMgr->createInstance( OUString::createFromAscii("com.sun.star.script.Converter") );
434cdf0e10cSrcweir 		if ( xIFace.is() )
435cdf0e10cSrcweir 		{
436cdf0e10cSrcweir 			xConverter = Reference< XTypeConverter >::query( xIFace );
437cdf0e10cSrcweir 		}
438cdf0e10cSrcweir 	}
439cdf0e10cSrcweir 
440*d75c37aeSmseidel 	Reference< XInitialization > xInit( xAttacher, UNO_QUERY );
441*d75c37aeSmseidel 	if( xInit.is() )
442*d75c37aeSmseidel 	{
443*d75c37aeSmseidel 		Sequence< Any > Arguments( 1 );
444*d75c37aeSmseidel 		Arguments[0] <<= rIntrospection;
445*d75c37aeSmseidel 		xInit->initialize( Arguments );
446*d75c37aeSmseidel 	}
447cdf0e10cSrcweir }
448cdf0e10cSrcweir 
449cdf0e10cSrcweir //-----------------------------------------------------------------------------
~ImplEventAttacherManager()450cdf0e10cSrcweir ImplEventAttacherManager::~ImplEventAttacherManager()
451cdf0e10cSrcweir {
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
getReflection()454cdf0e10cSrcweir Reference< XIdlReflection > ImplEventAttacherManager::getReflection() throw( Exception )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir 	Guard< Mutex > aGuard( aLock );
457cdf0e10cSrcweir 	// Haben wir den Service schon? Sonst anlegen
458cdf0e10cSrcweir 	if( !mxCoreReflection.is() )
459cdf0e10cSrcweir 	{
460cdf0e10cSrcweir 		Reference< XInterface > xIFace( mxSMgr->createInstance( OUString::createFromAscii("com.sun.star.reflection.CoreReflection") ) );
461cdf0e10cSrcweir 		mxCoreReflection = Reference< XIdlReflection >( xIFace, UNO_QUERY);
462cdf0e10cSrcweir 	}
463cdf0e10cSrcweir 	return mxCoreReflection;
464cdf0e10cSrcweir }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 
467cdf0e10cSrcweir //-----------------------------------------------------------------------------
implCheckIndex(sal_Int32 _nIndex)468cdf0e10cSrcweir ::std::deque<AttacherIndex_Impl>::iterator ImplEventAttacherManager::implCheckIndex( sal_Int32 _nIndex ) SAL_THROW ( ( IllegalArgumentException ) )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir 	if (_nIndex < 0)
471*d75c37aeSmseidel 		throw IllegalArgumentException();
472cdf0e10cSrcweir 
473*d75c37aeSmseidel 	::std::deque<AttacherIndex_Impl>::iterator aIt = aIndex.begin();
474*d75c37aeSmseidel 	for ( sal_Int32 i = 0; (i < _nIndex) && (aIt != aIndex.end()); ++i, ++aIt )
475cdf0e10cSrcweir 		;
476cdf0e10cSrcweir 
477*d75c37aeSmseidel 	if( aIt == aIndex.end() )
478*d75c37aeSmseidel 		throw IllegalArgumentException();
479cdf0e10cSrcweir 
480cdf0e10cSrcweir 	return aIt;
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir //-----------------------------------------------------------------------------
detachAll_Impl(ImplEventAttacherManager * pMgr,sal_Int32 nIdx,::std::deque<AttachedObject_Impl> & rList)484cdf0e10cSrcweir void detachAll_Impl
485cdf0e10cSrcweir (
486*d75c37aeSmseidel 	ImplEventAttacherManager * pMgr,
487*d75c37aeSmseidel 	sal_Int32 nIdx,
488*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > & rList
489cdf0e10cSrcweir )
490cdf0e10cSrcweir {
491*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjIt =  rList.begin();
492*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjEnd = rList.end();
493*d75c37aeSmseidel 	while( aObjIt != aObjEnd )
494*d75c37aeSmseidel 	{
495*d75c37aeSmseidel 		pMgr->detach( nIdx, (*aObjIt).xTarget );
496*d75c37aeSmseidel 		aObjIt++;
497*d75c37aeSmseidel 	}
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir //-----------------------------------------------------------------------------
attachAll_Impl(ImplEventAttacherManager * pMgr,sal_Int32 nIdx,::std::deque<AttachedObject_Impl> & rList)501cdf0e10cSrcweir void attachAll_Impl
502cdf0e10cSrcweir (
503*d75c37aeSmseidel 	ImplEventAttacherManager * pMgr,
504*d75c37aeSmseidel 	sal_Int32 nIdx,
505*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > & rList
506cdf0e10cSrcweir )
507cdf0e10cSrcweir {
508*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjIt =  rList.begin();
509*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjEnd = rList.end();
510*d75c37aeSmseidel 	while( aObjIt != aObjEnd )
511*d75c37aeSmseidel 	{
512*d75c37aeSmseidel 		pMgr->attach( nIdx, (*aObjIt).xTarget, (*aObjIt).aHelper );
513*d75c37aeSmseidel 		aObjIt++;
514*d75c37aeSmseidel 	}
515cdf0e10cSrcweir }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir //-----------------------------------------------------------------------------
518cdf0e10cSrcweir //*** Methoden von XEventAttacherManager ***
registerScriptEvent(sal_Int32 nIndex,const ScriptEventDescriptor & ScriptEvent)519cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::registerScriptEvent
520cdf0e10cSrcweir (
521*d75c37aeSmseidel 	sal_Int32 nIndex,
522*d75c37aeSmseidel 	const ScriptEventDescriptor& ScriptEvent
523cdf0e10cSrcweir )
524*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
525cdf0e10cSrcweir {
526*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
527*d75c37aeSmseidel 
528cdf0e10cSrcweir 	// Index pruefen und Array anpassen
529cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
530cdf0e10cSrcweir 
531*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aList = (*aIt).aObjList;
532cdf0e10cSrcweir 
533*d75c37aeSmseidel 	ScriptEventDescriptor aEvt = ScriptEvent;
534*d75c37aeSmseidel 	const sal_Unicode* pLastDot = aEvt.ListenerType.getStr();
535*d75c37aeSmseidel 	pLastDot += rtl_ustr_lastIndexOfChar( pLastDot, '.' );
536*d75c37aeSmseidel 	if( pLastDot )
537*d75c37aeSmseidel 		aEvt.ListenerType = pLastDot +1;
538cdf0e10cSrcweir #ifdef DEQUE_OK
539*d75c37aeSmseidel 	(*aIt).aEventList.push_back( aEvt );
540cdf0e10cSrcweir #else
541*d75c37aeSmseidel 	(*aIt).aEventList.realloc( (*aIt).aEventList.getLength() +1 );
542*d75c37aeSmseidel 	(*aIt).aEventList.getArray()[(*aIt).aEventList.getLength() -1] = aEvt;
543cdf0e10cSrcweir #endif
544cdf0e10cSrcweir 
545*d75c37aeSmseidel 	// register new new Event
546*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjIt = (*aIt).aObjList.begin();
547*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjEnd = (*aIt).aObjList.end();
548*d75c37aeSmseidel 	while( aObjIt != aObjEnd )
549*d75c37aeSmseidel 	{
550*d75c37aeSmseidel 		// resize
551*d75c37aeSmseidel 		sal_Int32 nPos = (*aObjIt).aAttachedListenerSeq.getLength();
552*d75c37aeSmseidel 		(*aObjIt).aAttachedListenerSeq.realloc( nPos + 1 );
553*d75c37aeSmseidel 		Reference< XEventListener > * pArray = (*aObjIt).aAttachedListenerSeq.getArray();
554*d75c37aeSmseidel 
555*d75c37aeSmseidel 		Reference< XAllListener > xAll =
556*d75c37aeSmseidel 			new AttacherAllListener_Impl( this, ScriptEvent.ScriptType, ScriptEvent.ScriptCode );
557*d75c37aeSmseidel 		try
558*d75c37aeSmseidel 		{
559*d75c37aeSmseidel 		pArray[nPos] = xAttacher->attachSingleEventListener( (*aObjIt).xTarget, xAll,
560*d75c37aeSmseidel 						(*aObjIt).aHelper, ScriptEvent.ListenerType,
561*d75c37aeSmseidel 						ScriptEvent.AddListenerParam, ScriptEvent.EventMethod );
562*d75c37aeSmseidel 		}
563*d75c37aeSmseidel 		catch( Exception& )
564*d75c37aeSmseidel 		{
565*d75c37aeSmseidel 		}
566*d75c37aeSmseidel 
567*d75c37aeSmseidel 		aObjIt++;
568*d75c37aeSmseidel 	}
569cdf0e10cSrcweir }
570cdf0e10cSrcweir 
571cdf0e10cSrcweir //-----------------------------------------------------------------------------
registerScriptEvents(sal_Int32 nIndex,const Sequence<ScriptEventDescriptor> & ScriptEvents)572cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::registerScriptEvents
573cdf0e10cSrcweir (
574*d75c37aeSmseidel 	sal_Int32 nIndex,
575*d75c37aeSmseidel 	const Sequence< ScriptEventDescriptor >& ScriptEvents
576cdf0e10cSrcweir )
577*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
578cdf0e10cSrcweir {
579*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
580cdf0e10cSrcweir 
581*d75c37aeSmseidel 	// Index pruefen und Array anpassen
582cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
583cdf0e10cSrcweir 
584*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aList = (*aIt).aObjList;
585*d75c37aeSmseidel 	detachAll_Impl( this, nIndex, aList );
586cdf0e10cSrcweir 
587*d75c37aeSmseidel 	const ScriptEventDescriptor* pArray = ScriptEvents.getConstArray();
588*d75c37aeSmseidel 	sal_Int32 nLen = ScriptEvents.getLength();
589*d75c37aeSmseidel 	for( sal_Int32 i = 0 ; i < nLen ; i++ )
590*d75c37aeSmseidel 		registerScriptEvent( nIndex, pArray[ i ] );
591cdf0e10cSrcweir 
592*d75c37aeSmseidel 	attachAll_Impl( this, nIndex, aList );
593cdf0e10cSrcweir }
594cdf0e10cSrcweir 
595cdf0e10cSrcweir //-----------------------------------------------------------------------------
revokeScriptEvent(sal_Int32 nIndex,const OUString & ListenerType,const OUString & EventMethod,const OUString & ToRemoveListenerParam)596cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::revokeScriptEvent
597cdf0e10cSrcweir (
598*d75c37aeSmseidel 	sal_Int32 nIndex,
599*d75c37aeSmseidel 	const OUString& ListenerType,
600*d75c37aeSmseidel 	const OUString& EventMethod,
601*d75c37aeSmseidel 	const OUString& ToRemoveListenerParam
602cdf0e10cSrcweir )
603*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
604cdf0e10cSrcweir {
605*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
608cdf0e10cSrcweir 
609*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aList = (*aIt).aObjList;
610*d75c37aeSmseidel 	detachAll_Impl( this, nIndex, aList );
611cdf0e10cSrcweir 
612*d75c37aeSmseidel 	OUString aLstType = ListenerType;
613*d75c37aeSmseidel 	const sal_Unicode * pLastDot = aLstType.getStr();
614*d75c37aeSmseidel 	pLastDot += rtl_ustr_lastIndexOfChar( pLastDot, '.' );
615*d75c37aeSmseidel 	if( pLastDot )
616*d75c37aeSmseidel 		aLstType = pLastDot +1;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir #ifdef DEQUE_OK
619*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtIt = (*aIt).aEventList.begin();
620*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtEnd = (*aIt).aEventList.end();
621*d75c37aeSmseidel 	while( aEvtIt != aEvtEnd )
622*d75c37aeSmseidel 	{
623*d75c37aeSmseidel 		if( aLstType				== (*aEvtIt).ListenerType
624*d75c37aeSmseidel 			&& EventMethod			== (*aEvtIt).EventMethod
625*d75c37aeSmseidel 			&& ToRemoveListenerParam	== (*aEvtIt).AddListenerParam )
626*d75c37aeSmseidel 		{
627*d75c37aeSmseidel 			(*aIt).aEventList.erase( aEvtIt );
628*d75c37aeSmseidel 			break;
629*d75c37aeSmseidel 		}
630*d75c37aeSmseidel 
631*d75c37aeSmseidel 		aEvtIt++;
632*d75c37aeSmseidel 	}
633cdf0e10cSrcweir #else
634cdf0e10cSrcweir 	Sequence< ScriptEventDescriptor >& rEventList = (*aIt).aEventList;
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 			ScriptEventDescriptor* pEventList = rEventList.getArray();
637cdf0e10cSrcweir 	const	ScriptEventDescriptor* pEventListEnd = pEventList + rEventList.getLength();
638*d75c37aeSmseidel 	for( ; pEventList < pEventListEnd; ++pEventList )
639*d75c37aeSmseidel 	{
640*d75c37aeSmseidel 		if	(	(aLstType				== pEventList->ListenerType	)
641*d75c37aeSmseidel 			&&	(EventMethod			== pEventList->EventMethod		)
642*d75c37aeSmseidel 			&&	(ToRemoveListenerParam	== pEventList->AddListenerParam)
643cdf0e10cSrcweir 			)
644*d75c37aeSmseidel 		{
645cdf0e10cSrcweir 			ScriptEventDescriptor* pMoveTo = pEventList;
646cdf0e10cSrcweir 			const ScriptEventDescriptor* pMoveFrom = pMoveTo + 1;
647cdf0e10cSrcweir 			while (pMoveFrom < pEventListEnd)
648cdf0e10cSrcweir 			{
649cdf0e10cSrcweir 				*pMoveTo++ = *pMoveFrom++;
650cdf0e10cSrcweir 			}
651cdf0e10cSrcweir 			rEventList.realloc( rEventList.getLength() - 1 );
652*d75c37aeSmseidel 			break;
653*d75c37aeSmseidel 		}
654*d75c37aeSmseidel 	}
655cdf0e10cSrcweir #endif
656*d75c37aeSmseidel 	attachAll_Impl( this, nIndex, aList );
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir //-----------------------------------------------------------------------------
revokeScriptEvents(sal_Int32 nIndex)660cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::revokeScriptEvents(sal_Int32 nIndex )
661*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
662cdf0e10cSrcweir {
663*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
664cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
665cdf0e10cSrcweir 
666*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aList = (*aIt).aObjList;
667*d75c37aeSmseidel 	detachAll_Impl( this, nIndex, aList );
668cdf0e10cSrcweir #ifdef DEQUE_OK
669*d75c37aeSmseidel 	(*aIt).aEventList = ::std::deque< ScriptEventDescriptor >();
670cdf0e10cSrcweir #else
671*d75c37aeSmseidel 	(*aIt).aEventList.realloc( 0 );
672cdf0e10cSrcweir #endif
673*d75c37aeSmseidel 	attachAll_Impl( this, nIndex, aList );
674cdf0e10cSrcweir }
675cdf0e10cSrcweir 
676cdf0e10cSrcweir //-----------------------------------------------------------------------------
insertEntry(sal_Int32 nIndex)677cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::insertEntry(sal_Int32 nIndex)
678*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
679cdf0e10cSrcweir {
680*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
681*d75c37aeSmseidel 	if( nIndex < 0 )
682*d75c37aeSmseidel 		throw IllegalArgumentException();
683cdf0e10cSrcweir 
684*d75c37aeSmseidel //	::std::deque<AttacherIndex_Impl>::iterator aIt = aIndex.begin();
685*d75c37aeSmseidel //	while( nIndex-- )
686*d75c37aeSmseidel //		aIt++;
687cdf0e10cSrcweir 
688cdf0e10cSrcweir 	if ( static_cast< ::std::deque< AttacherIndex_Impl >::size_type>(nIndex) >= aIndex.size() )
689cdf0e10cSrcweir 		aIndex.resize(nIndex+1);
690cdf0e10cSrcweir 
691*d75c37aeSmseidel 	AttacherIndex_Impl aTmp;
692*d75c37aeSmseidel 	aIndex.insert( aIndex.begin() + nIndex, aTmp );
693cdf0e10cSrcweir }
694cdf0e10cSrcweir 
695cdf0e10cSrcweir //-----------------------------------------------------------------------------
removeEntry(sal_Int32 nIndex)696cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::removeEntry(sal_Int32 nIndex)
697*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
698cdf0e10cSrcweir {
699*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
700cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
701cdf0e10cSrcweir 
702*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl > aList = (*aIt).aObjList;
703*d75c37aeSmseidel 	detachAll_Impl( this, nIndex, aList );
704*d75c37aeSmseidel 	aIndex.erase( aIt );
705cdf0e10cSrcweir }
706cdf0e10cSrcweir 
707cdf0e10cSrcweir //-----------------------------------------------------------------------------
getScriptEvents(sal_Int32 nIndex)708cdf0e10cSrcweir Sequence< ScriptEventDescriptor > SAL_CALL ImplEventAttacherManager::getScriptEvents(sal_Int32 nIndex)
709*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
710cdf0e10cSrcweir {
711*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
712cdf0e10cSrcweir 	::std::deque<AttacherIndex_Impl>::iterator aIt = implCheckIndex( nIndex );
713cdf0e10cSrcweir 
714cdf0e10cSrcweir #ifdef DEQUE_OK
715*d75c37aeSmseidel 	Sequence< ScriptEventDescriptor > aSeq( (*aIt).aEventList.size() );
716*d75c37aeSmseidel 	ScriptEventDescriptor * pArray = aSeq.getArray();
717*d75c37aeSmseidel 
718*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtIt = (*aIt).aEventList.begin();
719*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtEnd = (*aIt).aEventList.end();
720*d75c37aeSmseidel 	sal_Int32 i = 0;
721*d75c37aeSmseidel 	while( aEvtIt != aEvtEnd )
722*d75c37aeSmseidel 	{
723*d75c37aeSmseidel 		pArray[i++] = *aEvtIt;
724*d75c37aeSmseidel 		aEvtIt++;
725*d75c37aeSmseidel 	}
726*d75c37aeSmseidel 	return aSeq;
727cdf0e10cSrcweir #else
728*d75c37aeSmseidel 	return (*aIt).aEventList;
729cdf0e10cSrcweir #endif
730cdf0e10cSrcweir }
731cdf0e10cSrcweir 
732cdf0e10cSrcweir //-----------------------------------------------------------------------------
attach(sal_Int32 nIndex,const Reference<XInterface> & xObject,const Any & Helper)733cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::attach(sal_Int32 nIndex, const Reference< XInterface >& xObject, const Any & Helper)
734*d75c37aeSmseidel 	throw( IllegalArgumentException, ServiceNotRegisteredException, RuntimeException )
735cdf0e10cSrcweir {
736*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
737*d75c37aeSmseidel 	if( nIndex < 0 || !xObject.is() )
738*d75c37aeSmseidel 		throw IllegalArgumentException();
739*d75c37aeSmseidel 
740*d75c37aeSmseidel 	if( static_cast< ::std::deque< AttacherIndex_Impl >::size_type>(nIndex) >= aIndex.size() )
741*d75c37aeSmseidel 	{
742*d75c37aeSmseidel 		// alte Dateien lesen
743*d75c37aeSmseidel 		if( nVersion == 1 )
744*d75c37aeSmseidel 		{
745*d75c37aeSmseidel 			insertEntry( nIndex );
746*d75c37aeSmseidel 			attach( nIndex, xObject, Helper );
747*d75c37aeSmseidel 			return;
748*d75c37aeSmseidel 		}
749*d75c37aeSmseidel 		else
750*d75c37aeSmseidel 			throw IllegalArgumentException();
751*d75c37aeSmseidel 	}
752cdf0e10cSrcweir 
753cdf0e10cSrcweir 	::std::deque< AttacherIndex_Impl >::iterator aCurrentPosition = aIndex.begin() + nIndex;
754cdf0e10cSrcweir 
755cdf0e10cSrcweir 	AttachedObject_Impl aTmp;
756*d75c37aeSmseidel 	aTmp.xTarget = xObject;
757*d75c37aeSmseidel 	aTmp.aHelper = Helper;
758*d75c37aeSmseidel 	aCurrentPosition->aObjList.push_back( aTmp );
759cdf0e10cSrcweir 
760*d75c37aeSmseidel 	//::std::deque< AttachedObject_Impl >::iterator aObjIt = (*aIt).aObjList.back();
761*d75c37aeSmseidel 	AttachedObject_Impl & rCurObj = aCurrentPosition->aObjList.back();
762cdf0e10cSrcweir #ifdef DEQUE_OK
763*d75c37aeSmseidel 	rCurObj.aAttachedListenerSeq = Sequence< Reference< XEventListener > >( aCurrentPosition->aEventList.size() );
764cdf0e10cSrcweir #else
765*d75c37aeSmseidel 	rCurObj.aAttachedListenerSeq = Sequence< Reference< XEventListener > >( aCurrentPosition->aEventList.getLength() );
766cdf0e10cSrcweir #endif
767*d75c37aeSmseidel 	Reference< XEventListener > * pArray = rCurObj.aAttachedListenerSeq.getArray();
768cdf0e10cSrcweir 
769cdf0e10cSrcweir #ifdef DEQUE_OK
770*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtIt = aCurrentPosition->aEventList.begin();
771*d75c37aeSmseidel 	::std::deque< ScriptEventDescriptor >::iterator aEvtEnd = aCurrentPosition->aEventList.end();
772*d75c37aeSmseidel 	sal_Int32 i = 0;
773*d75c37aeSmseidel 	while( aEvtIt != aEvtEnd )
774*d75c37aeSmseidel 	{
775*d75c37aeSmseidel 		Reference< XAllListener > xAll =
776*d75c37aeSmseidel 			new AttacherAllListener_Impl( this, (*aEvtIt).ScriptType, (*aEvtIt).ScriptCode );
777*d75c37aeSmseidel 		Reference< XEventListener > xAdapter;
778*d75c37aeSmseidel 		try
779*d75c37aeSmseidel 		{
780*d75c37aeSmseidel 		xAdapter = xAttacher->attachSingleEventListener( rCurObj.xTarget, xAll,
781*d75c37aeSmseidel 						rCurObj.aHelper, (*aEvtIt).ScriptType,
782*d75c37aeSmseidel 						(*aEvtIt).AddListenerParam, (*aEvtIt).EventMethod );
783*d75c37aeSmseidel 		}
784*d75c37aeSmseidel 		catch( Exception& )
785*d75c37aeSmseidel 		{
786*d75c37aeSmseidel 		}
787*d75c37aeSmseidel 
788*d75c37aeSmseidel 		pArray[i++] = xAdapter;
789*d75c37aeSmseidel 		aEvtIt++;
790*d75c37aeSmseidel 	}
791cdf0e10cSrcweir #else
792*d75c37aeSmseidel 	sal_Int32 nLen = aCurrentPosition->aEventList.getLength();
793*d75c37aeSmseidel 	ScriptEventDescriptor * pEL = aCurrentPosition->aEventList.getArray();
794*d75c37aeSmseidel 	for(sal_Int32 i = 0; i < nLen; ++i )
795*d75c37aeSmseidel 	{
796*d75c37aeSmseidel 		Reference< XAllListener > xAll =
797*d75c37aeSmseidel 			new AttacherAllListener_Impl( this, pEL[i].ScriptType, pEL[i].ScriptCode );
798*d75c37aeSmseidel 		Reference< XEventListener > xAdapter;
799*d75c37aeSmseidel 		try
800*d75c37aeSmseidel 		{
801*d75c37aeSmseidel 		xAdapter = xAttacher->attachSingleEventListener( rCurObj.xTarget, xAll,
802*d75c37aeSmseidel 						rCurObj.aHelper, pEL[i].ListenerType,
803*d75c37aeSmseidel 						pEL[i].AddListenerParam, pEL[i].EventMethod );
804*d75c37aeSmseidel 		}
805*d75c37aeSmseidel 		catch( Exception& )
806*d75c37aeSmseidel 		{
807*d75c37aeSmseidel 		}
808*d75c37aeSmseidel 
809*d75c37aeSmseidel 		pArray[i] = xAdapter;
810*d75c37aeSmseidel 	}
811cdf0e10cSrcweir #endif
812cdf0e10cSrcweir }
813cdf0e10cSrcweir 
814cdf0e10cSrcweir //-----------------------------------------------------------------------------
detach(sal_Int32 nIndex,const Reference<XInterface> & xObject)815cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::detach(sal_Int32 nIndex, const Reference< XInterface >& xObject)
816*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
817cdf0e10cSrcweir {
818*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
819*d75c37aeSmseidel 	//return;
820*d75c37aeSmseidel 	if( nIndex < 0 || static_cast< ::std::deque< AttacherIndex_Impl >::size_type>(nIndex) >= aIndex.size() || !xObject.is() )
821*d75c37aeSmseidel 		throw IllegalArgumentException();
822cdf0e10cSrcweir 
823cdf0e10cSrcweir 	::std::deque< AttacherIndex_Impl >::iterator aCurrentPosition = aIndex.begin() + nIndex;
824*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjIt = aCurrentPosition->aObjList.begin();
825*d75c37aeSmseidel 	::std::deque< AttachedObject_Impl >::iterator aObjEnd = aCurrentPosition->aObjList.end();
826*d75c37aeSmseidel 	while( aObjIt != aObjEnd )
827*d75c37aeSmseidel 	{
828*d75c37aeSmseidel 		if( (*aObjIt).xTarget == xObject )
829*d75c37aeSmseidel 		{
830*d75c37aeSmseidel 			Reference< XEventListener > * pArray = (*aObjIt).aAttachedListenerSeq.getArray();
831cdf0e10cSrcweir #ifdef DEQUE_OK
832cdf0e10cSrcweir 
833*d75c37aeSmseidel 			::std::deque< ScriptEventDescriptor >::iterator aEvtIt = aCurrentPosition->aEventList.begin();
834*d75c37aeSmseidel 			::std::deque< ScriptEventDescriptor >::iterator aEvtEnd = aCurrentPosition->aEventList.end();
835*d75c37aeSmseidel 			sal_Int32 i = 0;
836*d75c37aeSmseidel 			while( aEvtIt != aEvtEnd )
837*d75c37aeSmseidel 			{
838*d75c37aeSmseidel 				if( pArray[i].is() )
839*d75c37aeSmseidel 				{
840*d75c37aeSmseidel 					try
841*d75c37aeSmseidel 					{
842*d75c37aeSmseidel 					xAttacher->removeListener( (*aObjIt).xTarget, (*aEvtIt).ListenerType,
843*d75c37aeSmseidel 												(*aEvtIt).AddListenerParam, pArray[i] );
844*d75c37aeSmseidel 					}
845*d75c37aeSmseidel 					catch( Exception& )
846*d75c37aeSmseidel 					{
847*d75c37aeSmseidel 					}
848*d75c37aeSmseidel 				}
849*d75c37aeSmseidel 				i++;
850*d75c37aeSmseidel 				aEvtIt++;
851*d75c37aeSmseidel 			}
852cdf0e10cSrcweir #else
853*d75c37aeSmseidel 			sal_Int32 nLen = aCurrentPosition->aEventList.getLength();
854*d75c37aeSmseidel 			ScriptEventDescriptor * pEL = aCurrentPosition->aEventList.getArray();
855*d75c37aeSmseidel 			for( sal_Int32 i = 0; i < nLen; i++ )
856*d75c37aeSmseidel 			{
857*d75c37aeSmseidel 				if( pArray[i].is() )
858*d75c37aeSmseidel 				{
859*d75c37aeSmseidel 					try
860*d75c37aeSmseidel 					{
861*d75c37aeSmseidel 					xAttacher->removeListener( (*aObjIt).xTarget, pEL[i].ListenerType,
862*d75c37aeSmseidel 												pEL[i].AddListenerParam, pArray[i] );
863*d75c37aeSmseidel 					}
864*d75c37aeSmseidel 					catch( Exception& )
865*d75c37aeSmseidel 					{
866*d75c37aeSmseidel 					}
867*d75c37aeSmseidel 				}
868*d75c37aeSmseidel 			}
869cdf0e10cSrcweir #endif
870*d75c37aeSmseidel 			aCurrentPosition->aObjList.erase( aObjIt );
871*d75c37aeSmseidel 			break;
872*d75c37aeSmseidel 		}
873*d75c37aeSmseidel 		aObjIt++;
874*d75c37aeSmseidel 	}
875cdf0e10cSrcweir }
876cdf0e10cSrcweir 
addScriptListener(const Reference<XScriptListener> & aListener)877cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::addScriptListener(const Reference< XScriptListener >& aListener)
878*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
879cdf0e10cSrcweir {
880*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
881*d75c37aeSmseidel 	aScriptListeners.addInterface( aListener );
882cdf0e10cSrcweir }
883cdf0e10cSrcweir 
removeScriptListener(const Reference<XScriptListener> & aListener)884cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::removeScriptListener(const Reference< XScriptListener >& aListener)
885*d75c37aeSmseidel 	throw( IllegalArgumentException, RuntimeException )
886cdf0e10cSrcweir {
887*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
888*d75c37aeSmseidel 	aScriptListeners.removeInterface( aListener );
889cdf0e10cSrcweir }
890cdf0e10cSrcweir 
891cdf0e10cSrcweir 
892cdf0e10cSrcweir // Methoden von XPersistObject
getServiceName(void)893cdf0e10cSrcweir OUString SAL_CALL ImplEventAttacherManager::getServiceName(void)
894*d75c37aeSmseidel 	throw( RuntimeException )
895cdf0e10cSrcweir {
896*d75c37aeSmseidel 	return OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.script.EventAttacherManager") );
897cdf0e10cSrcweir }
898cdf0e10cSrcweir 
write(const Reference<XObjectOutputStream> & OutStream)899cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::write(const Reference< XObjectOutputStream >& OutStream)
900*d75c37aeSmseidel 	throw( IOException, RuntimeException )
901cdf0e10cSrcweir {
902*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
903*d75c37aeSmseidel 	// Ohne XMarkableStream laeuft nichts
904*d75c37aeSmseidel 	Reference< XMarkableStream > xMarkStream( OutStream, UNO_QUERY );
905*d75c37aeSmseidel 	if( !xMarkStream.is() )
906*d75c37aeSmseidel 		return;
907*d75c37aeSmseidel 
908*d75c37aeSmseidel 	// Version schreiben
909*d75c37aeSmseidel 	OutStream->writeShort( 2 );
910*d75c37aeSmseidel 
911*d75c37aeSmseidel 	// Position fuer Laenge merken
912*d75c37aeSmseidel 	sal_Int32 nObjLenMark = xMarkStream->createMark();
913*d75c37aeSmseidel 	OutStream->writeLong( 0L );
914*d75c37aeSmseidel 
915*d75c37aeSmseidel 	OutStream->writeLong( aIndex.size() );
916*d75c37aeSmseidel 
917*d75c37aeSmseidel 	// Sequences schreiben
918*d75c37aeSmseidel 	::std::deque<AttacherIndex_Impl>::iterator aIt = aIndex.begin();
919*d75c37aeSmseidel 	::std::deque<AttacherIndex_Impl>::iterator aEnd = aIndex.end();
920*d75c37aeSmseidel 	while( aIt != aEnd )
921*d75c37aeSmseidel 	{
922cdf0e10cSrcweir #ifdef DEQUE_OK
923*d75c37aeSmseidel 		// Laenge der Sequence und alle Descriptoren schreiben
924*d75c37aeSmseidel 		OutStream->writeLong( (*aIt).aEventList.size() );
925*d75c37aeSmseidel 		::std::deque< ScriptEventDescriptor >::iterator aEvtIt = (*aIt).aEventList.begin();
926*d75c37aeSmseidel 		::std::deque< ScriptEventDescriptor >::iterator aEvtEnd = (*aIt).aEventList.end();
927*d75c37aeSmseidel 		while( aEvtIt != aEvtEnd )
928*d75c37aeSmseidel 		{
929*d75c37aeSmseidel 			const ScriptEventDescriptor& rDesc = (*aEvtIt);
930*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ListenerType );
931*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.EventMethod );
932*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.AddListenerParam );
933*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ScriptType );
934*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ScriptCode );
935*d75c37aeSmseidel 
936*d75c37aeSmseidel 			aEvtIt++;
937*d75c37aeSmseidel 		}
938cdf0e10cSrcweir #else
939*d75c37aeSmseidel 		sal_Int32 nLen = (*aIt).aEventList.getLength();
940*d75c37aeSmseidel 		// Laenge der Sequence und alle Descriptoren schreiben
941*d75c37aeSmseidel 		OutStream->writeLong( nLen );
942*d75c37aeSmseidel 		ScriptEventDescriptor * pEL = (*aIt).aEventList.getArray();
943*d75c37aeSmseidel 		for( sal_Int32 i = 0; i < nLen; i++ )
944*d75c37aeSmseidel 		{
945*d75c37aeSmseidel 			const ScriptEventDescriptor& rDesc = pEL[i];
946*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ListenerType );
947*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.EventMethod );
948*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.AddListenerParam );
949*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ScriptType );
950*d75c37aeSmseidel 			OutStream->writeUTF( rDesc.ScriptCode );
951*d75c37aeSmseidel 		}
952cdf0e10cSrcweir #endif
953*d75c37aeSmseidel 		aIt++;
954*d75c37aeSmseidel 	}
955*d75c37aeSmseidel 
956*d75c37aeSmseidel 	// Die jetzt bekannte Laenge eintragen
957*d75c37aeSmseidel 	sal_Int32 nObjLen = xMarkStream->offsetToMark( nObjLenMark ) -4;
958*d75c37aeSmseidel 	xMarkStream->jumpToMark( nObjLenMark );
959*d75c37aeSmseidel 	OutStream->writeLong( nObjLen );
960*d75c37aeSmseidel 	xMarkStream->jumpToFurthest();
961*d75c37aeSmseidel 	xMarkStream->deleteMark( nObjLenMark );
962cdf0e10cSrcweir }
963cdf0e10cSrcweir 
read(const Reference<XObjectInputStream> & InStream)964cdf0e10cSrcweir void SAL_CALL ImplEventAttacherManager::read(const Reference< XObjectInputStream >& InStream)
965*d75c37aeSmseidel 	throw( IOException, RuntimeException )
966cdf0e10cSrcweir {
967*d75c37aeSmseidel 	Guard< Mutex > aGuard( aLock );
968*d75c37aeSmseidel 	// Ohne XMarkableStream laeuft nichts
969*d75c37aeSmseidel 	Reference< XMarkableStream > xMarkStream( InStream, UNO_QUERY );
970*d75c37aeSmseidel 	if( !xMarkStream.is() )
971*d75c37aeSmseidel 		return;
972cdf0e10cSrcweir 
973*d75c37aeSmseidel 	// Version lesen
974*d75c37aeSmseidel 	nVersion = InStream->readShort();
975cdf0e10cSrcweir 
976*d75c37aeSmseidel 	// Zunaechst kommen die Daten gemaess Version 1,
977*d75c37aeSmseidel 	// muss auch bei hoeheren Versionen beibehalten werden
978*d75c37aeSmseidel 	sal_Int32 nLen = InStream->readLong();
979cdf0e10cSrcweir 
980*d75c37aeSmseidel 	// Position fuer Vergleichszwecke
981*d75c37aeSmseidel 	sal_Int32 nObjLenMark = xMarkStream->createMark();
982*d75c37aeSmseidel 
983*d75c37aeSmseidel 	// Anzahl der zu lesenden Sequences
984*d75c37aeSmseidel 	sal_Int32 nItemCount = InStream->readLong();
985*d75c37aeSmseidel 
986*d75c37aeSmseidel 	for( sal_Int32 i = 0 ; i < nItemCount ; i++ )
987*d75c37aeSmseidel 	{
988*d75c37aeSmseidel 		insertEntry( i );
989*d75c37aeSmseidel 		// Laenge der Sequence lesen
990*d75c37aeSmseidel 		sal_Int32 nSeqLen = InStream->readLong();
991*d75c37aeSmseidel 
992*d75c37aeSmseidel 		// Sequence anlegen und Descriptoren lesen
993*d75c37aeSmseidel 		Sequence< ScriptEventDescriptor > aSEDSeq( nSeqLen );
994*d75c37aeSmseidel 		ScriptEventDescriptor* pArray = aSEDSeq.getArray();
995*d75c37aeSmseidel 		for( sal_Int32 j = 0 ; j < nSeqLen ; j++ )
996*d75c37aeSmseidel 		{
997*d75c37aeSmseidel 			ScriptEventDescriptor& rDesc = pArray[ j ];
998*d75c37aeSmseidel 			rDesc.ListenerType = InStream->readUTF();
999*d75c37aeSmseidel 			rDesc.EventMethod = InStream->readUTF();
1000*d75c37aeSmseidel 			rDesc.AddListenerParam = InStream->readUTF();
1001*d75c37aeSmseidel 			rDesc.ScriptType = InStream->readUTF();
1002*d75c37aeSmseidel 			rDesc.ScriptCode = InStream->readUTF();
1003*d75c37aeSmseidel 		}
1004*d75c37aeSmseidel 		registerScriptEvents( i, aSEDSeq );
1005*d75c37aeSmseidel 	}
1006*d75c37aeSmseidel 
1007*d75c37aeSmseidel 	// Haben wir die angegebene Laenge gelesen?
1008*d75c37aeSmseidel 	sal_Int32 nRealLen = xMarkStream->offsetToMark( nObjLenMark );
1009*d75c37aeSmseidel 	if( nRealLen != nLen )
1010*d75c37aeSmseidel 	{
1011*d75c37aeSmseidel 		// Nur wenn die StreamVersion > 1 ist und noch Daten folgen, kann das
1012*d75c37aeSmseidel 		// Ganze richtig sein. Sonst ist etwas voellig daneben gegangen.
1013*d75c37aeSmseidel 		if( nRealLen > nLen || nVersion == 1 )
1014*d75c37aeSmseidel 		{
1015*d75c37aeSmseidel 			VOS_ENSHURE( sal_False, "ImplEventAttacherManager::read(): Fatal Error, wrong object length" );
1016*d75c37aeSmseidel 		}
1017*d75c37aeSmseidel 		else
1018*d75c37aeSmseidel 		{
1019*d75c37aeSmseidel 			// TODO: Pruefen, ob Zwischen-Speicherung der Daten sinnvoll sein koennte
1020*d75c37aeSmseidel 
1021*d75c37aeSmseidel 			// Vorerst einfach nur Skippen
1022*d75c37aeSmseidel 			sal_Int32 nSkipCount = nLen - nRealLen;
1023*d75c37aeSmseidel 			InStream->skipBytes( nSkipCount );
1024*d75c37aeSmseidel 		}
1025*d75c37aeSmseidel 	}
1026*d75c37aeSmseidel 	xMarkStream->jumpToFurthest();
1027*d75c37aeSmseidel 	xMarkStream->deleteMark( nObjLenMark );
1028*d75c37aeSmseidel }
1029*d75c37aeSmseidel 
1030*d75c37aeSmseidel } // namesapce comphelper
1031