summaryrefslogtreecommitdiff
path: root/ucbhelper/source/provider/contenthelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucbhelper/source/provider/contenthelper.cxx')
-rw-r--r--ucbhelper/source/provider/contenthelper.cxx1125
1 files changed, 0 insertions, 1125 deletions
diff --git a/ucbhelper/source/provider/contenthelper.cxx b/ucbhelper/source/provider/contenthelper.cxx
deleted file mode 100644
index 87c08c7a1c..0000000000
--- a/ucbhelper/source/provider/contenthelper.cxx
+++ /dev/null
@@ -1,1125 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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_ucbhelper.hxx"
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-
-#include <boost/unordered_map.hpp>
-#include <com/sun/star/ucb/ContentAction.hpp>
-#include <com/sun/star/ucb/CommandInfoChange.hpp>
-#include <com/sun/star/ucb/XPersistentPropertySet.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/PropertySetInfoChange.hpp>
-#include <cppuhelper/interfacecontainer.hxx>
-
-#include "osl/diagnose.h"
-#include "osl/mutex.hxx"
-#include "rtl/ref.hxx"
-#include <ucbhelper/contentidentifier.hxx>
-#include <ucbhelper/contenthelper.hxx>
-#include <ucbhelper/providerhelper.hxx>
-#include <ucbhelper/contentinfo.hxx>
-
-using namespace com::sun::star;
-
-namespace ucbhelper_impl
-{
-
-//=========================================================================
-//
-// class PropertyEventSequence.
-//
-//=========================================================================
-
-class PropertyEventSequence
-{
- uno::Sequence< beans::PropertyChangeEvent > m_aSeq;
- sal_uInt32 m_nPos;
-
-public:
- PropertyEventSequence( sal_uInt32 nSize )
- : m_aSeq( nSize ), m_nPos( 0 ) {};
-
- void append( const beans::PropertyChangeEvent& rEvt )
- { m_aSeq.getArray()[ m_nPos ] = rEvt; ++m_nPos; }
-
- const uno::Sequence< beans::PropertyChangeEvent >& getEvents()
- { m_aSeq.realloc( m_nPos ); return m_aSeq; }
-};
-
-//=========================================================================
-//
-// PropertiesEventListenerMap.
-//
-//=========================================================================
-
-typedef void* XPropertiesChangeListenerPtr; // -> Compiler problems!
-
-struct equalPtr
-{
- bool operator()( const XPropertiesChangeListenerPtr& rp1,
- const XPropertiesChangeListenerPtr& rp2 ) const
- {
- return ( rp1 == rp2 );
- }
-};
-
-struct hashPtr
-{
- size_t operator()( const XPropertiesChangeListenerPtr& rp ) const
- {
- return (size_t)rp;
- }
-};
-
-typedef boost::unordered_map
-<
- XPropertiesChangeListenerPtr,
- PropertyEventSequence*,
- hashPtr,
- equalPtr
->
-PropertiesEventListenerMap;
-
-//=========================================================================
-//
-// PropertyChangeListenerContainer.
-//
-//=========================================================================
-
-struct equalStr
-{
- bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
- {
- return !!( s1 == s2 );
- }
-};
-
-struct hashStr
-{
- size_t operator()( const rtl::OUString& rName ) const
- {
- return rName.hashCode();
- }
-};
-
-typedef cppu::OMultiTypeInterfaceContainerHelperVar
-<
- rtl::OUString,
- hashStr,
- equalStr
-> PropertyChangeListeners;
-
-//=========================================================================
-//
-// struct ContentImplHelper_Impl
-//
-//=========================================================================
-
-struct ContentImplHelper_Impl
-{
- rtl::Reference< ::ucbhelper::PropertySetInfo > m_xPropSetInfo;
- rtl::Reference< ::ucbhelper::CommandProcessorInfo > m_xCommandsInfo;
- cppu::OInterfaceContainerHelper* m_pDisposeEventListeners;
- cppu::OInterfaceContainerHelper* m_pContentEventListeners;
- cppu::OInterfaceContainerHelper* m_pPropSetChangeListeners;
- cppu::OInterfaceContainerHelper* m_pCommandChangeListeners;
- PropertyChangeListeners* m_pPropertyChangeListeners;
-
- ContentImplHelper_Impl()
- : m_pDisposeEventListeners( 0 ),
- m_pContentEventListeners( 0 ),
- m_pPropSetChangeListeners( 0 ),
- m_pCommandChangeListeners( 0 ),
- m_pPropertyChangeListeners( 0 ) {}
-
- ~ContentImplHelper_Impl()
- {
- delete m_pDisposeEventListeners;
- delete m_pContentEventListeners;
- delete m_pPropSetChangeListeners;
- delete m_pCommandChangeListeners;
- delete m_pPropertyChangeListeners;
- }
-};
-
-} // namespace ucbhelper_impl
-
-using namespace ucbhelper_impl;
-
-//=========================================================================
-//=========================================================================
-//
-// ContentImplHelper Implementation.
-//
-//=========================================================================
-//=========================================================================
-
-namespace ucbhelper {
-
-ContentImplHelper::ContentImplHelper(
- const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
- const rtl::Reference< ContentProviderImplHelper >& rxProvider,
- const uno::Reference<
- com::sun::star::ucb::XContentIdentifier >& Identifier )
-: m_pImpl( new ContentImplHelper_Impl ),
- m_xSMgr( rxSMgr ),
- m_xIdentifier( Identifier ),
- m_xProvider( rxProvider ),
- m_nCommandId( 0 )
-{
-}
-
-//=========================================================================
-// virtual
-ContentImplHelper::~ContentImplHelper()
-{
- delete m_pImpl;
-}
-
-//=========================================================================
-//
-// XInterface methods.
-//
-//=========================================================================
-
-void SAL_CALL ContentImplHelper::acquire()
- throw()
-{
- cppu::OWeakObject::acquire();
-}
-
-void SAL_CALL ContentImplHelper::release()
- throw()
-{
- // #144882# - Call to OWeakObject::release may destroy m_xProvider.
- // Prevent this.
- rtl::Reference< ContentProviderImplHelper > xKeepProviderAlive(
- m_xProvider );
-
- {
- osl::MutexGuard aGuard( m_xProvider->m_aMutex );
- OWeakObject::release();
- }
-}
-
-uno::Any SAL_CALL ContentImplHelper::queryInterface( const uno::Type & rType )
- throw( uno::RuntimeException )
-{
- com::sun::star::uno::Any aRet = cppu::queryInterface( rType,
- static_cast< lang::XTypeProvider * >(this),
- static_cast< lang::XServiceInfo * >(this),
- static_cast< lang::XComponent * >(this),
- static_cast< com::sun::star::ucb::XContent * >(this),
- static_cast< com::sun::star::ucb::XCommandProcessor * >(this),
- static_cast< beans::XPropertiesChangeNotifier * >(this),
- static_cast< com::sun::star::ucb::XCommandInfoChangeNotifier * >(this),
- static_cast< beans::XPropertyContainer * >(this),
- static_cast< beans::XPropertySetInfoChangeNotifier * >(this),
- static_cast< container::XChild * >(this));
- return aRet.hasValue() ? aRet : cppu::OWeakObject::queryInterface( rType );
-}
-
-//=========================================================================
-//
-// XTypeProvider methods.
-//
-//=========================================================================
-
-XTYPEPROVIDER_IMPL_10( ContentImplHelper,
- lang::XTypeProvider,
- lang::XServiceInfo,
- lang::XComponent,
- com::sun::star::ucb::XContent,
- com::sun::star::ucb::XCommandProcessor,
- beans::XPropertiesChangeNotifier,
- com::sun::star::ucb::XCommandInfoChangeNotifier,
- beans::XPropertyContainer,
- beans::XPropertySetInfoChangeNotifier,
- container::XChild );
-
-//=========================================================================
-//
-// XServiceInfo methods.
-//
-//=========================================================================
-
-// virtual
-sal_Bool SAL_CALL ContentImplHelper::supportsService(
- const rtl::OUString& ServiceName )
- throw( uno::RuntimeException )
-{
- uno::Sequence< rtl::OUString > aSNL = getSupportedServiceNames();
- const rtl::OUString* pArray = aSNL.getConstArray();
- for ( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
- {
- if ( pArray[ i ] == ServiceName )
- return sal_True;
- }
-
- return sal_False;
-}
-
-//=========================================================================
-//
-// XComponent methods.
-//
-//=========================================================================
-
-// virtual
-void SAL_CALL ContentImplHelper::dispose()
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pImpl->m_pDisposeEventListeners &&
- m_pImpl->m_pDisposeEventListeners->getLength() )
- {
- lang::EventObject aEvt;
- aEvt.Source = static_cast< lang::XComponent * >( this );
- m_pImpl->m_pDisposeEventListeners->disposeAndClear( aEvt );
- }
-
- if ( m_pImpl->m_pContentEventListeners &&
- m_pImpl->m_pContentEventListeners->getLength() )
- {
- lang::EventObject aEvt;
- aEvt.Source = static_cast< com::sun::star::ucb::XContent * >( this );
- m_pImpl->m_pContentEventListeners->disposeAndClear( aEvt );
- }
-
- if ( m_pImpl->m_pPropSetChangeListeners &&
- m_pImpl->m_pPropSetChangeListeners->getLength() )
- {
- lang::EventObject aEvt;
- aEvt.Source
- = static_cast< beans::XPropertySetInfoChangeNotifier * >( this );
- m_pImpl->m_pPropSetChangeListeners->disposeAndClear( aEvt );
- }
-
- if ( m_pImpl->m_pCommandChangeListeners &&
- m_pImpl->m_pCommandChangeListeners->getLength() )
- {
- lang::EventObject aEvt;
- aEvt.Source = static_cast< com::sun::star::ucb::XCommandInfoChangeNotifier * >( this );
- m_pImpl->m_pCommandChangeListeners->disposeAndClear( aEvt );
- }
-
- if ( m_pImpl->m_pPropertyChangeListeners )
- {
- lang::EventObject aEvt;
- aEvt.Source
- = static_cast< beans::XPropertiesChangeNotifier * >( this );
- m_pImpl->m_pPropertyChangeListeners->disposeAndClear( aEvt );
- }
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::addEventListener(
- const uno::Reference< lang::XEventListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pDisposeEventListeners )
- m_pImpl->m_pDisposeEventListeners
- = new cppu::OInterfaceContainerHelper( m_aMutex );
-
- m_pImpl->m_pDisposeEventListeners->addInterface( Listener );
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removeEventListener(
- const uno::Reference< lang::XEventListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pImpl->m_pDisposeEventListeners )
- m_pImpl->m_pDisposeEventListeners->removeInterface( Listener );
-}
-
-//=========================================================================
-//
-// XContent methods.
-//
-//=========================================================================
-
-// virtual
-uno::Reference< com::sun::star::ucb::XContentIdentifier > SAL_CALL
-ContentImplHelper::getIdentifier()
- throw( uno::RuntimeException )
-{
- return m_xIdentifier;
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::addContentEventListener(
- const uno::Reference< com::sun::star::ucb::XContentEventListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pContentEventListeners )
- m_pImpl->m_pContentEventListeners
- = new cppu::OInterfaceContainerHelper( m_aMutex );
-
- m_pImpl->m_pContentEventListeners->addInterface( Listener );
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removeContentEventListener(
- const uno::Reference< com::sun::star::ucb::XContentEventListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pImpl->m_pContentEventListeners )
- m_pImpl->m_pContentEventListeners->removeInterface( Listener );
-}
-
-//=========================================================================
-//
-// XCommandProcessor methods.
-//
-//=========================================================================
-
-// virtual
-sal_Int32 SAL_CALL ContentImplHelper::createCommandIdentifier()
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- // Just increase counter on every call to generate an identifier.
- return ++m_nCommandId;
-}
-
-//=========================================================================
-//
-// XPropertiesChangeNotifier methods.
-//
-//=========================================================================
-
-// virtual
-void SAL_CALL ContentImplHelper::addPropertiesChangeListener(
- const uno::Sequence< rtl::OUString >& PropertyNames,
- const uno::Reference< beans::XPropertiesChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pPropertyChangeListeners )
- m_pImpl->m_pPropertyChangeListeners
- = new PropertyChangeListeners( m_aMutex );
-
- sal_Int32 nCount = PropertyNames.getLength();
- if ( !nCount )
- {
- // Note: An empty sequence means a listener for "all" properties.
- m_pImpl->m_pPropertyChangeListeners->addInterface(
- rtl::OUString(), Listener );
- }
- else
- {
- const rtl::OUString* pSeq = PropertyNames.getConstArray();
-
- for ( sal_Int32 n = 0; n < nCount; ++n )
- {
- const rtl::OUString& rName = pSeq[ n ];
- if ( rName.getLength() )
- m_pImpl->m_pPropertyChangeListeners->addInterface(
- rName, Listener );
- }
- }
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removePropertiesChangeListener(
- const uno::Sequence< rtl::OUString >& PropertyNames,
- const uno::Reference< beans::XPropertiesChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pPropertyChangeListeners )
- return;
-
- sal_Int32 nCount = PropertyNames.getLength();
- if ( !nCount )
- {
- // Note: An empty sequence means a listener for "all" properties.
- m_pImpl->m_pPropertyChangeListeners->removeInterface(
- rtl::OUString(), Listener );
- }
- else
- {
- const rtl::OUString* pSeq = PropertyNames.getConstArray();
-
- for ( sal_Int32 n = 0; n < nCount; ++n )
- {
- const rtl::OUString& rName = pSeq[ n ];
- if ( rName.getLength() )
- m_pImpl->m_pPropertyChangeListeners->removeInterface(
- rName, Listener );
- }
- }
-}
-
-//=========================================================================
-//
-// XCommandInfoChangeNotifier methods.
-//
-//=========================================================================
-
-// virtual
-void SAL_CALL ContentImplHelper::addCommandInfoChangeListener(
- const uno::Reference< com::sun::star::ucb::XCommandInfoChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pCommandChangeListeners )
- m_pImpl->m_pCommandChangeListeners
- = new cppu::OInterfaceContainerHelper( m_aMutex );
-
- m_pImpl->m_pCommandChangeListeners->addInterface( Listener );
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removeCommandInfoChangeListener(
- const uno::Reference< com::sun::star::ucb::XCommandInfoChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pImpl->m_pCommandChangeListeners )
- m_pImpl->m_pCommandChangeListeners->removeInterface( Listener );
-}
-
-//=========================================================================
-//
-// XPropertyContainer methods.
-//
-//=========================================================================
-
-// virtual
-void SAL_CALL ContentImplHelper::addProperty(
- const rtl::OUString& Name,
- sal_Int16 Attributes,
- const uno::Any& DefaultValue )
- throw( beans::PropertyExistException,
- beans::IllegalTypeException,
- lang::IllegalArgumentException,
- uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- //////////////////////////////////////////////////////////////////////
- // Make sure a property with the requested name does not already
- // exist in dynamic and static(!) properties.
- //////////////////////////////////////////////////////////////////////
-
- // @@@ Need real command environment here, but where to get it from?
- // XPropertyContainer interface should be replaced by
- // XCommandProcessor commands!
- uno::Reference< com::sun::star::ucb::XCommandEnvironment > xEnv;
-
- if ( getPropertySetInfo( xEnv )->hasPropertyByName( Name ) )
- {
- // Property does already exist.
- throw beans::PropertyExistException();
- }
-
- //////////////////////////////////////////////////////////////////////
- // Add a new dynamic property.
- //////////////////////////////////////////////////////////////////////
-
- // Open/create persistent property set.
- uno::Reference< com::sun::star::ucb::XPersistentPropertySet > xSet(
- getAdditionalPropertySet( sal_True ) );
-
- OSL_ENSURE( xSet.is(),
- "ContentImplHelper::addProperty - No property set!" );
-
- if ( xSet.is() )
- {
- uno::Reference< beans::XPropertyContainer > xContainer(
- xSet, uno::UNO_QUERY );
-
- OSL_ENSURE(
- xContainer.is(),
- "ContentImplHelper::addProperty - No property container!" );
-
- if ( xContainer.is() )
- {
- // Property is always removeable.
- Attributes |= beans::PropertyAttribute::REMOVEABLE;
-
- try
- {
- xContainer->addProperty( Name, Attributes, DefaultValue );
- }
- catch ( beans::PropertyExistException const & )
- {
- OSL_FAIL( "ContentImplHelper::addProperty - Exists!" );
- throw;
- }
- catch ( beans::IllegalTypeException const & )
- {
- OSL_FAIL( "ContentImplHelper::addProperty - Wrong Type!" );
- throw;
- }
- catch ( lang::IllegalArgumentException const & )
- {
- OSL_FAIL( "ContentImplHelper::addProperty - Illegal Arg!" );
- throw;
- }
-
- // Success!
-
- if ( m_pImpl->m_xPropSetInfo.is() )
- {
- // Info cached in propertyset info is invalid now!
- m_pImpl->m_xPropSetInfo->reset();
- }
-
- // Notify propertyset info change listeners.
- if ( m_pImpl->m_pPropSetChangeListeners &&
- m_pImpl->m_pPropSetChangeListeners->getLength() )
- {
- beans::PropertySetInfoChangeEvent evt(
- static_cast< cppu::OWeakObject * >( this ),
- Name,
- -1, // No handle available
- beans::PropertySetInfoChange::PROPERTY_INSERTED );
- notifyPropertySetInfoChange( evt );
- }
- }
- }
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removeProperty( const rtl::OUString& Name )
- throw( beans::UnknownPropertyException,
- beans::NotRemoveableException,
- uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- try
- {
- // @@@ Need real command environment here, but where to get it from?
- // XPropertyContainer interface should be replaced by
- // XCommandProcessor commands!
- uno::Reference< com::sun::star::ucb::XCommandEnvironment > xEnv;
-
- beans::Property aProp
- = getPropertySetInfo( xEnv )->getPropertyByName( Name );
-
- if ( !( aProp.Attributes & beans::PropertyAttribute::REMOVEABLE ) )
- {
- // Not removeable!
- throw beans::NotRemoveableException();
- }
- }
- catch ( beans::UnknownPropertyException const & )
- {
- OSL_FAIL( "ContentImplHelper::removeProperty - Unknown!" );
- throw;
- }
-
- //////////////////////////////////////////////////////////////////////
- // Try to remove property from dynamic property set.
- //////////////////////////////////////////////////////////////////////
-
- // Open persistent property set, if exists.
- uno::Reference< com::sun::star::ucb::XPersistentPropertySet > xSet(
- getAdditionalPropertySet( sal_False ) );
- if ( xSet.is() )
- {
- uno::Reference< beans::XPropertyContainer > xContainer(
- xSet, uno::UNO_QUERY );
-
- OSL_ENSURE(
- xContainer.is(),
- "ContentImplHelper::removeProperty - No property container!" );
-
- if ( xContainer.is() )
- {
- try
- {
- xContainer->removeProperty( Name );
- }
- catch ( beans::UnknownPropertyException const & )
- {
- OSL_FAIL( "ContentImplHelper::removeProperty - Unknown!" );
- throw;
- }
- catch ( beans::NotRemoveableException const & )
- {
- OSL_FAIL(
- "ContentImplHelper::removeProperty - Unremoveable!" );
- throw;
- }
-
- xContainer = 0;
-
- // Success!
-
- if ( xSet->getPropertySetInfo()->getProperties().getLength() == 0 )
- {
- // Remove empty propertyset from registry.
- uno::Reference< com::sun::star::ucb::XPropertySetRegistry >
- xReg = xSet->getRegistry();
- if ( xReg.is() )
- {
- rtl::OUString aKey( xSet->getKey() );
- xSet = 0;
- xReg->removePropertySet( aKey );
- }
- }
-
- if ( m_pImpl->m_xPropSetInfo.is() )
- {
- // Info cached in propertyset info is invalid now!
- m_pImpl->m_xPropSetInfo->reset();
- }
-
- // Notify propertyset info change listeners.
- if ( m_pImpl->m_pPropSetChangeListeners &&
- m_pImpl->m_pPropSetChangeListeners->getLength() )
- {
- beans::PropertySetInfoChangeEvent evt(
- static_cast< cppu::OWeakObject * >( this ),
- Name,
- -1, // No handle available
- beans::PropertySetInfoChange::PROPERTY_REMOVED );
- notifyPropertySetInfoChange( evt );
- }
- }
- }
-}
-
-//=========================================================================
-//
-// XPropertySetInfoChangeNotifier methods.
-//
-//=========================================================================
-
-// virtual
-void SAL_CALL ContentImplHelper::addPropertySetInfoChangeListener(
- const uno::Reference< beans::XPropertySetInfoChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_pPropSetChangeListeners )
- m_pImpl->m_pPropSetChangeListeners
- = new cppu::OInterfaceContainerHelper( m_aMutex );
-
- m_pImpl->m_pPropSetChangeListeners->addInterface( Listener );
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::removePropertySetInfoChangeListener(
- const uno::Reference< beans::XPropertySetInfoChangeListener >& Listener )
- throw( uno::RuntimeException )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pImpl->m_pPropSetChangeListeners )
- m_pImpl->m_pPropSetChangeListeners->removeInterface( Listener );
-}
-
-//=========================================================================
-//
-// XChild methods.
-//
-//=========================================================================
-
-// virtual
-uno::Reference< uno::XInterface > SAL_CALL ContentImplHelper::getParent()
- throw( uno::RuntimeException )
-{
- uno::Reference< uno::XInterface > xParent;
- rtl::OUString aURL = getParentURL();
-
- if ( aURL.getLength() )
- {
- uno::Reference< com::sun::star::ucb::XContentIdentifier > xId(
- new ContentIdentifier( m_xSMgr, aURL ) );
- try
- {
- xParent.set( m_xProvider->queryContent( xId ) );
- }
- catch ( com::sun::star::ucb::IllegalIdentifierException const & )
- {
- }
- }
-
- return xParent;
-}
-
-//=========================================================================
-// virtual
-void SAL_CALL ContentImplHelper::setParent(
- const uno::Reference< uno::XInterface >& )
- throw( lang::NoSupportException, uno::RuntimeException )
-{
- throw lang::NoSupportException();
-}
-
-//=========================================================================
-//
-// Non-interface methods
-//
-//=========================================================================
-
-uno::Reference< com::sun::star::ucb::XPersistentPropertySet >
-ContentImplHelper::getAdditionalPropertySet( sal_Bool bCreate )
-{
- // Get propertyset from provider.
- return m_xProvider->getAdditionalPropertySet(
- m_xIdentifier->getContentIdentifier(), bCreate );
-}
-
-//=========================================================================
-sal_Bool ContentImplHelper::renameAdditionalPropertySet(
- const rtl::OUString& rOldKey,
- const rtl::OUString& rNewKey,
- sal_Bool bRecursive )
-{
- return m_xProvider->renameAdditionalPropertySet(
- rOldKey, rNewKey, bRecursive );
-}
-
-//=========================================================================
-sal_Bool ContentImplHelper::copyAdditionalPropertySet(
- const rtl::OUString& rSourceKey,
- const rtl::OUString& rTargetKey,
- sal_Bool bRecursive )
-{
- return m_xProvider->copyAdditionalPropertySet(
- rSourceKey, rTargetKey, bRecursive );
-}
-
-//=========================================================================
-sal_Bool ContentImplHelper::removeAdditionalPropertySet( sal_Bool bRecursive )
-{
- return m_xProvider->removeAdditionalPropertySet(
- m_xIdentifier->getContentIdentifier(), bRecursive );
-}
-
-//=========================================================================
-void ContentImplHelper::notifyPropertiesChange(
- const uno::Sequence< beans::PropertyChangeEvent >& evt ) const
-{
- if ( !m_pImpl->m_pPropertyChangeListeners )
- return;
-
- sal_Int32 nCount = evt.getLength();
- if ( nCount )
- {
- // First, notify listeners interested in changes of every property.
- cppu::OInterfaceContainerHelper* pAllPropsContainer
- = m_pImpl->m_pPropertyChangeListeners->getContainer(
- rtl::OUString() );
- if ( pAllPropsContainer )
- {
- cppu::OInterfaceIteratorHelper aIter( *pAllPropsContainer );
- while ( aIter.hasMoreElements() )
- {
- // Propagate event.
- uno::Reference< beans::XPropertiesChangeListener > xListener(
- aIter.next(), uno::UNO_QUERY );
- if ( xListener.is() )
- xListener->propertiesChange( evt );
- }
- }
-
- PropertiesEventListenerMap aListeners;
-
- const beans::PropertyChangeEvent* pEvents = evt.getConstArray();
-
- for ( sal_Int32 n = 0; n < nCount; ++n )
- {
- const beans::PropertyChangeEvent& rEvent = pEvents[ n ];
- const rtl::OUString& rName = rEvent.PropertyName;
-
- cppu::OInterfaceContainerHelper* pPropsContainer
- = m_pImpl->m_pPropertyChangeListeners->getContainer( rName );
- if ( pPropsContainer )
- {
- cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
- while ( aIter.hasMoreElements() )
- {
- PropertyEventSequence* p = NULL;
-
- beans::XPropertiesChangeListener* pListener =
- static_cast< beans::XPropertiesChangeListener * >(
- aIter.next() );
- PropertiesEventListenerMap::iterator it =
- aListeners.find( pListener );
- if ( it == aListeners.end() )
- {
- // Not in map - create and insert new entry.
- p = new PropertyEventSequence( nCount );
- aListeners[ pListener ] = p;
- }
- else
- p = (*it).second;
-
- if ( p )
- p->append( rEvent );
- }
- }
- }
-
- // Notify listeners.
- PropertiesEventListenerMap::iterator it = aListeners.begin();
- while ( !aListeners.empty() )
- {
- beans::XPropertiesChangeListener* pListener =
- static_cast< beans::XPropertiesChangeListener * >( (*it).first );
- PropertyEventSequence* pSeq = (*it).second;
-
- // Remove current element.
- aListeners.erase( it );
-
- // Propagate event.
- pListener->propertiesChange( pSeq->getEvents() );
-
- delete pSeq;
-
- it = aListeners.begin();
- }
- }
-}
-
-//=========================================================================
-void ContentImplHelper::notifyPropertySetInfoChange(
- const beans::PropertySetInfoChangeEvent& evt ) const
-{
- if ( !m_pImpl->m_pPropSetChangeListeners )
- return;
-
- // Notify event listeners.
- cppu::OInterfaceIteratorHelper aIter( *m_pImpl->m_pPropSetChangeListeners );
- while ( aIter.hasMoreElements() )
- {
- // Propagate event.
- uno::Reference< beans::XPropertySetInfoChangeListener >
- xListener( aIter.next(), uno::UNO_QUERY );
- if ( xListener.is() )
- xListener->propertySetInfoChange( evt );
- }
-}
-
-//=========================================================================
-void ContentImplHelper::notifyCommandInfoChange(
- const com::sun::star::ucb::CommandInfoChangeEvent& evt ) const
-{
- if ( !m_pImpl->m_pCommandChangeListeners )
- return;
-
- // Notify event listeners.
- cppu::OInterfaceIteratorHelper aIter(
- *m_pImpl->m_pCommandChangeListeners );
- while ( aIter.hasMoreElements() )
- {
- // Propagate event.
- uno::Reference< com::sun::star::ucb::XCommandInfoChangeListener >
- xListener( aIter.next(), uno::UNO_QUERY );
- if ( xListener.is() )
- xListener->commandInfoChange( evt );
- }
-}
-
-//=========================================================================
-void ContentImplHelper::notifyContentEvent(
- const com::sun::star::ucb::ContentEvent& evt ) const
-{
- if ( !m_pImpl->m_pContentEventListeners )
- return;
-
- // Notify event listeners.
- cppu::OInterfaceIteratorHelper aIter( *m_pImpl->m_pContentEventListeners );
- while ( aIter.hasMoreElements() )
- {
- // Propagate event.
- uno::Reference<
- com::sun::star::ucb::XContentEventListener > xListener(
- aIter.next(), uno::UNO_QUERY );
- if ( xListener.is() )
- xListener->contentEvent( evt );
- }
-}
-
-//=========================================================================
-void ContentImplHelper::inserted()
-{
- // Content is not yet registered at provider.
- m_xProvider->registerNewContent( this );
-
- // If the parent content is currently not instanciated, there can be
- // no listeners interested in changes ;-)
-
- rtl::Reference< ContentImplHelper > xParent
- = m_xProvider->queryExistingContent( getParentURL() );
-
- if ( xParent.is() )
- {
- com::sun::star::ucb::ContentEvent aEvt(
- static_cast< cppu::OWeakObject * >( xParent.get() ), // Source
- com::sun::star::ucb::ContentAction::INSERTED, // Action
- this, // Content
- xParent->getIdentifier() ); // Id
- xParent->notifyContentEvent( aEvt );
- }
-}
-
-//=========================================================================
-void ContentImplHelper::deleted()
-{
- uno::Reference< com::sun::star::ucb::XContent > xThis = this;
-
- rtl::Reference< ContentImplHelper > xParent
- = m_xProvider->queryExistingContent( getParentURL() );
-
- if ( xParent.is() )
- {
- // Let parent notify "REMOVED" event.
- com::sun::star::ucb::ContentEvent aEvt(
- static_cast< cppu::OWeakObject * >( xParent.get() ),
- com::sun::star::ucb::ContentAction::REMOVED,
- this,
- xParent->getIdentifier() );
- xParent->notifyContentEvent( aEvt );
- }
-
- // Notify "DELETED" event.
- com::sun::star::ucb::ContentEvent aEvt1(
- static_cast< cppu::OWeakObject * >( this ),
- com::sun::star::ucb::ContentAction::DELETED,
- this,
- getIdentifier() );
- notifyContentEvent( aEvt1 );
-
- m_xProvider->removeContent( this );
-}
-
-//=========================================================================
-sal_Bool ContentImplHelper::exchange(
- const uno::Reference< com::sun::star::ucb::XContentIdentifier >& rNewId )
-{
- uno::Reference< com::sun::star::ucb::XContent > xThis = this;
-
- osl::ClearableMutexGuard aGuard( m_aMutex );
-
- rtl::Reference< ContentImplHelper > xContent
- = m_xProvider->queryExistingContent( rNewId );
- if ( xContent.is() )
- {
- // @@@
- // Big trouble. Another object with the new identity exists.
- // How shall I mutate to / merge with the other object?
- return sal_False;
- }
-
- uno::Reference< com::sun::star::ucb::XContentIdentifier > xOldId
- = getIdentifier();
-
- // Re-insert at provider.
- m_xProvider->removeContent( this );
- m_xIdentifier = rNewId;
- m_xProvider->registerNewContent( this );
-
- aGuard.clear();
-
- // Notify "EXCHANGED" event.
- com::sun::star::ucb::ContentEvent aEvt(
- static_cast< cppu::OWeakObject * >( this ),
- com::sun::star::ucb::ContentAction::EXCHANGED,
- this,
- xOldId );
- notifyContentEvent( aEvt );
- return sal_True;
-}
-
-//=========================================================================
-uno::Reference< com::sun::star::ucb::XCommandInfo >
-ContentImplHelper::getCommandInfo(
- const uno::Reference< com::sun::star::ucb::XCommandEnvironment > & xEnv,
- sal_Bool bCache )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_xCommandsInfo.is() )
- m_pImpl->m_xCommandsInfo
- = new CommandProcessorInfo( m_xSMgr, xEnv, this );
- else if ( !bCache )
- m_pImpl->m_xCommandsInfo->reset();
-
- return uno::Reference< com::sun::star::ucb::XCommandInfo >(
- m_pImpl->m_xCommandsInfo.get() );
-}
-
-//=========================================================================
-uno::Reference< beans::XPropertySetInfo >
-ContentImplHelper::getPropertySetInfo(
- const uno::Reference< com::sun::star::ucb::XCommandEnvironment > & xEnv,
- sal_Bool bCache )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pImpl->m_xPropSetInfo.is() )
- m_pImpl->m_xPropSetInfo
- = new PropertySetInfo( m_xSMgr, xEnv, this );
- else if ( !bCache )
- m_pImpl->m_xPropSetInfo->reset();
-
- return uno::Reference< beans::XPropertySetInfo >(
- m_pImpl->m_xPropSetInfo.get() );
-}
-
-} // namespace ucbhelper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */