summaryrefslogtreecommitdiffstats
path: root/cppuhelper/source/servicemanager.hxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-01-15 16:28:30 +0100
committerStephan Bergmann <sbergman@redhat.com>2013-01-16 11:39:02 +0100
commit3250fad6374ef276e198faabbb1d655adeeb28f0 (patch)
tree345130b5605d3f90b968cbd3366ad2f3f1957ddb /cppuhelper/source/servicemanager.hxx
parentfdo#42387 Fixed Merging of cells in RTL Tables in impress (diff)
downloadcore-3250fad6374ef276e198faabbb1d655adeeb28f0.tar.gz
core-3250fad6374ef276e198faabbb1d655adeeb28f0.zip
Extract servicemanager and typedescriptionprovider from defaultbootstrap
Change-Id: I94fe7e68c5a49e591a625e9bf62108acac69428d
Diffstat (limited to 'cppuhelper/source/servicemanager.hxx')
-rw-r--r--cppuhelper/source/servicemanager.hxx338
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: */