LibreOffice Module cppuhelper (master) 1
servicemanager.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#pragma once
11
12#include <sal/config.h>
13
14#include <cassert>
15#include <unordered_map>
16#include <memory>
17#include <mutex>
18#include <string_view>
19#include <utility>
20#include <vector>
21
22#include <com/sun/star/beans/XPropertySet.hpp>
23#include <com/sun/star/beans/XPropertySetInfo.hpp>
24#include <com/sun/star/container/XContentEnumerationAccess.hpp>
25#include <com/sun/star/container/XSet.hpp>
26#include <com/sun/star/lang/XEventListener.hpp>
27#include <com/sun/star/lang/XInitialization.hpp>
28#include <com/sun/star/lang/XMultiComponentFactory.hpp>
29#include <com/sun/star/lang/XMultiServiceFactory.hpp>
30#include <com/sun/star/lang/XServiceInfo.hpp>
31#include <com/sun/star/uno/Reference.hxx>
34#include <rtl/ustring.hxx>
35
36namespace com::sun::star::lang {
37 class XSingleComponentFactory;
38}
39namespace cppu { struct ContextEntry_Init; }
40namespace com :: sun :: star :: lang { class XSingleServiceFactory; }
41namespace com :: sun :: star :: uno { class XComponentContext; }
42
43class RegistryKey;
44
45namespace cppuhelper {
46
47extern "C" {
48
49typedef css::uno::XInterface * ImplementationConstructorFn(
50 css::uno::XComponentContext *, css::uno::Sequence<css::uno::Any> const &);
51
52}
53
54typedef std::function<css::uno::XInterface * (css::uno::XComponentContext *, css::uno::Sequence<css::uno::Any> const&)> WrapperConstructorFn;
55
56typedef cppu::WeakComponentImplHelper<
57 css::lang::XServiceInfo, css::lang::XMultiServiceFactory,
58 css::lang::XMultiComponentFactory, css::container::XSet,
59 css::container::XContentEnumerationAccess, css::beans::XPropertySet,
60 css::beans::XPropertySetInfo, css::lang::XEventListener,
61 css::lang::XInitialization>
63
66{
67public:
68 struct Data {
69 Data() = default;
70 Data(const Data&) = delete;
71 const Data& operator=(const Data&) = delete;
72
75 OUString theName, OUString theLoader,
76 OUString theUri, OUString theEnvironment,
77 OUString theConstructorName,
78 OUString thePrefix,
79 bool theIsSingleInstance,
80 css::uno::Reference< css::uno::XComponentContext > theAlienContext,
81 OUString theRdbFile):
82 name(std::move(theName)), loader(std::move(theLoader)), uri(std::move(theUri)), environment(std::move(theEnvironment)),
83 constructorName(std::move(theConstructorName)), prefix(std::move(thePrefix)),
84 isSingleInstance(theIsSingleInstance),
85 alienContext(std::move(theAlienContext)), rdbFile(std::move(theRdbFile)),
86 constructorFn(nullptr), status(STATUS_NEW), dispose(true)
87 {}
88
90 OUString theName,
91 css::uno::Reference< css::lang::XSingleComponentFactory >
92 const & theFactory1,
93 css::uno::Reference< css::lang::XSingleServiceFactory > const &
94 theFactory2,
95 css::uno::Reference< css::lang::XComponent > theComponent):
96 name(std::move(theName)), isSingleInstance(false), constructorFn(nullptr),
97 factory1(theFactory1), factory2(theFactory2),
98 component(std::move(theComponent)), status(STATUS_LOADED), dispose(true)
99 { assert(theFactory1.is() || theFactory2.is()); }
100
102 const Implementation& operator=(const Implementation&) = delete;
103
104 css::uno::Reference<css::uno::XInterface> createInstance(
105 css::uno::Reference<css::uno::XComponentContext> const &
106 context,
107 bool singletonRequest);
108
109 css::uno::Reference<css::uno::XInterface>
111 css::uno::Reference<css::uno::XComponentContext> const &
112 context,
113 bool singletonRequest,
114 css::uno::Sequence<css::uno::Any> const & arguments);
115
116 bool shallDispose() const { return isSingleInstance || !singletons.empty(); }
117
119
120 // Logically, exactly one of constructorFn, factory1, factory2 should
121 // be set. However, there are two exceptions: For one, when
122 // constructorFn is set, ServiceManager::createContentEnumeration will
123 // store the necessary ImplementationWrapper in factory1 (so that
124 // multiple calls to createContentEnumeration will return the same
125 // wrapper). For another, when factory1 should be set but status is
126 // STATUS_NEW, factory1 is not yet set (and when status is
127 // STATUS_WRAPPER, factory1 is merely set to an
128 // ImplementationWrapper---also due to a
129 // ServiceManager::createContentEnumeration call---and will be
130 // loaded later).
131 OUString name;
132 OUString loader;
133 OUString uri;
134 OUString environment;
136 OUString prefix;
138 css::uno::Reference< css::uno::XComponentContext > alienContext;
139 OUString rdbFile;
140 std::vector< OUString > services;
141 std::vector< OUString > singletons;
143 css::uno::Reference< css::lang::XSingleComponentFactory > factory1;
144 css::uno::Reference< css::lang::XSingleServiceFactory > factory2;
145 css::uno::Reference< css::lang::XComponent > component;
147
148 std::mutex mutex;
149 css::uno::Reference<css::uno::XInterface> singleInstance;
150 css::uno::Reference< css::lang::XComponent > disposeInstance;
152
153 private:
154 css::uno::Reference<css::uno::XInterface> doCreateInstance(
155 css::uno::Reference<css::uno::XComponentContext> const & context);
156
157 css::uno::Reference<css::uno::XInterface> doCreateInstanceWithArguments(
158 css::uno::Reference<css::uno::XComponentContext> const & context,
159 css::uno::Sequence<css::uno::Any> const & arguments);
160
162 bool singletonRequest,
163 css::uno::Reference<css::uno::XInterface> const & instance);
164 };
165
166 typedef std::unordered_map< OUString, std::shared_ptr< Implementation > >
168
169 typedef
170 std::unordered_map<
171 css::uno::Reference< css::lang::XServiceInfo >,
172 std::shared_ptr< Implementation > >
174
175 typedef
176 std::unordered_map<
177 OUString,
178 std::vector< std::shared_ptr< Implementation > > >
180
185 };
186
188
190 const ServiceManager& operator=(const ServiceManager&) = delete;
191
192 using ServiceManagerBase::acquire;
193 using ServiceManagerBase::release;
194
195 void init(std::u16string_view rdbUris);
196
198 css::uno::Reference< css::uno::XComponentContext > const & context)
199 {
200 assert(context.is());
201 assert(!context_.is());
202 context_ = context;
203 }
204
206 std::vector< cppu::ContextEntry_Init > * entries);
207
208 css::uno::Reference< css::uno::XComponentContext > const & getContext()
209 const
210 {
211 assert(context_.is());
212 return context_;
213 }
214
216 css::uno::Reference< css::uno::XComponentContext > const & context,
217 std::shared_ptr< Data::Implementation > const & implementation);
218
219private:
220 virtual ~ServiceManager() override;
221
222 virtual void SAL_CALL disposing() override;
223
224 virtual OUString SAL_CALL getImplementationName() override;
225
226 virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
227
228 virtual css::uno::Sequence< OUString > SAL_CALL
229 getSupportedServiceNames() override;
230
231 virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(
232 OUString const & aServiceSpecifier) override;
233
234 virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
236 OUString const & ServiceSpecifier,
237 css::uno::Sequence< css::uno::Any > const & Arguments) override;
238
239 virtual css::uno::Sequence< OUString > SAL_CALL
240 getAvailableServiceNames() override;
241
242 virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
244 OUString const & aServiceSpecifier,
245 css::uno::Reference< css::uno::XComponentContext > const & Context) override;
246
247 virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
249 OUString const & ServiceSpecifier,
250 css::uno::Sequence< css::uno::Any > const & Arguments,
251 css::uno::Reference< css::uno::XComponentContext > const & Context) override;
252
253 virtual css::uno::Type SAL_CALL getElementType() override;
254
255 virtual sal_Bool SAL_CALL hasElements() override;
256
257 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
258 createEnumeration() override;
259
260 virtual sal_Bool SAL_CALL has(css::uno::Any const & aElement) override;
261
262 virtual void SAL_CALL insert(css::uno::Any const & aElement) override;
263
264 virtual void SAL_CALL remove(css::uno::Any const & aElement) override;
265
266 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL
267 createContentEnumeration(OUString const & aServiceName) override;
268
269 virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL
270 getPropertySetInfo() override;
271
272 virtual void SAL_CALL setPropertyValue(
273 OUString const & aPropertyName, css::uno::Any const & aValue) override;
274
275 virtual css::uno::Any SAL_CALL getPropertyValue(
276 OUString const & PropertyName) override;
277
278 virtual void SAL_CALL addPropertyChangeListener(
279 OUString const & aPropertyName,
280 css::uno::Reference< css::beans::XPropertyChangeListener > const &
281 xListener) override;
282
283 virtual void SAL_CALL removePropertyChangeListener(
284 OUString const & aPropertyName,
285 css::uno::Reference< css::beans::XPropertyChangeListener > const &
286 aListener) override;
287
288 virtual void SAL_CALL addVetoableChangeListener(
289 OUString const & PropertyName,
290 css::uno::Reference< css::beans::XVetoableChangeListener > const &
291 aListener) override;
292
293 virtual void SAL_CALL removeVetoableChangeListener(
294 OUString const & PropertyName,
295 css::uno::Reference< css::beans::XVetoableChangeListener > const &
296 aListener) override;
297
298 virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties() override;
299
300 virtual css::beans::Property SAL_CALL getPropertyByName(
301 OUString const & aName) override;
302
303 virtual sal_Bool SAL_CALL hasPropertyByName(OUString const & Name) override;
304
305 virtual void SAL_CALL disposing(css::lang::EventObject const & Source) override;
306
307 virtual void SAL_CALL initialize(
308 css::uno::Sequence<css::uno::Any> const & aArguments)
309 override;
310
311 // needs to be called with rBHelper.rMutex locked:
312 bool isDisposed() const { return rBHelper.bDisposed || rBHelper.bInDispose; }
313
315 css::uno::Reference< css::lang::XComponent > const & component);
316
317 void readRdbDirectory(std::u16string_view uri, bool optional);
318
319 void readRdbFile(OUString const & uri, bool optional);
320
321 bool readLegacyRdbFile(OUString const & uri);
322
323 OUString readLegacyRdbString(
324 std::u16string_view uri, RegistryKey & key,
325 OUString const & path);
326
328 std::u16string_view uri, RegistryKey & key,
329 OUString const & path, std::vector< OUString > * strings);
330
331 void insertRdbFiles(
332 std::vector< OUString > const & uris,
333 css::uno::Reference< css::uno::XComponentContext > const &
334 alientContext);
335
337 css::uno::Reference< css::lang::XServiceInfo > const & factoryInfo);
338
339 bool insertExtraData(Data const & extra);
340
341 void removeRdbFiles(std::vector< OUString > const & uris);
342
344 css::uno::Reference< css::lang::XServiceInfo > const & factoryInfo,
345 bool removeListener);
346
347 void removeImplementation(const OUString & name);
348
349 std::shared_ptr< Data::Implementation > findServiceImplementation(
350 css::uno::Reference< css::uno::XComponentContext > const & context,
351 OUString const & specifier);
352
354
355 css::uno::Reference< css::uno::XComponentContext > context_;
357};
358
359}
360
361/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
base class for all classes who want derive from cppu::WeakComponentImplHelperXX.
Definition: basemutex.hxx:40
mutable::osl::Mutex m_aMutex
Definition: basemutex.hxx:42
virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties() override
bool readLegacyRdbFile(OUString const &uri)
virtual css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames() override
const ServiceManager & operator=(const ServiceManager &)=delete
virtual void SAL_CALL removeVetoableChangeListener(OUString const &PropertyName, css::uno::Reference< css::beans::XVetoableChangeListener > const &aListener) override
void loadImplementation(css::uno::Reference< css::uno::XComponentContext > const &context, std::shared_ptr< Data::Implementation > const &implementation)
bool insertExtraData(Data const &extra)
void addSingletonContextEntries(std::vector< cppu::ContextEntry_Init > *entries)
void removeEventListenerFromComponent(css::uno::Reference< css::lang::XComponent > const &component)
virtual void SAL_CALL setPropertyValue(OUString const &aPropertyName, css::uno::Any const &aValue) override
virtual sal_Bool SAL_CALL hasPropertyByName(OUString const &Name) override
virtual void SAL_CALL insert(css::uno::Any const &aElement) override
void insertLegacyFactory(css::uno::Reference< css::lang::XServiceInfo > const &factoryInfo)
virtual sal_Bool SAL_CALL hasElements() override
virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override
virtual void SAL_CALL removePropertyChangeListener(OUString const &aPropertyName, css::uno::Reference< css::beans::XPropertyChangeListener > const &aListener) override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual ~ServiceManager() override
virtual void SAL_CALL disposing() override
void readRdbDirectory(std::u16string_view uri, bool optional)
virtual css::beans::Property SAL_CALL getPropertyByName(OUString const &aName) override
virtual void SAL_CALL addVetoableChangeListener(OUString const &PropertyName, css::uno::Reference< css::beans::XVetoableChangeListener > const &aListener) override
void insertRdbFiles(std::vector< OUString > const &uris, css::uno::Reference< css::uno::XComponentContext > const &alientContext)
void readLegacyRdbStrings(std::u16string_view uri, RegistryKey &key, OUString const &path, std::vector< OUString > *strings)
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArgumentsAndContext(OUString const &ServiceSpecifier, css::uno::Sequence< css::uno::Any > const &Arguments, css::uno::Reference< css::uno::XComponentContext > const &Context) override
std::shared_ptr< Data::Implementation > findServiceImplementation(css::uno::Reference< css::uno::XComponentContext > const &context, OUString const &specifier)
void removeImplementation(const OUString &name)
bool removeLegacyFactory(css::uno::Reference< css::lang::XServiceInfo > const &factoryInfo, bool removeListener)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual sal_Bool SAL_CALL has(css::uno::Any const &aElement) override
css::uno::Reference< css::uno::XComponentContext > const & getContext() const
virtual void SAL_CALL remove(css::uno::Any const &aElement) override
void removeRdbFiles(std::vector< OUString > const &uris)
void setContext(css::uno::Reference< css::uno::XComponentContext > const &context)
virtual css::uno::Any SAL_CALL getPropertyValue(OUString const &PropertyName) override
void preloadImplementations()
Used only by LibreOfficeKit when used by Online to pre-initialize.
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(OUString const &aServiceSpecifier) override
virtual OUString SAL_CALL getImplementationName() override
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithContext(OUString const &aServiceSpecifier, css::uno::Reference< css::uno::XComponentContext > const &Context) override
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments(OUString const &ServiceSpecifier, css::uno::Sequence< css::uno::Any > const &Arguments) override
ServiceManager(const ServiceManager &)=delete
virtual void SAL_CALL initialize(css::uno::Sequence< css::uno::Any > const &aArguments) override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createContentEnumeration(OUString const &aServiceName) override
virtual sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
void readRdbFile(OUString const &uri, bool optional)
css::uno::Reference< css::uno::XComponentContext > context_
OUString readLegacyRdbString(std::u16string_view uri, RegistryKey &key, OUString const &path)
virtual css::uno::Type SAL_CALL getElementType() override
virtual void SAL_CALL addPropertyChangeListener(OUString const &aPropertyName, css::uno::Reference< css::beans::XPropertyChangeListener > const &xListener) override
void init(std::u16string_view rdbUris)
css::uno::XInterface * ImplementationConstructorFn(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
cppu::WeakComponentImplHelper< css::lang::XServiceInfo, css::lang::XMultiServiceFactory, css::lang::XMultiComponentFactory, css::container::XSet, css::container::XContentEnumerationAccess, css::beans::XPropertySet, css::beans::XPropertySetInfo, css::lang::XEventListener, css::lang::XInitialization > ServiceManagerBase
std::function< css::uno::XInterface *(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)> WrapperConstructorFn
css::uno::Reference< css::lang::XComponent > disposeInstance
css::uno::Reference< css::uno::XInterface > createInstanceWithArguments(css::uno::Reference< css::uno::XComponentContext > const &context, bool singletonRequest, css::uno::Sequence< css::uno::Any > const &arguments)
const Implementation & operator=(const Implementation &)=delete
css::uno::Reference< css::uno::XInterface > doCreateInstanceWithArguments(css::uno::Reference< css::uno::XComponentContext > const &context, css::uno::Sequence< css::uno::Any > const &arguments)
css::uno::Reference< css::uno::XInterface > createInstance(css::uno::Reference< css::uno::XComponentContext > const &context, bool singletonRequest)
Implementation(OUString theName, OUString theLoader, OUString theUri, OUString theEnvironment, OUString theConstructorName, OUString thePrefix, bool theIsSingleInstance, css::uno::Reference< css::uno::XComponentContext > theAlienContext, OUString theRdbFile)
css::uno::Reference< css::uno::XInterface > doCreateInstance(css::uno::Reference< css::uno::XComponentContext > const &context)
css::uno::Reference< css::lang::XSingleServiceFactory > factory2
css::uno::Reference< css::lang::XSingleComponentFactory > factory1
Implementation(OUString theName, css::uno::Reference< css::lang::XSingleComponentFactory > const &theFactory1, css::uno::Reference< css::lang::XSingleServiceFactory > const &theFactory2, css::uno::Reference< css::lang::XComponent > theComponent)
Implementation(const Implementation &)=delete
css::uno::Reference< css::uno::XInterface > singleInstance
css::uno::Reference< css::lang::XComponent > component
void updateDisposeInstance(bool singletonRequest, css::uno::Reference< css::uno::XInterface > const &instance)
css::uno::Reference< css::uno::XComponentContext > alienContext
std::unordered_map< OUString, std::shared_ptr< Implementation > > NamedImplementations
DynamicImplementations dynamicImplementations
std::unordered_map< css::uno::Reference< css::lang::XServiceInfo >, std::shared_ptr< Implementation > > DynamicImplementations
const Data & operator=(const Data &)=delete
NamedImplementations namedImplementations
std::unordered_map< OUString, std::vector< std::shared_ptr< Implementation > > > ImplementationMap
unsigned char sal_Bool