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