xref: /trunk/main/ucb/source/cacher/dynamicresultsetwrapper.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
112f86921cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 }
524