diff options
Diffstat (limited to 'comphelper/source')
-rw-r--r-- | comphelper/source/misc/makefile.mk | 1 | ||||
-rw-r--r-- | comphelper/source/misc/namedvaluecollection.cxx | 49 | ||||
-rw-r--r-- | comphelper/source/misc/querydeep.cxx | 76 | ||||
-rw-r--r-- | comphelper/source/officeinstdir/officeinstallationdirectories.cxx | 92 | ||||
-rw-r--r-- | comphelper/source/officeinstdir/officeinstallationdirectories.hxx | 6 | ||||
-rw-r--r-- | comphelper/source/property/propagg.cxx | 24 |
6 files changed, 123 insertions, 125 deletions
diff --git a/comphelper/source/misc/makefile.mk b/comphelper/source/misc/makefile.mk index cecba554b332..0bb4defb4165 100644 --- a/comphelper/source/misc/makefile.mk +++ b/comphelper/source/misc/makefile.mk @@ -74,7 +74,6 @@ SLOFILES= \ $(SLO)$/officeresourcebundle.obj \ $(SLO)$/officerestartmanager.obj \ $(SLO)$/proxyaggregation.obj \ - $(SLO)$/querydeep.obj \ $(SLO)$/regpathhelper.obj \ $(SLO)$/scopeguard.obj \ $(SLO)$/SelectionMultiplex.obj \ diff --git a/comphelper/source/misc/namedvaluecollection.cxx b/comphelper/source/misc/namedvaluecollection.cxx index 8bab7fa3d7c7..566e5526019c 100644 --- a/comphelper/source/misc/namedvaluecollection.cxx +++ b/comphelper/source/misc/namedvaluecollection.cxx @@ -99,21 +99,7 @@ namespace comphelper NamedValueCollection::NamedValueCollection( const Any& _rElements ) :m_pImpl( new NamedValueCollection_Impl ) { - Sequence< NamedValue > aNamedValues; - Sequence< PropertyValue > aPropertyValues; - NamedValue aNamedValue; - PropertyValue aPropertyValue; - - if ( _rElements >>= aNamedValues ) - impl_assign( aNamedValues ); - else if ( _rElements >>= aPropertyValues ) - impl_assign( aPropertyValues ); - else if ( _rElements >>= aNamedValue ) - impl_assign( Sequence< NamedValue >( &aNamedValue, 1 ) ); - else if ( _rElements >>= aPropertyValue ) - impl_assign( Sequence< PropertyValue >( &aPropertyValue, 1 ) ); - else - OSL_ENSURE( !_rElements.hasValue(), "NamedValueCollection::NamedValueCollection(Any): unsupported type!" ); + impl_assign( _rElements ); } //-------------------------------------------------------------------- @@ -170,6 +156,39 @@ namespace comphelper } //-------------------------------------------------------------------- + ::std::vector< ::rtl::OUString > NamedValueCollection::getNames() const + { + ::std::vector< ::rtl::OUString > aNames( m_pImpl->aValues.size() ); + ::std::transform( + m_pImpl->aValues.begin(), + m_pImpl->aValues.end(), + aNames.begin(), + ::std::select1st< NamedValueRepository::value_type >() + ); + return aNames; + } + + //-------------------------------------------------------------------- + void NamedValueCollection::impl_assign( const Any& i_rWrappedElements ) + { + Sequence< NamedValue > aNamedValues; + Sequence< PropertyValue > aPropertyValues; + NamedValue aNamedValue; + PropertyValue aPropertyValue; + + if ( i_rWrappedElements >>= aNamedValues ) + impl_assign( aNamedValues ); + else if ( i_rWrappedElements >>= aPropertyValues ) + impl_assign( aPropertyValues ); + else if ( i_rWrappedElements >>= aNamedValue ) + impl_assign( Sequence< NamedValue >( &aNamedValue, 1 ) ); + else if ( i_rWrappedElements >>= aPropertyValue ) + impl_assign( Sequence< PropertyValue >( &aPropertyValue, 1 ) ); + else + OSL_ENSURE( !i_rWrappedElements.hasValue(), "NamedValueCollection::impl_assign(Any): unsupported type!" ); + } + + //-------------------------------------------------------------------- void NamedValueCollection::impl_assign( const Sequence< Any >& _rArguments ) { { diff --git a/comphelper/source/misc/querydeep.cxx b/comphelper/source/misc/querydeep.cxx deleted file mode 100644 index 92e475686783..000000000000 --- a/comphelper/source/misc/querydeep.cxx +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * - * 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_comphelper.hxx" -#include <comphelper/querydeep.hxx> -#include <typelib/typedescription.h> - -//__________________________________________________________________________________________________ - -sal_Bool comphelper::isDerivedFrom( - const ::com::sun::star::uno::Type & rBaseType, - const ::com::sun::star::uno::Type & rType ) -{ - using namespace ::com::sun::star::uno; - - TypeClass eClass = rBaseType.getTypeClass(); - - if (eClass != TypeClass_INTERFACE) - return sal_False; - - // supported TypeClass - do the types match ? - if (eClass != rType.getTypeClass()) - return sal_False; - - sal_Bool bRet; - - // shortcut for simple case - if (rBaseType == ::getCppuType(static_cast<const Reference< XInterface > *>(0))) - { - bRet = sal_True; - } - else - { - // now ask in cppu (aka typelib) - ::typelib_TypeDescription *pBaseTD = 0, *pTD = 0; - - rBaseType. getDescription(&pBaseTD); - rType. getDescription(&pTD); - - // interfaces are assignable to a base - bRet = ::typelib_typedescription_isAssignableFrom(pBaseTD, pTD); - - ::typelib_typedescription_release(pBaseTD); - ::typelib_typedescription_release(pTD); - } - - return bRet; -} - - - diff --git a/comphelper/source/officeinstdir/officeinstallationdirectories.cxx b/comphelper/source/officeinstdir/officeinstallationdirectories.cxx index 3ce0d4de865a..ebeedc92839d 100644 --- a/comphelper/source/officeinstdir/officeinstallationdirectories.cxx +++ b/comphelper/source/officeinstdir/officeinstallationdirectories.cxx @@ -101,10 +101,12 @@ static bool makeCanonicalFileURL( rtl::OUString & rURL ) OfficeInstallationDirectories::OfficeInstallationDirectories( const uno::Reference< uno::XComponentContext > & xCtx ) -: m_aOfficeDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(baseinsturl)" ) ), +: m_aOfficeBrandDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(brandbaseurl)" ) ), + m_aOfficeBaseDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(baseinsturl)" ) ), m_aUserDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(userdataurl)" ) ), m_xCtx( xCtx ), - m_pOfficeDir( 0 ), + m_pOfficeBrandDir( 0 ), + m_pOfficeBaseDir( 0 ), m_pUserDir( 0 ) { } @@ -113,6 +115,9 @@ OfficeInstallationDirectories::OfficeInstallationDirectories( // virtual OfficeInstallationDirectories::~OfficeInstallationDirectories() { + delete m_pOfficeBrandDir; + delete m_pOfficeBaseDir; + delete m_pUserDir; } //========================================================================= @@ -124,9 +129,8 @@ rtl::OUString SAL_CALL OfficeInstallationDirectories::getOfficeInstallationDirectoryURL() throw ( uno::RuntimeException ) { - // late init m_pOfficeDir and m_pUserDir initDirs(); - return rtl::OUString( *m_pOfficeDir ); + return rtl::OUString( *m_pOfficeBrandDir ); } //========================================================================= @@ -135,7 +139,6 @@ rtl::OUString SAL_CALL OfficeInstallationDirectories::getOfficeUserDataDirectoryURL() throw ( uno::RuntimeException ) { - // late init m_pOfficeDir and m_pUserDir initDirs(); return rtl::OUString( *m_pUserDir ); } @@ -149,29 +152,39 @@ OfficeInstallationDirectories::makeRelocatableURL( const rtl::OUString& URL ) { if ( URL.getLength() > 0 ) { - // late init m_pOfficeDir and m_pUserDir initDirs(); rtl::OUString aCanonicalURL( URL ); makeCanonicalFileURL( aCanonicalURL ); - sal_Int32 nIndex = aCanonicalURL.indexOf( *m_pOfficeDir ); + sal_Int32 nIndex = aCanonicalURL.indexOf( *m_pOfficeBrandDir ); if ( nIndex != -1 ) { return rtl::OUString( URL.replaceAt( nIndex, - m_pOfficeDir->getLength(), - m_aOfficeDirMacro ) ); + m_pOfficeBrandDir->getLength(), + m_aOfficeBrandDirMacro ) ); } else { - nIndex = aCanonicalURL.indexOf( *m_pUserDir ); + nIndex = aCanonicalURL.indexOf( *m_pOfficeBaseDir ); if ( nIndex != -1 ) { return rtl::OUString( URL.replaceAt( nIndex, - m_pUserDir->getLength(), - m_aUserDirMacro ) ); + m_pOfficeBaseDir->getLength(), + m_aOfficeBaseDirMacro ) ); + } + else + { + nIndex = aCanonicalURL.indexOf( *m_pUserDir ); + if ( nIndex != -1 ) + { + return rtl::OUString( + URL.replaceAt( nIndex, + m_pUserDir->getLength(), + m_aUserDirMacro ) ); + } } } } @@ -186,29 +199,40 @@ OfficeInstallationDirectories::makeAbsoluteURL( const rtl::OUString& URL ) { if ( URL.getLength() > 0 ) { - sal_Int32 nIndex = URL.indexOf( m_aOfficeDirMacro ); + sal_Int32 nIndex = URL.indexOf( m_aOfficeBrandDirMacro ); if ( nIndex != -1 ) { - // late init m_pOfficeDir and m_pUserDir initDirs(); return rtl::OUString( URL.replaceAt( nIndex, - m_aOfficeDirMacro.getLength(), - *m_pOfficeDir ) ); + m_aOfficeBrandDirMacro.getLength(), + *m_pOfficeBrandDir ) ); } else { - nIndex = URL.indexOf( m_aUserDirMacro ); + nIndex = URL.indexOf( m_aOfficeBaseDirMacro ); if ( nIndex != -1 ) { - // late init m_pOfficeDir and m_pUserDir initDirs(); return rtl::OUString( URL.replaceAt( nIndex, - m_aUserDirMacro.getLength(), - *m_pUserDir ) ); + m_aOfficeBaseDirMacro.getLength(), + *m_pOfficeBaseDir ) ); + } + else + { + nIndex = URL.indexOf( m_aUserDirMacro ); + if ( nIndex != -1 ) + { + initDirs(); + + return rtl::OUString( + URL.replaceAt( nIndex, + m_aUserDirMacro.getLength(), + *m_pUserDir ) ); + } } } } @@ -300,13 +324,14 @@ OfficeInstallationDirectories::Create( void OfficeInstallationDirectories::initDirs() { - if ( m_pOfficeDir == 0 ) + if ( m_pOfficeBrandDir == 0 ) { osl::MutexGuard aGuard( m_aMutex ); - if ( m_pOfficeDir == 0 ) + if ( m_pOfficeBrandDir == 0 ) { - m_pOfficeDir = new rtl::OUString; - m_pUserDir = new rtl::OUString; + m_pOfficeBrandDir = new rtl::OUString; + m_pOfficeBaseDir = new rtl::OUString; + m_pUserDir = new rtl::OUString; uno::Reference< util::XMacroExpander > xExpander; @@ -320,15 +345,24 @@ void OfficeInstallationDirectories::initDirs() if ( xExpander.is() ) { - *m_pOfficeDir = + *m_pOfficeBrandDir = + xExpander->expandMacros( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$BRAND_BASE_DIR" ) ) ); + + OSL_ENSURE( m_pOfficeBrandDir->getLength() > 0, + "Unable to obtain office brand installation directory!" ); + + makeCanonicalFileURL( *m_pOfficeBrandDir ); + + *m_pOfficeBaseDir = xExpander->expandMacros( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":BaseInstallation}" ) ) ); - OSL_ENSURE( m_pOfficeDir->getLength() > 0, - "Unable to obtain office installation directory!" ); + OSL_ENSURE( m_pOfficeBaseDir->getLength() > 0, + "Unable to obtain office base installation directory!" ); - makeCanonicalFileURL( *m_pOfficeDir ); + makeCanonicalFileURL( *m_pOfficeBaseDir ); *m_pUserDir = xExpander->expandMacros( @@ -336,7 +370,7 @@ void OfficeInstallationDirectories::initDirs() "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":UserInstallation}" ) ) ); OSL_ENSURE( m_pUserDir->getLength() > 0, - "Unable to obtain office user data directory!" ); + "Unable to obtain office user data directory!" ); makeCanonicalFileURL( *m_pUserDir ); } diff --git a/comphelper/source/officeinstdir/officeinstallationdirectories.hxx b/comphelper/source/officeinstdir/officeinstallationdirectories.hxx index 2ffb3582718a..9c56f7ce80fd 100644 --- a/comphelper/source/officeinstdir/officeinstallationdirectories.hxx +++ b/comphelper/source/officeinstdir/officeinstallationdirectories.hxx @@ -94,11 +94,13 @@ public: private: void initDirs(); - rtl::OUString m_aOfficeDirMacro; + rtl::OUString m_aOfficeBrandDirMacro; + rtl::OUString m_aOfficeBaseDirMacro; rtl::OUString m_aUserDirMacro; com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > m_xCtx; - rtl::OUString * m_pOfficeDir; + rtl::OUString * m_pOfficeBrandDir; + rtl::OUString * m_pOfficeBaseDir; rtl::OUString * m_pUserDir; }; diff --git a/comphelper/source/property/propagg.cxx b/comphelper/source/property/propagg.cxx index e796c29eba90..9c2fd868d973 100644 --- a/comphelper/source/property/propagg.cxx +++ b/comphelper/source/property/propagg.cxx @@ -87,20 +87,36 @@ OPropertyArrayAggregationHelper::OPropertyArrayAggregationHelper( const Property* pDelegateProps = _rProperties.getConstArray(); Property* pMergedProps = m_aProperties.getArray(); + // if properties are present both at the delegatee and the aggregate, then the former are supposed to win. + // So, we'll need an existence check. + ::std::set< ::rtl::OUString > aDelegatorProps; + // create the map for the delegator properties sal_Int32 nMPLoop = 0; for ( ; nMPLoop < nDelegatorProps; ++nMPLoop, ++pDelegateProps ) + { m_aPropertyAccessors[ pDelegateProps->Handle ] = OPropertyAccessor( -1, nMPLoop, sal_False ); + OSL_ENSURE( aDelegatorProps.find( pDelegateProps->Name ) == aDelegatorProps.end(), + "OPropertyArrayAggregationHelper::OPropertyArrayAggregationHelper: duplicate delegatee property!" ); + aDelegatorProps.insert( pDelegateProps->Name ); + } // create the map for the aggregate properties sal_Int32 nAggregateHandle = _nFirstAggregateId; pMergedProps += nDelegatorProps; - for ( ; nMPLoop < nMergedProps; ++nMPLoop, ++pMergedProps, ++pAggregateProps ) + for ( ; nMPLoop < nMergedProps; ++pAggregateProps ) { + // if the aggregate property is present at the delegatee already, ignore it + if ( aDelegatorProps.find( pAggregateProps->Name ) != aDelegatorProps.end() ) + { + --nMergedProps; + continue; + } + // next aggregate property - remember it *pMergedProps = *pAggregateProps; - // determine the handle for the property which we will expose to the ourside world + // determine the handle for the property which we will expose to the outside world sal_Int32 nHandle = -1; // ask the infor service first if ( _pInfoService ) @@ -123,7 +139,11 @@ OPropertyArrayAggregationHelper::OPropertyArrayAggregationHelper( // remember the accessor for this property m_aPropertyAccessors[ nHandle ] = OPropertyAccessor( pMergedProps->Handle, nMPLoop, sal_True ); pMergedProps->Handle = nHandle; + + ++nMPLoop; + ++pMergedProps; } + m_aProperties.realloc( nMergedProps ); pMergedProps = m_aProperties.getArray(); // reset, needed again below // sortieren der Properties nach Namen |