diff options
author | Oliver Bolte <obo@openoffice.org> | 2006-03-29 11:42:32 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2006-03-29 11:42:32 +0000 |
commit | ca4f05b0ea5ee8c196e17eb355f2d27b9fb824bb (patch) | |
tree | 6c6df908f3d78e016adced8dbfe1add29b883ddd | |
parent | cf4be47a4141b6e2942953120131bce546366525 (diff) |
INTEGRATION: CWS dba203a (1.1.2); FILE ADDED
2006/03/17 11:12:04 fs 1.1.2.1: outsourced service registration/creation from resource.cxx
-rw-r--r-- | extensions/source/resource/res_services.cxx | 138 | ||||
-rw-r--r-- | extensions/source/resource/res_services.hxx | 81 |
2 files changed, 219 insertions, 0 deletions
diff --git a/extensions/source/resource/res_services.cxx b/extensions/source/resource/res_services.cxx new file mode 100644 index 000000000..1a70659c0 --- /dev/null +++ b/extensions/source/resource/res_services.cxx @@ -0,0 +1,138 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: res_services.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2006-03-29 12:42:21 $ + * + * 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 + * + ************************************************************************/ + +#ifndef EXTENSIONS_RESOURCE_SERVICES_HXX +#include "res_services.hxx" +#endif + +/** === begin UNO includes === **/ +#ifndef _COM_SUN_STAR_REGISTRY_XREGISTRYKEY_HPP_ +#include <com/sun/star/registry/XRegistryKey.hpp> +#endif +/** === end UNO includes === **/ + +/** === begin UNO using === **/ +using ::com::sun::star::registry::XRegistryKey; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::lang::XMultiServiceFactory; +using ::com::sun::star::lang::XSingleServiceFactory; +using ::com::sun::star::uno::UNO_QUERY; +/** === end UNO using === **/ + +#include <vector> + +namespace res +{ + ::std::vector< ComponentInfo > getComponentInfos() + { + ::std::vector< ::res::ComponentInfo > aComponentInfos; + aComponentInfos.push_back( getComponentInfo_VclStringResourceLoader() ); + aComponentInfos.push_back( getComponentInfo_OpenOfficeResourceLoader() ); + return aComponentInfos; + } +} + +extern "C" { + +void SAL_CALL component_getImplementationEnvironment( + const sal_Char ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +sal_Bool SAL_CALL component_writeInfo( void * /*pServiceManager*/, XRegistryKey * pRegistryKey ) +{ + try + { + ::std::vector< ::res::ComponentInfo > aComponentInfos( ::res::getComponentInfos() ); + for ( ::std::vector< ::res::ComponentInfo >::const_iterator loop = aComponentInfos.begin(); + loop != aComponentInfos.end(); + ++loop + ) + { + Reference< XRegistryKey > xNewKey = + pRegistryKey->createKey( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/") ) + + loop->sImplementationName + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/UNO/SERVICES" ) ) ); + + for( sal_Int32 i = 0; i < loop->aSupportedServices.getLength(); ++i ) + xNewKey->createKey( loop->aSupportedServices.getConstArray()[i]); + + if ( loop->sSingletonName.getLength() ) + { + OSL_ENSURE( loop->aSupportedServices.getLength() == 1, "singletons must support exactly one service!" ); + xNewKey = pRegistryKey->createKey( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/") ) + + loop->sImplementationName + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/UNO/SINGLETONS/" ) ) + + loop->sSingletonName ); + xNewKey->setStringValue( loop->aSupportedServices[ 0 ] ); + } + } + + return sal_True; + } + catch (Exception &) + { + // not allowed to throw an exception over the c function. + //OSL_ENSURE( sal_False, "Exception cannot register component!" ); + return sal_False; + } +} + +void * SAL_CALL component_getFactory( + const sal_Char * pImplName, XMultiServiceFactory * /*pServiceManager*/, void * /*pRegistryKey*/ ) +{ + void * pRet = 0; + ::std::vector< ::res::ComponentInfo > aComponentInfos( ::res::getComponentInfos() ); + for ( ::std::vector< ::res::ComponentInfo >::const_iterator loop = aComponentInfos.begin(); + loop != aComponentInfos.end(); + ++loop + ) + { + if ( 0 == loop->sImplementationName.compareToAscii( pImplName ) ) + { + // create the factory + Reference< XSingleServiceFactory > xFactory( ::cppu::createSingleComponentFactory( + loop->pFactory, loop->sImplementationName, loop->aSupportedServices ), + UNO_QUERY ); + // acquire, because we return an interface pointer instead of a reference + xFactory->acquire(); + pRet = xFactory.get(); + } + } + return pRet; +} + +} // extern "C" diff --git a/extensions/source/resource/res_services.hxx b/extensions/source/resource/res_services.hxx new file mode 100644 index 000000000..45fe4a5e1 --- /dev/null +++ b/extensions/source/resource/res_services.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: res_services.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2006-03-29 12:42:32 $ + * + * 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 + * + ************************************************************************/ + +#ifndef EXTENSIONS_RESOURCE_SERVICES_HXX +#define EXTENSIONS_RESOURCE_SERVICES_HXX + +/** === begin UNO includes === **/ +#ifndef _COM_SUN_STAR_UNO_SEQUENCE_HXX_ +#include <com/sun/star/uno/Sequence.hxx> +#endif +#ifndef _COM_SUN_STAR_UNO_REFERENCE_HXX_ +#include <com/sun/star/uno/Reference.hxx> +#endif +#ifndef _COM_SUN_STAR_UNO_XINTERFACE_HPP_ +#include <com/sun/star/uno/XInterface.hpp> +#endif +/** === end UNO includes === **/ + +#ifndef _CPPUHELPER_FACTORY_HXX_ +#include <cppuhelper/factory.hxx> +#endif + +//........................................................................ +namespace res +{ +//........................................................................ + + struct ComponentInfo + { + /// services supported by the component + ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupportedServices; + /// implementation name of the component + ::rtl::OUString sImplementationName; + /** name of the singleton instance of the component, if it is a singleton, empty otherwise + If the component is a singleton, aSupportedServices must contain exactly one element. + */ + ::rtl::OUString sSingletonName; + /// factory for creating the component + ::cppu::ComponentFactoryFunc pFactory; + }; + + ComponentInfo getComponentInfo_VclStringResourceLoader(); + ComponentInfo getComponentInfo_OpenOfficeResourceLoader(); + +//........................................................................ +} // namespace res +//........................................................................ + +#endif // EXTENSIONS_RESOURCE_SERVICES_HXX |