summaryrefslogtreecommitdiff
path: root/ucb/source/ucp/hierarchy/hierarchydatasource.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucb/source/ucp/hierarchy/hierarchydatasource.cxx')
-rw-r--r--ucb/source/ucp/hierarchy/hierarchydatasource.cxx1116
1 files changed, 1116 insertions, 0 deletions
diff --git a/ucb/source/ucp/hierarchy/hierarchydatasource.cxx b/ucb/source/ucp/hierarchy/hierarchydatasource.cxx
new file mode 100644
index 000000000000..467259caf0eb
--- /dev/null
+++ b/ucb/source/ucp/hierarchy/hierarchydatasource.cxx
@@ -0,0 +1,1116 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_ucb.hxx"
+
+/**************************************************************************
+ TODO
+ **************************************************************************
+
+ Note: Configuration Management classes do not support XAggregation.
+ So I have to wrap the interesting interfaces manually.
+
+ *************************************************************************/
+#include "hierarchydatasource.hxx"
+#include <osl/diagnose.h>
+
+#include "osl/doublecheckedlocking.h"
+#include <cppuhelper/interfacecontainer.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/util/XChangesBatch.hpp>
+#include <com/sun/star/util/XChangesNotifier.hpp>
+
+using namespace com::sun::star;
+using namespace hierarchy_ucp;
+
+//=========================================================================
+
+// describe path of cfg entry
+#define CFGPROPERTY_NODEPATH "nodepath"
+// true->async. update; false->sync. update
+#define CFGPROPERTY_LAZYWRITE "lazywrite"
+
+#define READ_SERVICE_NAME "com.sun.star.ucb.HierarchyDataReadAccess"
+#define READWRITE_SERVICE_NAME "com.sun.star.ucb.HierarchyDataReadWriteAccess"
+
+#define CONFIG_PROVIDER_SERVICE_NAME \
+ "com.sun.star.configuration.ConfigurationProvider"
+#define CONFIG_READ_SERVICE_NAME \
+ "com.sun.star.configuration.ConfigurationAccess"
+#define CONFIG_READWRITE_SERVICE_NAME \
+ "com.sun.star.configuration.ConfigurationUpdateAccess"
+#define CONFIG_DATA_ROOT_KEY \
+ "/org.openoffice.ucb.Hierarchy/Root"
+
+//=========================================================================
+
+namespace hcp_impl
+{
+
+//=========================================================================
+//
+// HierarchyDataReadAccess Implementation.
+//
+//=========================================================================
+
+class HierarchyDataAccess : public cppu::OWeakObject,
+ public lang::XServiceInfo,
+ public lang::XTypeProvider,
+ public lang::XComponent,
+ public lang::XSingleServiceFactory,
+ public container::XHierarchicalNameAccess,
+ public container::XNameContainer,
+ public util::XChangesNotifier,
+ public util::XChangesBatch
+{
+ osl::Mutex m_aMutex;
+ uno::Reference< uno::XInterface > m_xConfigAccess;
+ uno::Reference< lang::XComponent > m_xCfgC;
+ uno::Reference< lang::XSingleServiceFactory > m_xCfgSSF;
+ uno::Reference< container::XHierarchicalNameAccess > m_xCfgHNA;
+ uno::Reference< container::XNameContainer > m_xCfgNC;
+ uno::Reference< container::XNameReplace > m_xCfgNR;
+ uno::Reference< container::XNameAccess > m_xCfgNA;
+ uno::Reference< container::XElementAccess > m_xCfgEA;
+ uno::Reference< util::XChangesNotifier > m_xCfgCN;
+ uno::Reference< util::XChangesBatch > m_xCfgCB;
+ bool m_bReadOnly;
+
+public:
+ HierarchyDataAccess( const uno::Reference<
+ uno::XInterface > & xConfigAccess,
+ bool bReadOnly );
+ virtual ~HierarchyDataAccess();
+
+ // XInterface
+ XINTERFACE_DECL()
+
+ // XServiceInfo
+ XSERVICEINFO_DECL()
+
+ // XTypeProvider
+ XTYPEPROVIDER_DECL()
+
+ // XComponent
+ virtual void SAL_CALL
+ dispose()
+ throw ( uno::RuntimeException );
+ virtual void SAL_CALL
+ addEventListener( const uno::Reference< lang::XEventListener > & xListener )
+ throw ( uno::RuntimeException );
+ virtual void SAL_CALL
+ removeEventListener( const uno::Reference<
+ lang::XEventListener > & aListener )
+ throw ( uno::RuntimeException );
+
+ // XSingleServiceFactory
+ virtual uno::Reference< uno::XInterface > SAL_CALL
+ createInstance()
+ throw ( uno::Exception, uno::RuntimeException );
+ virtual uno::Reference< uno::XInterface > SAL_CALL
+ createInstanceWithArguments( const uno::Sequence< uno::Any > & aArguments )
+ throw ( uno::Exception, uno::RuntimeException );
+
+ // XHierarchicalNameAccess
+ virtual uno::Any SAL_CALL
+ getByHierarchicalName( const rtl::OUString & aName )
+ throw ( container::NoSuchElementException, uno::RuntimeException );
+ virtual sal_Bool SAL_CALL
+ hasByHierarchicalName( const rtl::OUString & aName )
+ throw ( uno::RuntimeException );
+
+ // XNameContainer
+ virtual void SAL_CALL
+ insertByName( const rtl::OUString & aName, const uno::Any & aElement )
+ throw ( lang::IllegalArgumentException,
+ container::ElementExistException,
+ lang::WrappedTargetException,
+ uno::RuntimeException );
+ virtual void SAL_CALL
+ removeByName( const rtl::OUString & Name )
+ throw ( container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException );
+
+ // XNameReplace ( base of XNameContainer )
+ virtual void SAL_CALL
+ replaceByName( const rtl::OUString & aName, const uno::Any & aElement )
+ throw ( lang::IllegalArgumentException,
+ container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException );
+
+ // XNameAccess ( base of XNameReplace )
+ virtual uno::Any SAL_CALL
+ getByName( const rtl::OUString & aName )
+ throw ( container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException );
+ virtual uno::Sequence< rtl::OUString > SAL_CALL
+ getElementNames()
+ throw ( uno::RuntimeException );
+ virtual sal_Bool SAL_CALL
+ hasByName( const rtl::OUString & aName )
+ throw ( uno::RuntimeException );
+
+ // XElementAccess ( base of XNameAccess )
+ virtual uno::Type SAL_CALL
+ getElementType()
+ throw ( uno::RuntimeException );
+ virtual sal_Bool SAL_CALL
+ hasElements()
+ throw ( uno::RuntimeException );
+
+ // XChangesNotifier
+ virtual void SAL_CALL
+ addChangesListener( const uno::Reference<
+ util::XChangesListener > & aListener )
+ throw ( uno::RuntimeException );
+ virtual void SAL_CALL
+ removeChangesListener( const uno::Reference<
+ util::XChangesListener > & aListener )
+ throw ( uno::RuntimeException );
+
+ // XChangesBatch
+ virtual void SAL_CALL
+ commitChanges()
+ throw ( lang::WrappedTargetException, uno::RuntimeException );
+ virtual sal_Bool SAL_CALL
+ hasPendingChanges()
+ throw ( uno::RuntimeException );
+ virtual uno::Sequence< util::ElementChange > SAL_CALL
+ getPendingChanges()
+ throw ( uno::RuntimeException );
+};
+
+} // namespace hcp_impl
+
+using namespace hcp_impl;
+
+//=========================================================================
+//=========================================================================
+//
+// HierarchyDataSource Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+HierarchyDataSource::HierarchyDataSource(
+ const uno::Reference< lang::XMultiServiceFactory > & rxServiceMgr )
+: m_xSMgr( rxServiceMgr ),
+ m_pDisposeEventListeners( 0 )
+{
+}
+
+//=========================================================================
+// virtual
+HierarchyDataSource::~HierarchyDataSource()
+{
+ delete m_pDisposeEventListeners;
+}
+
+//=========================================================================
+//
+// XInterface methods.
+//
+//=========================================================================
+
+XINTERFACE_IMPL_4( HierarchyDataSource,
+ lang::XTypeProvider,
+ lang::XServiceInfo,
+ lang::XComponent,
+ lang::XMultiServiceFactory );
+
+//=========================================================================
+//
+// XTypeProvider methods.
+//
+//=========================================================================
+
+XTYPEPROVIDER_IMPL_4( HierarchyDataSource,
+ lang::XTypeProvider,
+ lang::XServiceInfo,
+ lang::XComponent,
+ lang::XMultiServiceFactory );
+
+//=========================================================================
+//
+// XServiceInfo methods.
+//
+//=========================================================================
+
+XSERVICEINFO_IMPL_0( HierarchyDataSource,
+ rtl::OUString::createFromAscii(
+ "com.sun.star.comp.ucb.HierarchyDataSource" ) )
+{
+ uno::Sequence< rtl::OUString > aSNS( 2 );
+ aSNS[ 0 ] = rtl::OUString::createFromAscii(
+ "com.sun.star.ucb.DefaultHierarchyDataSource" );
+ aSNS[ 1 ] = rtl::OUString::createFromAscii(
+ "com.sun.star.ucb.HierarchyDataSource" );
+ return aSNS;
+}
+
+ONE_INSTANCE_SERVICE_FACTORY_IMPL( HierarchyDataSource );
+
+//=========================================================================
+//
+// XComponent methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL HierarchyDataSource::dispose()
+ throw( uno::RuntimeException )
+{
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
+ {
+ lang::EventObject aEvt;
+ aEvt.Source = static_cast< lang::XComponent * >( this );
+ m_pDisposeEventListeners->disposeAndClear( aEvt );
+ }
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL HierarchyDataSource::addEventListener(
+ const uno::Reference< lang::XEventListener > & Listener )
+ throw( uno::RuntimeException )
+{
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ if ( !m_pDisposeEventListeners )
+ m_pDisposeEventListeners
+ = new cppu::OInterfaceContainerHelper( m_aMutex );
+
+ m_pDisposeEventListeners->addInterface( Listener );
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL HierarchyDataSource::removeEventListener(
+ const uno::Reference< lang::XEventListener > & Listener )
+ throw( uno::RuntimeException )
+{
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ if ( m_pDisposeEventListeners )
+ m_pDisposeEventListeners->removeInterface( Listener );
+}
+
+//=========================================================================
+//
+// XMultiServiceFactory methods.
+//
+//=========================================================================
+
+// virtual
+uno::Reference< uno::XInterface > SAL_CALL
+HierarchyDataSource::createInstance( const rtl::OUString & aServiceSpecifier )
+ throw ( uno::Exception, uno::RuntimeException )
+{
+ // Create view to root node.
+
+ beans::PropertyValue aProp;
+ aProp.Name = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( CFGPROPERTY_NODEPATH ) );
+ aProp.Value <<=
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( CONFIG_DATA_ROOT_KEY ) );
+
+ uno::Sequence< uno::Any > aArguments( 1 );
+ aArguments[ 0 ] <<= aProp;
+
+ return createInstanceWithArguments( aServiceSpecifier, aArguments, false );
+}
+
+//=========================================================================
+// virtual
+uno::Reference< uno::XInterface > SAL_CALL
+HierarchyDataSource::createInstanceWithArguments(
+ const rtl::OUString & ServiceSpecifier,
+ const uno::Sequence< uno::Any > & Arguments )
+ throw ( uno::Exception, uno::RuntimeException )
+{
+ return createInstanceWithArguments( ServiceSpecifier, Arguments, true );
+}
+
+//=========================================================================
+// virtual
+uno::Sequence< rtl::OUString > SAL_CALL
+HierarchyDataSource::getAvailableServiceNames()
+ throw ( uno::RuntimeException )
+{
+ uno::Sequence< rtl::OUString > aNames( 2 );
+ aNames[ 0 ] = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( READ_SERVICE_NAME ) );
+ aNames[ 1 ] = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( READWRITE_SERVICE_NAME ) );
+ return aNames;
+}
+
+//=========================================================================
+//
+// Non-interface methods
+//
+//=========================================================================
+
+uno::Reference< uno::XInterface > SAL_CALL
+HierarchyDataSource::createInstanceWithArguments(
+ const rtl::OUString & ServiceSpecifier,
+ const uno::Sequence< uno::Any > & Arguments,
+ bool bCheckArgs )
+ throw ( uno::Exception, uno::RuntimeException )
+{
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+
+ // Check service specifier.
+ bool bReadOnly = !!ServiceSpecifier.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( READ_SERVICE_NAME ) );
+ bool bReadWrite = !bReadOnly &&
+ ServiceSpecifier.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( READWRITE_SERVICE_NAME ) );
+
+ if ( !bReadOnly && !bReadWrite )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "Unsupported service specifier!" );
+ return uno::Reference< uno::XInterface >();
+ }
+
+ uno::Sequence< uno::Any > aNewArgs( Arguments );
+
+ bool bHasLazyWriteProp = bReadOnly; // property must be added only if
+ // a writable view is requested.
+ if ( bCheckArgs )
+ {
+ // Check arguments.
+ bool bHasNodePath = false;
+ sal_Int32 nCount = Arguments.getLength();
+ for ( sal_Int32 n = 0; n < nCount; ++n )
+ {
+ beans::PropertyValue aProp;
+ if ( Arguments[ n ] >>= aProp )
+ {
+ if ( aProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM( CFGPROPERTY_NODEPATH ) ) )
+ {
+ rtl::OUString aPath;
+ if ( aProp.Value >>= aPath )
+ {
+ bHasNodePath = true;
+
+ // Create path to data inside the configuration.
+ rtl::OUString aConfigPath;
+ if ( !createConfigPath( aPath, aConfigPath ) )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::"
+ "createInstanceWithArguments - "
+ "Invalid node path!" );
+ return uno::Reference< uno::XInterface >();
+ }
+
+ aProp.Value <<= aConfigPath;
+
+ // Set new path in arguments.
+ aNewArgs[ n ] <<= aProp;
+
+ if ( bHasLazyWriteProp )
+ break;
+ }
+ else
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "Invalid type for property 'nodepath'!" );
+ return uno::Reference< uno::XInterface >();
+ }
+ }
+ else if ( aProp.Name.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM(
+ CFGPROPERTY_LAZYWRITE ) ) )
+ {
+ if ( aProp.Value.getValueType() == getCppuBooleanType() )
+ {
+ bHasLazyWriteProp = true;
+
+ if ( bHasNodePath )
+ break;
+ }
+ else
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "Invalid type for property 'lazywrite'!" );
+ return uno::Reference< uno::XInterface >();
+ }
+ }
+ }
+ }
+
+ if ( !bHasNodePath )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "No 'nodepath' property!" );
+ return uno::Reference< uno::XInterface >();
+ }
+ }
+
+ // Create Configuration Provider.
+ uno::Reference< lang::XMultiServiceFactory > xProv = getConfigProvider();
+ if ( !xProv.is() )
+ return uno::Reference< uno::XInterface >();
+
+ uno::Reference< uno::XInterface > xConfigAccess;
+ try
+ {
+ if ( bReadOnly )
+ {
+ // Create configuration read-only access object.
+ xConfigAccess = xProv->createInstanceWithArguments(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+ CONFIG_READ_SERVICE_NAME ) ),
+ aNewArgs );
+ }
+ else
+ {
+ // Append 'lazywrite' property value, if not already present.
+ if ( !bHasLazyWriteProp )
+ {
+ sal_Int32 nLen = aNewArgs.getLength();
+ aNewArgs.realloc( nLen + 1 );
+
+ beans::PropertyValue aProp;
+ aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+ CFGPROPERTY_LAZYWRITE ) );
+ aProp.Value <<= sal_True;
+ aNewArgs[ nLen ] <<= aProp;
+ }
+
+ // Create configuration read-write access object.
+ xConfigAccess = xProv->createInstanceWithArguments(
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+ CONFIG_READWRITE_SERVICE_NAME ) ),
+ aNewArgs );
+ }
+ }
+ catch ( uno::Exception const & )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "Cannot instanciate configuration access!" );
+ throw;
+ }
+
+ if ( !xConfigAccess.is() )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createInstanceWithArguments - "
+ "Cannot instanciate configuration access!" );
+ return xConfigAccess;
+ }
+
+ return uno::Reference< uno::XInterface >(
+ static_cast< cppu::OWeakObject * >(
+ new HierarchyDataAccess( xConfigAccess, bReadOnly ) ) );
+}
+
+//=========================================================================
+uno::Reference< lang::XMultiServiceFactory >
+HierarchyDataSource::getConfigProvider()
+{
+ if ( !m_xConfigProvider.is() )
+ {
+ osl::Guard< osl::Mutex > aGuard( m_aMutex );
+ if ( !m_xConfigProvider.is() )
+ {
+ try
+ {
+ m_xConfigProvider
+ = uno::Reference< lang::XMultiServiceFactory >(
+ m_xSMgr->createInstance(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ CONFIG_PROVIDER_SERVICE_NAME ) ) ),
+ uno::UNO_QUERY );
+
+ OSL_ENSURE( m_xConfigProvider.is(),
+ "HierarchyDataSource::getConfigProvider - "
+ "No configuration provider!" );
+ }
+ catch ( uno::Exception const & )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::getConfigProvider - "
+ "caught exception!" );
+ }
+ }
+ }
+
+ return m_xConfigProvider;
+}
+
+//=========================================================================
+bool HierarchyDataSource::createConfigPath(
+ const rtl::OUString & rInPath, rtl::OUString & rOutPath )
+{
+ if ( rInPath.getLength() )
+ {
+ if ( rInPath.indexOf( '/' ) == 0 )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createConfigPath - "
+ "Leading slash in node path!" );
+ return false;
+ }
+
+ if ( rInPath.lastIndexOf( '/' ) == rInPath.getLength() - 1 )
+ {
+ OSL_ENSURE( false,
+ "HierarchyDataSource::createConfigPath - "
+ "Trailing slash in node path!" );
+ return false;
+ }
+
+ rtl::OUString aOutPath(
+ RTL_CONSTASCII_USTRINGPARAM( CONFIG_DATA_ROOT_KEY "/" ) );
+ aOutPath += rInPath;
+ rOutPath = aOutPath;
+ }
+ else
+ {
+ rOutPath = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( CONFIG_DATA_ROOT_KEY ) );
+ }
+
+ return true;
+}
+
+//=========================================================================
+//=========================================================================
+//
+// HierarchyDataAccess Implementation.
+//
+//=========================================================================
+//=========================================================================
+
+#define ENSURE_ORIG_INTERFACE( interface_name, member_name ) \
+ m_xCfg##member_name; \
+ if ( !m_xCfg##member_name.is() ) \
+ { \
+ osl::Guard< osl::Mutex > aGuard( m_aMutex ); \
+ if ( !m_xCfg##member_name.is() ) \
+ m_xCfg##member_name \
+ = uno::Reference< interface_name >( \
+ m_xConfigAccess, uno::UNO_QUERY ); \
+ xOrig = m_xCfg##member_name; \
+ }
+
+//=========================================================================
+HierarchyDataAccess::HierarchyDataAccess( const uno::Reference<
+ uno::XInterface > & xConfigAccess,
+ bool bReadOnly )
+: m_xConfigAccess( xConfigAccess ),
+ m_bReadOnly( bReadOnly )
+{
+}
+
+//=========================================================================
+// virtual
+HierarchyDataAccess::~HierarchyDataAccess()
+{
+}
+
+//=========================================================================
+//
+// XInterface methods.
+//
+//=========================================================================
+
+XINTERFACE_COMMON_IMPL( HierarchyDataAccess );
+
+//=========================================================================
+// virtual
+uno::Any SAL_CALL HierarchyDataAccess::queryInterface( const uno::Type & aType )
+ throw ( uno::RuntimeException )
+{
+ // Interfaces supported in read-only and read-write mode.
+ uno::Any aRet = cppu::queryInterface( aType,
+ static_cast< lang::XTypeProvider * >( this ),
+ static_cast< lang::XServiceInfo * >( this ),
+ static_cast< lang::XComponent * >( this ),
+ static_cast< container::XHierarchicalNameAccess * >( this ),
+ static_cast< container::XNameAccess * >( this ),
+ static_cast< container::XElementAccess * >( this ),
+ static_cast< util::XChangesNotifier * >( this ) );
+
+ // Interfaces supported only in read-write mode.
+ if ( !aRet.hasValue() && !m_bReadOnly )
+ {
+ aRet = cppu::queryInterface( aType,
+ static_cast< lang::XSingleServiceFactory * >( this ),
+ static_cast< container::XNameContainer * >( this ),
+ static_cast< container::XNameReplace * >( this ),
+ static_cast< util::XChangesBatch * >( this ) );
+ }
+
+ return aRet.hasValue() ? aRet : OWeakObject::queryInterface( aType );
+}
+
+//=========================================================================
+//
+// XTypeProvider methods.
+//
+//=========================================================================
+
+XTYPEPROVIDER_COMMON_IMPL( HierarchyDataAccess );
+
+//=========================================================================
+// virtual
+uno::Sequence< uno::Type > SAL_CALL HierarchyDataAccess::getTypes()
+ throw( uno::RuntimeException )
+{
+ cppu::OTypeCollection * pCollection = 0;
+
+ if ( m_bReadOnly )
+ {
+ static cppu::OTypeCollection* pReadOnlyTypes = 0;
+
+ pCollection = pReadOnlyTypes;
+ if ( !pCollection )
+ {
+ osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
+
+ pCollection = pReadOnlyTypes;
+ if ( !pCollection )
+ {
+ static cppu::OTypeCollection aCollection(
+ CPPU_TYPE_REF( lang::XTypeProvider ),
+ CPPU_TYPE_REF( lang::XServiceInfo ),
+ CPPU_TYPE_REF( lang::XComponent ),
+ CPPU_TYPE_REF( container::XHierarchicalNameAccess ),
+ CPPU_TYPE_REF( container::XNameAccess ),
+ CPPU_TYPE_REF( util::XChangesNotifier ) );
+ pCollection = &aCollection;
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pReadOnlyTypes = pCollection;
+ }
+ }
+ else {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+ }
+ else
+ {
+ static cppu::OTypeCollection* pReadWriteTypes = 0;
+
+ pCollection = pReadWriteTypes;
+ if ( !pCollection )
+ {
+ osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
+
+ pCollection = pReadWriteTypes;
+ if ( !pCollection )
+ {
+ static cppu::OTypeCollection aCollection(
+ CPPU_TYPE_REF( lang::XTypeProvider ),
+ CPPU_TYPE_REF( lang::XServiceInfo ),
+ CPPU_TYPE_REF( lang::XComponent ),
+ CPPU_TYPE_REF( lang::XSingleServiceFactory ),
+ CPPU_TYPE_REF( container::XHierarchicalNameAccess ),
+ CPPU_TYPE_REF( container::XNameContainer ),
+ CPPU_TYPE_REF( util::XChangesBatch ),
+ CPPU_TYPE_REF( util::XChangesNotifier ) );
+ pCollection = &aCollection;
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pReadWriteTypes = pCollection;
+ }
+ }
+ else {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+ }
+
+ return (*pCollection).getTypes();
+}
+
+//=========================================================================
+//
+// XServiceInfo methods.
+//
+//=========================================================================
+
+XSERVICEINFO_NOFACTORY_IMPL_0(
+ HierarchyDataAccess,
+ rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.comp.ucb.HierarchyDataAccess" ) ) )
+{
+ uno::Sequence< rtl::OUString > aSNS( 2 );
+ aSNS[ 0 ] = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( READ_SERVICE_NAME ) );
+ aSNS[ 1 ] = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM( READWRITE_SERVICE_NAME ) );
+ return aSNS;
+}
+
+//=========================================================================
+//
+// XComponent methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL HierarchyDataAccess::dispose()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< lang::XComponent > xOrig
+ = ENSURE_ORIG_INTERFACE( lang::XComponent, C );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XComponent!" );
+ xOrig->dispose();
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL HierarchyDataAccess::addEventListener(
+ const uno::Reference< lang::XEventListener > & xListener )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< lang::XComponent > xOrig
+ = ENSURE_ORIG_INTERFACE( lang::XComponent, C );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XComponent!" );
+ xOrig->addEventListener( xListener );
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL HierarchyDataAccess::removeEventListener(
+ const uno::Reference< lang::XEventListener > & aListener )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< lang::XComponent > xOrig
+ = ENSURE_ORIG_INTERFACE( lang::XComponent, C );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XComponent!" );
+ xOrig->removeEventListener( aListener );
+}
+
+//=========================================================================
+//
+// XHierarchicalNameAccess methods.
+//
+//=========================================================================
+
+// virtual
+uno::Any SAL_CALL HierarchyDataAccess::getByHierarchicalName(
+ const rtl::OUString & aName )
+ throw ( container::NoSuchElementException, uno::RuntimeException )
+{
+ uno::Reference< container::XHierarchicalNameAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XHierarchicalNameAccess, HNA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : "
+ "Data source is not an XHierarchicalNameAccess!" );
+ return xOrig->getByHierarchicalName( aName );
+}
+
+//=========================================================================
+// virtual
+sal_Bool SAL_CALL HierarchyDataAccess::hasByHierarchicalName(
+ const rtl::OUString & aName )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< container::XHierarchicalNameAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XHierarchicalNameAccess, HNA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : "
+ "Data source is not an XHierarchicalNameAccess!" );
+ return xOrig->hasByHierarchicalName( aName );
+}
+
+//=========================================================================
+//
+// XNameAccess methods.
+//
+//=========================================================================
+
+// virtual
+uno::Any SAL_CALL HierarchyDataAccess::getByName( const rtl::OUString & aName )
+ throw ( container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ uno::Reference< container::XNameAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameAccess, NA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameAccess!" );
+ return xOrig->getByName( aName );
+}
+
+//=========================================================================
+// virtual
+uno::Sequence< rtl::OUString > SAL_CALL HierarchyDataAccess::getElementNames()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< container::XNameAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameAccess, NA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameAccess!" );
+ return xOrig->getElementNames();
+}
+
+//=========================================================================
+// virtual
+sal_Bool SAL_CALL HierarchyDataAccess::hasByName( const rtl::OUString & aName )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< container::XNameAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameAccess, NA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameAccess!" );
+ return xOrig->hasByName( aName );
+}
+
+//=========================================================================
+//
+// XElementAccess methods.
+//
+//=========================================================================
+
+// virtual
+uno::Type SAL_CALL HierarchyDataAccess::getElementType()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< container::XElementAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XElementAccess, EA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XElementAccess!" );
+ return xOrig->getElementType();
+}
+
+//=========================================================================
+// virtual
+sal_Bool SAL_CALL HierarchyDataAccess::hasElements()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< container::XElementAccess > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XElementAccess, EA );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XElementAccess!" );
+ return xOrig->hasElements();
+}
+
+//=========================================================================
+//
+// XChangesNotifier methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL HierarchyDataAccess::addChangesListener(
+ const uno::Reference< util::XChangesListener > & aListener )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< util::XChangesNotifier > xOrig
+ = ENSURE_ORIG_INTERFACE( util::XChangesNotifier, CN );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XChangesNotifier!" );
+ xOrig->addChangesListener( aListener );
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL HierarchyDataAccess::removeChangesListener(
+ const uno::Reference< util::XChangesListener > & aListener )
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< util::XChangesNotifier > xOrig
+ = ENSURE_ORIG_INTERFACE( util::XChangesNotifier, CN );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XChangesNotifier!" );
+ xOrig->removeChangesListener( aListener );
+}
+
+//=========================================================================
+//
+// XSingleServiceFactory methods.
+//
+//=========================================================================
+
+// virtual
+uno::Reference< uno::XInterface > SAL_CALL HierarchyDataAccess::createInstance()
+ throw ( uno::Exception, uno::RuntimeException )
+{
+ uno::Reference< lang::XSingleServiceFactory > xOrig
+ = ENSURE_ORIG_INTERFACE( lang::XSingleServiceFactory, SSF );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XSingleServiceFactory!" );
+ return xOrig->createInstance();
+}
+
+//=========================================================================
+// virtual
+uno::Reference< uno::XInterface > SAL_CALL
+HierarchyDataAccess::createInstanceWithArguments(
+ const uno::Sequence< uno::Any > & aArguments )
+ throw ( uno::Exception, uno::RuntimeException )
+{
+ uno::Reference< lang::XSingleServiceFactory > xOrig
+ = ENSURE_ORIG_INTERFACE( lang::XSingleServiceFactory, SSF );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XSingleServiceFactory!" );
+ return xOrig->createInstanceWithArguments( aArguments );
+}
+
+//=========================================================================
+//
+// XNameContainer methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL
+HierarchyDataAccess::insertByName( const rtl::OUString & aName,
+ const uno::Any & aElement )
+ throw ( lang::IllegalArgumentException,
+ container::ElementExistException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ uno::Reference< container::XNameContainer > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameContainer, NC );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameContainer!" );
+ xOrig->insertByName( aName, aElement );
+}
+
+//=========================================================================
+// virtual
+void SAL_CALL
+HierarchyDataAccess::removeByName( const rtl::OUString & Name )
+ throw ( container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ uno::Reference< container::XNameContainer > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameContainer, NC );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameContainer!" );
+ xOrig->removeByName( Name );
+}
+
+//=========================================================================
+//
+// XNameReplace methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL HierarchyDataAccess::replaceByName( const rtl::OUString & aName,
+ const uno::Any & aElement )
+ throw ( lang::IllegalArgumentException,
+ container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ uno::Reference< container::XNameReplace > xOrig
+ = ENSURE_ORIG_INTERFACE( container::XNameReplace, NR );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XNameReplace!" );
+ xOrig->replaceByName( aName, aElement );
+}
+
+//=========================================================================
+//
+// XChangesBatch methods.
+//
+//=========================================================================
+
+// virtual
+void SAL_CALL HierarchyDataAccess::commitChanges()
+ throw ( lang::WrappedTargetException, uno::RuntimeException )
+{
+ uno::Reference< util::XChangesBatch > xOrig
+ = ENSURE_ORIG_INTERFACE( util::XChangesBatch, CB );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XChangesBatch!" );
+ xOrig->commitChanges();
+}
+
+//=========================================================================
+// virtual
+sal_Bool SAL_CALL HierarchyDataAccess::hasPendingChanges()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< util::XChangesBatch > xOrig
+ = ENSURE_ORIG_INTERFACE( util::XChangesBatch, CB );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XChangesBatch!" );
+ return xOrig->hasPendingChanges();
+}
+
+//=========================================================================
+// virtual
+uno::Sequence< util::ElementChange > SAL_CALL
+HierarchyDataAccess::getPendingChanges()
+ throw ( uno::RuntimeException )
+{
+ uno::Reference< util::XChangesBatch > xOrig
+ = ENSURE_ORIG_INTERFACE( util::XChangesBatch, CB );
+
+ OSL_ENSURE( xOrig.is(),
+ "HierarchyDataAccess : Data source is not an XChangesBatch!" );
+ return xOrig->getPendingChanges();
+}
+