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