lok: vcl: fix multiple floatwin removal case more robustly.
[LibreOffice.git] / ucb / source / cacher / contentresultsetwrapper.cxx
blobbe35593388c0bfc114ab1be3697f2fa226fff1fc
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include "contentresultsetwrapper.hxx"
22 #include <com/sun/star/sdbc/FetchDirection.hpp>
23 #include <com/sun/star/ucb/FetchError.hpp>
24 #include <com/sun/star/beans/PropertyAttribute.hpp>
25 #include <com/sun/star/sdbc/ResultSetType.hpp>
26 #include <com/sun/star/lang/DisposedException.hpp>
27 #include <rtl/ustring.hxx>
28 #include <osl/diagnose.h>
29 #include <cppuhelper/queryinterface.hxx>
31 using namespace com::sun::star::beans;
32 using namespace com::sun::star::lang;
33 using namespace com::sun::star::sdbc;
34 using namespace com::sun::star::ucb;
35 using namespace com::sun::star::uno;
36 using namespace com::sun::star::util;
37 using namespace comphelper;
38 using namespace cppu;
41 // class ContentResultSetWrapper
44 ContentResultSetWrapper::ContentResultSetWrapper(
45 Reference< XResultSet > const & xOrigin )
46 : m_xResultSetOrigin( xOrigin )
47 , m_nForwardOnly( 2 )
48 , m_bDisposed( false )
49 , m_bInDispose( false )
51 m_xMyListenerImpl = new ContentResultSetWrapperListener( this );
53 OSL_ENSURE( m_xResultSetOrigin.is(), "XResultSet is required" );
55 //!! call impl_init() at the end of constructor of derived class
59 void ContentResultSetWrapper::impl_init_xRowOrigin()
62 osl::Guard< osl::Mutex > aGuard( m_aMutex );
63 if(m_xRowOrigin.is())
64 return;
67 Reference< XRow > xOrgig =
68 Reference< XRow >( m_xResultSetOrigin, UNO_QUERY );
71 osl::Guard< osl::Mutex > aGuard( m_aMutex );
72 m_xRowOrigin = xOrgig;
73 OSL_ENSURE( m_xRowOrigin.is(), "interface XRow is required" );
77 void ContentResultSetWrapper::impl_init_xContentAccessOrigin()
80 osl::Guard< osl::Mutex > aGuard( m_aMutex );
81 if(m_xContentAccessOrigin.is())
82 return;
85 Reference< XContentAccess > xOrgig =
86 Reference< XContentAccess >( m_xResultSetOrigin, UNO_QUERY );
89 osl::Guard< osl::Mutex > aGuard( m_aMutex );
90 m_xContentAccessOrigin = xOrgig;
91 OSL_ENSURE( m_xContentAccessOrigin.is(), "interface XContentAccess is required" );
96 void ContentResultSetWrapper::impl_init_xPropertySetOrigin()
99 osl::Guard< osl::Mutex > aGuard( m_aMutex );
100 if( m_xPropertySetOrigin.is() )
101 return;
104 Reference< XPropertySet > xOrig =
105 Reference< XPropertySet >( m_xResultSetOrigin, UNO_QUERY );
108 osl::Guard< osl::Mutex > aGuard( m_aMutex );
109 m_xPropertySetOrigin = xOrig;
110 OSL_ENSURE( m_xPropertySetOrigin.is(), "interface XPropertySet is required" );
114 void ContentResultSetWrapper::impl_init()
116 //call this at the end of constructor of derived class
119 //listen to disposing from Origin:
120 Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
121 OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
122 xComponentOrigin->addEventListener( static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
125 ContentResultSetWrapper::~ContentResultSetWrapper()
127 //call impl_deinit() at start of destructor of derived class
130 void ContentResultSetWrapper::impl_deinit()
132 //call this at start of destructor of derived class
134 m_xMyListenerImpl->impl_OwnerDies();
137 //virtual
138 void ContentResultSetWrapper::impl_initPropertySetInfo()
141 osl::Guard< osl::Mutex > aGuard( m_aMutex );
142 if( m_xPropertySetInfo.is() )
143 return;
145 impl_init_xPropertySetOrigin();
146 if( !m_xPropertySetOrigin.is() )
147 return;
150 Reference< XPropertySetInfo > xOrig =
151 m_xPropertySetOrigin->getPropertySetInfo();
154 osl::Guard< osl::Mutex > aGuard( m_aMutex );
155 m_xPropertySetInfo = xOrig;
159 void ContentResultSetWrapper::impl_EnsureNotDisposed()
161 osl::Guard< osl::Mutex > aGuard( m_aMutex );
162 if( m_bDisposed )
163 throw DisposedException();
166 void ContentResultSetWrapper::impl_getPropertyChangeListenerContainer()
168 osl::Guard< osl::Mutex > aGuard( m_aMutex );
169 if ( !m_pPropertyChangeListeners )
170 m_pPropertyChangeListeners.reset(
171 new PropertyChangeListenerContainer_Impl( m_aContainerMutex ) );
174 void ContentResultSetWrapper::impl_getVetoableChangeListenerContainer()
176 osl::Guard< osl::Mutex > aGuard( m_aMutex );
177 if ( !m_pVetoableChangeListeners )
178 m_pVetoableChangeListeners.reset(
179 new PropertyChangeListenerContainer_Impl( m_aContainerMutex ) );
182 void ContentResultSetWrapper::impl_notifyPropertyChangeListeners( const PropertyChangeEvent& rEvt )
185 osl::Guard< osl::Mutex > aGuard( m_aMutex );
186 if( !m_pPropertyChangeListeners )
187 return;
190 // Notify listeners interested especially in the changed property.
191 OInterfaceContainerHelper* pContainer =
192 m_pPropertyChangeListeners->getContainer( rEvt.PropertyName );
193 if( pContainer )
195 OInterfaceIteratorHelper aIter( *pContainer );
196 while( aIter.hasMoreElements() )
198 Reference< XPropertyChangeListener > xListener(
199 aIter.next(), UNO_QUERY );
200 if( xListener.is() )
201 xListener->propertyChange( rEvt );
205 // Notify listeners interested in all properties.
206 pContainer = m_pPropertyChangeListeners->getContainer( OUString() );
207 if( pContainer )
209 OInterfaceIteratorHelper aIter( *pContainer );
210 while( aIter.hasMoreElements() )
212 Reference< XPropertyChangeListener > xListener(
213 aIter.next(), UNO_QUERY );
214 if( xListener.is() )
215 xListener->propertyChange( rEvt );
220 void ContentResultSetWrapper::impl_notifyVetoableChangeListeners( const PropertyChangeEvent& rEvt )
223 osl::Guard< osl::Mutex > aGuard( m_aMutex );
224 if( !m_pVetoableChangeListeners )
225 return;
228 // Notify listeners interested especially in the changed property.
229 OInterfaceContainerHelper* pContainer =
230 m_pVetoableChangeListeners->getContainer( rEvt.PropertyName );
231 if( pContainer )
233 OInterfaceIteratorHelper aIter( *pContainer );
234 while( aIter.hasMoreElements() )
236 Reference< XVetoableChangeListener > xListener(
237 aIter.next(), UNO_QUERY );
238 if( xListener.is() )
239 xListener->vetoableChange( rEvt );
243 // Notify listeners interested in all properties.
244 pContainer = m_pVetoableChangeListeners->getContainer( OUString() );
245 if( pContainer )
247 OInterfaceIteratorHelper aIter( *pContainer );
248 while( aIter.hasMoreElements() )
250 Reference< XVetoableChangeListener > xListener(
251 aIter.next(), UNO_QUERY );
252 if( xListener.is() )
253 xListener->vetoableChange( rEvt );
258 bool ContentResultSetWrapper::impl_isForwardOnly()
260 //m_nForwardOnly == 2 -> don't know
261 //m_nForwardOnly == 1 -> YES
262 //m_nForwardOnly == 0 -> NO
264 //@todo replace this with lines in comment
265 osl::Guard< osl::Mutex > aGuard( m_aMutex );
266 m_nForwardOnly = 0;
267 return false;
271 ReacquireableGuard aGuard( m_aMutex );
272 if( m_nForwardOnly == 2 )
274 aGuard.clear();
275 if( !getPropertySetInfo().is() )
277 aGuard.reacquire();
278 m_nForwardOnly = 0;
279 return m_nForwardOnly;
281 aGuard.reacquire();
283 OUString aName("ResultSetType");
284 //find out, if we are ForwardOnly and cache the value:
286 impl_init_xPropertySetOrigin();
287 if( !m_xPropertySetOrigin.is() )
289 OSL_FAIL( "broadcaster was disposed already" );
290 m_nForwardOnly = 0;
291 return m_nForwardOnly;
294 aGuard.clear();
295 Any aAny = m_xPropertySetOrigin->getPropertyValue( aName );
297 aGuard.reacquire();
298 long nResultSetType;
299 if( ( aAny >>= nResultSetType ) &&
300 ( nResultSetType == ResultSetType::FORWARD_ONLY ) )
301 m_nForwardOnly = 1;
302 else
303 m_nForwardOnly = 0;
305 return m_nForwardOnly;
310 // XInterface methods.
312 css::uno::Any SAL_CALL ContentResultSetWrapper::queryInterface( const css::uno::Type & rType )
314 //list all interfaces inclusive baseclasses of interfaces
315 css::uno::Any aRet = cppu::queryInterface( rType,
316 static_cast< XComponent* >(this),
317 static_cast< XCloseable* >(this),
318 static_cast< XResultSetMetaDataSupplier* >(this),
319 static_cast< XPropertySet* >(this),
320 static_cast< XContentAccess* >(this),
321 static_cast< XResultSet* >(this),
322 static_cast< XRow* >(this)
324 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
327 // XComponent methods.
329 // virtual
330 void SAL_CALL ContentResultSetWrapper::dispose()
332 impl_EnsureNotDisposed();
334 bool isCleared = false;
335 osl::ResettableMutexGuard aGuard(m_aMutex);
336 if( m_bInDispose || m_bDisposed )
337 return;
338 m_bInDispose = true;
340 if( m_xPropertySetOrigin.is() )
342 aGuard.clear();
343 isCleared = true;
346 m_xPropertySetOrigin->removePropertyChangeListener(
347 OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
349 catch( Exception& )
351 OSL_FAIL( "could not remove PropertyChangeListener" );
355 m_xPropertySetOrigin->removeVetoableChangeListener(
356 OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
358 catch( Exception& )
360 OSL_FAIL( "could not remove VetoableChangeListener" );
363 Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
364 OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
365 xComponentOrigin->removeEventListener( static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
368 if (isCleared)
370 aGuard.reset();
371 isCleared = false;
373 if( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
375 EventObject aEvt;
376 aEvt.Source = static_cast< XComponent * >( this );
378 aGuard.clear();
379 isCleared = true;
380 m_pDisposeEventListeners->disposeAndClear( aEvt );
383 if (isCleared)
385 aGuard.reset();
386 isCleared = false;
388 if( m_pPropertyChangeListeners )
390 EventObject aEvt;
391 aEvt.Source = static_cast< XPropertySet * >( this );
393 aGuard.clear();
394 isCleared = true;
395 m_pPropertyChangeListeners->disposeAndClear( aEvt );
398 if (isCleared)
400 aGuard.reset();
401 isCleared = false;
403 if( m_pVetoableChangeListeners )
405 EventObject aEvt;
406 aEvt.Source = static_cast< XPropertySet * >( this );
408 aGuard.clear();
409 isCleared = true;
410 m_pVetoableChangeListeners->disposeAndClear( aEvt );
413 if (isCleared)
415 aGuard.reset();
417 m_bDisposed = true;
418 m_bInDispose = false;
422 // virtual
423 void SAL_CALL ContentResultSetWrapper::addEventListener( const Reference< XEventListener >& Listener )
425 impl_EnsureNotDisposed();
426 osl::Guard< osl::Mutex > aGuard( m_aMutex );
428 if ( !m_pDisposeEventListeners )
429 m_pDisposeEventListeners.reset(
430 new OInterfaceContainerHelper2( m_aContainerMutex ) );
432 m_pDisposeEventListeners->addInterface( Listener );
436 // virtual
437 void SAL_CALL ContentResultSetWrapper::removeEventListener( const Reference< XEventListener >& Listener )
439 impl_EnsureNotDisposed();
440 osl::Guard< osl::Mutex > aGuard( m_aMutex );
442 if ( m_pDisposeEventListeners )
443 m_pDisposeEventListeners->removeInterface( Listener );
447 //XCloseable methods.
449 //virtual
450 void SAL_CALL ContentResultSetWrapper::close()
452 impl_EnsureNotDisposed();
453 dispose();
457 //XResultSetMetaDataSupplier methods.
459 //virtual
460 Reference< XResultSetMetaData > SAL_CALL ContentResultSetWrapper::getMetaData()
462 impl_EnsureNotDisposed();
464 osl::ResettableMutexGuard aGuard(m_aMutex);
465 if( !m_xMetaDataFromOrigin.is() && m_xResultSetOrigin.is() )
467 Reference< XResultSetMetaDataSupplier > xMetaDataSupplier(
468 m_xResultSetOrigin, UNO_QUERY );
470 if( xMetaDataSupplier.is() )
472 aGuard.clear();
474 Reference< XResultSetMetaData > xMetaData
475 = xMetaDataSupplier->getMetaData();
477 aGuard.reset();
478 m_xMetaDataFromOrigin = xMetaData;
481 return m_xMetaDataFromOrigin;
485 // XPropertySet methods.
487 // virtual
488 Reference< XPropertySetInfo > SAL_CALL ContentResultSetWrapper::getPropertySetInfo()
490 impl_EnsureNotDisposed();
492 osl::Guard< osl::Mutex > aGuard( m_aMutex );
493 if( m_xPropertySetInfo.is() )
494 return m_xPropertySetInfo;
496 impl_initPropertySetInfo();
497 return m_xPropertySetInfo;
500 // virtual
501 void SAL_CALL ContentResultSetWrapper::setPropertyValue( const OUString& rPropertyName, const Any& rValue )
503 impl_EnsureNotDisposed();
504 impl_init_xPropertySetOrigin();
505 if( !m_xPropertySetOrigin.is() )
507 OSL_FAIL( "broadcaster was disposed already" );
508 throw UnknownPropertyException();
510 m_xPropertySetOrigin->setPropertyValue( rPropertyName, rValue );
514 // virtual
515 Any SAL_CALL ContentResultSetWrapper::getPropertyValue( const OUString& rPropertyName )
517 impl_EnsureNotDisposed();
518 impl_init_xPropertySetOrigin();
519 if( !m_xPropertySetOrigin.is() )
521 OSL_FAIL( "broadcaster was disposed already" );
522 throw UnknownPropertyException();
524 return m_xPropertySetOrigin->getPropertyValue( rPropertyName );
528 // virtual
529 void SAL_CALL ContentResultSetWrapper::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener )
531 impl_EnsureNotDisposed();
533 if( !getPropertySetInfo().is() )
535 OSL_FAIL( "broadcaster was disposed already" );
536 throw UnknownPropertyException();
539 if( !aPropertyName.isEmpty() )
541 m_xPropertySetInfo->getPropertyByName( aPropertyName );
542 //throws UnknownPropertyException, if so
545 impl_getPropertyChangeListenerContainer();
546 bool bNeedRegister = !m_pPropertyChangeListeners->
547 getContainedTypes().getLength();
548 m_pPropertyChangeListeners->addInterface( aPropertyName, xListener );
549 if( bNeedRegister )
551 impl_init_xPropertySetOrigin();
553 osl::Guard< osl::Mutex > aGuard( m_aMutex );
554 if( !m_xPropertySetOrigin.is() )
556 OSL_FAIL( "broadcaster was disposed already" );
557 return;
562 m_xPropertySetOrigin->addPropertyChangeListener(
563 OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
565 catch( Exception& )
567 m_pPropertyChangeListeners->removeInterface( aPropertyName, xListener );
568 throw;
574 // virtual
575 void SAL_CALL ContentResultSetWrapper::addVetoableChangeListener( const OUString& rPropertyName, const Reference< XVetoableChangeListener >& xListener )
577 impl_EnsureNotDisposed();
579 if( !getPropertySetInfo().is() )
581 OSL_FAIL( "broadcaster was disposed already" );
582 throw UnknownPropertyException();
584 if( !rPropertyName.isEmpty() )
586 m_xPropertySetInfo->getPropertyByName( rPropertyName );
587 //throws UnknownPropertyException, if so
590 impl_getVetoableChangeListenerContainer();
591 bool bNeedRegister = !m_pVetoableChangeListeners->
592 getContainedTypes().getLength();
593 m_pVetoableChangeListeners->addInterface( rPropertyName, xListener );
594 if( bNeedRegister )
596 impl_init_xPropertySetOrigin();
598 osl::Guard< osl::Mutex > aGuard( m_aMutex );
599 if( !m_xPropertySetOrigin.is() )
601 OSL_FAIL( "broadcaster was disposed already" );
602 return;
607 m_xPropertySetOrigin->addVetoableChangeListener(
608 OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
610 catch( Exception& )
612 m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
613 throw;
619 // virtual
620 void SAL_CALL ContentResultSetWrapper::removePropertyChangeListener( const OUString& rPropertyName, const Reference< XPropertyChangeListener >& xListener )
622 impl_EnsureNotDisposed();
625 //noop, if no listener registered
626 osl::Guard< osl::Mutex > aGuard( m_aMutex );
627 if( !m_pPropertyChangeListeners )
628 return;
630 OInterfaceContainerHelper* pContainer =
631 m_pPropertyChangeListeners->getContainer( rPropertyName );
633 if( !pContainer )
635 if( !rPropertyName.isEmpty() )
637 if( !getPropertySetInfo().is() )
638 throw UnknownPropertyException();
640 m_xPropertySetInfo->getPropertyByName( rPropertyName );
641 //throws UnknownPropertyException, if so
643 return; //the listener was not registered
646 m_pPropertyChangeListeners->removeInterface( rPropertyName, xListener );
648 if( !m_pPropertyChangeListeners->getContainedTypes().getLength() )
650 impl_init_xPropertySetOrigin();
652 osl::Guard< osl::Mutex > aGuard( m_aMutex );
653 if( !m_xPropertySetOrigin.is() )
655 OSL_FAIL( "broadcaster was disposed already" );
656 return;
661 m_xPropertySetOrigin->removePropertyChangeListener(
662 OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
664 catch( Exception& )
666 OSL_FAIL( "could not remove PropertyChangeListener" );
672 // virtual
673 void SAL_CALL ContentResultSetWrapper::removeVetoableChangeListener( const OUString& rPropertyName, const Reference< XVetoableChangeListener >& xListener )
675 impl_EnsureNotDisposed();
678 //noop, if no listener registered
679 osl::Guard< osl::Mutex > aGuard( m_aMutex );
680 if( !m_pVetoableChangeListeners )
681 return;
683 OInterfaceContainerHelper* pContainer =
684 m_pVetoableChangeListeners->getContainer( rPropertyName );
686 if( !pContainer )
688 if( !rPropertyName.isEmpty() )
690 if( !getPropertySetInfo().is() )
691 throw UnknownPropertyException();
693 m_xPropertySetInfo->getPropertyByName( rPropertyName );
694 //throws UnknownPropertyException, if so
696 return; //the listener was not registered
699 m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
701 if( !m_pVetoableChangeListeners->getContainedTypes().getLength() )
703 impl_init_xPropertySetOrigin();
705 osl::Guard< osl::Mutex > aGuard( m_aMutex );
706 if( !m_xPropertySetOrigin.is() )
708 OSL_FAIL( "broadcaster was disposed already" );
709 return;
714 m_xPropertySetOrigin->removeVetoableChangeListener(
715 OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
717 catch( Exception& )
719 OSL_FAIL( "could not remove VetoableChangeListener" );
725 // own methods.
728 //virtual
729 void ContentResultSetWrapper::impl_disposing( const EventObject& )
731 impl_EnsureNotDisposed();
733 osl::Guard< osl::Mutex > aGuard( m_aMutex );
735 if( !m_xResultSetOrigin.is() )
736 return;
738 //release all references to the broadcaster:
739 m_xResultSetOrigin.clear();
740 if(m_xRowOrigin.is())
741 m_xRowOrigin.clear();
742 if(m_xContentAccessOrigin.is())
743 m_xContentAccessOrigin.clear();
744 if(m_xPropertySetOrigin.is())
745 m_xPropertySetOrigin.clear();
746 m_xMetaDataFromOrigin.clear();
747 if(m_xPropertySetInfo.is())
748 m_xPropertySetInfo.clear();
751 //virtual
752 void ContentResultSetWrapper::impl_propertyChange( const PropertyChangeEvent& rEvt )
754 impl_EnsureNotDisposed();
756 PropertyChangeEvent aEvt( rEvt );
757 aEvt.Source = static_cast< XPropertySet * >( this );
758 aEvt.Further = false;
759 impl_notifyPropertyChangeListeners( aEvt );
762 //virtual
763 void ContentResultSetWrapper::impl_vetoableChange( const PropertyChangeEvent& rEvt )
765 impl_EnsureNotDisposed();
767 PropertyChangeEvent aEvt( rEvt );
768 aEvt.Source = static_cast< XPropertySet * >( this );
769 aEvt.Further = false;
771 impl_notifyVetoableChangeListeners( aEvt );
775 // XContentAccess methods. ( -- position dependent )
778 // virtual
779 OUString SAL_CALL ContentResultSetWrapper::queryContentIdentifierString()
781 impl_EnsureNotDisposed();
782 impl_init_xContentAccessOrigin();
783 if( !m_xContentAccessOrigin.is() )
785 OSL_FAIL( "broadcaster was disposed already" );
786 throw RuntimeException();
788 return m_xContentAccessOrigin->queryContentIdentifierString();
792 // virtual
793 Reference< XContentIdentifier > SAL_CALL ContentResultSetWrapper::queryContentIdentifier()
795 impl_EnsureNotDisposed();
796 impl_init_xContentAccessOrigin();
797 if( !m_xContentAccessOrigin.is() )
799 OSL_FAIL( "broadcaster was disposed already" );
800 throw RuntimeException();
802 return m_xContentAccessOrigin->queryContentIdentifier();
806 // virtual
807 Reference< XContent > SAL_CALL ContentResultSetWrapper::queryContent()
809 impl_EnsureNotDisposed();
810 impl_init_xContentAccessOrigin();
811 if( !m_xContentAccessOrigin.is() )
813 OSL_FAIL( "broadcaster was disposed already" );
814 throw RuntimeException();
816 return m_xContentAccessOrigin->queryContent();
820 // XResultSet methods.
822 //virtual
824 sal_Bool SAL_CALL ContentResultSetWrapper::next()
826 impl_EnsureNotDisposed();
828 if( !m_xResultSetOrigin.is() )
830 OSL_FAIL( "broadcaster was disposed already" );
831 throw RuntimeException();
833 return m_xResultSetOrigin->next();
836 //virtual
837 sal_Bool SAL_CALL ContentResultSetWrapper::previous()
839 impl_EnsureNotDisposed();
841 if( !m_xResultSetOrigin.is() )
843 OSL_FAIL( "broadcaster was disposed already" );
844 throw RuntimeException();
846 return m_xResultSetOrigin->previous();
849 //virtual
850 sal_Bool SAL_CALL ContentResultSetWrapper::absolute( sal_Int32 row )
852 impl_EnsureNotDisposed();
854 if( !m_xResultSetOrigin.is() )
856 OSL_FAIL( "broadcaster was disposed already" );
857 throw RuntimeException();
859 return m_xResultSetOrigin->absolute( row );
862 //virtual
863 sal_Bool SAL_CALL ContentResultSetWrapper::relative( sal_Int32 rows )
865 impl_EnsureNotDisposed();
867 if( !m_xResultSetOrigin.is() )
869 OSL_FAIL( "broadcaster was disposed already" );
870 throw RuntimeException();
872 return m_xResultSetOrigin->relative( rows );
876 //virtual
877 sal_Bool SAL_CALL ContentResultSetWrapper::first()
879 impl_EnsureNotDisposed();
881 if( !m_xResultSetOrigin.is() )
883 OSL_FAIL( "broadcaster was disposed already" );
884 throw RuntimeException();
886 return m_xResultSetOrigin->first();
889 //virtual
890 sal_Bool SAL_CALL ContentResultSetWrapper::last()
892 impl_EnsureNotDisposed();
894 if( !m_xResultSetOrigin.is() )
896 OSL_FAIL( "broadcaster was disposed already" );
897 throw RuntimeException();
899 return m_xResultSetOrigin->last();
902 //virtual
903 void SAL_CALL ContentResultSetWrapper::beforeFirst()
905 impl_EnsureNotDisposed();
907 if( !m_xResultSetOrigin.is() )
909 OSL_FAIL( "broadcaster was disposed already" );
910 throw RuntimeException();
912 m_xResultSetOrigin->beforeFirst();
915 //virtual
916 void SAL_CALL ContentResultSetWrapper::afterLast()
918 impl_EnsureNotDisposed();
920 if( !m_xResultSetOrigin.is() )
922 OSL_FAIL( "broadcaster was disposed already" );
923 throw RuntimeException();
925 m_xResultSetOrigin->afterLast();
928 //virtual
929 sal_Bool SAL_CALL ContentResultSetWrapper::isAfterLast()
931 impl_EnsureNotDisposed();
933 if( !m_xResultSetOrigin.is() )
935 OSL_FAIL( "broadcaster was disposed already" );
936 throw RuntimeException();
938 return m_xResultSetOrigin->isAfterLast();
941 //virtual
942 sal_Bool SAL_CALL ContentResultSetWrapper::isBeforeFirst()
944 impl_EnsureNotDisposed();
946 if( !m_xResultSetOrigin.is() )
948 OSL_FAIL( "broadcaster was disposed already" );
949 throw RuntimeException();
951 return m_xResultSetOrigin->isBeforeFirst();
954 //virtual
955 sal_Bool SAL_CALL ContentResultSetWrapper::isFirst()
957 impl_EnsureNotDisposed();
959 if( !m_xResultSetOrigin.is() )
961 OSL_FAIL( "broadcaster was disposed already" );
962 throw RuntimeException();
964 return m_xResultSetOrigin->isFirst();
967 //virtual
968 sal_Bool SAL_CALL ContentResultSetWrapper::isLast()
970 impl_EnsureNotDisposed();
972 if( !m_xResultSetOrigin.is() )
974 OSL_FAIL( "broadcaster was disposed already" );
975 throw RuntimeException();
977 return m_xResultSetOrigin->isLast();
981 //virtual
982 sal_Int32 SAL_CALL ContentResultSetWrapper::getRow()
984 impl_EnsureNotDisposed();
986 if( !m_xResultSetOrigin.is() )
988 OSL_FAIL( "broadcaster was disposed already" );
989 throw RuntimeException();
991 return m_xResultSetOrigin->getRow();
994 //virtual
995 void SAL_CALL ContentResultSetWrapper::refreshRow()
997 impl_EnsureNotDisposed();
999 if( !m_xResultSetOrigin.is() )
1001 OSL_FAIL( "broadcaster was disposed already" );
1002 throw RuntimeException();
1004 m_xResultSetOrigin->refreshRow();
1007 //virtual
1008 sal_Bool SAL_CALL ContentResultSetWrapper::rowUpdated()
1010 impl_EnsureNotDisposed();
1012 if( !m_xResultSetOrigin.is() )
1014 OSL_FAIL( "broadcaster was disposed already" );
1015 throw RuntimeException();
1017 return m_xResultSetOrigin->rowUpdated();
1020 //virtual
1021 sal_Bool SAL_CALL ContentResultSetWrapper::rowInserted()
1023 impl_EnsureNotDisposed();
1025 if( !m_xResultSetOrigin.is() )
1027 OSL_FAIL( "broadcaster was disposed already" );
1028 throw RuntimeException();
1030 return m_xResultSetOrigin->rowInserted();
1033 //virtual
1034 sal_Bool SAL_CALL ContentResultSetWrapper::rowDeleted()
1036 impl_EnsureNotDisposed();
1038 if( !m_xResultSetOrigin.is() )
1040 OSL_FAIL( "broadcaster was disposed already" );
1041 throw RuntimeException();
1043 return m_xResultSetOrigin->rowDeleted();
1046 //virtual
1047 Reference< XInterface > SAL_CALL ContentResultSetWrapper::getStatement()
1049 impl_EnsureNotDisposed();
1050 //@todo ?return anything
1051 return Reference< XInterface >();
1055 // XRow methods.
1058 void ContentResultSetWrapper::verifyGet()
1060 impl_EnsureNotDisposed();
1061 impl_init_xRowOrigin();
1062 if( !m_xRowOrigin.is() )
1064 OSL_FAIL( "broadcaster was disposed already" );
1065 throw RuntimeException();
1069 //virtual
1070 sal_Bool SAL_CALL ContentResultSetWrapper::wasNull()
1072 impl_EnsureNotDisposed();
1073 impl_init_xRowOrigin();
1074 if( !m_xRowOrigin.is() )
1076 OSL_FAIL( "broadcaster was disposed already" );
1077 throw RuntimeException();
1079 return m_xRowOrigin->wasNull();
1082 //virtual
1083 OUString SAL_CALL ContentResultSetWrapper::getString( sal_Int32 columnIndex )
1085 verifyGet();
1086 return m_xRowOrigin->getString( columnIndex );
1089 //virtual
1090 sal_Bool SAL_CALL ContentResultSetWrapper::getBoolean( sal_Int32 columnIndex )
1092 verifyGet();
1093 return m_xRowOrigin->getBoolean( columnIndex );
1096 //virtual
1097 sal_Int8 SAL_CALL ContentResultSetWrapper::getByte( sal_Int32 columnIndex )
1099 verifyGet();
1100 return m_xRowOrigin->getByte( columnIndex );
1103 //virtual
1104 sal_Int16 SAL_CALL ContentResultSetWrapper::getShort( sal_Int32 columnIndex )
1106 verifyGet();
1107 return m_xRowOrigin->getShort( columnIndex );
1110 //virtual
1111 sal_Int32 SAL_CALL ContentResultSetWrapper::getInt( sal_Int32 columnIndex )
1113 verifyGet();
1114 return m_xRowOrigin->getInt( columnIndex );
1117 //virtual
1118 sal_Int64 SAL_CALL ContentResultSetWrapper::getLong( sal_Int32 columnIndex )
1120 verifyGet();
1121 return m_xRowOrigin->getLong( columnIndex );
1124 //virtual
1125 float SAL_CALL ContentResultSetWrapper::getFloat( sal_Int32 columnIndex )
1127 verifyGet();
1128 return m_xRowOrigin->getFloat( columnIndex );
1131 //virtual
1132 double SAL_CALL ContentResultSetWrapper::getDouble( sal_Int32 columnIndex )
1134 verifyGet();
1135 return m_xRowOrigin->getDouble( columnIndex );
1138 //virtual
1139 Sequence< sal_Int8 > SAL_CALL ContentResultSetWrapper::getBytes( sal_Int32 columnIndex )
1141 verifyGet();
1142 return m_xRowOrigin->getBytes( columnIndex );
1145 //virtual
1146 Date SAL_CALL ContentResultSetWrapper::getDate( sal_Int32 columnIndex )
1148 verifyGet();
1149 return m_xRowOrigin->getDate( columnIndex );
1152 //virtual
1153 Time SAL_CALL ContentResultSetWrapper::getTime( sal_Int32 columnIndex )
1155 verifyGet();
1156 return m_xRowOrigin->getTime( columnIndex );
1159 //virtual
1160 DateTime SAL_CALL ContentResultSetWrapper::getTimestamp( sal_Int32 columnIndex )
1162 verifyGet();
1163 return m_xRowOrigin->getTimestamp( columnIndex );
1166 //virtual
1167 Reference< css::io::XInputStream > SAL_CALL ContentResultSetWrapper::getBinaryStream( sal_Int32 columnIndex )
1169 verifyGet();
1170 return m_xRowOrigin->getBinaryStream( columnIndex );
1173 //virtual
1174 Reference< css::io::XInputStream > SAL_CALL ContentResultSetWrapper::getCharacterStream( sal_Int32 columnIndex )
1176 verifyGet();
1177 return m_xRowOrigin->getCharacterStream( columnIndex );
1180 //virtual
1181 Any SAL_CALL ContentResultSetWrapper::getObject( sal_Int32 columnIndex, const Reference< css::container::XNameAccess >& typeMap )
1183 //if you change this macro please pay attention to
1184 //define XROW_GETXXX, where this is similar implemented
1186 impl_EnsureNotDisposed();
1187 impl_init_xRowOrigin();
1188 if( !m_xRowOrigin.is() )
1190 OSL_FAIL( "broadcaster was disposed already" );
1191 throw RuntimeException();
1193 return m_xRowOrigin->getObject( columnIndex, typeMap );
1196 //virtual
1197 Reference< XRef > SAL_CALL ContentResultSetWrapper::getRef( sal_Int32 columnIndex )
1199 verifyGet();
1200 return m_xRowOrigin->getRef( columnIndex );
1203 //virtual
1204 Reference< XBlob > SAL_CALL ContentResultSetWrapper::getBlob( sal_Int32 columnIndex )
1206 verifyGet();
1207 return m_xRowOrigin->getBlob( columnIndex );
1210 //virtual
1211 Reference< XClob > SAL_CALL ContentResultSetWrapper::getClob( sal_Int32 columnIndex )
1213 verifyGet();
1214 return m_xRowOrigin->getClob( columnIndex );
1217 //virtual
1218 Reference< XArray > SAL_CALL ContentResultSetWrapper::getArray( sal_Int32 columnIndex )
1220 verifyGet();
1221 return m_xRowOrigin->getArray( columnIndex );
1225 // class ContentResultSetWrapperListener
1228 ContentResultSetWrapperListener::ContentResultSetWrapperListener(
1229 ContentResultSetWrapper* pOwner )
1230 : m_pOwner( pOwner )
1234 ContentResultSetWrapperListener::~ContentResultSetWrapperListener()
1239 // XInterface methods.
1240 void SAL_CALL ContentResultSetWrapperListener::acquire()
1241 throw()
1243 OWeakObject::acquire();
1246 void SAL_CALL ContentResultSetWrapperListener::release()
1247 throw()
1249 OWeakObject::release();
1252 css::uno::Any SAL_CALL ContentResultSetWrapperListener::queryInterface( const css::uno::Type & rType )
1254 //list all interfaces inclusive baseclasses of interfaces
1255 css::uno::Any aRet = cppu::queryInterface( rType,
1256 static_cast< XEventListener * >(
1257 static_cast< XPropertyChangeListener * >(this)),
1258 static_cast< XPropertyChangeListener* >(this),
1259 static_cast< XVetoableChangeListener* >(this)
1261 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
1264 //XEventListener methods.
1267 //virtual
1268 void SAL_CALL ContentResultSetWrapperListener::disposing( const EventObject& rEventObject )
1270 if( m_pOwner )
1271 m_pOwner->impl_disposing( rEventObject );
1275 //XPropertyChangeListener methods.
1278 //virtual
1279 void SAL_CALL ContentResultSetWrapperListener::propertyChange( const PropertyChangeEvent& rEvt )
1281 if( m_pOwner )
1282 m_pOwner->impl_propertyChange( rEvt );
1286 //XVetoableChangeListener methods.
1288 //virtual
1289 void SAL_CALL ContentResultSetWrapperListener::vetoableChange( const PropertyChangeEvent& rEvt )
1291 if( m_pOwner )
1292 m_pOwner->impl_vetoableChange( rEvt );
1295 void ContentResultSetWrapperListener::impl_OwnerDies()
1297 m_pOwner = nullptr;
1300 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */