1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_ucb.hxx"
26 
27 #include <contentresultsetwrapper.hxx>
28 #include <com/sun/star/sdbc/FetchDirection.hpp>
29 #include <com/sun/star/ucb/FetchError.hpp>
30 #include <com/sun/star/beans/PropertyAttribute.hpp>
31 #include <com/sun/star/sdbc/ResultSetType.hpp>
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <rtl/ustring.hxx>
34 #include <osl/diagnose.h>
35 
36 using namespace com::sun::star::beans;
37 using namespace com::sun::star::lang;
38 using namespace com::sun::star::sdbc;
39 using namespace com::sun::star::ucb;
40 using namespace com::sun::star::uno;
41 using namespace com::sun::star::util;
42 using namespace cppu;
43 using namespace rtl;
44 
45 //--------------------------------------------------------------------------
46 //--------------------------------------------------------------------------
47 // class ContentResultSetWrapper
48 //--------------------------------------------------------------------------
49 //--------------------------------------------------------------------------
50 
ContentResultSetWrapper(Reference<XResultSet> xOrigin)51 ContentResultSetWrapper::ContentResultSetWrapper(
52 								Reference< XResultSet > xOrigin )
53 				: m_xResultSetOrigin( xOrigin )
54 				, m_xRowOrigin( NULL )
55 				, m_xContentAccessOrigin( NULL )
56 				, m_xPropertySetOrigin( NULL )
57 				, m_xPropertySetInfo( NULL )
58 				, m_nForwardOnly( 2 )
59 				, m_xMetaDataFromOrigin( NULL )
60 				, m_bDisposed( sal_False )
61 				, m_bInDispose( sal_False )
62 				, m_pDisposeEventListeners( NULL )
63 				, m_pPropertyChangeListeners( NULL )
64 				, m_pVetoableChangeListeners( NULL )
65 {
66 	m_pMyListenerImpl = new ContentResultSetWrapperListener( this );
67 	m_xMyListenerImpl = Reference< XPropertyChangeListener >( m_pMyListenerImpl );
68 
69 	OSL_ENSURE( m_xResultSetOrigin.is(), "XResultSet is required" );
70 
71 	//!! call impl_init() at the end of constructor of derived class
72 };
73 
74 
impl_init_xRowOrigin()75 void SAL_CALL ContentResultSetWrapper::impl_init_xRowOrigin()
76 {
77 	{
78 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
79 		if(m_xRowOrigin.is())
80 			return;
81 	}
82 
83 	Reference< XRow > xOrgig =
84 		Reference< XRow >( m_xResultSetOrigin, UNO_QUERY );
85 
86 	{
87 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
88 		m_xRowOrigin = xOrgig;
89 		OSL_ENSURE( m_xRowOrigin.is(), "interface XRow is required" );
90 	}
91 }
92 
impl_init_xContentAccessOrigin()93 void SAL_CALL ContentResultSetWrapper::impl_init_xContentAccessOrigin()
94 {
95 	{
96 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
97 		if(m_xContentAccessOrigin.is())
98 			return;
99 	}
100 
101 	Reference< XContentAccess > xOrgig =
102 		Reference< XContentAccess >( m_xResultSetOrigin, UNO_QUERY );
103 
104 	{
105 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
106 		m_xContentAccessOrigin = xOrgig;
107 		OSL_ENSURE( m_xContentAccessOrigin.is(), "interface XContentAccess is required" );
108 	}
109 }
110 
111 
impl_init_xPropertySetOrigin()112 void SAL_CALL ContentResultSetWrapper::impl_init_xPropertySetOrigin()
113 {
114 	{
115 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
116 		if( m_xPropertySetOrigin.is() )
117 			return;
118 	}
119 
120 	Reference< XPropertySet > xOrig =
121 		Reference< XPropertySet >( m_xResultSetOrigin, UNO_QUERY );
122 
123 	{
124 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
125 		m_xPropertySetOrigin = xOrig;
126 		OSL_ENSURE( m_xPropertySetOrigin.is(), "interface XPropertySet is required" );
127 	}
128 }
129 
impl_init()130 void SAL_CALL ContentResultSetWrapper::impl_init()
131 {
132 	//call this at the end of constructor of derived class
133 	//
134 
135 	//listen to disposing from Origin:
136 	Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
137 	OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
138 	xComponentOrigin->addEventListener( static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) );
139 }
140 
~ContentResultSetWrapper()141 ContentResultSetWrapper::~ContentResultSetWrapper()
142 {
143 	//call impl_deinit() at start of destructor of derived class
144 
145 	delete m_pDisposeEventListeners;
146 	delete m_pPropertyChangeListeners;
147 	delete m_pVetoableChangeListeners;
148 };
149 
impl_deinit()150 void SAL_CALL ContentResultSetWrapper::impl_deinit()
151 {
152 	//call this at start of destructor of derived class
153 	//
154 	m_pMyListenerImpl->impl_OwnerDies();
155 }
156 
157 //virtual
158 void SAL_CALL ContentResultSetWrapper
impl_initPropertySetInfo()159 	::impl_initPropertySetInfo()
160 {
161 	{
162 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
163 		if( m_xPropertySetInfo.is() )
164 			return;
165 
166 		impl_init_xPropertySetOrigin();
167 		if( !m_xPropertySetOrigin.is() )
168 			return;
169 	}
170 
171 	Reference< XPropertySetInfo > xOrig =
172 			m_xPropertySetOrigin->getPropertySetInfo();
173 
174 	{
175 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
176 		m_xPropertySetInfo = xOrig;
177 	}
178 }
179 
180 void SAL_CALL ContentResultSetWrapper
impl_EnsureNotDisposed()181 ::impl_EnsureNotDisposed()
182 	throw( DisposedException, RuntimeException )
183 {
184 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
185 	if( m_bDisposed )
186 		throw DisposedException();
187 }
188 
189 ContentResultSetWrapper::PropertyChangeListenerContainer_Impl* SAL_CALL
190 	ContentResultSetWrapper
impl_getPropertyChangeListenerContainer()191 	::impl_getPropertyChangeListenerContainer()
192 {
193 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
194 	if ( !m_pPropertyChangeListeners )
195 		m_pPropertyChangeListeners =
196 			new PropertyChangeListenerContainer_Impl( m_aContainerMutex );
197 	return m_pPropertyChangeListeners;
198 }
199 
200 ContentResultSetWrapper::PropertyChangeListenerContainer_Impl* SAL_CALL
201 	ContentResultSetWrapper
impl_getVetoableChangeListenerContainer()202 	::impl_getVetoableChangeListenerContainer()
203 {
204 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
205 	if ( !m_pVetoableChangeListeners )
206 		m_pVetoableChangeListeners =
207 			new PropertyChangeListenerContainer_Impl( m_aContainerMutex );
208 	return m_pVetoableChangeListeners;
209 }
210 
211 void SAL_CALL ContentResultSetWrapper
impl_notifyPropertyChangeListeners(const PropertyChangeEvent & rEvt)212 	::impl_notifyPropertyChangeListeners(
213 					const PropertyChangeEvent& rEvt )
214 {
215 	{
216 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
217 		if( !m_pPropertyChangeListeners )
218 			return;
219 	}
220 
221 	// Notify listeners interested especially in the changed property.
222 	OInterfaceContainerHelper* pContainer =
223 			m_pPropertyChangeListeners->getContainer( rEvt.PropertyName );
224 	if( pContainer )
225 	{
226 		OInterfaceIteratorHelper aIter( *pContainer );
227 		while( aIter.hasMoreElements() )
228 		{
229 			Reference< XPropertyChangeListener > xListener(
230 													aIter.next(), UNO_QUERY );
231 			if( xListener.is() )
232 				xListener->propertyChange( rEvt );
233 		}
234 	}
235 
236 	// Notify listeners interested in all properties.
237 	pContainer = m_pPropertyChangeListeners->getContainer( OUString() );
238 	if( pContainer )
239 	{
240 		OInterfaceIteratorHelper aIter( *pContainer );
241 		while( aIter.hasMoreElements() )
242 		{
243 			Reference< XPropertyChangeListener > xListener(
244 													aIter.next(), UNO_QUERY );
245 			if( xListener.is() )
246 				xListener->propertyChange( rEvt );
247 		}
248 	}
249 }
250 
251 void SAL_CALL ContentResultSetWrapper
impl_notifyVetoableChangeListeners(const PropertyChangeEvent & rEvt)252 	::impl_notifyVetoableChangeListeners( const PropertyChangeEvent& rEvt )
253 	throw( PropertyVetoException,
254 		   RuntimeException )
255 {
256 	{
257 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
258 		if( !m_pVetoableChangeListeners )
259 			return;
260 	}
261 
262 	// Notify listeners interested especially in the changed property.
263 	OInterfaceContainerHelper* pContainer =
264 			m_pVetoableChangeListeners->getContainer( rEvt.PropertyName );
265 	if( pContainer )
266 	{
267 		OInterfaceIteratorHelper aIter( *pContainer );
268 		while( aIter.hasMoreElements() )
269 		{
270 			Reference< XVetoableChangeListener > xListener(
271 													aIter.next(), UNO_QUERY );
272 			if( xListener.is() )
273 				xListener->vetoableChange( rEvt );
274 		}
275 	}
276 
277 	// Notify listeners interested in all properties.
278 	pContainer = m_pVetoableChangeListeners->getContainer( OUString() );
279 	if( pContainer )
280 	{
281 		OInterfaceIteratorHelper aIter( *pContainer );
282 		while( aIter.hasMoreElements() )
283 		{
284 			Reference< XVetoableChangeListener > xListener(
285 													aIter.next(), UNO_QUERY );
286 			if( xListener.is() )
287 				xListener->vetoableChange( rEvt );
288 		}
289 	}
290 }
291 
292 sal_Bool SAL_CALL ContentResultSetWrapper
impl_isForwardOnly()293 	::impl_isForwardOnly()
294 {
295 	//m_nForwardOnly == 2 -> don't know
296 	//m_nForwardOnly == 1 -> YES
297 	//m_nForwardOnly == 0 -> NO
298 
299 	//@todo replace this with lines in comment
300 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
301 	m_nForwardOnly = 0;
302 	return false;
303 
304 
305 	/*
306 	ReacquireableGuard aGuard( m_aMutex );
307 	if( m_nForwardOnly == 2 )
308 	{
309 		aGuard.clear();
310 		if( !getPropertySetInfo().is() )
311 		{
312 			aGuard.reacquire();
313 			m_nForwardOnly = 0;
314 			return m_nForwardOnly;
315 		}
316 		aGuard.reacquire();
317 
318 		rtl::OUString aName = OUString::createFromAscii( "ResultSetType" );
319 		//find out, if we are ForwardOnly and cache the value:
320 
321 		impl_init_xPropertySetOrigin();
322 		if( !m_xPropertySetOrigin.is() )
323 		{
324 			OSL_ENSURE( sal_False, "broadcaster was disposed already" );
325 			m_nForwardOnly = 0;
326 			return m_nForwardOnly;
327 		}
328 
329 		aGuard.clear();
330 		Any aAny = m_xPropertySetOrigin->getPropertyValue( aName );
331 
332 		aGuard.reacquire();
333 		long nResultSetType;
334 		if( ( aAny >>= nResultSetType ) &&
335 			( nResultSetType == ResultSetType::FORWARD_ONLY ) )
336 			m_nForwardOnly = 1;
337 		else
338 			m_nForwardOnly = 0;
339 	}
340 	return m_nForwardOnly;
341 	*/
342 }
343 
344 //--------------------------------------------------------------------------
345 // XInterface methods.
346 //--------------------------------------------------------------------------
347 //list all interfaces inclusive baseclasses of interfaces
348 QUERYINTERFACE_IMPL_START( ContentResultSetWrapper )
349 
SAL_STATIC_CAST(XComponent *,this)350 	SAL_STATIC_CAST( XComponent*, this ),
351 	SAL_STATIC_CAST( XCloseable*, this ),
352 	SAL_STATIC_CAST( XResultSetMetaDataSupplier*, this ),
353 	SAL_STATIC_CAST( XPropertySet*, this ),
354 
355 	SAL_STATIC_CAST( XContentAccess*, this ),
356 	SAL_STATIC_CAST( XResultSet*, this ),
357 	SAL_STATIC_CAST( XRow*, this )
358 
359 QUERYINTERFACE_IMPL_END
360 
361 //--------------------------------------------------------------------------
362 // XComponent methods.
363 //--------------------------------------------------------------------------
364 // virtual
365 void SAL_CALL ContentResultSetWrapper
366 	::dispose() throw( RuntimeException )
367 {
368 	impl_EnsureNotDisposed();
369 
370 	ReacquireableGuard aGuard( m_aMutex );
371 	if( m_bInDispose || m_bDisposed )
372 		return;
373 	m_bInDispose = sal_True;
374 
375 	if( m_xPropertySetOrigin.is() )
376 	{
377 		aGuard.clear();
378 		try
379 		{
380 			m_xPropertySetOrigin->removePropertyChangeListener(
381 				OUString(), static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) );
382 		}
383 		catch( Exception& )
384 		{
385 			OSL_ENSURE( sal_False, "could not remove PropertyChangeListener" );
386 		}
387 		try
388 		{
389 			m_xPropertySetOrigin->removeVetoableChangeListener(
390 				OUString(), static_cast< XVetoableChangeListener * >( m_pMyListenerImpl ) );
391 		}
392 		catch( Exception& )
393 		{
394 			OSL_ENSURE( sal_False, "could not remove VetoableChangeListener" );
395 		}
396 
397 		Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
398 		OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
399 		xComponentOrigin->removeEventListener( static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) );
400 	}
401 
402 	aGuard.reacquire();
403 	if( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
404 	{
405 		EventObject aEvt;
406 		aEvt.Source = static_cast< XComponent * >( this );
407 
408 		aGuard.clear();
409 		m_pDisposeEventListeners->disposeAndClear( aEvt );
410 	}
411 
412 	aGuard.reacquire();
413 	if( m_pPropertyChangeListeners )
414 	{
415 		EventObject aEvt;
416 		aEvt.Source = static_cast< XPropertySet * >( this );
417 
418 		aGuard.clear();
419 		m_pPropertyChangeListeners->disposeAndClear( aEvt );
420 	}
421 
422 	aGuard.reacquire();
423 	if( m_pVetoableChangeListeners )
424 	{
425 		EventObject aEvt;
426 		aEvt.Source = static_cast< XPropertySet * >( this );
427 
428 		aGuard.clear();
429 		m_pVetoableChangeListeners->disposeAndClear( aEvt );
430 	}
431 
432 	aGuard.reacquire();
433 	m_bDisposed = sal_True;
434 	m_bInDispose = sal_False;
435 }
436 
437 //--------------------------------------------------------------------------
438 // virtual
439 void SAL_CALL ContentResultSetWrapper
addEventListener(const Reference<XEventListener> & Listener)440 	::addEventListener(	const Reference< XEventListener >& Listener )
441 	throw( RuntimeException )
442 {
443 	impl_EnsureNotDisposed();
444 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
445 
446 	if ( !m_pDisposeEventListeners )
447 		m_pDisposeEventListeners =
448 					new OInterfaceContainerHelper( m_aContainerMutex );
449 
450 	m_pDisposeEventListeners->addInterface( Listener );
451 }
452 
453 //--------------------------------------------------------------------------
454 // virtual
455 void SAL_CALL ContentResultSetWrapper
removeEventListener(const Reference<XEventListener> & Listener)456 	::removeEventListener( const Reference< XEventListener >& Listener )
457 	throw( RuntimeException )
458 {
459 	impl_EnsureNotDisposed();
460 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
461 
462 	if ( m_pDisposeEventListeners )
463 		m_pDisposeEventListeners->removeInterface( Listener );
464 }
465 
466 //--------------------------------------------------------------------------
467 //XCloseable methods.
468 //--------------------------------------------------------------------------
469 //virtual
470 void SAL_CALL ContentResultSetWrapper
close()471 	::close()
472 	throw( SQLException,
473 		   RuntimeException )
474 {
475 	impl_EnsureNotDisposed();
476 	dispose();
477 }
478 
479 //--------------------------------------------------------------------------
480 //XResultSetMetaDataSupplier methods.
481 //--------------------------------------------------------------------------
482 //virtual
483 Reference< XResultSetMetaData > SAL_CALL ContentResultSetWrapper
getMetaData()484 	::getMetaData()
485 	throw( SQLException,
486 		   RuntimeException )
487 {
488 	impl_EnsureNotDisposed();
489 
490 	ReacquireableGuard aGuard( m_aMutex );
491 	if( !m_xMetaDataFromOrigin.is() && m_xResultSetOrigin.is() )
492 	{
493 		Reference< XResultSetMetaDataSupplier > xMetaDataSupplier
494 			= Reference< XResultSetMetaDataSupplier >(
495 				m_xResultSetOrigin, UNO_QUERY );
496 
497 		if( xMetaDataSupplier.is() )
498 		{
499 			aGuard.clear();
500 
501 			Reference< XResultSetMetaData > xMetaData
502 				= xMetaDataSupplier->getMetaData();
503 
504 			aGuard.reacquire();
505 			m_xMetaDataFromOrigin = xMetaData;
506 		}
507 	}
508 	return m_xMetaDataFromOrigin;
509 }
510 
511 
512 //--------------------------------------------------------------------------
513 // XPropertySet methods.
514 //--------------------------------------------------------------------------
515 // virtual
516 Reference< XPropertySetInfo > SAL_CALL ContentResultSetWrapper
getPropertySetInfo()517 	::getPropertySetInfo() throw( RuntimeException )
518 {
519 	impl_EnsureNotDisposed();
520 	{
521 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
522 		if( m_xPropertySetInfo.is() )
523 			return m_xPropertySetInfo;
524 	}
525 	impl_initPropertySetInfo();
526 	return m_xPropertySetInfo;
527 }
528 //--------------------------------------------------------------------------
529 // virtual
530 void SAL_CALL ContentResultSetWrapper
setPropertyValue(const OUString & rPropertyName,const Any & rValue)531 	::setPropertyValue( const OUString& rPropertyName, const Any& rValue )
532 	throw( UnknownPropertyException,
533 		   PropertyVetoException,
534 		   IllegalArgumentException,
535 		   WrappedTargetException,
536 		   RuntimeException )
537 {
538 	impl_EnsureNotDisposed();
539 	impl_init_xPropertySetOrigin();
540 	if( !m_xPropertySetOrigin.is() )
541 	{
542 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
543 		throw UnknownPropertyException();
544 	}
545 	m_xPropertySetOrigin->setPropertyValue( rPropertyName, rValue );
546 }
547 
548 //--------------------------------------------------------------------------
549 // virtual
550 Any SAL_CALL ContentResultSetWrapper
getPropertyValue(const OUString & rPropertyName)551 	::getPropertyValue( const OUString& rPropertyName )
552 	throw( UnknownPropertyException,
553 		   WrappedTargetException,
554 		   RuntimeException )
555 {
556 	impl_EnsureNotDisposed();
557 	impl_init_xPropertySetOrigin();
558 	if( !m_xPropertySetOrigin.is() )
559 	{
560 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
561 		throw UnknownPropertyException();
562 	}
563 	return m_xPropertySetOrigin->getPropertyValue( rPropertyName );
564 }
565 
566 //--------------------------------------------------------------------------
567 // virtual
568 void SAL_CALL ContentResultSetWrapper
addPropertyChangeListener(const OUString & aPropertyName,const Reference<XPropertyChangeListener> & xListener)569 	::addPropertyChangeListener(
570 			const OUString& aPropertyName,
571 			const Reference< XPropertyChangeListener >& xListener )
572 	throw( UnknownPropertyException,
573 		   WrappedTargetException,
574 		   RuntimeException )
575 {
576 	impl_EnsureNotDisposed();
577 
578 	if( !getPropertySetInfo().is() )
579 	{
580 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
581 		throw UnknownPropertyException();
582 	}
583 
584 	if( aPropertyName.getLength() )
585 	{
586 		m_xPropertySetInfo->getPropertyByName( aPropertyName );
587 		//throws UnknownPropertyException, if so
588 	}
589 
590 	impl_getPropertyChangeListenerContainer();
591 	sal_Bool bNeedRegister = !m_pPropertyChangeListeners->
592 						getContainedTypes().getLength();
593 	m_pPropertyChangeListeners->addInterface( aPropertyName, xListener );
594 	if( bNeedRegister )
595 	{
596 		impl_init_xPropertySetOrigin();
597 		{
598 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
599 			if( !m_xPropertySetOrigin.is() )
600 			{
601 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
602 				return;
603 			}
604 		}
605 		try
606 		{
607 			m_xPropertySetOrigin->addPropertyChangeListener(
608 				OUString(), static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) );
609 		}
610 		catch( Exception& rEx )
611 		{
612 			m_pPropertyChangeListeners->removeInterface( aPropertyName, xListener );
613 			throw rEx;
614 		}
615 	}
616 }
617 
618 //--------------------------------------------------------------------------
619 // virtual
620 void SAL_CALL ContentResultSetWrapper
addVetoableChangeListener(const OUString & rPropertyName,const Reference<XVetoableChangeListener> & xListener)621 	::addVetoableChangeListener(
622 			const OUString& rPropertyName,
623 			const Reference< XVetoableChangeListener >& xListener )
624 	throw( UnknownPropertyException,
625 		   WrappedTargetException,
626 		   RuntimeException )
627 {
628 	impl_EnsureNotDisposed();
629 
630 	if( !getPropertySetInfo().is() )
631 	{
632 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
633 		throw UnknownPropertyException();
634 	}
635 	if( rPropertyName.getLength() )
636 	{
637 		m_xPropertySetInfo->getPropertyByName( rPropertyName );
638 		//throws UnknownPropertyException, if so
639 	}
640 
641 	impl_getVetoableChangeListenerContainer();
642 	sal_Bool bNeedRegister = !m_pVetoableChangeListeners->
643 						getContainedTypes().getLength();
644 	m_pVetoableChangeListeners->addInterface( rPropertyName, xListener );
645 	if( bNeedRegister )
646 	{
647 		impl_init_xPropertySetOrigin();
648 		{
649 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
650 			if( !m_xPropertySetOrigin.is() )
651 			{
652 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
653 				return;
654 			}
655 		}
656 		try
657 		{
658 			m_xPropertySetOrigin->addVetoableChangeListener(
659 				OUString(), static_cast< XVetoableChangeListener * >( m_pMyListenerImpl ) );
660 		}
661 		catch( Exception& rEx )
662 		{
663 			m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
664 			throw rEx;
665 		}
666 	}
667 }
668 
669 //--------------------------------------------------------------------------
670 // virtual
671 void SAL_CALL ContentResultSetWrapper
removePropertyChangeListener(const OUString & rPropertyName,const Reference<XPropertyChangeListener> & xListener)672 	::removePropertyChangeListener(
673 			const OUString& rPropertyName,
674 			const Reference< XPropertyChangeListener >& xListener )
675 	throw( UnknownPropertyException,
676 		   WrappedTargetException,
677 		   RuntimeException )
678 {
679 	impl_EnsureNotDisposed();
680 
681 	{
682 		//noop, if no listener registered
683 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
684 		if( !m_pPropertyChangeListeners )
685 			return;
686 	}
687 	OInterfaceContainerHelper* pContainer =
688 		m_pPropertyChangeListeners->getContainer( rPropertyName );
689 
690 	if( !pContainer )
691 	{
692 		if( rPropertyName.getLength() )
693 		{
694 			if( !getPropertySetInfo().is() )
695 				throw UnknownPropertyException();
696 
697 			m_xPropertySetInfo->getPropertyByName( rPropertyName );
698 			//throws UnknownPropertyException, if so
699 		}
700 		return; //the listener was not registered
701 	}
702 
703 	m_pPropertyChangeListeners->removeInterface( rPropertyName, xListener );
704 
705 	if( !m_pPropertyChangeListeners->getContainedTypes().getLength() )
706 	{
707 		impl_init_xPropertySetOrigin();
708 		{
709 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
710 			if( !m_xPropertySetOrigin.is() )
711 			{
712 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
713 				return;
714 			}
715 		}
716 		try
717 		{
718 			m_xPropertySetOrigin->removePropertyChangeListener(
719 				OUString(), static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) );
720 		}
721 		catch( Exception& )
722 		{
723 			OSL_ENSURE( sal_False, "could not remove PropertyChangeListener" );
724 		}
725 	}
726 }
727 
728 //--------------------------------------------------------------------------
729 // virtual
730 void SAL_CALL ContentResultSetWrapper
removeVetoableChangeListener(const OUString & rPropertyName,const Reference<XVetoableChangeListener> & xListener)731 	::removeVetoableChangeListener(
732 			const OUString& rPropertyName,
733 			const Reference< XVetoableChangeListener >& xListener )
734 	throw( UnknownPropertyException,
735 		   WrappedTargetException,
736 		   RuntimeException )
737 {
738 	impl_EnsureNotDisposed();
739 
740 	{
741 		//noop, if no listener registered
742 		osl::Guard< osl::Mutex > aGuard( m_aMutex );
743 		if( !m_pVetoableChangeListeners )
744 			return;
745 	}
746 	OInterfaceContainerHelper* pContainer =
747 		m_pVetoableChangeListeners->getContainer( rPropertyName );
748 
749 	if( !pContainer )
750 	{
751 		if( rPropertyName.getLength() )
752 		{
753 			if( !getPropertySetInfo().is() )
754 				throw UnknownPropertyException();
755 
756 			m_xPropertySetInfo->getPropertyByName( rPropertyName );
757 			//throws UnknownPropertyException, if so
758 		}
759 		return; //the listener was not registered
760 	}
761 
762 	m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
763 
764 	if( !m_pVetoableChangeListeners->getContainedTypes().getLength() )
765 	{
766 		impl_init_xPropertySetOrigin();
767 		{
768 			osl::Guard< osl::Mutex > aGuard( m_aMutex );
769 			if( !m_xPropertySetOrigin.is() )
770 			{
771 				OSL_ENSURE( sal_False, "broadcaster was disposed already" );
772 				return;
773 			}
774 		}
775 		try
776 		{
777 			m_xPropertySetOrigin->removeVetoableChangeListener(
778 				OUString(), static_cast< XVetoableChangeListener * >( m_pMyListenerImpl ) );
779 		}
780 		catch( Exception& )
781 		{
782 			OSL_ENSURE( sal_False, "could not remove VetoableChangeListener" );
783 		}
784 	}
785 }
786 
787 //--------------------------------------------------------------------------
788 // own methods.
789 //--------------------------------------------------------------------------
790 
791 //virtual
792 void SAL_CALL ContentResultSetWrapper
impl_disposing(const EventObject &)793 	::impl_disposing( const EventObject& )
794 	throw( RuntimeException )
795 {
796 	impl_EnsureNotDisposed();
797 
798 	osl::Guard< osl::Mutex > aGuard( m_aMutex );
799 
800 	if( !m_xResultSetOrigin.is() )
801 		return;
802 
803 	//release all references to the broadcaster:
804 	m_xResultSetOrigin.clear();
805 	if(m_xRowOrigin.is())
806 		m_xRowOrigin.clear();
807 	if(m_xContentAccessOrigin.is())
808 		m_xContentAccessOrigin.clear();
809 	if(m_xPropertySetOrigin.is())
810 		m_xPropertySetOrigin.clear();
811 	m_xMetaDataFromOrigin.clear();
812 	if(m_xPropertySetInfo.is())
813 		m_xPropertySetInfo.clear();
814 }
815 
816 //virtual
817 void SAL_CALL ContentResultSetWrapper
impl_propertyChange(const PropertyChangeEvent & rEvt)818 	::impl_propertyChange( const PropertyChangeEvent& rEvt )
819 	throw( RuntimeException )
820 {
821 	impl_EnsureNotDisposed();
822 
823 	PropertyChangeEvent aEvt( rEvt );
824 	aEvt.Source = static_cast< XPropertySet * >( this );
825 	aEvt.Further = sal_False;
826 	impl_notifyPropertyChangeListeners(	aEvt );
827 }
828 
829 //virtual
830 void SAL_CALL ContentResultSetWrapper
impl_vetoableChange(const PropertyChangeEvent & rEvt)831 	::impl_vetoableChange( const PropertyChangeEvent& rEvt )
832 	throw( PropertyVetoException,
833 		   RuntimeException )
834 {
835 	impl_EnsureNotDisposed();
836 
837 	PropertyChangeEvent aEvt( rEvt );
838 	aEvt.Source = static_cast< XPropertySet * >( this );
839 	aEvt.Further = sal_False;
840 
841 	impl_notifyVetoableChangeListeners( aEvt );
842 }
843 
844 //--------------------------------------------------------------------------
845 // XContentAccess methods.	( -- position dependent )
846 //--------------------------------------------------------------------------
847 
848 // virtual
849 OUString SAL_CALL ContentResultSetWrapper
queryContentIdentifierString()850 	::queryContentIdentifierString()
851 	throw( RuntimeException )
852 {
853 	impl_EnsureNotDisposed();
854 	impl_init_xContentAccessOrigin();
855 	if( !m_xContentAccessOrigin.is() )
856 	{
857 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
858 		throw RuntimeException();
859 	}
860 	return m_xContentAccessOrigin->queryContentIdentifierString();
861 }
862 
863 //--------------------------------------------------------------------------
864 // virtual
865 Reference< XContentIdentifier > SAL_CALL ContentResultSetWrapper
queryContentIdentifier()866 	::queryContentIdentifier()
867 	throw( RuntimeException )
868 {
869 	impl_EnsureNotDisposed();
870 	impl_init_xContentAccessOrigin();
871 	if( !m_xContentAccessOrigin.is() )
872 	{
873 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
874 		throw RuntimeException();
875 	}
876 	return m_xContentAccessOrigin->queryContentIdentifier();
877 }
878 
879 //--------------------------------------------------------------------------
880 // virtual
881 Reference< XContent > SAL_CALL ContentResultSetWrapper
queryContent()882 	::queryContent()
883 	throw( RuntimeException )
884 {
885 	impl_EnsureNotDisposed();
886 	impl_init_xContentAccessOrigin();
887 	if( !m_xContentAccessOrigin.is() )
888 	{
889 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
890 		throw RuntimeException();
891 	}
892 	return m_xContentAccessOrigin->queryContent();
893 }
894 
895 //-----------------------------------------------------------------
896 // XResultSet methods.
897 //-----------------------------------------------------------------
898 //virtual
899 
900 sal_Bool SAL_CALL ContentResultSetWrapper
next()901 	::next()
902 	throw( SQLException,
903 		   RuntimeException )
904 {
905 	impl_EnsureNotDisposed();
906 
907 	if( !m_xResultSetOrigin.is() )
908 	{
909 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
910 		throw RuntimeException();
911 	}
912 	return m_xResultSetOrigin->next();
913 }
914 
915 //virtual
916 sal_Bool SAL_CALL ContentResultSetWrapper
previous()917 	::previous()
918 	throw( SQLException,
919 		   RuntimeException )
920 {
921 	impl_EnsureNotDisposed();
922 
923 	if( !m_xResultSetOrigin.is() )
924 	{
925 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
926 		throw RuntimeException();
927 	}
928 	return m_xResultSetOrigin->previous();
929 }
930 
931 //virtual
932 sal_Bool SAL_CALL ContentResultSetWrapper
absolute(sal_Int32 row)933 	::absolute( sal_Int32 row )
934 	throw( SQLException,
935 		   RuntimeException )
936 {
937 	impl_EnsureNotDisposed();
938 
939 	if( !m_xResultSetOrigin.is() )
940 	{
941 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
942 		throw RuntimeException();
943 	}
944 	return m_xResultSetOrigin->absolute( row );
945 }
946 
947 //virtual
948 sal_Bool SAL_CALL ContentResultSetWrapper
relative(sal_Int32 rows)949 	::relative( sal_Int32 rows )
950 	throw( SQLException,
951 		   RuntimeException )
952 {
953 	impl_EnsureNotDisposed();
954 
955 	if( !m_xResultSetOrigin.is() )
956 	{
957 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
958 		throw RuntimeException();
959 	}
960 	return m_xResultSetOrigin->relative( rows );
961 }
962 
963 
964 //virtual
965 sal_Bool SAL_CALL ContentResultSetWrapper
first()966 	::first()
967 	throw( SQLException,
968 		   RuntimeException )
969 {
970 	impl_EnsureNotDisposed();
971 
972 	if( !m_xResultSetOrigin.is() )
973 	{
974 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
975 		throw RuntimeException();
976 	}
977 	return m_xResultSetOrigin->first();
978 }
979 
980 //virtual
981 sal_Bool SAL_CALL ContentResultSetWrapper
last()982 	::last()
983 	throw( SQLException,
984 		   RuntimeException )
985 {
986 	impl_EnsureNotDisposed();
987 
988 	if( !m_xResultSetOrigin.is() )
989 	{
990 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
991 		throw RuntimeException();
992 	}
993 	return m_xResultSetOrigin->last();
994 }
995 
996 //virtual
997 void SAL_CALL ContentResultSetWrapper
beforeFirst()998 	::beforeFirst()
999 	throw( SQLException,
1000 		   RuntimeException )
1001 {
1002 	impl_EnsureNotDisposed();
1003 
1004 	if( !m_xResultSetOrigin.is() )
1005 	{
1006 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1007 		throw RuntimeException();
1008 	}
1009 	m_xResultSetOrigin->beforeFirst();
1010 }
1011 
1012 //virtual
1013 void SAL_CALL ContentResultSetWrapper
afterLast()1014 	::afterLast()
1015 	throw( SQLException,
1016 		   RuntimeException )
1017 {
1018 	impl_EnsureNotDisposed();
1019 
1020 	if( !m_xResultSetOrigin.is() )
1021 	{
1022 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1023 		throw RuntimeException();
1024 	}
1025 	m_xResultSetOrigin->afterLast();
1026 }
1027 
1028 //virtual
1029 sal_Bool SAL_CALL ContentResultSetWrapper
isAfterLast()1030 	::isAfterLast()
1031 	throw( SQLException,
1032 		   RuntimeException )
1033 {
1034 	impl_EnsureNotDisposed();
1035 
1036 	if( !m_xResultSetOrigin.is() )
1037 	{
1038 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1039 		throw RuntimeException();
1040 	}
1041 	return m_xResultSetOrigin->isAfterLast();
1042 }
1043 
1044 //virtual
1045 sal_Bool SAL_CALL ContentResultSetWrapper
isBeforeFirst()1046 	::isBeforeFirst()
1047 	throw( SQLException,
1048 		   RuntimeException )
1049 {
1050 	impl_EnsureNotDisposed();
1051 
1052 	if( !m_xResultSetOrigin.is() )
1053 	{
1054 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1055 		throw RuntimeException();
1056 	}
1057 	return m_xResultSetOrigin->isBeforeFirst();
1058 }
1059 
1060 //virtual
1061 sal_Bool SAL_CALL ContentResultSetWrapper
isFirst()1062 	::isFirst()
1063 	throw( SQLException,
1064 		   RuntimeException )
1065 {
1066 	impl_EnsureNotDisposed();
1067 
1068 	if( !m_xResultSetOrigin.is() )
1069 	{
1070 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1071 		throw RuntimeException();
1072 	}
1073 	return m_xResultSetOrigin->isFirst();
1074 }
1075 
1076 //virtual
1077 sal_Bool SAL_CALL ContentResultSetWrapper
isLast()1078 	::isLast()
1079 	throw( SQLException,
1080 		   RuntimeException )
1081 {
1082 	impl_EnsureNotDisposed();
1083 
1084 	if( !m_xResultSetOrigin.is() )
1085 	{
1086 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1087 		throw RuntimeException();
1088 	}
1089 	return m_xResultSetOrigin->isLast();
1090 }
1091 
1092 
1093 //virtual
1094 sal_Int32 SAL_CALL ContentResultSetWrapper
getRow()1095 	::getRow()
1096 	throw( SQLException,
1097 		   RuntimeException )
1098 {
1099 	impl_EnsureNotDisposed();
1100 
1101 	if( !m_xResultSetOrigin.is() )
1102 	{
1103 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1104 		throw RuntimeException();
1105 	}
1106 	return m_xResultSetOrigin->getRow();
1107 }
1108 
1109 //virtual
1110 void SAL_CALL ContentResultSetWrapper
refreshRow()1111 	::refreshRow()
1112 	throw( SQLException,
1113 		   RuntimeException )
1114 {
1115 	impl_EnsureNotDisposed();
1116 
1117 	if( !m_xResultSetOrigin.is() )
1118 	{
1119 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1120 		throw RuntimeException();
1121 	}
1122 	m_xResultSetOrigin->refreshRow();
1123 }
1124 
1125 //virtual
1126 sal_Bool SAL_CALL ContentResultSetWrapper
rowUpdated()1127 	::rowUpdated()
1128 	throw( SQLException,
1129 		   RuntimeException )
1130 {
1131 	impl_EnsureNotDisposed();
1132 
1133 	if( !m_xResultSetOrigin.is() )
1134 	{
1135 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1136 		throw RuntimeException();
1137 	}
1138 	return m_xResultSetOrigin->rowUpdated();
1139 }
1140 //virtual
1141 sal_Bool SAL_CALL ContentResultSetWrapper
rowInserted()1142 	::rowInserted()
1143 	throw( SQLException,
1144 		   RuntimeException )
1145 {
1146 	impl_EnsureNotDisposed();
1147 
1148 	if( !m_xResultSetOrigin.is() )
1149 	{
1150 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1151 		throw RuntimeException();
1152 	}
1153 	return m_xResultSetOrigin->rowInserted();
1154 }
1155 
1156 //virtual
1157 sal_Bool SAL_CALL ContentResultSetWrapper
rowDeleted()1158 	::rowDeleted()
1159 	throw( SQLException,
1160 		   RuntimeException )
1161 {
1162 	impl_EnsureNotDisposed();
1163 
1164 	if( !m_xResultSetOrigin.is() )
1165 	{
1166 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1167 		throw RuntimeException();
1168 	}
1169 	return m_xResultSetOrigin->rowDeleted();
1170 }
1171 
1172 //virtual
1173 Reference< XInterface > SAL_CALL ContentResultSetWrapper
getStatement()1174 	::getStatement()
1175 	throw( SQLException,
1176 		   RuntimeException )
1177 {
1178 	impl_EnsureNotDisposed();
1179 	//@todo ?return anything
1180 	return Reference< XInterface >();
1181 }
1182 
1183 //-----------------------------------------------------------------
1184 // XRow methods.
1185 //-----------------------------------------------------------------
1186 
1187 #define XROW_GETXXX( getXXX )									\
1188 impl_EnsureNotDisposed();										\
1189 impl_init_xRowOrigin();											\
1190 if( !m_xRowOrigin.is() )										\
1191 {																\
1192 	OSL_ENSURE( sal_False, "broadcaster was disposed already" );\
1193 	throw RuntimeException();									\
1194 }																\
1195 return m_xRowOrigin->getXXX( columnIndex );
1196 
1197 //virtual
1198 sal_Bool SAL_CALL ContentResultSetWrapper
wasNull()1199 	::wasNull()
1200 	throw( SQLException,
1201 		   RuntimeException )
1202 {
1203 	impl_EnsureNotDisposed();
1204 	impl_init_xRowOrigin();
1205 	if( !m_xRowOrigin.is() )
1206 	{
1207 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1208 		throw RuntimeException();
1209 	}
1210 	return m_xRowOrigin->wasNull();
1211 }
1212 
1213 //virtual
1214 rtl::OUString SAL_CALL ContentResultSetWrapper
getString(sal_Int32 columnIndex)1215 	::getString( sal_Int32 columnIndex )
1216 	throw( SQLException,
1217 		   RuntimeException )
1218 {
1219 	XROW_GETXXX( getString );
1220 }
1221 
1222 //virtual
1223 sal_Bool SAL_CALL ContentResultSetWrapper
getBoolean(sal_Int32 columnIndex)1224 	::getBoolean( sal_Int32 columnIndex )
1225 	throw( SQLException,
1226 		   RuntimeException )
1227 {
1228 	XROW_GETXXX( getBoolean );
1229 }
1230 
1231 //virtual
1232 sal_Int8 SAL_CALL ContentResultSetWrapper
getByte(sal_Int32 columnIndex)1233 	::getByte( sal_Int32 columnIndex )
1234 	throw( SQLException,
1235 		   RuntimeException )
1236 {
1237 	XROW_GETXXX( getByte );
1238 }
1239 
1240 //virtual
1241 sal_Int16 SAL_CALL ContentResultSetWrapper
getShort(sal_Int32 columnIndex)1242 	::getShort( sal_Int32 columnIndex )
1243 	throw( SQLException,
1244 		   RuntimeException )
1245 {
1246 	XROW_GETXXX( getShort );
1247 }
1248 
1249 //virtual
1250 sal_Int32 SAL_CALL ContentResultSetWrapper
getInt(sal_Int32 columnIndex)1251 	::getInt( sal_Int32 columnIndex )
1252 	throw( SQLException,
1253 		   RuntimeException )
1254 {
1255 	XROW_GETXXX( getInt );
1256 }
1257 
1258 //virtual
1259 sal_Int64 SAL_CALL ContentResultSetWrapper
getLong(sal_Int32 columnIndex)1260 	::getLong( sal_Int32 columnIndex )
1261 	throw( SQLException,
1262 		   RuntimeException )
1263 {
1264 	XROW_GETXXX( getLong );
1265 }
1266 
1267 //virtual
1268 float SAL_CALL ContentResultSetWrapper
getFloat(sal_Int32 columnIndex)1269 	::getFloat( sal_Int32 columnIndex )
1270 	throw( SQLException,
1271 		   RuntimeException )
1272 {
1273 	XROW_GETXXX( getFloat );
1274 }
1275 
1276 //virtual
1277 double SAL_CALL ContentResultSetWrapper
getDouble(sal_Int32 columnIndex)1278 	::getDouble( sal_Int32 columnIndex )
1279 	throw( SQLException,
1280 		   RuntimeException )
1281 {
1282 	XROW_GETXXX( getDouble );
1283 }
1284 
1285 //virtual
1286 Sequence< sal_Int8 > SAL_CALL ContentResultSetWrapper
getBytes(sal_Int32 columnIndex)1287 	::getBytes( sal_Int32 columnIndex )
1288 	throw( SQLException,
1289 		   RuntimeException )
1290 {
1291 	XROW_GETXXX( getBytes );
1292 }
1293 
1294 //virtual
1295 Date SAL_CALL ContentResultSetWrapper
getDate(sal_Int32 columnIndex)1296 	::getDate( sal_Int32 columnIndex )
1297 	throw( SQLException,
1298 		   RuntimeException )
1299 {
1300 	XROW_GETXXX( getDate );
1301 }
1302 
1303 //virtual
1304 Time SAL_CALL ContentResultSetWrapper
getTime(sal_Int32 columnIndex)1305 	::getTime( sal_Int32 columnIndex )
1306 	throw( SQLException,
1307 		   RuntimeException )
1308 {
1309 	XROW_GETXXX( getTime );
1310 }
1311 
1312 //virtual
1313 DateTime SAL_CALL ContentResultSetWrapper
getTimestamp(sal_Int32 columnIndex)1314 	::getTimestamp( sal_Int32 columnIndex )
1315 	throw( SQLException,
1316 		   RuntimeException )
1317 {
1318 	XROW_GETXXX( getTimestamp );
1319 }
1320 
1321 //virtual
1322 Reference< com::sun::star::io::XInputStream >
1323 	SAL_CALL ContentResultSetWrapper
getBinaryStream(sal_Int32 columnIndex)1324 	::getBinaryStream( sal_Int32 columnIndex )
1325 	throw( SQLException,
1326 		   RuntimeException )
1327 {
1328 	XROW_GETXXX( getBinaryStream );
1329 }
1330 
1331 //virtual
1332 Reference< com::sun::star::io::XInputStream >
1333 	SAL_CALL ContentResultSetWrapper
getCharacterStream(sal_Int32 columnIndex)1334 	::getCharacterStream( sal_Int32 columnIndex )
1335 	throw( SQLException,
1336 		   RuntimeException )
1337 {
1338 	XROW_GETXXX( getCharacterStream );
1339 }
1340 
1341 //virtual
1342 Any SAL_CALL ContentResultSetWrapper
getObject(sal_Int32 columnIndex,const Reference<com::sun::star::container::XNameAccess> & typeMap)1343 	::getObject( sal_Int32 columnIndex,
1344 		   const Reference<
1345 			com::sun::star::container::XNameAccess >& typeMap )
1346 	throw( SQLException,
1347 		   RuntimeException )
1348 {
1349 	//if you change this macro please pay attention to
1350 	//define XROW_GETXXX, where this is similar implemented
1351 
1352 	impl_EnsureNotDisposed();
1353 	impl_init_xRowOrigin();
1354 	if( !m_xRowOrigin.is() )
1355 	{
1356 		OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1357 		throw RuntimeException();
1358 	}
1359 	return m_xRowOrigin->getObject( columnIndex, typeMap );
1360 }
1361 
1362 //virtual
1363 Reference< XRef > SAL_CALL ContentResultSetWrapper
getRef(sal_Int32 columnIndex)1364 	::getRef( sal_Int32 columnIndex )
1365 	throw( SQLException,
1366 		   RuntimeException )
1367 {
1368 	XROW_GETXXX( getRef );
1369 }
1370 
1371 //virtual
1372 Reference< XBlob > SAL_CALL ContentResultSetWrapper
getBlob(sal_Int32 columnIndex)1373 	::getBlob( sal_Int32 columnIndex )
1374 	throw( SQLException,
1375 		   RuntimeException )
1376 {
1377 	XROW_GETXXX( getBlob );
1378 }
1379 
1380 //virtual
1381 Reference< XClob > SAL_CALL ContentResultSetWrapper
getClob(sal_Int32 columnIndex)1382 	::getClob( sal_Int32 columnIndex )
1383 	throw( SQLException,
1384 		   RuntimeException )
1385 {
1386 	XROW_GETXXX( getClob );
1387 }
1388 
1389 //virtual
1390 Reference< XArray > SAL_CALL ContentResultSetWrapper
getArray(sal_Int32 columnIndex)1391 	::getArray( sal_Int32 columnIndex )
1392 	throw( SQLException,
1393 		   RuntimeException )
1394 {
1395 	XROW_GETXXX( getArray );
1396 }
1397 
1398 //--------------------------------------------------------------------------
1399 //--------------------------------------------------------------------------
1400 // class ContentResultSetWrapperListener
1401 //--------------------------------------------------------------------------
1402 //--------------------------------------------------------------------------
1403 
ContentResultSetWrapperListener(ContentResultSetWrapper * pOwner)1404 ContentResultSetWrapperListener::ContentResultSetWrapperListener(
1405 	ContentResultSetWrapper* pOwner )
1406 	: m_pOwner( pOwner )
1407 {
1408 }
1409 
~ContentResultSetWrapperListener()1410 ContentResultSetWrapperListener::~ContentResultSetWrapperListener()
1411 {
1412 }
1413 
1414 //--------------------------------------------------------------------------
1415 // XInterface methods.
1416 //--------------------------------------------------------------------------
1417 //list all interfaces inclusive baseclasses of interfaces
1418 XINTERFACE_COMMON_IMPL( ContentResultSetWrapperListener )
QUERYINTERFACE_IMPL_START(ContentResultSetWrapperListener)1419 QUERYINTERFACE_IMPL_START( ContentResultSetWrapperListener )
1420 
1421 	static_cast< XEventListener * >(
1422 					 static_cast< XPropertyChangeListener * >(this))
1423 	, SAL_STATIC_CAST( XPropertyChangeListener*, this )
1424 	, SAL_STATIC_CAST( XVetoableChangeListener*, this )
1425 
1426 QUERYINTERFACE_IMPL_END
1427 
1428 
1429 //--------------------------------------------------------------------------
1430 //XEventListener methods.
1431 //--------------------------------------------------------------------------
1432 
1433 //virtual
1434 void SAL_CALL ContentResultSetWrapperListener
1435 	::disposing( const EventObject& rEventObject )
1436 	throw( RuntimeException )
1437 {
1438 	if( m_pOwner )
1439 		m_pOwner->impl_disposing( rEventObject );
1440 }
1441 
1442 //--------------------------------------------------------------------------
1443 //XPropertyChangeListener methods.
1444 //--------------------------------------------------------------------------
1445 
1446 //virtual
1447 void SAL_CALL ContentResultSetWrapperListener
propertyChange(const PropertyChangeEvent & rEvt)1448 	::propertyChange( const PropertyChangeEvent& rEvt )
1449 	throw( RuntimeException )
1450 {
1451 	if( m_pOwner )
1452 		m_pOwner->impl_propertyChange( rEvt );
1453 }
1454 
1455 //--------------------------------------------------------------------------
1456 //XVetoableChangeListener methods.
1457 //--------------------------------------------------------------------------
1458 //virtual
1459 void SAL_CALL ContentResultSetWrapperListener
vetoableChange(const PropertyChangeEvent & rEvt)1460 	::vetoableChange( const PropertyChangeEvent& rEvt )
1461 	throw( PropertyVetoException,
1462 		   RuntimeException )
1463 {
1464 	if( m_pOwner )
1465 		m_pOwner->impl_vetoableChange( rEvt );
1466 }
1467 
1468 void SAL_CALL ContentResultSetWrapperListener
impl_OwnerDies()1469 	::impl_OwnerDies()
1470 {
1471 	m_pOwner = NULL;
1472 }
1473 
1474