e57ca02849
...(for now, from LIBO_INTERNAL_CODE only). See the mail thread starting at <https://lists.freedesktop.org/archives/libreoffice/2017-January/076665.html> "Dynamic Exception Specifications" for details. Most changes have been done automatically by the rewriting loplugin:dynexcspec (after enabling the rewriting mode, to be committed shortly). The way it only removes exception specs from declarations if it also sees a definition, it identified some dead declarations-w/o-definitions (that have been removed manually) and some cases where a definition appeared in multiple include files (which have also been cleaned up manually). There's also been cases of macro paramters (that were used to abstract over exception specs) that have become unused now (and been removed). Furthermore, some code needed to be cleaned up manually (avmedia/source/quicktime/ and connectivity/source/drivers/kab/), as I had no configurations available that would actually build that code. Missing @throws documentation has not been applied in such manual clean-up. Change-Id: I3408691256c9b0c12bc5332de976743626e13960 Reviewed-on: https://gerrit.libreoffice.org/33574 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
1292 lines
34 KiB
C++
1292 lines
34 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
|
|
#include <contentresultsetwrapper.hxx>
|
|
#include <com/sun/star/sdbc/FetchDirection.hpp>
|
|
#include <com/sun/star/ucb/FetchError.hpp>
|
|
#include <com/sun/star/beans/PropertyAttribute.hpp>
|
|
#include <com/sun/star/sdbc/ResultSetType.hpp>
|
|
#include <com/sun/star/lang/DisposedException.hpp>
|
|
#include <rtl/ustring.hxx>
|
|
#include <osl/diagnose.h>
|
|
|
|
using namespace com::sun::star::beans;
|
|
using namespace com::sun::star::lang;
|
|
using namespace com::sun::star::sdbc;
|
|
using namespace com::sun::star::ucb;
|
|
using namespace com::sun::star::uno;
|
|
using namespace com::sun::star::util;
|
|
using namespace comphelper;
|
|
using namespace cppu;
|
|
|
|
|
|
// class ContentResultSetWrapper
|
|
|
|
|
|
ContentResultSetWrapper::ContentResultSetWrapper(
|
|
Reference< XResultSet > const & xOrigin )
|
|
: m_xResultSetOrigin( xOrigin )
|
|
, m_xRowOrigin( nullptr )
|
|
, m_xContentAccessOrigin( nullptr )
|
|
, m_xPropertySetOrigin( nullptr )
|
|
, m_xPropertySetInfo( nullptr )
|
|
, m_nForwardOnly( 2 )
|
|
, m_xMetaDataFromOrigin( nullptr )
|
|
, m_bDisposed( false )
|
|
, m_bInDispose( false )
|
|
, m_pDisposeEventListeners( nullptr )
|
|
, m_pPropertyChangeListeners( nullptr )
|
|
, m_pVetoableChangeListeners( nullptr )
|
|
{
|
|
m_xMyListenerImpl = new ContentResultSetWrapperListener( this );
|
|
|
|
OSL_ENSURE( m_xResultSetOrigin.is(), "XResultSet is required" );
|
|
|
|
//!! call impl_init() at the end of constructor of derived class
|
|
};
|
|
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_init_xRowOrigin()
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if(m_xRowOrigin.is())
|
|
return;
|
|
}
|
|
|
|
Reference< XRow > xOrgig =
|
|
Reference< XRow >( m_xResultSetOrigin, UNO_QUERY );
|
|
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
m_xRowOrigin = xOrgig;
|
|
OSL_ENSURE( m_xRowOrigin.is(), "interface XRow is required" );
|
|
}
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_init_xContentAccessOrigin()
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if(m_xContentAccessOrigin.is())
|
|
return;
|
|
}
|
|
|
|
Reference< XContentAccess > xOrgig =
|
|
Reference< XContentAccess >( m_xResultSetOrigin, UNO_QUERY );
|
|
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
m_xContentAccessOrigin = xOrgig;
|
|
OSL_ENSURE( m_xContentAccessOrigin.is(), "interface XContentAccess is required" );
|
|
}
|
|
}
|
|
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_init_xPropertySetOrigin()
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( m_xPropertySetOrigin.is() )
|
|
return;
|
|
}
|
|
|
|
Reference< XPropertySet > xOrig =
|
|
Reference< XPropertySet >( m_xResultSetOrigin, UNO_QUERY );
|
|
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
m_xPropertySetOrigin = xOrig;
|
|
OSL_ENSURE( m_xPropertySetOrigin.is(), "interface XPropertySet is required" );
|
|
}
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_init()
|
|
{
|
|
//call this at the end of constructor of derived class
|
|
|
|
|
|
//listen to disposing from Origin:
|
|
Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
|
|
OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
|
|
xComponentOrigin->addEventListener( static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
|
|
ContentResultSetWrapper::~ContentResultSetWrapper()
|
|
{
|
|
//call impl_deinit() at start of destructor of derived class
|
|
|
|
delete m_pDisposeEventListeners;
|
|
delete m_pPropertyChangeListeners;
|
|
delete m_pVetoableChangeListeners;
|
|
};
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_deinit()
|
|
{
|
|
//call this at start of destructor of derived class
|
|
|
|
m_xMyListenerImpl->impl_OwnerDies();
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::impl_initPropertySetInfo()
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( m_xPropertySetInfo.is() )
|
|
return;
|
|
|
|
impl_init_xPropertySetOrigin();
|
|
if( !m_xPropertySetOrigin.is() )
|
|
return;
|
|
}
|
|
|
|
Reference< XPropertySetInfo > xOrig =
|
|
m_xPropertySetOrigin->getPropertySetInfo();
|
|
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
m_xPropertySetInfo = xOrig;
|
|
}
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_EnsureNotDisposed()
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( m_bDisposed )
|
|
throw DisposedException();
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_getPropertyChangeListenerContainer()
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if ( !m_pPropertyChangeListeners )
|
|
m_pPropertyChangeListeners =
|
|
new PropertyChangeListenerContainer_Impl( m_aContainerMutex );
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_getVetoableChangeListenerContainer()
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if ( !m_pVetoableChangeListeners )
|
|
m_pVetoableChangeListeners =
|
|
new PropertyChangeListenerContainer_Impl( m_aContainerMutex );
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_notifyPropertyChangeListeners( const PropertyChangeEvent& rEvt )
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_pPropertyChangeListeners )
|
|
return;
|
|
}
|
|
|
|
// Notify listeners interested especially in the changed property.
|
|
OInterfaceContainerHelper* pContainer =
|
|
m_pPropertyChangeListeners->getContainer( rEvt.PropertyName );
|
|
if( pContainer )
|
|
{
|
|
OInterfaceIteratorHelper aIter( *pContainer );
|
|
while( aIter.hasMoreElements() )
|
|
{
|
|
Reference< XPropertyChangeListener > xListener(
|
|
aIter.next(), UNO_QUERY );
|
|
if( xListener.is() )
|
|
xListener->propertyChange( rEvt );
|
|
}
|
|
}
|
|
|
|
// Notify listeners interested in all properties.
|
|
pContainer = m_pPropertyChangeListeners->getContainer( OUString() );
|
|
if( pContainer )
|
|
{
|
|
OInterfaceIteratorHelper aIter( *pContainer );
|
|
while( aIter.hasMoreElements() )
|
|
{
|
|
Reference< XPropertyChangeListener > xListener(
|
|
aIter.next(), UNO_QUERY );
|
|
if( xListener.is() )
|
|
xListener->propertyChange( rEvt );
|
|
}
|
|
}
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapper::impl_notifyVetoableChangeListeners( const PropertyChangeEvent& rEvt )
|
|
{
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_pVetoableChangeListeners )
|
|
return;
|
|
}
|
|
|
|
// Notify listeners interested especially in the changed property.
|
|
OInterfaceContainerHelper* pContainer =
|
|
m_pVetoableChangeListeners->getContainer( rEvt.PropertyName );
|
|
if( pContainer )
|
|
{
|
|
OInterfaceIteratorHelper aIter( *pContainer );
|
|
while( aIter.hasMoreElements() )
|
|
{
|
|
Reference< XVetoableChangeListener > xListener(
|
|
aIter.next(), UNO_QUERY );
|
|
if( xListener.is() )
|
|
xListener->vetoableChange( rEvt );
|
|
}
|
|
}
|
|
|
|
// Notify listeners interested in all properties.
|
|
pContainer = m_pVetoableChangeListeners->getContainer( OUString() );
|
|
if( pContainer )
|
|
{
|
|
OInterfaceIteratorHelper aIter( *pContainer );
|
|
while( aIter.hasMoreElements() )
|
|
{
|
|
Reference< XVetoableChangeListener > xListener(
|
|
aIter.next(), UNO_QUERY );
|
|
if( xListener.is() )
|
|
xListener->vetoableChange( rEvt );
|
|
}
|
|
}
|
|
}
|
|
|
|
bool SAL_CALL ContentResultSetWrapper::impl_isForwardOnly()
|
|
{
|
|
//m_nForwardOnly == 2 -> don't know
|
|
//m_nForwardOnly == 1 -> YES
|
|
//m_nForwardOnly == 0 -> NO
|
|
|
|
//@todo replace this with lines in comment
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
m_nForwardOnly = 0;
|
|
return false;
|
|
|
|
|
|
/*
|
|
ReacquireableGuard aGuard( m_aMutex );
|
|
if( m_nForwardOnly == 2 )
|
|
{
|
|
aGuard.clear();
|
|
if( !getPropertySetInfo().is() )
|
|
{
|
|
aGuard.reacquire();
|
|
m_nForwardOnly = 0;
|
|
return m_nForwardOnly;
|
|
}
|
|
aGuard.reacquire();
|
|
|
|
OUString aName("ResultSetType");
|
|
//find out, if we are ForwardOnly and cache the value:
|
|
|
|
impl_init_xPropertySetOrigin();
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
m_nForwardOnly = 0;
|
|
return m_nForwardOnly;
|
|
}
|
|
|
|
aGuard.clear();
|
|
Any aAny = m_xPropertySetOrigin->getPropertyValue( aName );
|
|
|
|
aGuard.reacquire();
|
|
long nResultSetType;
|
|
if( ( aAny >>= nResultSetType ) &&
|
|
( nResultSetType == ResultSetType::FORWARD_ONLY ) )
|
|
m_nForwardOnly = 1;
|
|
else
|
|
m_nForwardOnly = 0;
|
|
}
|
|
return m_nForwardOnly;
|
|
*/
|
|
}
|
|
|
|
|
|
// XInterface methods.
|
|
|
|
css::uno::Any SAL_CALL ContentResultSetWrapper::queryInterface( const css::uno::Type & rType )
|
|
{
|
|
//list all interfaces inclusive baseclasses of interfaces
|
|
css::uno::Any aRet = cppu::queryInterface( rType,
|
|
(static_cast< XComponent* >(this)),
|
|
(static_cast< XCloseable* >(this)),
|
|
(static_cast< XResultSetMetaDataSupplier* >(this)),
|
|
(static_cast< XPropertySet* >(this)),
|
|
(static_cast< XContentAccess* >(this)),
|
|
(static_cast< XResultSet* >(this)),
|
|
(static_cast< XRow* >(this))
|
|
);
|
|
return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
|
|
}
|
|
|
|
// XComponent methods.
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::dispose()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
bool isCleared = false;
|
|
osl::ResettableMutexGuard aGuard(m_aMutex);
|
|
if( m_bInDispose || m_bDisposed )
|
|
return;
|
|
m_bInDispose = true;
|
|
|
|
if( m_xPropertySetOrigin.is() )
|
|
{
|
|
aGuard.clear();
|
|
isCleared = true;
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->removePropertyChangeListener(
|
|
OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
OSL_FAIL( "could not remove PropertyChangeListener" );
|
|
}
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->removeVetoableChangeListener(
|
|
OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
OSL_FAIL( "could not remove VetoableChangeListener" );
|
|
}
|
|
|
|
Reference< XComponent > xComponentOrigin( m_xResultSetOrigin, UNO_QUERY );
|
|
OSL_ENSURE( xComponentOrigin.is(), "interface XComponent is required" );
|
|
xComponentOrigin->removeEventListener( static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
|
|
if (isCleared)
|
|
{
|
|
aGuard.reset();
|
|
isCleared = false;
|
|
}
|
|
if( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
|
|
{
|
|
EventObject aEvt;
|
|
aEvt.Source = static_cast< XComponent * >( this );
|
|
|
|
aGuard.clear();
|
|
isCleared = true;
|
|
m_pDisposeEventListeners->disposeAndClear( aEvt );
|
|
}
|
|
|
|
if (isCleared)
|
|
{
|
|
aGuard.reset();
|
|
isCleared = false;
|
|
}
|
|
if( m_pPropertyChangeListeners )
|
|
{
|
|
EventObject aEvt;
|
|
aEvt.Source = static_cast< XPropertySet * >( this );
|
|
|
|
aGuard.clear();
|
|
isCleared = true;
|
|
m_pPropertyChangeListeners->disposeAndClear( aEvt );
|
|
}
|
|
|
|
if (isCleared)
|
|
{
|
|
aGuard.reset();
|
|
isCleared = false;
|
|
}
|
|
if( m_pVetoableChangeListeners )
|
|
{
|
|
EventObject aEvt;
|
|
aEvt.Source = static_cast< XPropertySet * >( this );
|
|
|
|
aGuard.clear();
|
|
isCleared = true;
|
|
m_pVetoableChangeListeners->disposeAndClear( aEvt );
|
|
}
|
|
|
|
if (isCleared)
|
|
{
|
|
aGuard.reset();
|
|
}
|
|
m_bDisposed = true;
|
|
m_bInDispose = false;
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::addEventListener( const Reference< XEventListener >& Listener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
|
|
if ( !m_pDisposeEventListeners )
|
|
m_pDisposeEventListeners =
|
|
new OInterfaceContainerHelper2( m_aContainerMutex );
|
|
|
|
m_pDisposeEventListeners->addInterface( Listener );
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::removeEventListener( const Reference< XEventListener >& Listener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
|
|
if ( m_pDisposeEventListeners )
|
|
m_pDisposeEventListeners->removeInterface( Listener );
|
|
}
|
|
|
|
|
|
//XCloseable methods.
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::close()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
dispose();
|
|
}
|
|
|
|
|
|
//XResultSetMetaDataSupplier methods.
|
|
|
|
//virtual
|
|
Reference< XResultSetMetaData > SAL_CALL ContentResultSetWrapper::getMetaData()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
osl::ResettableMutexGuard aGuard(m_aMutex);
|
|
if( !m_xMetaDataFromOrigin.is() && m_xResultSetOrigin.is() )
|
|
{
|
|
Reference< XResultSetMetaDataSupplier > xMetaDataSupplier(
|
|
m_xResultSetOrigin, UNO_QUERY );
|
|
|
|
if( xMetaDataSupplier.is() )
|
|
{
|
|
aGuard.clear();
|
|
|
|
Reference< XResultSetMetaData > xMetaData
|
|
= xMetaDataSupplier->getMetaData();
|
|
|
|
aGuard.reset();
|
|
m_xMetaDataFromOrigin = xMetaData;
|
|
}
|
|
}
|
|
return m_xMetaDataFromOrigin;
|
|
}
|
|
|
|
|
|
// XPropertySet methods.
|
|
|
|
// virtual
|
|
Reference< XPropertySetInfo > SAL_CALL ContentResultSetWrapper::getPropertySetInfo()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( m_xPropertySetInfo.is() )
|
|
return m_xPropertySetInfo;
|
|
}
|
|
impl_initPropertySetInfo();
|
|
return m_xPropertySetInfo;
|
|
}
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::setPropertyValue( const OUString& rPropertyName, const Any& rValue )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xPropertySetOrigin();
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw UnknownPropertyException();
|
|
}
|
|
m_xPropertySetOrigin->setPropertyValue( rPropertyName, rValue );
|
|
}
|
|
|
|
|
|
// virtual
|
|
Any SAL_CALL ContentResultSetWrapper::getPropertyValue( const OUString& rPropertyName )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xPropertySetOrigin();
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw UnknownPropertyException();
|
|
}
|
|
return m_xPropertySetOrigin->getPropertyValue( rPropertyName );
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !getPropertySetInfo().is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw UnknownPropertyException();
|
|
}
|
|
|
|
if( !aPropertyName.isEmpty() )
|
|
{
|
|
m_xPropertySetInfo->getPropertyByName( aPropertyName );
|
|
//throws UnknownPropertyException, if so
|
|
}
|
|
|
|
impl_getPropertyChangeListenerContainer();
|
|
bool bNeedRegister = !m_pPropertyChangeListeners->
|
|
getContainedTypes().getLength();
|
|
m_pPropertyChangeListeners->addInterface( aPropertyName, xListener );
|
|
if( bNeedRegister )
|
|
{
|
|
impl_init_xPropertySetOrigin();
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
return;
|
|
}
|
|
}
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->addPropertyChangeListener(
|
|
OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
m_pPropertyChangeListeners->removeInterface( aPropertyName, xListener );
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::addVetoableChangeListener( const OUString& rPropertyName, const Reference< XVetoableChangeListener >& xListener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !getPropertySetInfo().is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw UnknownPropertyException();
|
|
}
|
|
if( !rPropertyName.isEmpty() )
|
|
{
|
|
m_xPropertySetInfo->getPropertyByName( rPropertyName );
|
|
//throws UnknownPropertyException, if so
|
|
}
|
|
|
|
impl_getVetoableChangeListenerContainer();
|
|
bool bNeedRegister = !m_pVetoableChangeListeners->
|
|
getContainedTypes().getLength();
|
|
m_pVetoableChangeListeners->addInterface( rPropertyName, xListener );
|
|
if( bNeedRegister )
|
|
{
|
|
impl_init_xPropertySetOrigin();
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
return;
|
|
}
|
|
}
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->addVetoableChangeListener(
|
|
OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::removePropertyChangeListener( const OUString& rPropertyName, const Reference< XPropertyChangeListener >& xListener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
{
|
|
//noop, if no listener registered
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_pPropertyChangeListeners )
|
|
return;
|
|
}
|
|
OInterfaceContainerHelper* pContainer =
|
|
m_pPropertyChangeListeners->getContainer( rPropertyName );
|
|
|
|
if( !pContainer )
|
|
{
|
|
if( !rPropertyName.isEmpty() )
|
|
{
|
|
if( !getPropertySetInfo().is() )
|
|
throw UnknownPropertyException();
|
|
|
|
m_xPropertySetInfo->getPropertyByName( rPropertyName );
|
|
//throws UnknownPropertyException, if so
|
|
}
|
|
return; //the listener was not registered
|
|
}
|
|
|
|
m_pPropertyChangeListeners->removeInterface( rPropertyName, xListener );
|
|
|
|
if( !m_pPropertyChangeListeners->getContainedTypes().getLength() )
|
|
{
|
|
impl_init_xPropertySetOrigin();
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
return;
|
|
}
|
|
}
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->removePropertyChangeListener(
|
|
OUString(), static_cast< XPropertyChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
OSL_FAIL( "could not remove PropertyChangeListener" );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// virtual
|
|
void SAL_CALL ContentResultSetWrapper::removeVetoableChangeListener( const OUString& rPropertyName, const Reference< XVetoableChangeListener >& xListener )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
{
|
|
//noop, if no listener registered
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_pVetoableChangeListeners )
|
|
return;
|
|
}
|
|
OInterfaceContainerHelper* pContainer =
|
|
m_pVetoableChangeListeners->getContainer( rPropertyName );
|
|
|
|
if( !pContainer )
|
|
{
|
|
if( !rPropertyName.isEmpty() )
|
|
{
|
|
if( !getPropertySetInfo().is() )
|
|
throw UnknownPropertyException();
|
|
|
|
m_xPropertySetInfo->getPropertyByName( rPropertyName );
|
|
//throws UnknownPropertyException, if so
|
|
}
|
|
return; //the listener was not registered
|
|
}
|
|
|
|
m_pVetoableChangeListeners->removeInterface( rPropertyName, xListener );
|
|
|
|
if( !m_pVetoableChangeListeners->getContainedTypes().getLength() )
|
|
{
|
|
impl_init_xPropertySetOrigin();
|
|
{
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
if( !m_xPropertySetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
return;
|
|
}
|
|
}
|
|
try
|
|
{
|
|
m_xPropertySetOrigin->removeVetoableChangeListener(
|
|
OUString(), static_cast< XVetoableChangeListener * >( m_xMyListenerImpl.get() ) );
|
|
}
|
|
catch( Exception& )
|
|
{
|
|
OSL_FAIL( "could not remove VetoableChangeListener" );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// own methods.
|
|
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::impl_disposing( const EventObject& )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
osl::Guard< osl::Mutex > aGuard( m_aMutex );
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
return;
|
|
|
|
//release all references to the broadcaster:
|
|
m_xResultSetOrigin.clear();
|
|
if(m_xRowOrigin.is())
|
|
m_xRowOrigin.clear();
|
|
if(m_xContentAccessOrigin.is())
|
|
m_xContentAccessOrigin.clear();
|
|
if(m_xPropertySetOrigin.is())
|
|
m_xPropertySetOrigin.clear();
|
|
m_xMetaDataFromOrigin.clear();
|
|
if(m_xPropertySetInfo.is())
|
|
m_xPropertySetInfo.clear();
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::impl_propertyChange( const PropertyChangeEvent& rEvt )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
PropertyChangeEvent aEvt( rEvt );
|
|
aEvt.Source = static_cast< XPropertySet * >( this );
|
|
aEvt.Further = false;
|
|
impl_notifyPropertyChangeListeners( aEvt );
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::impl_vetoableChange( const PropertyChangeEvent& rEvt )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
PropertyChangeEvent aEvt( rEvt );
|
|
aEvt.Source = static_cast< XPropertySet * >( this );
|
|
aEvt.Further = false;
|
|
|
|
impl_notifyVetoableChangeListeners( aEvt );
|
|
}
|
|
|
|
|
|
// XContentAccess methods. ( -- position dependent )
|
|
|
|
|
|
// virtual
|
|
OUString SAL_CALL ContentResultSetWrapper::queryContentIdentifierString()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xContentAccessOrigin();
|
|
if( !m_xContentAccessOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xContentAccessOrigin->queryContentIdentifierString();
|
|
}
|
|
|
|
|
|
// virtual
|
|
Reference< XContentIdentifier > SAL_CALL ContentResultSetWrapper::queryContentIdentifier()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xContentAccessOrigin();
|
|
if( !m_xContentAccessOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xContentAccessOrigin->queryContentIdentifier();
|
|
}
|
|
|
|
|
|
// virtual
|
|
Reference< XContent > SAL_CALL ContentResultSetWrapper::queryContent()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xContentAccessOrigin();
|
|
if( !m_xContentAccessOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xContentAccessOrigin->queryContent();
|
|
}
|
|
|
|
|
|
// XResultSet methods.
|
|
|
|
//virtual
|
|
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::next()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->next();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::previous()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->previous();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::absolute( sal_Int32 row )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->absolute( row );
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::relative( sal_Int32 rows )
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->relative( rows );
|
|
}
|
|
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::first()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->first();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::last()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->last();
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::beforeFirst()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
m_xResultSetOrigin->beforeFirst();
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::afterLast()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
m_xResultSetOrigin->afterLast();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::isAfterLast()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->isAfterLast();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::isBeforeFirst()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->isBeforeFirst();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::isFirst()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->isFirst();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::isLast()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->isLast();
|
|
}
|
|
|
|
|
|
//virtual
|
|
sal_Int32 SAL_CALL ContentResultSetWrapper::getRow()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->getRow();
|
|
}
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapper::refreshRow()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
m_xResultSetOrigin->refreshRow();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::rowUpdated()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->rowUpdated();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::rowInserted()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->rowInserted();
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::rowDeleted()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
|
|
if( !m_xResultSetOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xResultSetOrigin->rowDeleted();
|
|
}
|
|
|
|
//virtual
|
|
Reference< XInterface > SAL_CALL ContentResultSetWrapper::getStatement()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
//@todo ?return anything
|
|
return Reference< XInterface >();
|
|
}
|
|
|
|
|
|
// XRow methods.
|
|
|
|
|
|
#define XROW_GETXXX( getXXX ) \
|
|
impl_EnsureNotDisposed(); \
|
|
impl_init_xRowOrigin(); \
|
|
if( !m_xRowOrigin.is() ) \
|
|
{ \
|
|
OSL_FAIL( "broadcaster was disposed already" );\
|
|
throw RuntimeException(); \
|
|
} \
|
|
return m_xRowOrigin->getXXX( columnIndex );
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::wasNull()
|
|
{
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xRowOrigin();
|
|
if( !m_xRowOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xRowOrigin->wasNull();
|
|
}
|
|
|
|
//virtual
|
|
OUString SAL_CALL ContentResultSetWrapper::getString( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getString );
|
|
}
|
|
|
|
//virtual
|
|
sal_Bool SAL_CALL ContentResultSetWrapper::getBoolean( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getBoolean );
|
|
}
|
|
|
|
//virtual
|
|
sal_Int8 SAL_CALL ContentResultSetWrapper::getByte( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getByte );
|
|
}
|
|
|
|
//virtual
|
|
sal_Int16 SAL_CALL ContentResultSetWrapper::getShort( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getShort );
|
|
}
|
|
|
|
//virtual
|
|
sal_Int32 SAL_CALL ContentResultSetWrapper::getInt( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getInt );
|
|
}
|
|
|
|
//virtual
|
|
sal_Int64 SAL_CALL ContentResultSetWrapper::getLong( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getLong );
|
|
}
|
|
|
|
//virtual
|
|
float SAL_CALL ContentResultSetWrapper::getFloat( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getFloat );
|
|
}
|
|
|
|
//virtual
|
|
double SAL_CALL ContentResultSetWrapper::getDouble( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getDouble );
|
|
}
|
|
|
|
//virtual
|
|
Sequence< sal_Int8 > SAL_CALL ContentResultSetWrapper::getBytes( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getBytes );
|
|
}
|
|
|
|
//virtual
|
|
Date SAL_CALL ContentResultSetWrapper::getDate( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getDate );
|
|
}
|
|
|
|
//virtual
|
|
Time SAL_CALL ContentResultSetWrapper::getTime( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getTime );
|
|
}
|
|
|
|
//virtual
|
|
DateTime SAL_CALL ContentResultSetWrapper::getTimestamp( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getTimestamp );
|
|
}
|
|
|
|
//virtual
|
|
Reference< css::io::XInputStream > SAL_CALL ContentResultSetWrapper::getBinaryStream( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getBinaryStream );
|
|
}
|
|
|
|
//virtual
|
|
Reference< css::io::XInputStream > SAL_CALL ContentResultSetWrapper::getCharacterStream( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getCharacterStream );
|
|
}
|
|
|
|
//virtual
|
|
Any SAL_CALL ContentResultSetWrapper::getObject( sal_Int32 columnIndex, const Reference< css::container::XNameAccess >& typeMap )
|
|
{
|
|
//if you change this macro please pay attention to
|
|
//define XROW_GETXXX, where this is similar implemented
|
|
|
|
impl_EnsureNotDisposed();
|
|
impl_init_xRowOrigin();
|
|
if( !m_xRowOrigin.is() )
|
|
{
|
|
OSL_FAIL( "broadcaster was disposed already" );
|
|
throw RuntimeException();
|
|
}
|
|
return m_xRowOrigin->getObject( columnIndex, typeMap );
|
|
}
|
|
|
|
//virtual
|
|
Reference< XRef > SAL_CALL ContentResultSetWrapper::getRef( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getRef );
|
|
}
|
|
|
|
//virtual
|
|
Reference< XBlob > SAL_CALL ContentResultSetWrapper::getBlob( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getBlob );
|
|
}
|
|
|
|
//virtual
|
|
Reference< XClob > SAL_CALL ContentResultSetWrapper::getClob( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getClob );
|
|
}
|
|
|
|
//virtual
|
|
Reference< XArray > SAL_CALL ContentResultSetWrapper::getArray( sal_Int32 columnIndex )
|
|
{
|
|
XROW_GETXXX( getArray );
|
|
}
|
|
|
|
|
|
// class ContentResultSetWrapperListener
|
|
|
|
|
|
ContentResultSetWrapperListener::ContentResultSetWrapperListener(
|
|
ContentResultSetWrapper* pOwner )
|
|
: m_pOwner( pOwner )
|
|
{
|
|
}
|
|
|
|
ContentResultSetWrapperListener::~ContentResultSetWrapperListener()
|
|
{
|
|
}
|
|
|
|
|
|
// XInterface methods.
|
|
void SAL_CALL ContentResultSetWrapperListener::acquire()
|
|
throw()
|
|
{
|
|
OWeakObject::acquire();
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapperListener::release()
|
|
throw()
|
|
{
|
|
OWeakObject::release();
|
|
}
|
|
|
|
css::uno::Any SAL_CALL ContentResultSetWrapperListener::queryInterface( const css::uno::Type & rType )
|
|
{
|
|
//list all interfaces inclusive baseclasses of interfaces
|
|
css::uno::Any aRet = cppu::queryInterface( rType,
|
|
static_cast< XEventListener * >(
|
|
static_cast< XPropertyChangeListener * >(this)),
|
|
static_cast< XPropertyChangeListener* >(this),
|
|
static_cast< XVetoableChangeListener* >(this)
|
|
);
|
|
return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
|
|
}
|
|
|
|
//XEventListener methods.
|
|
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapperListener::disposing( const EventObject& rEventObject )
|
|
{
|
|
if( m_pOwner )
|
|
m_pOwner->impl_disposing( rEventObject );
|
|
}
|
|
|
|
|
|
//XPropertyChangeListener methods.
|
|
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapperListener::propertyChange( const PropertyChangeEvent& rEvt )
|
|
{
|
|
if( m_pOwner )
|
|
m_pOwner->impl_propertyChange( rEvt );
|
|
}
|
|
|
|
|
|
//XVetoableChangeListener methods.
|
|
|
|
//virtual
|
|
void SAL_CALL ContentResultSetWrapperListener::vetoableChange( const PropertyChangeEvent& rEvt )
|
|
{
|
|
if( m_pOwner )
|
|
m_pOwner->impl_vetoableChange( rEvt );
|
|
}
|
|
|
|
void SAL_CALL ContentResultSetWrapperListener::impl_OwnerDies()
|
|
{
|
|
m_pOwner = nullptr;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|