1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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
;
41 // class ContentResultSetWrapper
44 ContentResultSetWrapper::ContentResultSetWrapper(
45 Reference
< XResultSet
> const & xOrigin
)
46 : m_xResultSetOrigin( xOrigin
)
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
);
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())
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() )
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();
138 void ContentResultSetWrapper::impl_initPropertySetInfo()
141 osl::Guard
< osl::Mutex
> aGuard( m_aMutex
);
142 if( m_xPropertySetInfo
.is() )
145 impl_init_xPropertySetOrigin();
146 if( !m_xPropertySetOrigin
.is() )
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
);
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
)
190 // Notify listeners interested especially in the changed property.
191 OInterfaceContainerHelper
* pContainer
=
192 m_pPropertyChangeListeners
->getContainer( rEvt
.PropertyName
);
195 OInterfaceIteratorHelper
aIter( *pContainer
);
196 while( aIter
.hasMoreElements() )
198 Reference
< XPropertyChangeListener
> xListener(
199 aIter
.next(), UNO_QUERY
);
201 xListener
->propertyChange( rEvt
);
205 // Notify listeners interested in all properties.
206 pContainer
= m_pPropertyChangeListeners
->getContainer( OUString() );
209 OInterfaceIteratorHelper
aIter( *pContainer
);
210 while( aIter
.hasMoreElements() )
212 Reference
< XPropertyChangeListener
> xListener(
213 aIter
.next(), UNO_QUERY
);
215 xListener
->propertyChange( rEvt
);
220 void ContentResultSetWrapper::impl_notifyVetoableChangeListeners( const PropertyChangeEvent
& rEvt
)
223 osl::Guard
< osl::Mutex
> aGuard( m_aMutex
);
224 if( !m_pVetoableChangeListeners
)
228 // Notify listeners interested especially in the changed property.
229 OInterfaceContainerHelper
* pContainer
=
230 m_pVetoableChangeListeners
->getContainer( rEvt
.PropertyName
);
233 OInterfaceIteratorHelper
aIter( *pContainer
);
234 while( aIter
.hasMoreElements() )
236 Reference
< XVetoableChangeListener
> xListener(
237 aIter
.next(), UNO_QUERY
);
239 xListener
->vetoableChange( rEvt
);
243 // Notify listeners interested in all properties.
244 pContainer
= m_pVetoableChangeListeners
->getContainer( OUString() );
247 OInterfaceIteratorHelper
aIter( *pContainer
);
248 while( aIter
.hasMoreElements() )
250 Reference
< XVetoableChangeListener
> xListener(
251 aIter
.next(), UNO_QUERY
);
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
);
271 ReacquireableGuard aGuard( m_aMutex );
272 if( m_nForwardOnly == 2 )
275 if( !getPropertySetInfo().is() )
279 return m_nForwardOnly;
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" );
291 return m_nForwardOnly;
295 Any aAny = m_xPropertySetOrigin->getPropertyValue( aName );
299 if( ( aAny >>= nResultSetType ) &&
300 ( nResultSetType == ResultSetType::FORWARD_ONLY ) )
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.
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
)
340 if( m_xPropertySetOrigin
.is() )
346 m_xPropertySetOrigin
->removePropertyChangeListener(
347 OUString(), static_cast< XPropertyChangeListener
* >( m_xMyListenerImpl
.get() ) );
351 OSL_FAIL( "could not remove PropertyChangeListener" );
355 m_xPropertySetOrigin
->removeVetoableChangeListener(
356 OUString(), static_cast< XVetoableChangeListener
* >( m_xMyListenerImpl
.get() ) );
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() ) );
373 if( m_pDisposeEventListeners
&& m_pDisposeEventListeners
->getLength() )
376 aEvt
.Source
= static_cast< XComponent
* >( this );
380 m_pDisposeEventListeners
->disposeAndClear( aEvt
);
388 if( m_pPropertyChangeListeners
)
391 aEvt
.Source
= static_cast< XPropertySet
* >( this );
395 m_pPropertyChangeListeners
->disposeAndClear( aEvt
);
403 if( m_pVetoableChangeListeners
)
406 aEvt
.Source
= static_cast< XPropertySet
* >( this );
410 m_pVetoableChangeListeners
->disposeAndClear( aEvt
);
418 m_bInDispose
= false;
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
);
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.
450 void SAL_CALL
ContentResultSetWrapper::close()
452 impl_EnsureNotDisposed();
457 //XResultSetMetaDataSupplier methods.
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() )
474 Reference
< XResultSetMetaData
> xMetaData
475 = xMetaDataSupplier
->getMetaData();
478 m_xMetaDataFromOrigin
= xMetaData
;
481 return m_xMetaDataFromOrigin
;
485 // XPropertySet methods.
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
;
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
);
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
);
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
);
551 impl_init_xPropertySetOrigin();
553 osl::Guard
< osl::Mutex
> aGuard( m_aMutex
);
554 if( !m_xPropertySetOrigin
.is() )
556 OSL_FAIL( "broadcaster was disposed already" );
562 m_xPropertySetOrigin
->addPropertyChangeListener(
563 OUString(), static_cast< XPropertyChangeListener
* >( m_xMyListenerImpl
.get() ) );
567 m_pPropertyChangeListeners
->removeInterface( aPropertyName
, xListener
);
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
);
596 impl_init_xPropertySetOrigin();
598 osl::Guard
< osl::Mutex
> aGuard( m_aMutex
);
599 if( !m_xPropertySetOrigin
.is() )
601 OSL_FAIL( "broadcaster was disposed already" );
607 m_xPropertySetOrigin
->addVetoableChangeListener(
608 OUString(), static_cast< XVetoableChangeListener
* >( m_xMyListenerImpl
.get() ) );
612 m_pVetoableChangeListeners
->removeInterface( rPropertyName
, xListener
);
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
)
630 OInterfaceContainerHelper
* pContainer
=
631 m_pPropertyChangeListeners
->getContainer( rPropertyName
);
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" );
661 m_xPropertySetOrigin
->removePropertyChangeListener(
662 OUString(), static_cast< XPropertyChangeListener
* >( m_xMyListenerImpl
.get() ) );
666 OSL_FAIL( "could not remove PropertyChangeListener" );
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
)
683 OInterfaceContainerHelper
* pContainer
=
684 m_pVetoableChangeListeners
->getContainer( rPropertyName
);
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" );
714 m_xPropertySetOrigin
->removeVetoableChangeListener(
715 OUString(), static_cast< XVetoableChangeListener
* >( m_xMyListenerImpl
.get() ) );
719 OSL_FAIL( "could not remove VetoableChangeListener" );
729 void ContentResultSetWrapper::impl_disposing( const EventObject
& )
731 impl_EnsureNotDisposed();
733 osl::Guard
< osl::Mutex
> aGuard( m_aMutex
);
735 if( !m_xResultSetOrigin
.is() )
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();
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
);
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 )
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();
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();
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.
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();
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();
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
);
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
);
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
1047 Reference
< XInterface
> SAL_CALL
ContentResultSetWrapper::getStatement()
1049 impl_EnsureNotDisposed();
1050 //@todo ?return anything
1051 return Reference
< XInterface
>();
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();
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();
1083 OUString SAL_CALL
ContentResultSetWrapper::getString( sal_Int32 columnIndex
)
1086 return m_xRowOrigin
->getString( columnIndex
);
1090 sal_Bool SAL_CALL
ContentResultSetWrapper::getBoolean( sal_Int32 columnIndex
)
1093 return m_xRowOrigin
->getBoolean( columnIndex
);
1097 sal_Int8 SAL_CALL
ContentResultSetWrapper::getByte( sal_Int32 columnIndex
)
1100 return m_xRowOrigin
->getByte( columnIndex
);
1104 sal_Int16 SAL_CALL
ContentResultSetWrapper::getShort( sal_Int32 columnIndex
)
1107 return m_xRowOrigin
->getShort( columnIndex
);
1111 sal_Int32 SAL_CALL
ContentResultSetWrapper::getInt( sal_Int32 columnIndex
)
1114 return m_xRowOrigin
->getInt( columnIndex
);
1118 sal_Int64 SAL_CALL
ContentResultSetWrapper::getLong( sal_Int32 columnIndex
)
1121 return m_xRowOrigin
->getLong( columnIndex
);
1125 float SAL_CALL
ContentResultSetWrapper::getFloat( sal_Int32 columnIndex
)
1128 return m_xRowOrigin
->getFloat( columnIndex
);
1132 double SAL_CALL
ContentResultSetWrapper::getDouble( sal_Int32 columnIndex
)
1135 return m_xRowOrigin
->getDouble( columnIndex
);
1139 Sequence
< sal_Int8
> SAL_CALL
ContentResultSetWrapper::getBytes( sal_Int32 columnIndex
)
1142 return m_xRowOrigin
->getBytes( columnIndex
);
1146 Date SAL_CALL
ContentResultSetWrapper::getDate( sal_Int32 columnIndex
)
1149 return m_xRowOrigin
->getDate( columnIndex
);
1153 Time SAL_CALL
ContentResultSetWrapper::getTime( sal_Int32 columnIndex
)
1156 return m_xRowOrigin
->getTime( columnIndex
);
1160 DateTime SAL_CALL
ContentResultSetWrapper::getTimestamp( sal_Int32 columnIndex
)
1163 return m_xRowOrigin
->getTimestamp( columnIndex
);
1167 Reference
< css::io::XInputStream
> SAL_CALL
ContentResultSetWrapper::getBinaryStream( sal_Int32 columnIndex
)
1170 return m_xRowOrigin
->getBinaryStream( columnIndex
);
1174 Reference
< css::io::XInputStream
> SAL_CALL
ContentResultSetWrapper::getCharacterStream( sal_Int32 columnIndex
)
1177 return m_xRowOrigin
->getCharacterStream( columnIndex
);
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
);
1197 Reference
< XRef
> SAL_CALL
ContentResultSetWrapper::getRef( sal_Int32 columnIndex
)
1200 return m_xRowOrigin
->getRef( columnIndex
);
1204 Reference
< XBlob
> SAL_CALL
ContentResultSetWrapper::getBlob( sal_Int32 columnIndex
)
1207 return m_xRowOrigin
->getBlob( columnIndex
);
1211 Reference
< XClob
> SAL_CALL
ContentResultSetWrapper::getClob( sal_Int32 columnIndex
)
1214 return m_xRowOrigin
->getClob( columnIndex
);
1218 Reference
< XArray
> SAL_CALL
ContentResultSetWrapper::getArray( sal_Int32 columnIndex
)
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()
1243 OWeakObject::acquire();
1246 void SAL_CALL
ContentResultSetWrapperListener::release()
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.
1268 void SAL_CALL
ContentResultSetWrapperListener::disposing( const EventObject
& rEventObject
)
1271 m_pOwner
->impl_disposing( rEventObject
);
1275 //XPropertyChangeListener methods.
1279 void SAL_CALL
ContentResultSetWrapperListener::propertyChange( const PropertyChangeEvent
& rEvt
)
1282 m_pOwner
->impl_propertyChange( rEvt
);
1286 //XVetoableChangeListener methods.
1289 void SAL_CALL
ContentResultSetWrapperListener::vetoableChange( const PropertyChangeEvent
& rEvt
)
1292 m_pOwner
->impl_vetoableChange( rEvt
);
1295 void ContentResultSetWrapperListener::impl_OwnerDies()
1300 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */