1*2f86921cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2f86921cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2f86921cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2f86921cSAndrew Rist  * distributed with this work for additional information
6*2f86921cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2f86921cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2f86921cSAndrew Rist  * "License"); you may not use this file except in compliance
9*2f86921cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2f86921cSAndrew Rist  *
11*2f86921cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2f86921cSAndrew Rist  *
13*2f86921cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2f86921cSAndrew Rist  * software distributed under the License is distributed on an
15*2f86921cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2f86921cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*2f86921cSAndrew Rist  * specific language governing permissions and limitations
18*2f86921cSAndrew Rist  * under the License.
19*2f86921cSAndrew Rist  *
20*2f86921cSAndrew Rist  *************************************************************/
21*2f86921cSAndrew Rist 
22*2f86921cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_ucb.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