1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #include "precompiled_sd.hxx"
25
26 #include "tools/ConfigurationAccess.hxx"
27 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 #include <com/sun/star/beans/PropertyValue.hpp>
29 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
30 #include <com/sun/star/util/XChangesBatch.hpp>
31 #include <comphelper/processfactory.hxx>
32 #include <tools/diagnose_ex.h>
33
34 using namespace ::com::sun::star;
35 using namespace ::com::sun::star::uno;
36 using ::rtl::OUString;
37
38 namespace sd { namespace tools {
39
ConfigurationAccess(const Reference<XComponentContext> & rxContext,const OUString & rsRootName,const WriteMode eMode)40 ConfigurationAccess::ConfigurationAccess (
41 const Reference<XComponentContext>& rxContext,
42 const OUString& rsRootName,
43 const WriteMode eMode)
44 : mxRoot()
45 {
46 Reference<lang::XMultiComponentFactory> xFactory (rxContext->getServiceManager());
47 if (xFactory.is())
48 {
49 Reference<lang::XMultiServiceFactory> xProvider (
50 xFactory->createInstanceWithContext(
51 OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"),
52 rxContext),
53 UNO_QUERY);
54 if (xProvider.is())
55 Initialize(xProvider, rsRootName, eMode);
56 }
57 }
58
59
60
61
ConfigurationAccess(const OUString & rsRootName,const WriteMode eMode)62 ConfigurationAccess::ConfigurationAccess (
63 const OUString& rsRootName,
64 const WriteMode eMode)
65 : mxRoot()
66 {
67 Reference<lang::XMultiServiceFactory> xProvider (
68 ::comphelper::getProcessServiceFactory()->createInstance(
69 OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")),
70 UNO_QUERY);
71 if (xProvider.is())
72 Initialize(xProvider, rsRootName, eMode);
73 }
74
75
76
77
Initialize(const Reference<lang::XMultiServiceFactory> & rxProvider,const OUString & rsRootName,const WriteMode eMode)78 void ConfigurationAccess::Initialize (
79 const Reference<lang::XMultiServiceFactory>& rxProvider,
80 const OUString& rsRootName,
81 const WriteMode eMode)
82 {
83 try
84 {
85 Sequence<Any> aCreationArguments(3);
86 aCreationArguments[0] = makeAny(beans::PropertyValue(
87 OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")),
88 0,
89 makeAny(rsRootName),
90 beans::PropertyState_DIRECT_VALUE));
91 aCreationArguments[1] = makeAny(beans::PropertyValue(
92 OUString(RTL_CONSTASCII_USTRINGPARAM("depth")),
93 0,
94 makeAny((sal_Int32)-1),
95 beans::PropertyState_DIRECT_VALUE));
96 aCreationArguments[2] = makeAny(beans::PropertyValue(
97 OUString(RTL_CONSTASCII_USTRINGPARAM("lazywrite")),
98 0,
99 makeAny(true),
100 beans::PropertyState_DIRECT_VALUE));
101 OUString sAccessService;
102 if (eMode == READ_ONLY)
103 sAccessService = OUString(RTL_CONSTASCII_USTRINGPARAM(
104 "com.sun.star.configuration.ConfigurationAccess"));
105 else
106 sAccessService = OUString(RTL_CONSTASCII_USTRINGPARAM(
107 "com.sun.star.configuration.ConfigurationUpdateAccess"));
108
109 mxRoot = rxProvider->createInstanceWithArguments(
110 sAccessService,
111 aCreationArguments);
112 }
113 catch (Exception&)
114 {
115 DBG_UNHANDLED_EXCEPTION();
116 }
117 }
118
119
120
121
GetConfigurationNode(const OUString & sPathToNode)122 Any ConfigurationAccess::GetConfigurationNode (
123 const OUString& sPathToNode)
124 {
125 return GetConfigurationNode(
126 Reference<container::XHierarchicalNameAccess>(mxRoot, UNO_QUERY),
127 sPathToNode);
128 }
129
130
131
132
GetConfigurationNode(const css::uno::Reference<css::container::XHierarchicalNameAccess> & rxNode,const OUString & sPathToNode)133 Any ConfigurationAccess::GetConfigurationNode (
134 const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
135 const OUString& sPathToNode)
136 {
137 if (sPathToNode.getLength() == 0)
138 return Any(rxNode);
139
140 try
141 {
142 if (rxNode.is())
143 {
144 return rxNode->getByHierarchicalName(sPathToNode);
145 }
146 }
147 catch (Exception& rException)
148 {
149 OSL_TRACE ("caught exception while getting configuration node %s: %s",
150 ::rtl::OUStringToOString(sPathToNode, RTL_TEXTENCODING_UTF8).getStr(),
151 ::rtl::OUStringToOString(rException.Message, RTL_TEXTENCODING_UTF8).getStr());
152 }
153
154 return Any();
155 }
156
157
158
159
CommitChanges(void)160 void ConfigurationAccess::CommitChanges (void)
161 {
162 Reference<util::XChangesBatch> xConfiguration (mxRoot, UNO_QUERY);
163 if (xConfiguration.is())
164 xConfiguration->commitChanges();
165 }
166
167
168
169
ForAll(const Reference<container::XNameAccess> & rxContainer,const::std::vector<OUString> & rArguments,const Functor & rFunctor)170 void ConfigurationAccess::ForAll (
171 const Reference<container::XNameAccess>& rxContainer,
172 const ::std::vector<OUString>& rArguments,
173 const Functor& rFunctor)
174 {
175 if (rxContainer.is())
176 {
177 ::std::vector<Any> aValues(rArguments.size());
178 Sequence<OUString> aKeys (rxContainer->getElementNames());
179 for (sal_Int32 nItemIndex=0; nItemIndex<aKeys.getLength(); ++nItemIndex)
180 {
181 const OUString& rsKey (aKeys[nItemIndex]);
182 Reference<container::XNameAccess> xSetItem (rxContainer->getByName(rsKey), UNO_QUERY);
183 if (xSetItem.is())
184 {
185 // Get from the current item of the container the children
186 // that match the names in the rArguments list.
187 for (sal_uInt32 nValueIndex=0; nValueIndex<aValues.size(); ++nValueIndex)
188 aValues[nValueIndex] = xSetItem->getByName(rArguments[nValueIndex]);
189 }
190 rFunctor(rsKey, aValues);
191 }
192 }
193 }
194
195
196
197
FillList(const Reference<container::XNameAccess> & rxContainer,const::rtl::OUString & rsArgument,::std::vector<OUString> & rList)198 void ConfigurationAccess::FillList(
199 const Reference<container::XNameAccess>& rxContainer,
200 const ::rtl::OUString& rsArgument,
201 ::std::vector<OUString>& rList)
202 {
203 try
204 {
205 if (rxContainer.is())
206 {
207 Sequence<OUString> aKeys (rxContainer->getElementNames());
208 rList.resize(aKeys.getLength());
209 for (sal_Int32 nItemIndex=0; nItemIndex<aKeys.getLength(); ++nItemIndex)
210 {
211 Reference<container::XNameAccess> xSetItem (
212 rxContainer->getByName(aKeys[nItemIndex]), UNO_QUERY);
213 if (xSetItem.is())
214 {
215 xSetItem->getByName(rsArgument) >>= rList[nItemIndex];
216 }
217 }
218 }
219 }
220 catch (RuntimeException&)
221 {}
222 }
223
224
225 } } // end of namespace sd::tools
226
227