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