diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-03-06 18:56:18 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-03-06 18:56:18 +0000 |
commit | 6c247ca5d0e404c9cfbeb381a4509fcc6aea9365 (patch) | |
tree | a9d921aa624ae7cfce571f30df14e76df0497a32 /sfx2/source/doc/sfxmodelfactory.cxx | |
parent | 94eaed4274a278307647a4d01fbfffa1648dbc2d (diff) |
INTEGRATION: CWS odbmacros2 (1.1.2); FILE ADDED
2007/12/22 13:40:45 fs 1.1.2.3: during #i49133#: extended the previous change (per AS' request) so the factory method does not take two booleans, but a 64 bit field instead
2007/12/18 07:32:07 fs 1.1.2.2: #i10000#
2007/12/11 22:42:49 fs 1.1.2.1: #i49133# helper for creating a service factory for SfxBaseModel-derived classes
Diffstat (limited to 'sfx2/source/doc/sfxmodelfactory.cxx')
-rw-r--r-- | sfx2/source/doc/sfxmodelfactory.cxx | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/sfx2/source/doc/sfxmodelfactory.cxx b/sfx2/source/doc/sfxmodelfactory.cxx new file mode 100644 index 000000000000..01dca61bf536 --- /dev/null +++ b/sfx2/source/doc/sfxmodelfactory.cxx @@ -0,0 +1,248 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: sfxmodelfactory.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2008-03-06 19:56:18 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sfx2.hxx" + +#ifndef SFX2_SFXMODELFACTORY_HXX +#include "sfx2/sfxmodelfactory.hxx" +#endif + +/** === begin UNO includes === **/ +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +/** === end UNO includes === **/ + +#include <comphelper/namedvaluecollection.hxx> +#include <cppuhelper/implbase2.hxx> + +#include <algorithm> +#include <functional> + +//........................................................................ +namespace sfx2 +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::lang::XMultiServiceFactory; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::lang::XSingleServiceFactory; + using ::com::sun::star::lang::XServiceInfo; + using ::com::sun::star::beans::NamedValue; + using ::com::sun::star::beans::PropertyValue; + using ::com::sun::star::lang::XInitialization; + /** === end UNO using === **/ + + //==================================================================== + //= SfxModelFactory - declaration + //==================================================================== + typedef ::cppu::WeakImplHelper2 < XSingleServiceFactory + , XServiceInfo + > SfxModelFactory_Base; + /** implements a XSingleServiceFactory which can be used to created instances + of classes derived from SfxBaseModel + + In opposite to the default implementations from module cppuhelper, this + factory evaluates certain creation arguments (passed to createInstanceWithArguments) + and passes them to the factory function of the derived class. + */ + class SfxModelFactory : public SfxModelFactory_Base + { + public: + SfxModelFactory( + const Reference< XMultiServiceFactory >& _rxServiceFactory, + const ::rtl::OUString& _rImplementationName, + const SfxModelFactoryFunc _pComponentFactoryFunc, + const Sequence< ::rtl::OUString >& _rServiceNames + ); + + // XSingleServiceFactory + virtual Reference< XInterface > SAL_CALL createInstance( ) throw (Exception, RuntimeException); + virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& aArguments ) throw (Exception, RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); + virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); + + protected: + virtual ~SfxModelFactory(); + + private: + Reference< XInterface > impl_createInstance( const sal_uInt64 _nCreationFlags ) const; + + private: + const Reference< XMultiServiceFactory > m_xServiceFactory; + const ::rtl::OUString m_sImplementationName; + const Sequence< ::rtl::OUString > m_aServiceNames; + const SfxModelFactoryFunc m_pComponentFactoryFunc; + }; + + //==================================================================== + //= SfxModelFactory - implementation + //==================================================================== + //-------------------------------------------------------------------- + SfxModelFactory::SfxModelFactory( const Reference< XMultiServiceFactory >& _rxServiceFactory, + const ::rtl::OUString& _rImplementationName, const SfxModelFactoryFunc _pComponentFactoryFunc, + const Sequence< ::rtl::OUString >& _rServiceNames ) + :m_xServiceFactory( _rxServiceFactory ) + ,m_sImplementationName( _rImplementationName ) + ,m_aServiceNames( _rServiceNames ) + ,m_pComponentFactoryFunc( _pComponentFactoryFunc ) + { + } + + //-------------------------------------------------------------------- + SfxModelFactory::~SfxModelFactory() + { + } + + //-------------------------------------------------------------------- + Reference< XInterface > SfxModelFactory::impl_createInstance( const sal_uInt64 _nCreationFlags ) const + { + return (*m_pComponentFactoryFunc)( m_xServiceFactory, _nCreationFlags ); + } + + //-------------------------------------------------------------------- + Reference< XInterface > SAL_CALL SfxModelFactory::createInstance( ) throw (Exception, RuntimeException) + { + return impl_createInstance( 0 ); + return createInstanceWithArguments( Sequence< Any >() ); + } + + //-------------------------------------------------------------------- + namespace + { + struct IsSpecialArgument : public ::std::unary_function< Any, bool > + { + static bool isSpecialArgumentName( const ::rtl::OUString& _rValueName ) + { + return _rValueName.equalsAscii( "EmbeddedObject" ) + || _rValueName.equalsAscii( "EmbeddedScriptSupport" ); + } + + bool operator()( const Any& _rArgument ) const + { + NamedValue aNamedValue; + if ( ( _rArgument >>= aNamedValue ) && isSpecialArgumentName( aNamedValue.Name ) ) + return true; + PropertyValue aPropertyValue; + if ( ( _rArgument >>= aPropertyValue ) && isSpecialArgumentName( aPropertyValue.Name ) ) + return true; + return false; + } + }; + } + + //-------------------------------------------------------------------- + Reference< XInterface > SAL_CALL SfxModelFactory::createInstanceWithArguments( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException) + { + ::comphelper::NamedValueCollection aArgs( _rArguments ); + const sal_Bool bEmbeddedObject = aArgs.getOrDefault( "EmbeddedObject", sal_False ); + const sal_Bool bScriptSupport = aArgs.getOrDefault( "EmbeddedScriptSupport", sal_True ); + + sal_uInt64 nCreationFlags = + ( bEmbeddedObject ? SFXMODEL_EMBEDDED_OBJECT : 0 ) + | ( bScriptSupport ? 0 : SFXMODEL_DISABLE_EMBEDDED_SCRIPTS ); + + Reference< XInterface > xInstance( impl_createInstance( nCreationFlags ) ); + + // to mimic the bahaviour of the default factory's createInstanceWithArguments, we initialize + // the object with the given arguments, stripped by the two special ones + Sequence< Any > aStrippedArguments( _rArguments.getLength() ); + Any* pStrippedArgs = aStrippedArguments.getArray(); + Any* pStrippedArgsEnd = ::std::remove_copy_if( + _rArguments.getConstArray(), + _rArguments.getConstArray() + _rArguments.getLength(), + pStrippedArgs, + IsSpecialArgument() + ); + aStrippedArguments.realloc( pStrippedArgsEnd - pStrippedArgs ); + + if ( aStrippedArguments.getLength() ) + { + Reference< XInitialization > xModelInit( xInstance, UNO_QUERY ); + OSL_ENSURE( xModelInit.is(), "SfxModelFactory::createInstanceWithArguments: no XInitialization!" ); + if ( xModelInit.is() ) + xModelInit->initialize( aStrippedArguments ); + } + + return xInstance; + } + + //-------------------------------------------------------------------- + ::rtl::OUString SAL_CALL SfxModelFactory::getImplementationName( ) throw (RuntimeException) + { + return m_sImplementationName; + } + + //-------------------------------------------------------------------- + ::sal_Bool SAL_CALL SfxModelFactory::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException) + { + return ::std::find( + m_aServiceNames.getConstArray(), + m_aServiceNames.getConstArray() + m_aServiceNames.getLength(), + _rServiceName + ) != m_aServiceNames.getConstArray() + m_aServiceNames.getLength(); + } + + //-------------------------------------------------------------------- + Sequence< ::rtl::OUString > SAL_CALL SfxModelFactory::getSupportedServiceNames( ) throw (RuntimeException) + { + return m_aServiceNames; + } + + //-------------------------------------------------------------------- + Reference< XSingleServiceFactory > createSfxModelFactory( const Reference< XMultiServiceFactory >& _rxServiceFactory, + const ::rtl::OUString& _rImplementationName, const SfxModelFactoryFunc _pComponentFactoryFunc, + const Sequence< ::rtl::OUString >& _rServiceNames ) + { + return new SfxModelFactory( _rxServiceFactory, _rImplementationName, _pComponentFactoryFunc, _rServiceNames ); + } + +//........................................................................ +} // namespace sfx2 +//........................................................................ |