12f86921cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
32f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
42f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file
52f86921cSAndrew Rist * distributed with this work for additional information
62f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
72f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the
82f86921cSAndrew Rist * "License"); you may not use this file except in compliance
92f86921cSAndrew Rist * with the License. You may obtain a copy of the License at
102f86921cSAndrew Rist *
112f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
122f86921cSAndrew Rist *
132f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing,
142f86921cSAndrew Rist * software distributed under the License is distributed on an
152f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162f86921cSAndrew Rist * KIND, either express or implied. See the License for the
172f86921cSAndrew Rist * specific language governing permissions and limitations
182f86921cSAndrew Rist * under the License.
192f86921cSAndrew Rist *
202f86921cSAndrew Rist *************************************************************/
212f86921cSAndrew Rist
222f86921cSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25*421ed02eSdamjan #include "precompiled_cacher.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <dynamicresultsetwrapper.hxx>
28cdf0e10cSrcweir #include <ucbhelper/macros.hxx>
29cdf0e10cSrcweir #include <osl/diagnose.h>
30cdf0e10cSrcweir #include <rtl/ustring.hxx>
31cdf0e10cSrcweir #include <com/sun/star/ucb/ListActionType.hpp>
32cdf0e10cSrcweir #include <com/sun/star/ucb/WelcomeDynamicResultSetStruct.hpp>
33cdf0e10cSrcweir #include <com/sun/star/ucb/XCachedDynamicResultSetStubFactory.hpp>
34cdf0e10cSrcweir
35cdf0e10cSrcweir using namespace com::sun::star::lang;
36cdf0e10cSrcweir using namespace com::sun::star::sdbc;
37cdf0e10cSrcweir using namespace com::sun::star::ucb;
38cdf0e10cSrcweir using namespace com::sun::star::uno;
39cdf0e10cSrcweir using namespace cppu;
40cdf0e10cSrcweir using namespace rtl;
41cdf0e10cSrcweir
42cdf0e10cSrcweir //--------------------------------------------------------------------------
43cdf0e10cSrcweir //--------------------------------------------------------------------------
44cdf0e10cSrcweir // class DynamicResultSetWrapper
45cdf0e10cSrcweir //--------------------------------------------------------------------------
46cdf0e10cSrcweir //--------------------------------------------------------------------------
47cdf0e10cSrcweir
DynamicResultSetWrapper(Reference<XDynamicResultSet> xOrigin,const Reference<XMultiServiceFactory> & xSMgr)48cdf0e10cSrcweir DynamicResultSetWrapper::DynamicResultSetWrapper(
49cdf0e10cSrcweir Reference< XDynamicResultSet > xOrigin
50cdf0e10cSrcweir , const Reference< XMultiServiceFactory > & xSMgr )
51cdf0e10cSrcweir
52cdf0e10cSrcweir : m_bDisposed( sal_False )
53cdf0e10cSrcweir , m_bInDispose( sal_False )
54cdf0e10cSrcweir , m_pDisposeEventListeners( NULL )
55cdf0e10cSrcweir , m_xSMgr( xSMgr )
56cdf0e10cSrcweir , m_bStatic( sal_False )
57cdf0e10cSrcweir , m_bGotWelcome( sal_False )
58cdf0e10cSrcweir , m_xSource( xOrigin )
59cdf0e10cSrcweir , m_xSourceResultOne( NULL )
60cdf0e10cSrcweir , m_xSourceResultTwo( NULL )
61cdf0e10cSrcweir // , m_xSourceResultCurrent( NULL )
62cdf0e10cSrcweir // , m_bUseOne( NULL )
63cdf0e10cSrcweir , m_xMyResultOne( NULL )
64cdf0e10cSrcweir , m_xMyResultTwo( NULL )
65cdf0e10cSrcweir , m_xListener( NULL )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir m_pMyListenerImpl = new DynamicResultSetWrapperListener( this );
68cdf0e10cSrcweir m_xMyListenerImpl = Reference< XDynamicResultSetListener >( m_pMyListenerImpl );
69cdf0e10cSrcweir //call impl_init() at the end of constructor of derived class
70cdf0e10cSrcweir };
71cdf0e10cSrcweir
impl_init()72cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper::impl_init()
73cdf0e10cSrcweir {
74cdf0e10cSrcweir //call this at the end of constructor of derived class
75cdf0e10cSrcweir //
76cdf0e10cSrcweir
77cdf0e10cSrcweir Reference< XDynamicResultSet > xSource = NULL;
78cdf0e10cSrcweir {
79cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
80cdf0e10cSrcweir xSource = m_xSource;
81cdf0e10cSrcweir m_xSource = NULL;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir if( xSource.is() )
84cdf0e10cSrcweir setSource( xSource );
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
~DynamicResultSetWrapper()87cdf0e10cSrcweir DynamicResultSetWrapper::~DynamicResultSetWrapper()
88cdf0e10cSrcweir {
89cdf0e10cSrcweir //call impl_deinit() at start of destructor of derived class
90cdf0e10cSrcweir
91cdf0e10cSrcweir delete m_pDisposeEventListeners;
92cdf0e10cSrcweir };
93cdf0e10cSrcweir
impl_deinit()94cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper::impl_deinit()
95cdf0e10cSrcweir {
96cdf0e10cSrcweir //call this at start of destructor of derived class
97cdf0e10cSrcweir //
98cdf0e10cSrcweir m_pMyListenerImpl->impl_OwnerDies();
99cdf0e10cSrcweir }
100cdf0e10cSrcweir
101cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
impl_EnsureNotDisposed()102cdf0e10cSrcweir ::impl_EnsureNotDisposed()
103cdf0e10cSrcweir throw( DisposedException, RuntimeException )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
106cdf0e10cSrcweir if( m_bDisposed )
107cdf0e10cSrcweir throw DisposedException();
108cdf0e10cSrcweir }
109cdf0e10cSrcweir
110cdf0e10cSrcweir //virtual
111cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
impl_InitResultSetOne(const Reference<XResultSet> & xResultSet)112cdf0e10cSrcweir ::impl_InitResultSetOne( const Reference< XResultSet >& xResultSet )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
115cdf0e10cSrcweir OSL_ENSURE( !m_xSourceResultOne.is(), "Source ResultSet One is set already" );
116cdf0e10cSrcweir m_xSourceResultOne = xResultSet;
117cdf0e10cSrcweir m_xMyResultOne = xResultSet;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir
120cdf0e10cSrcweir //virtual
121cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
impl_InitResultSetTwo(const Reference<XResultSet> & xResultSet)122cdf0e10cSrcweir ::impl_InitResultSetTwo( const Reference< XResultSet >& xResultSet )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
125cdf0e10cSrcweir OSL_ENSURE( !m_xSourceResultTwo.is(), "Source ResultSet Two is set already" );
126cdf0e10cSrcweir m_xSourceResultTwo = xResultSet;
127cdf0e10cSrcweir m_xMyResultTwo = xResultSet;
128cdf0e10cSrcweir }
129cdf0e10cSrcweir
130cdf0e10cSrcweir //--------------------------------------------------------------------------
131cdf0e10cSrcweir // XInterface methods.
132cdf0e10cSrcweir //--------------------------------------------------------------------------
133cdf0e10cSrcweir //list all interfaces inclusive baseclasses of interfaces
134cdf0e10cSrcweir QUERYINTERFACE_IMPL_START( DynamicResultSetWrapper )
SAL_STATIC_CAST(XComponent *,this)135cdf0e10cSrcweir SAL_STATIC_CAST( XComponent*, this ) //base of XDynamicResultSet
136cdf0e10cSrcweir , SAL_STATIC_CAST( XDynamicResultSet*, this )
137cdf0e10cSrcweir , SAL_STATIC_CAST( XSourceInitialization*, this )
138cdf0e10cSrcweir QUERYINTERFACE_IMPL_END
139cdf0e10cSrcweir
140cdf0e10cSrcweir //--------------------------------------------------------------------------
141cdf0e10cSrcweir // XComponent methods.
142cdf0e10cSrcweir //--------------------------------------------------------------------------
143cdf0e10cSrcweir // virtual
144cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
145cdf0e10cSrcweir ::dispose() throw( RuntimeException )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir impl_EnsureNotDisposed();
148cdf0e10cSrcweir
149cdf0e10cSrcweir Reference< XComponent > xSourceComponent;
150cdf0e10cSrcweir {
151cdf0e10cSrcweir osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
152cdf0e10cSrcweir if( m_bInDispose || m_bDisposed )
153cdf0e10cSrcweir return;
154cdf0e10cSrcweir m_bInDispose = sal_True;
155cdf0e10cSrcweir
156cdf0e10cSrcweir xSourceComponent = Reference< XComponent >(m_xSource, UNO_QUERY);
157cdf0e10cSrcweir
158cdf0e10cSrcweir if( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir EventObject aEvt;
161cdf0e10cSrcweir aEvt.Source = static_cast< XComponent * >( this );
162cdf0e10cSrcweir
163cdf0e10cSrcweir aGuard.clear();
164cdf0e10cSrcweir m_pDisposeEventListeners->disposeAndClear( aEvt );
165cdf0e10cSrcweir }
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
168cdf0e10cSrcweir /* //@todo ?? ( only if java collection needs to long )
169cdf0e10cSrcweir if( xSourceComponent.is() )
170cdf0e10cSrcweir xSourceComponent->dispose();
171cdf0e10cSrcweir */
172cdf0e10cSrcweir
173cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
174cdf0e10cSrcweir m_bDisposed = sal_True;
175cdf0e10cSrcweir m_bInDispose = sal_False;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir //--------------------------------------------------------------------------
179cdf0e10cSrcweir // virtual
180cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
addEventListener(const Reference<XEventListener> & Listener)181cdf0e10cSrcweir ::addEventListener( const Reference< XEventListener >& Listener )
182cdf0e10cSrcweir throw( RuntimeException )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir impl_EnsureNotDisposed();
185cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
186cdf0e10cSrcweir
187cdf0e10cSrcweir if ( !m_pDisposeEventListeners )
188cdf0e10cSrcweir m_pDisposeEventListeners =
189cdf0e10cSrcweir new OInterfaceContainerHelper( m_aContainerMutex );
190cdf0e10cSrcweir
191cdf0e10cSrcweir m_pDisposeEventListeners->addInterface( Listener );
192cdf0e10cSrcweir }
193cdf0e10cSrcweir
194cdf0e10cSrcweir //--------------------------------------------------------------------------
195cdf0e10cSrcweir // virtual
196cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
removeEventListener(const Reference<XEventListener> & Listener)197cdf0e10cSrcweir ::removeEventListener( const Reference< XEventListener >& Listener )
198cdf0e10cSrcweir throw( RuntimeException )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir impl_EnsureNotDisposed();
201cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
202cdf0e10cSrcweir
203cdf0e10cSrcweir if ( m_pDisposeEventListeners )
204cdf0e10cSrcweir m_pDisposeEventListeners->removeInterface( Listener );
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
207cdf0e10cSrcweir //--------------------------------------------------------------------------
208cdf0e10cSrcweir // own methods
209cdf0e10cSrcweir //--------------------------------------------------------------------------
210cdf0e10cSrcweir
211cdf0e10cSrcweir //virtual
212cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
impl_disposing(const EventObject &)213cdf0e10cSrcweir ::impl_disposing( const EventObject& )
214cdf0e10cSrcweir throw( RuntimeException )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir impl_EnsureNotDisposed();
217cdf0e10cSrcweir
218cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
219cdf0e10cSrcweir
220cdf0e10cSrcweir if( !m_xSource.is() )
221cdf0e10cSrcweir return;
222cdf0e10cSrcweir
223cdf0e10cSrcweir //release all references to the broadcaster:
224cdf0e10cSrcweir m_xSource.clear();
225cdf0e10cSrcweir m_xSourceResultOne.clear();//?? or only when not static??
226cdf0e10cSrcweir m_xSourceResultTwo.clear();//??
227cdf0e10cSrcweir //@todo m_xMyResultOne.clear(); ???
228cdf0e10cSrcweir //@todo m_xMyResultTwo.clear(); ???
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir //virtual
232cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
impl_notify(const ListEvent & Changes)233cdf0e10cSrcweir ::impl_notify( const ListEvent& Changes )
234cdf0e10cSrcweir throw( RuntimeException )
235cdf0e10cSrcweir {
236cdf0e10cSrcweir impl_EnsureNotDisposed();
237cdf0e10cSrcweir //@todo
238cdf0e10cSrcweir /*
239cdf0e10cSrcweir <p>The Listener is allowed to blockade this call, until he really want to go
240cdf0e10cSrcweir to the new version. The only situation, where the listener has to return the
241cdf0e10cSrcweir update call at once is, while he disposes his broadcaster or while he is
242cdf0e10cSrcweir removing himsef as listener (otherwise you deadlock)!!!
243cdf0e10cSrcweir */
244cdf0e10cSrcweir // handle the actions in the list
245cdf0e10cSrcweir
246cdf0e10cSrcweir ListEvent aNewEvent;
247cdf0e10cSrcweir aNewEvent.Source = static_cast< XDynamicResultSet * >( this );
248cdf0e10cSrcweir aNewEvent.Changes = Changes.Changes;
249cdf0e10cSrcweir
250cdf0e10cSrcweir {
251cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
252cdf0e10cSrcweir for( long i=0; !m_bGotWelcome && i<Changes.Changes.getLength(); i++ )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir ListAction& rAction = aNewEvent.Changes[i];
255cdf0e10cSrcweir switch( rAction.ListActionType )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir case ListActionType::WELCOME:
258cdf0e10cSrcweir {
259cdf0e10cSrcweir WelcomeDynamicResultSetStruct aWelcome;
260cdf0e10cSrcweir if( rAction.ActionInfo >>= aWelcome )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir impl_InitResultSetOne( aWelcome.Old );
263cdf0e10cSrcweir impl_InitResultSetTwo( aWelcome.New );
264cdf0e10cSrcweir m_bGotWelcome = sal_True;
265cdf0e10cSrcweir
266cdf0e10cSrcweir aWelcome.Old = m_xMyResultOne;
267cdf0e10cSrcweir aWelcome.New = m_xMyResultTwo;
268cdf0e10cSrcweir
269cdf0e10cSrcweir rAction.ActionInfo <<= aWelcome;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir else
272cdf0e10cSrcweir {
273cdf0e10cSrcweir OSL_ENSURE( sal_False, "ListActionType was WELCOME but ActionInfo didn't contain a WelcomeDynamicResultSetStruct" );
274cdf0e10cSrcweir //throw RuntimeException();
275cdf0e10cSrcweir }
276cdf0e10cSrcweir break;
277cdf0e10cSrcweir }
278cdf0e10cSrcweir }
279cdf0e10cSrcweir }
280cdf0e10cSrcweir OSL_ENSURE( m_bGotWelcome, "first notification was without WELCOME" );
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir if( !m_xListener.is() )
284cdf0e10cSrcweir m_aListenerSet.wait();
285cdf0e10cSrcweir m_xListener->notify( aNewEvent );
286cdf0e10cSrcweir
287cdf0e10cSrcweir /*
288cdf0e10cSrcweir m_bUseOne = !m_bUseOne;
289cdf0e10cSrcweir if( m_bUseOne )
290cdf0e10cSrcweir m_xSourceResultCurrent = m_xSourceResultOne;
291cdf0e10cSrcweir else
292cdf0e10cSrcweir m_xSourceResultCurrent = m_xSourceResultTwo;
293cdf0e10cSrcweir */
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
296cdf0e10cSrcweir //--------------------------------------------------------------------------
297cdf0e10cSrcweir // XSourceInitialization
298cdf0e10cSrcweir //--------------------------------------------------------------------------
299cdf0e10cSrcweir //virtual
300cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
setSource(const Reference<XInterface> & Source)301cdf0e10cSrcweir ::setSource( const Reference< XInterface > & Source )
302cdf0e10cSrcweir throw( AlreadyInitializedException, RuntimeException )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir impl_EnsureNotDisposed();
305cdf0e10cSrcweir {
306cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
307cdf0e10cSrcweir if( m_xSource.is() )
308cdf0e10cSrcweir {
309cdf0e10cSrcweir throw AlreadyInitializedException();
310cdf0e10cSrcweir }
311cdf0e10cSrcweir }
312cdf0e10cSrcweir
313cdf0e10cSrcweir Reference< XDynamicResultSet > xSourceDynamic( Source, UNO_QUERY );
314cdf0e10cSrcweir OSL_ENSURE( xSourceDynamic.is(),
315cdf0e10cSrcweir "the given source is not of required type XDynamicResultSet" );
316cdf0e10cSrcweir
317cdf0e10cSrcweir Reference< XDynamicResultSetListener > xListener = NULL;
318cdf0e10cSrcweir Reference< XDynamicResultSetListener > xMyListenerImpl = NULL;
319cdf0e10cSrcweir
320cdf0e10cSrcweir sal_Bool bStatic = sal_False;
321cdf0e10cSrcweir {
322cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
323cdf0e10cSrcweir m_xSource = xSourceDynamic;
324cdf0e10cSrcweir xListener = m_xListener;
325cdf0e10cSrcweir bStatic = m_bStatic;
326cdf0e10cSrcweir xMyListenerImpl = m_xMyListenerImpl;
327cdf0e10cSrcweir }
328cdf0e10cSrcweir if( xListener.is() )
329cdf0e10cSrcweir xSourceDynamic->setListener( m_xMyListenerImpl );
330cdf0e10cSrcweir else if( bStatic )
331cdf0e10cSrcweir {
332cdf0e10cSrcweir Reference< XComponent > xSourceComponent( Source, UNO_QUERY );
333cdf0e10cSrcweir xSourceComponent->addEventListener( Reference< XEventListener > ::query( xMyListenerImpl ) );
334cdf0e10cSrcweir }
335cdf0e10cSrcweir m_aSourceSet.set();
336cdf0e10cSrcweir }
337cdf0e10cSrcweir
338cdf0e10cSrcweir //--------------------------------------------------------------------------
339cdf0e10cSrcweir // XDynamicResultSet
340cdf0e10cSrcweir //--------------------------------------------------------------------------
341cdf0e10cSrcweir //virtual
342cdf0e10cSrcweir Reference< XResultSet > SAL_CALL DynamicResultSetWrapper
getStaticResultSet()343cdf0e10cSrcweir ::getStaticResultSet()
344cdf0e10cSrcweir throw( ListenerAlreadySetException, RuntimeException )
345cdf0e10cSrcweir {
346cdf0e10cSrcweir impl_EnsureNotDisposed();
347cdf0e10cSrcweir
348cdf0e10cSrcweir Reference< XDynamicResultSet > xSource = NULL;
349cdf0e10cSrcweir Reference< XEventListener > xMyListenerImpl = NULL;
350cdf0e10cSrcweir {
351cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
352cdf0e10cSrcweir if( m_xListener.is() )
353cdf0e10cSrcweir throw ListenerAlreadySetException();
354cdf0e10cSrcweir
355cdf0e10cSrcweir xSource = m_xSource;
356cdf0e10cSrcweir m_bStatic = sal_True;
357cdf0e10cSrcweir xMyListenerImpl = Reference< XEventListener > ::query( m_xMyListenerImpl );
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
360cdf0e10cSrcweir if( xSource.is() )
361cdf0e10cSrcweir {
362cdf0e10cSrcweir Reference< XComponent > xSourceComponent( xSource, UNO_QUERY );
363cdf0e10cSrcweir xSourceComponent->addEventListener( xMyListenerImpl );
364cdf0e10cSrcweir }
365cdf0e10cSrcweir if( !xSource.is() )
366cdf0e10cSrcweir m_aSourceSet.wait();
367cdf0e10cSrcweir
368cdf0e10cSrcweir
369cdf0e10cSrcweir Reference< XResultSet > xResultSet = xSource->getStaticResultSet();
370cdf0e10cSrcweir impl_InitResultSetOne( xResultSet );
371cdf0e10cSrcweir return m_xMyResultOne;
372cdf0e10cSrcweir }
373cdf0e10cSrcweir
374cdf0e10cSrcweir //virtual
375cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
setListener(const Reference<XDynamicResultSetListener> & Listener)376cdf0e10cSrcweir ::setListener( const Reference<
377cdf0e10cSrcweir XDynamicResultSetListener > & Listener )
378cdf0e10cSrcweir throw( ListenerAlreadySetException, RuntimeException )
379cdf0e10cSrcweir {
380cdf0e10cSrcweir impl_EnsureNotDisposed();
381cdf0e10cSrcweir
382cdf0e10cSrcweir Reference< XDynamicResultSet > xSource = NULL;
383cdf0e10cSrcweir Reference< XDynamicResultSetListener > xMyListenerImpl = NULL;
384cdf0e10cSrcweir {
385cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
386cdf0e10cSrcweir if( m_xListener.is() )
387cdf0e10cSrcweir throw ListenerAlreadySetException();
388cdf0e10cSrcweir if( m_bStatic )
389cdf0e10cSrcweir throw ListenerAlreadySetException();
390cdf0e10cSrcweir
391cdf0e10cSrcweir m_xListener = Listener;
392cdf0e10cSrcweir addEventListener( Reference< XEventListener >::query( Listener ) );
393cdf0e10cSrcweir
394cdf0e10cSrcweir xSource = m_xSource;
395cdf0e10cSrcweir xMyListenerImpl = m_xMyListenerImpl;
396cdf0e10cSrcweir }
397cdf0e10cSrcweir if ( xSource.is() )
398cdf0e10cSrcweir xSource->setListener( xMyListenerImpl );
399cdf0e10cSrcweir
400cdf0e10cSrcweir m_aListenerSet.set();
401cdf0e10cSrcweir }
402cdf0e10cSrcweir
403cdf0e10cSrcweir //virtual
404cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapper
connectToCache(const Reference<XDynamicResultSet> & xCache)405cdf0e10cSrcweir ::connectToCache( const Reference< XDynamicResultSet > & xCache )
406cdf0e10cSrcweir throw( ListenerAlreadySetException, AlreadyInitializedException, ServiceNotFoundException, RuntimeException )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir impl_EnsureNotDisposed();
409cdf0e10cSrcweir
410cdf0e10cSrcweir if( m_xListener.is() )
411cdf0e10cSrcweir throw ListenerAlreadySetException();
412cdf0e10cSrcweir if( m_bStatic )
413cdf0e10cSrcweir throw ListenerAlreadySetException();
414cdf0e10cSrcweir
415cdf0e10cSrcweir Reference< XSourceInitialization > xTarget( xCache, UNO_QUERY );
416cdf0e10cSrcweir OSL_ENSURE( xTarget.is(), "The given Target dosn't have the required interface 'XSourceInitialization'" );
417cdf0e10cSrcweir if( xTarget.is() && m_xSMgr.is() )
418cdf0e10cSrcweir {
419cdf0e10cSrcweir //@todo m_aSourceSet.wait();?
420cdf0e10cSrcweir
421cdf0e10cSrcweir Reference< XCachedDynamicResultSetStubFactory > xStubFactory;
422cdf0e10cSrcweir try
423cdf0e10cSrcweir {
424cdf0e10cSrcweir xStubFactory = Reference< XCachedDynamicResultSetStubFactory >(
425cdf0e10cSrcweir m_xSMgr->createInstance(
426cdf0e10cSrcweir OUString::createFromAscii(
427cdf0e10cSrcweir "com.sun.star.ucb.CachedDynamicResultSetStubFactory" ) ),
428cdf0e10cSrcweir UNO_QUERY );
429cdf0e10cSrcweir }
430cdf0e10cSrcweir catch ( Exception const & )
431cdf0e10cSrcweir {
432cdf0e10cSrcweir }
433cdf0e10cSrcweir
434cdf0e10cSrcweir if( xStubFactory.is() )
435cdf0e10cSrcweir {
436cdf0e10cSrcweir xStubFactory->connectToCache(
437cdf0e10cSrcweir this, xCache, Sequence< NumberedSortingInfo > (), NULL );
438cdf0e10cSrcweir return;
439cdf0e10cSrcweir }
440cdf0e10cSrcweir }
441cdf0e10cSrcweir OSL_ENSURE( sal_False, "could not connect to cache" );
442cdf0e10cSrcweir throw ServiceNotFoundException();
443cdf0e10cSrcweir }
444cdf0e10cSrcweir
445cdf0e10cSrcweir //virtual
446cdf0e10cSrcweir sal_Int16 SAL_CALL DynamicResultSetWrapper
getCapabilities()447cdf0e10cSrcweir ::getCapabilities()
448cdf0e10cSrcweir throw( RuntimeException )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir impl_EnsureNotDisposed();
451cdf0e10cSrcweir
452cdf0e10cSrcweir m_aSourceSet.wait();
453cdf0e10cSrcweir Reference< XDynamicResultSet > xSource = NULL;
454cdf0e10cSrcweir {
455cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
456cdf0e10cSrcweir xSource = m_xSource;
457cdf0e10cSrcweir }
458cdf0e10cSrcweir return xSource->getCapabilities();
459cdf0e10cSrcweir }
460cdf0e10cSrcweir
461cdf0e10cSrcweir //--------------------------------------------------------------------------
462cdf0e10cSrcweir //--------------------------------------------------------------------------
463cdf0e10cSrcweir // class DynamicResultSetWrapperListener
464cdf0e10cSrcweir //--------------------------------------------------------------------------
465cdf0e10cSrcweir //--------------------------------------------------------------------------
466cdf0e10cSrcweir
DynamicResultSetWrapperListener(DynamicResultSetWrapper * pOwner)467cdf0e10cSrcweir DynamicResultSetWrapperListener::DynamicResultSetWrapperListener(
468cdf0e10cSrcweir DynamicResultSetWrapper* pOwner )
469cdf0e10cSrcweir : m_pOwner( pOwner )
470cdf0e10cSrcweir {
471cdf0e10cSrcweir
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
~DynamicResultSetWrapperListener()474cdf0e10cSrcweir DynamicResultSetWrapperListener::~DynamicResultSetWrapperListener()
475cdf0e10cSrcweir {
476cdf0e10cSrcweir
477cdf0e10cSrcweir }
478cdf0e10cSrcweir
479cdf0e10cSrcweir //--------------------------------------------------------------------------
480cdf0e10cSrcweir // XInterface methods.
481cdf0e10cSrcweir //--------------------------------------------------------------------------
482cdf0e10cSrcweir //list all interfaces inclusive baseclasses of interfaces
483cdf0e10cSrcweir XINTERFACE_IMPL_2( DynamicResultSetWrapperListener
484cdf0e10cSrcweir , XDynamicResultSetListener
485cdf0e10cSrcweir , XEventListener //base of XDynamicResultSetListener
486cdf0e10cSrcweir );
487cdf0e10cSrcweir
488cdf0e10cSrcweir //--------------------------------------------------------------------------
489cdf0e10cSrcweir // XDynamicResultSetListener methods:
490cdf0e10cSrcweir //--------------------------------------------------------------------------
491cdf0e10cSrcweir //virtual
492cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapperListener
disposing(const EventObject & rEventObject)493cdf0e10cSrcweir ::disposing( const EventObject& rEventObject )
494cdf0e10cSrcweir throw( RuntimeException )
495cdf0e10cSrcweir {
496cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
497cdf0e10cSrcweir
498cdf0e10cSrcweir if( m_pOwner )
499cdf0e10cSrcweir m_pOwner->impl_disposing( rEventObject );
500cdf0e10cSrcweir }
501cdf0e10cSrcweir
502cdf0e10cSrcweir //virtual
503cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapperListener
notify(const ListEvent & Changes)504cdf0e10cSrcweir ::notify( const ListEvent& Changes )
505cdf0e10cSrcweir throw( RuntimeException )
506cdf0e10cSrcweir {
507cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
508cdf0e10cSrcweir
509cdf0e10cSrcweir if( m_pOwner )
510cdf0e10cSrcweir m_pOwner->impl_notify( Changes );
511cdf0e10cSrcweir }
512cdf0e10cSrcweir
513cdf0e10cSrcweir //--------------------------------------------------------------------------
514cdf0e10cSrcweir // own methods:
515cdf0e10cSrcweir //--------------------------------------------------------------------------
516cdf0e10cSrcweir
517cdf0e10cSrcweir void SAL_CALL DynamicResultSetWrapperListener
impl_OwnerDies()518cdf0e10cSrcweir ::impl_OwnerDies()
519cdf0e10cSrcweir {
520cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
521cdf0e10cSrcweir
522cdf0e10cSrcweir m_pOwner = NULL;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
525