1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <sal/config.h>
24 #include <com/sun/star/beans/NamedValue.hpp>
25 #include <com/sun/star/container/NoSuchElementException.hpp>
26 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
27 #include <com/sun/star/container/XNamed.hpp>
28 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
29 #include <com/sun/star/lang/XServiceInfo.hpp>
30 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
31 #include <com/sun/star/registry/InvalidRegistryException.hpp>
32 #include <com/sun/star/registry/InvalidValueException.hpp>
33 #include <com/sun/star/registry/RegistryKeyType.hpp>
34 #include <com/sun/star/registry/RegistryValueType.hpp>
35 #include <com/sun/star/registry/XRegistryKey.hpp>
36 #include <com/sun/star/registry/XSimpleRegistry.hpp>
37 #include <com/sun/star/uno/Any.hxx>
38 #include <com/sun/star/uno/DeploymentException.hpp>
39 #include <com/sun/star/uno/Exception.hpp>
40 #include <com/sun/star/uno/Reference.hxx>
41 #include <com/sun/star/uno/RuntimeException.hpp>
42 #include <com/sun/star/uno/Sequence.hxx>
43 #include <com/sun/star/uno/Type.hxx>
44 #include <com/sun/star/uno/TypeClass.hpp>
45 #include <com/sun/star/uno/XComponentContext.hpp>
46 #include <com/sun/star/uno/XInterface.hpp>
47 #include <com/sun/star/util/XFlushable.hpp>
48 #include <cppu/unotype.hxx>
49 #include <cppuhelper/exc_hlp.hxx>
50 #include <cppuhelper/implbase.hxx>
51 #include <cppuhelper/supportsservice.hxx>
52 #include <cppuhelper/weak.hxx>
54 #include <rtl/ustring.hxx>
56 #include <sal/types.h>
58 namespace com::sun::star::util
{
62 namespace configmgr::configuration_registry
{
67 public cppu::WeakImplHelper
<
68 css::lang::XServiceInfo
, css::registry::XSimpleRegistry
,
69 css::util::XFlushable
>
72 explicit Service(css::uno::Reference
< css::uno::XComponentContext
> const & context
);
75 Service(const Service
&) = delete;
76 Service
& operator=(const Service
&) = delete;
78 virtual ~Service() override
{}
80 virtual OUString SAL_CALL
getImplementationName() override
81 { return "com.sun.star.comp.configuration.ConfigurationRegistry"; }
83 virtual sal_Bool SAL_CALL
supportsService(OUString
const & ServiceName
) override
84 { return cppu::supportsService(this, ServiceName
); }
86 virtual css::uno::Sequence
< OUString
> SAL_CALL
87 getSupportedServiceNames() override
88 { return { "com.sun.star.configuration.ConfigurationRegistry" }; }
90 virtual OUString SAL_CALL
getURL() override
;
92 virtual void SAL_CALL
open(
93 OUString
const & rURL
, sal_Bool bReadOnly
, sal_Bool
) override
;
95 virtual sal_Bool SAL_CALL
isValid() override
;
97 virtual void SAL_CALL
close() override
;
99 virtual void SAL_CALL
destroy() override
;
101 virtual css::uno::Reference
< css::registry::XRegistryKey
> SAL_CALL
102 getRootKey() override
;
104 virtual sal_Bool SAL_CALL
isReadOnly() override
;
106 virtual void SAL_CALL
mergeKey(OUString
const &, OUString
const &) override
;
108 virtual void SAL_CALL
flush() override
;
110 virtual void SAL_CALL
addFlushListener(
111 css::uno::Reference
< css::util::XFlushListener
> const &) override
;
113 virtual void SAL_CALL
removeFlushListener(
114 css::uno::Reference
< css::util::XFlushListener
> const &) override
;
118 void checkValid_RuntimeException();
122 css::uno::Reference
< css::lang::XMultiServiceFactory
> provider_
;
124 css::uno::Reference
< css::uno::XInterface
> access_
;
128 friend class RegistryKey
;
132 public cppu::WeakImplHelper
< css::registry::XRegistryKey
>
135 RegistryKey(Service
& service
, css::uno::Any value
):
136 service_(service
), value_(std::move(value
)) {}
139 RegistryKey(const RegistryKey
&) = delete;
140 RegistryKey
& operator=(const RegistryKey
&) = delete;
142 virtual ~RegistryKey() override
{}
144 virtual OUString SAL_CALL
getKeyName() override
;
146 virtual sal_Bool SAL_CALL
isReadOnly() override
;
148 virtual sal_Bool SAL_CALL
isValid() override
;
150 virtual css::registry::RegistryKeyType SAL_CALL
getKeyType(
151 OUString
const &) override
;
153 virtual css::registry::RegistryValueType SAL_CALL
getValueType() override
;
155 virtual sal_Int32 SAL_CALL
getLongValue() override
;
157 virtual void SAL_CALL
setLongValue(sal_Int32
) override
;
159 virtual css::uno::Sequence
< sal_Int32
> SAL_CALL
getLongListValue() override
;
161 virtual void SAL_CALL
setLongListValue(
162 css::uno::Sequence
< sal_Int32
> const &) override
;
164 virtual OUString SAL_CALL
getAsciiValue() override
;
166 virtual void SAL_CALL
setAsciiValue(OUString
const &) override
;
168 virtual css::uno::Sequence
< OUString
> SAL_CALL
getAsciiListValue() override
;
170 virtual void SAL_CALL
setAsciiListValue(
171 css::uno::Sequence
< OUString
> const &) override
;
173 virtual OUString SAL_CALL
getStringValue() override
;
175 virtual void SAL_CALL
setStringValue(OUString
const &) override
;
177 virtual css::uno::Sequence
< OUString
> SAL_CALL
getStringListValue() override
;
179 virtual void SAL_CALL
setStringListValue(
180 css::uno::Sequence
< OUString
> const &) override
;
182 virtual css::uno::Sequence
< sal_Int8
> SAL_CALL
getBinaryValue() override
;
184 virtual void SAL_CALL
setBinaryValue(css::uno::Sequence
< sal_Int8
> const &) override
;
186 virtual css::uno::Reference
< css::registry::XRegistryKey
> SAL_CALL
openKey(
187 OUString
const & aKeyName
) override
;
189 virtual css::uno::Reference
< css::registry::XRegistryKey
> SAL_CALL
190 createKey(OUString
const &) override
;
192 virtual void SAL_CALL
closeKey() override
;
194 virtual void SAL_CALL
deleteKey(OUString
const &) override
;
197 css::uno::Sequence
< css::uno::Reference
< css::registry::XRegistryKey
> >
198 SAL_CALL
openKeys() override
;
200 virtual css::uno::Sequence
< OUString
> SAL_CALL
getKeyNames() override
;
202 virtual sal_Bool SAL_CALL
createLink(
203 OUString
const &, OUString
const &) override
;
205 virtual void SAL_CALL
deleteLink(OUString
const &) override
;
207 virtual OUString SAL_CALL
getLinkTarget(OUString
const &) override
;
209 virtual OUString SAL_CALL
getResolvedName(
210 OUString
const & aKeyName
) override
;
213 css::uno::Any value_
;
217 css::uno::Reference
< css::uno::XComponentContext
> const & context
)
220 assert(context
.is());
223 context
->getServiceManager()->createInstanceWithContext(
224 "com.sun.star.configuration.DefaultProvider", context
),
225 css::uno::UNO_QUERY_THROW
);
226 } catch (css::uno::RuntimeException
&) {
228 } catch (css::uno::Exception
& e
) {
229 throw css::uno::DeploymentException(
230 ("component context fails to supply service"
231 " com.sun.star.configuration.DefaultProvider of type"
232 " com.sun.star.lang.XMultiServiceFactory: " + e
.Message
),
237 OUString
Service::getURL() {
238 std::unique_lock
g(mutex_
);
239 checkValid_RuntimeException();
243 void Service::open(OUString
const & rURL
, sal_Bool bReadOnly
, sal_Bool
)
246 std::unique_lock
g(mutex_
);
250 css::uno::Sequence
< css::uno::Any
> args
{ css::uno::Any(
251 css::beans::NamedValue("nodepath", css::uno::Any(rURL
))) };
253 access_
= provider_
->createInstanceWithArguments(
255 ? OUString("com.sun.star.configuration.ConfigurationAccess")
257 "com.sun.star.configuration.ConfigurationUpdateAccess")),
259 } catch (css::uno::RuntimeException
&) {
261 } catch (css::uno::Exception
& e
) {
262 css::uno::Any anyEx
= cppu::getCaughtException();
263 throw css::lang::WrappedTargetRuntimeException(
264 "com.sun.star.configuration.ConfigurationRegistry: open failed: " +
269 readOnly_
= bReadOnly
;
272 sal_Bool
Service::isValid() {
273 std::unique_lock
g(mutex_
);
277 void Service::close()
279 std::unique_lock
g(mutex_
);
284 void Service::destroy()
286 throw css::uno::RuntimeException(
287 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
291 css::uno::Reference
< css::registry::XRegistryKey
> Service::getRootKey()
293 std::unique_lock
g(mutex_
);
295 return new RegistryKey(*this, css::uno::Any(access_
));
298 sal_Bool
Service::isReadOnly() {
299 std::unique_lock
g(mutex_
);
300 checkValid_RuntimeException();
304 void Service::mergeKey(OUString
const &, OUString
const &)
306 throw css::uno::RuntimeException(
307 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
311 void Service::flush()
313 throw css::uno::RuntimeException(
314 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
318 void Service::addFlushListener(
319 css::uno::Reference
< css::util::XFlushListener
> const &)
321 throw css::uno::RuntimeException(
322 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
326 void Service::removeFlushListener(
327 css::uno::Reference
< css::util::XFlushListener
> const &)
329 throw css::uno::RuntimeException(
330 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
334 void Service::checkValid() {
336 throw css::registry::InvalidRegistryException(
337 "com.sun.star.configuration.ConfigurationRegistry: not valid",
342 void Service::checkValid_RuntimeException() {
344 throw css::uno::RuntimeException(
345 "com.sun.star.configuration.ConfigurationRegistry: not valid",
350 void Service::doClose() {
354 OUString
RegistryKey::getKeyName() {
355 std::unique_lock
g(service_
.mutex_
);
356 service_
.checkValid_RuntimeException();
357 css::uno::Reference
< css::container::XNamed
> named
;
358 if (value_
>>= named
) {
359 return named
->getName();
361 throw css::uno::RuntimeException(
362 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
366 sal_Bool
RegistryKey::isReadOnly()
368 std::unique_lock
g(service_
.mutex_
);
369 service_
.checkValid_RuntimeException();
370 return service_
.readOnly_
; //TODO: read-only sub-nodes in update access?
373 sal_Bool
RegistryKey::isValid() {
374 return service_
.isValid();
377 css::registry::RegistryKeyType
RegistryKey::getKeyType(OUString
const &)
379 std::unique_lock
g(service_
.mutex_
);
380 service_
.checkValid();
381 return css::registry::RegistryKeyType_KEY
;
384 css::registry::RegistryValueType
RegistryKey::getValueType()
386 std::unique_lock
g(service_
.mutex_
);
387 service_
.checkValid();
388 css::uno::Type
t(value_
.getValueType());
389 switch (t
.getTypeClass()) {
390 case css::uno::TypeClass_LONG
:
391 return css::registry::RegistryValueType_LONG
;
392 case css::uno::TypeClass_STRING
:
393 return css::registry::RegistryValueType_STRING
;
394 case css::uno::TypeClass_SEQUENCE
:
395 if (t
== cppu::UnoType
< css::uno::Sequence
< sal_Int8
> >::get()) {
396 return css::registry::RegistryValueType_BINARY
;
397 } else if (t
== cppu::UnoType
< css::uno::Sequence
< sal_Int32
> >::get())
399 return css::registry::RegistryValueType_LONGLIST
;
401 cppu::UnoType
< css::uno::Sequence
< OUString
> >::get())
403 return css::registry::RegistryValueType_STRINGLIST
;
407 return css::registry::RegistryValueType_NOT_DEFINED
;
411 sal_Int32
RegistryKey::getLongValue()
413 std::unique_lock
g(service_
.mutex_
);
414 service_
.checkValid();
419 throw css::registry::InvalidValueException(
420 "com.sun.star.configuration.ConfigurationRegistry",
424 void RegistryKey::setLongValue(sal_Int32
)
426 throw css::uno::RuntimeException(
427 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
431 css::uno::Sequence
< sal_Int32
> RegistryKey::getLongListValue()
433 std::unique_lock
g(service_
.mutex_
);
434 service_
.checkValid();
435 css::uno::Sequence
< sal_Int32
> v
;
439 throw css::registry::InvalidValueException(
440 "com.sun.star.configuration.ConfigurationRegistry",
444 void RegistryKey::setLongListValue(css::uno::Sequence
< sal_Int32
> const &)
446 throw css::uno::RuntimeException(
447 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
451 OUString
RegistryKey::getAsciiValue()
453 std::unique_lock
g(service_
.mutex_
);
454 service_
.checkValid();
459 throw css::registry::InvalidValueException(
460 "com.sun.star.configuration.ConfigurationRegistry",
464 void RegistryKey::setAsciiValue(OUString
const &)
466 throw css::uno::RuntimeException(
467 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
471 css::uno::Sequence
< OUString
> RegistryKey::getAsciiListValue()
473 std::unique_lock
g(service_
.mutex_
);
474 service_
.checkValid();
475 css::uno::Sequence
< OUString
> v
;
479 throw css::registry::InvalidValueException(
480 "com.sun.star.configuration.ConfigurationRegistry",
484 void RegistryKey::setAsciiListValue(css::uno::Sequence
< OUString
> const &)
486 throw css::uno::RuntimeException(
487 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
491 OUString
RegistryKey::getStringValue()
493 std::unique_lock
g(service_
.mutex_
);
494 service_
.checkValid();
499 throw css::registry::InvalidValueException(
500 "com.sun.star.configuration.ConfigurationRegistry",
504 void RegistryKey::setStringValue(OUString
const &)
506 throw css::uno::RuntimeException(
507 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
511 css::uno::Sequence
< OUString
> RegistryKey::getStringListValue()
513 std::unique_lock
g(service_
.mutex_
);
514 service_
.checkValid();
515 css::uno::Sequence
< OUString
> v
;
519 throw css::registry::InvalidValueException(
520 "com.sun.star.configuration.ConfigurationRegistry",
524 void RegistryKey::setStringListValue(
525 css::uno::Sequence
< OUString
> const &)
527 throw css::uno::RuntimeException(
528 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
532 css::uno::Sequence
< sal_Int8
> RegistryKey::getBinaryValue()
534 std::unique_lock
g(service_
.mutex_
);
535 service_
.checkValid();
536 css::uno::Sequence
< sal_Int8
> v
;
540 throw css::registry::InvalidValueException(
541 "com.sun.star.configuration.ConfigurationRegistry",
545 void RegistryKey::setBinaryValue(css::uno::Sequence
< sal_Int8
> const &)
547 throw css::uno::RuntimeException(
548 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
552 css::uno::Reference
< css::registry::XRegistryKey
> RegistryKey::openKey(
553 OUString
const & aKeyName
)
555 std::unique_lock
g(service_
.mutex_
);
556 service_
.checkValid_RuntimeException();
557 css::uno::Reference
< css::container::XHierarchicalNameAccess
> access
;
558 if (value_
>>= access
) {
560 return new RegistryKey(
561 service_
, access
->getByHierarchicalName(aKeyName
));
562 } catch (css::container::NoSuchElementException
&) {}
564 return css::uno::Reference
< css::registry::XRegistryKey
>();
567 css::uno::Reference
< css::registry::XRegistryKey
> RegistryKey::createKey(
570 throw css::uno::RuntimeException(
571 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
575 void RegistryKey::closeKey()
577 std::unique_lock
g(service_
.mutex_
);
578 service_
.checkValid_RuntimeException();
581 void RegistryKey::deleteKey(OUString
const &)
583 throw css::uno::RuntimeException(
584 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
588 css::uno::Sequence
< css::uno::Reference
< css::registry::XRegistryKey
> >
589 RegistryKey::openKeys()
591 throw css::uno::RuntimeException(
592 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
596 css::uno::Sequence
< OUString
> RegistryKey::getKeyNames()
598 throw css::uno::RuntimeException(
599 "com.sun.star.configuration.ConfigurationRegistry: not implemented",
603 sal_Bool
RegistryKey::createLink(OUString
const &, OUString
const &)
605 std::unique_lock
g(service_
.mutex_
);
606 service_
.checkValid_RuntimeException();
610 void RegistryKey::deleteLink(OUString
const &)
612 std::unique_lock
g(service_
.mutex_
);
613 service_
.checkValid_RuntimeException();
616 OUString
RegistryKey::getLinkTarget(OUString
const &)
618 std::unique_lock
g(service_
.mutex_
);
619 service_
.checkValid_RuntimeException();
623 OUString
RegistryKey::getResolvedName(OUString
const & aKeyName
)
625 std::unique_lock
g(service_
.mutex_
);
626 service_
.checkValid_RuntimeException();
632 extern "C" SAL_DLLPUBLIC_EXPORT
css::uno::XInterface
*
633 com_sun_star_comp_configuration_ConfigurationRegistry_get_implementation(
634 css::uno::XComponentContext
* context
, css::uno::Sequence
<css::uno::Any
> const&)
636 return cppu::acquire(new Service(context
));
641 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */