Line data Source code
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 : #include "sal/config.h"
11 :
12 : #include <cassert>
13 :
14 : #include "boost/shared_ptr.hpp"
15 : #include "com/sun/star/configuration/ReadOnlyAccess.hpp"
16 : #include "com/sun/star/configuration/ReadWriteAccess.hpp"
17 : #include "com/sun/star/configuration/XReadWriteAccess.hpp"
18 : #include "com/sun/star/configuration/theDefaultProvider.hpp"
19 : #include "com/sun/star/container/XHierarchicalNameAccess.hpp"
20 : #include "com/sun/star/container/XHierarchicalNameReplace.hpp"
21 : #include "com/sun/star/container/XNameAccess.hpp"
22 : #include "com/sun/star/container/XNameContainer.hpp"
23 : #include "com/sun/star/lang/Locale.hpp"
24 : #include "com/sun/star/lang/XLocalizable.hpp"
25 : #include "com/sun/star/uno/Any.hxx"
26 : #include "com/sun/star/uno/Reference.hxx"
27 : #include "com/sun/star/uno/XComponentContext.hpp"
28 : #include "comphelper/configuration.hxx"
29 : #include "rtl/instance.hxx"
30 : #include "rtl/ustrbuf.hxx"
31 : #include "rtl/ustring.hxx"
32 : #include "i18nlangtag/languagetag.hxx"
33 :
34 : namespace {
35 :
36 : struct TheConfigurationWrapper:
37 : public rtl::StaticWithArg<
38 : comphelper::detail::ConfigurationWrapper,
39 : css::uno::Reference< css::uno::XComponentContext >,
40 : TheConfigurationWrapper >
41 : {};
42 :
43 2 : OUString getDefaultLocale(
44 : css::uno::Reference< css::uno::XComponentContext > const & context)
45 : {
46 : return LanguageTag(
47 : css::uno::Reference< css::lang::XLocalizable >(
48 : css::configuration::theDefaultProvider::get(context),
49 4 : css::uno::UNO_QUERY_THROW)->
50 4 : getLocale()).getBcp47(false);
51 : }
52 :
53 0 : OUString extendLocalizedPath(OUString const & path, OUString const & locale) {
54 0 : OUStringBuffer buf(path);
55 0 : buf.append("/['*");
56 : SAL_WARN_IF(
57 : locale.match("*"), "comphelper",
58 : "Locale \"" << locale << "\" starts with \"*\"");
59 : assert(locale.indexOf('&') == -1);
60 : assert(locale.indexOf('"') == -1);
61 : assert(locale.indexOf('\'') == -1);
62 0 : buf.append(locale);
63 0 : buf.append("']");
64 0 : return buf.makeStringAndClear();
65 : }
66 :
67 : }
68 :
69 : boost::shared_ptr< comphelper::ConfigurationChanges >
70 1 : comphelper::ConfigurationChanges::create(
71 : css::uno::Reference< css::uno::XComponentContext > const & context)
72 : {
73 1 : return TheConfigurationWrapper::get(context).createChanges();
74 : }
75 :
76 :
77 1 : comphelper::ConfigurationChanges::~ConfigurationChanges() {}
78 :
79 1 : void comphelper::ConfigurationChanges::commit() const {
80 1 : access_->commitChanges();
81 1 : }
82 :
83 1 : comphelper::ConfigurationChanges::ConfigurationChanges(
84 : css::uno::Reference< css::uno::XComponentContext > const & context):
85 : access_(
86 : css::configuration::ReadWriteAccess::create(
87 1 : context, getDefaultLocale(context)))
88 1 : {}
89 :
90 1 : void comphelper::ConfigurationChanges::setPropertyValue(
91 : OUString const & path, css::uno::Any const & value) const
92 : {
93 1 : access_->replaceByHierarchicalName(path, value);
94 1 : }
95 :
96 : css::uno::Reference< css::container::XHierarchicalNameReplace >
97 0 : comphelper::ConfigurationChanges::getGroup(OUString const & path) const
98 : {
99 : return css::uno::Reference< css::container::XHierarchicalNameReplace >(
100 0 : access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
101 : }
102 :
103 : css::uno::Reference< css::container::XNameContainer >
104 0 : comphelper::ConfigurationChanges::getSet(OUString const & path) const
105 : {
106 : return css::uno::Reference< css::container::XNameContainer >(
107 0 : access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
108 : }
109 :
110 : comphelper::detail::ConfigurationWrapper const &
111 7 : comphelper::detail::ConfigurationWrapper::get(
112 : css::uno::Reference< css::uno::XComponentContext > const & context)
113 : {
114 7 : return TheConfigurationWrapper::get(context);
115 : }
116 :
117 1 : comphelper::detail::ConfigurationWrapper::ConfigurationWrapper(
118 : css::uno::Reference< css::uno::XComponentContext > const & context):
119 : context_(context),
120 1 : access_(css::configuration::ReadOnlyAccess::create(context, "*"))
121 1 : {}
122 :
123 1 : comphelper::detail::ConfigurationWrapper::~ConfigurationWrapper() {}
124 :
125 5 : css::uno::Any comphelper::detail::ConfigurationWrapper::getPropertyValue(
126 : OUString const & path) const
127 : {
128 5 : return access_->getByHierarchicalName(path);
129 : }
130 :
131 1 : void comphelper::detail::ConfigurationWrapper::setPropertyValue(
132 : boost::shared_ptr< ConfigurationChanges > const & batch,
133 : OUString const & path, com::sun::star::uno::Any const & value) const
134 : {
135 : assert(batch.get() != 0);
136 1 : batch->setPropertyValue(path, value);
137 1 : }
138 :
139 : css::uno::Any
140 0 : comphelper::detail::ConfigurationWrapper::getLocalizedPropertyValue(
141 : OUString const & path) const
142 : {
143 0 : return access_->getByHierarchicalName(
144 0 : extendLocalizedPath(path, getDefaultLocale(context_)));
145 : }
146 :
147 0 : void comphelper::detail::ConfigurationWrapper::setLocalizedPropertyValue(
148 : boost::shared_ptr< ConfigurationChanges > const & batch,
149 : OUString const & path, com::sun::star::uno::Any const & value) const
150 : {
151 : assert(batch.get() != 0);
152 0 : batch->setPropertyValue(path, value);
153 0 : }
154 :
155 : css::uno::Reference< css::container::XHierarchicalNameAccess >
156 0 : comphelper::detail::ConfigurationWrapper::getGroupReadOnly(
157 : OUString const & path) const
158 : {
159 : return css::uno::Reference< css::container::XHierarchicalNameAccess >(
160 : (css::configuration::ReadOnlyAccess::create(
161 0 : context_, getDefaultLocale(context_))->
162 0 : getByHierarchicalName(path)),
163 0 : css::uno::UNO_QUERY_THROW);
164 : }
165 :
166 : css::uno::Reference< css::container::XHierarchicalNameReplace >
167 0 : comphelper::detail::ConfigurationWrapper::getGroupReadWrite(
168 : boost::shared_ptr< ConfigurationChanges > const & batch,
169 : OUString const & path) const
170 : {
171 : assert(batch.get() != 0);
172 0 : return batch->getGroup(path);
173 : }
174 :
175 : css::uno::Reference< css::container::XNameAccess >
176 1 : comphelper::detail::ConfigurationWrapper::getSetReadOnly(
177 : OUString const & path) const
178 : {
179 : return css::uno::Reference< css::container::XNameAccess >(
180 : (css::configuration::ReadOnlyAccess::create(
181 2 : context_, getDefaultLocale(context_))->
182 1 : getByHierarchicalName(path)),
183 2 : css::uno::UNO_QUERY_THROW);
184 : }
185 :
186 : css::uno::Reference< css::container::XNameContainer >
187 0 : comphelper::detail::ConfigurationWrapper::getSetReadWrite(
188 : boost::shared_ptr< ConfigurationChanges > const & batch,
189 : OUString const & path) const
190 : {
191 : assert(batch.get() != 0);
192 0 : return batch->getSet(path);
193 : }
194 :
195 : boost::shared_ptr< comphelper::ConfigurationChanges >
196 1 : comphelper::detail::ConfigurationWrapper::createChanges() const {
197 : return boost::shared_ptr< ConfigurationChanges >(
198 1 : new ConfigurationChanges(context_));
199 : }
200 :
201 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|