diff options
Diffstat (limited to 'cppuhelper/source/servicemanager.hxx')
-rw-r--r-- | cppuhelper/source/servicemanager.hxx | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/cppuhelper/source/servicemanager.hxx b/cppuhelper/source/servicemanager.hxx new file mode 100644 index 000000000000..e4a9dfaa9055 --- /dev/null +++ b/cppuhelper/source/servicemanager.hxx @@ -0,0 +1,338 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_CPPUHELPER_SOURCE_SERVICEMANAGER_HXX +#define INCLUDED_CPPUHELPER_SOURCE_SERVICEMANAGER_HXX + +#include "sal/config.h" + +#include <cassert> +#include <map> +#include <vector> + +#include "boost/noncopyable.hpp" +#include "boost/shared_ptr.hpp" +#include "com/sun/star/beans/XPropertySet.hpp" +#include "com/sun/star/beans/XPropertySetInfo.hpp" +#include "com/sun/star/container/XContentEnumerationAccess.hpp" +#include "com/sun/star/container/XSet.hpp" +#include "com/sun/star/lang/XEventListener.hpp" +#include "com/sun/star/lang/XMultiComponentFactory.hpp" +#include "com/sun/star/lang/XMultiServiceFactory.hpp" +#include "com/sun/star/lang/XServiceInfo.hpp" +#include "com/sun/star/lang/XSingleServiceFactory.hpp" +#include "com/sun/star/uno/XComponentContext.hpp" +#include "com/sun/star/uno/Reference.hxx" +#include "cppuhelper/compbase8.hxx" +#include "osl/mutex.hxx" +#include "registry/registry.hxx" +#include "rtl/ustring.hxx" + +namespace cppuhelper { + +typedef cppu::WeakComponentImplHelper8< + css::lang::XServiceInfo, css::lang::XMultiServiceFactory, + css::lang::XMultiComponentFactory, css::container::XSet, + css::container::XContentEnumerationAccess, css::beans::XPropertySet, + css::beans::XPropertySetInfo, css::lang::XEventListener > +ServiceManagerBase; + +class ServiceManager: + private osl::Mutex, public ServiceManagerBase, private boost::noncopyable +{ +public: + struct Data: private boost::noncopyable { + struct ImplementationInfo: private boost::noncopyable { + ImplementationInfo( + rtl::OUString const & theName, rtl::OUString const & theLoader, + rtl::OUString const & theUri, rtl::OUString const & thePrefix, + css::uno::Reference< css::uno::XComponentContext > const & + theAlienContext, + rtl::OUString const & theRdbFile): + name(theName), loader(theLoader), uri(theUri), + prefix(thePrefix), alienContext(theAlienContext), + rdbFile(theRdbFile) + {} + + explicit ImplementationInfo(rtl::OUString const & theName): + name(theName) {} + + rtl::OUString const name; + rtl::OUString const loader; + rtl::OUString const uri; + rtl::OUString const prefix; + css::uno::Reference< css::uno::XComponentContext > const + alienContext; + rtl::OUString const rdbFile; + std::vector< rtl::OUString > services; + std::vector< rtl::OUString > singletons; + }; + + struct Implementation: private boost::noncopyable { + Implementation( + rtl::OUString const & name, rtl::OUString const & loader, + rtl::OUString const & uri, rtl::OUString const & prefix, + css::uno::Reference< css::uno::XComponentContext > const & + alienContext, + rtl::OUString const & rdbFile): + info( + new ImplementationInfo( + name, loader, uri, prefix, alienContext, rdbFile)), + loaded(false) + {} + + Implementation( + rtl::OUString const & name, + css::uno::Reference< css::lang::XSingleComponentFactory > + const & theFactory1, + css::uno::Reference< css::lang::XSingleServiceFactory > const & + theFactory2, + css::uno::Reference< css::lang::XComponent > const & + theComponent): + info(new ImplementationInfo(name)), factory1(theFactory1), + factory2(theFactory2), component(theComponent), loaded(true) + {} + + boost::shared_ptr< ImplementationInfo > info; + css::uno::Reference< css::lang::XSingleComponentFactory > factory1; + css::uno::Reference< css::lang::XSingleServiceFactory > factory2; + css::uno::Reference< css::lang::XComponent > component; + bool loaded; + }; + + typedef std::map< rtl::OUString, boost::shared_ptr< Implementation > > + NamedImplementations; + + typedef + std::map< + css::uno::Reference< css::lang::XServiceInfo >, + boost::shared_ptr< Implementation > > + DynamicImplementations; + + typedef + std::map< + rtl::OUString, + std::vector< boost::shared_ptr< Implementation > > > + ImplementationMap; + + NamedImplementations namedImplementations; + DynamicImplementations dynamicImplementations; + ImplementationMap services; + ImplementationMap singletons; + }; + + explicit ServiceManager(rtl::OUString const & rdbUris): + ServiceManagerBase(*static_cast< osl::Mutex * >(this)) + { readRdbs(rdbUris); } + + using ServiceManagerBase::acquire; + using ServiceManagerBase::release; + + void setContext( + css::uno::Reference< css::uno::XComponentContext > const & context) + { + assert(context.is()); + assert(!context_.is()); + context_ = context; + } + + css::uno::Reference< css::uno::XComponentContext > getContext() const { + assert(context_.is()); + return context_; + } + + Data const & getData() const { return data_; } + + void loadImplementation( + css::uno::Reference< css::uno::XComponentContext > const & context, + boost::shared_ptr< Data::ImplementationInfo > const & info, + css::uno::Reference< css::lang::XSingleComponentFactory > * factory1, + css::uno::Reference< css::lang::XSingleServiceFactory > * factory2); + + virtual rtl::OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException); + + virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName) + throw (css::uno::RuntimeException); + + virtual css::uno::Sequence< rtl::OUString > SAL_CALL + getSupportedServiceNames() throw (css::uno::RuntimeException); + + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( + rtl::OUString const & aServiceSpecifier) + throw (css::uno::Exception, css::uno::RuntimeException); + + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL + createInstanceWithArguments( + rtl::OUString const & ServiceSpecifier, + css::uno::Sequence< css::uno::Any > const & Arguments) + throw (css::uno::Exception, css::uno::RuntimeException); + + virtual css::uno::Sequence< rtl::OUString > SAL_CALL + getAvailableServiceNames() throw (css::uno::RuntimeException); + + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL + createInstanceWithContext( + rtl::OUString const & aServiceSpecifier, + css::uno::Reference< css::uno::XComponentContext > const & Context) + throw (css::uno::Exception, css::uno::RuntimeException); + + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL + createInstanceWithArgumentsAndContext( + rtl::OUString const & ServiceSpecifier, + css::uno::Sequence< css::uno::Any > const & Arguments, + css::uno::Reference< css::uno::XComponentContext > const & Context) + throw (css::uno::Exception, css::uno::RuntimeException); + + virtual css::uno::Type SAL_CALL getElementType() + throw (css::uno::RuntimeException); + + virtual sal_Bool SAL_CALL hasElements() throw (css::uno::RuntimeException); + + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL + createEnumeration() throw (css::uno::RuntimeException); + + virtual sal_Bool SAL_CALL has(css::uno::Any const & aElement) + throw (css::uno::RuntimeException); + + virtual void SAL_CALL insert(css::uno::Any const & aElement) + throw ( + css::lang::IllegalArgumentException, + css::container::ElementExistException, css::uno::RuntimeException); + + virtual void SAL_CALL remove(css::uno::Any const & aElement) + throw ( + css::lang::IllegalArgumentException, + css::container::NoSuchElementException, css::uno::RuntimeException); + + virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL + createContentEnumeration(rtl::OUString const & aServiceName) + throw (css::uno::RuntimeException); + + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL + getPropertySetInfo() throw (css::uno::RuntimeException); + + virtual void SAL_CALL setPropertyValue( + rtl::OUString const & aPropertyName, css::uno::Any const & aValue) + throw ( + css::beans::UnknownPropertyException, + css::beans::PropertyVetoException, + css::lang::IllegalArgumentException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual css::uno::Any SAL_CALL getPropertyValue( + rtl::OUString const & PropertyName) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual void SAL_CALL addPropertyChangeListener( + rtl::OUString const & aPropertyName, + css::uno::Reference< css::beans::XPropertyChangeListener > const & + xListener) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual void SAL_CALL removePropertyChangeListener( + rtl::OUString const & aPropertyName, + css::uno::Reference< css::beans::XPropertyChangeListener > const & + aListener) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual void SAL_CALL addVetoableChangeListener( + rtl::OUString const & PropertyName, + css::uno::Reference< css::beans::XVetoableChangeListener > const & + aListener) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual void SAL_CALL removeVetoableChangeListener( + rtl::OUString const & PropertyName, + css::uno::Reference< css::beans::XVetoableChangeListener > const & + aListener) + throw ( + css::beans::UnknownPropertyException, + css::lang::WrappedTargetException, css::uno::RuntimeException); + + virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties() + throw (css::uno::RuntimeException); + + virtual css::beans::Property SAL_CALL getPropertyByName( + rtl::OUString const & aName) + throw ( + css::beans::UnknownPropertyException, css::uno::RuntimeException); + + virtual sal_Bool SAL_CALL hasPropertyByName(rtl::OUString const & Name) + throw (css::uno::RuntimeException); + + virtual void SAL_CALL disposing(css::lang::EventObject const & Source) + throw (css::uno::RuntimeException); + +private: + virtual ~ServiceManager() {} + + virtual void SAL_CALL disposing(); + + // needs to be called with rBHelper.rMutex locked: + bool isDisposed() { return rBHelper.bDisposed || rBHelper.bInDispose; } + + void removeEventListenerFromComponent( + css::uno::Reference< css::lang::XComponent > const & component); + + void readRdbs(rtl::OUString const & uris); + + void readRdbDirectory(rtl::OUString const & uri, bool optional); + + void readRdbFile(rtl::OUString const & uri, bool optional); + + bool readLegacyRdbFile(rtl::OUString const & uri); + + rtl::OUString readLegacyRdbString( + rtl::OUString const & uri, RegistryKey & key, + rtl::OUString const & path); + + void readLegacyRdbStrings( + rtl::OUString const & uri, RegistryKey & key, + rtl::OUString const & path, std::vector< rtl::OUString > * strings); + + void insertRdbFiles( + std::vector< rtl::OUString > const & uris, + css::uno::Reference< css::uno::XComponentContext > const & + alientContext); + + void insertLegacyFactory( + css::uno::Reference< css::lang::XServiceInfo > const & factoryInfo); + + bool insertExtraData(Data const & extra); + + void removeRdbFiles(std::vector< rtl::OUString > const & uris); + + bool removeLegacyFactory( + css::uno::Reference< css::lang::XServiceInfo > const & factoryInfo, + bool removeListener); + + void removeImplementation(rtl::OUString name); + + boost::shared_ptr< Data::Implementation > findServiceImplementation( + css::uno::Reference< css::uno::XComponentContext > const & context, + rtl::OUString const & specifier); + + css::uno::Reference< css::uno::XComponentContext > context_; + Data data_; +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |