1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_comphelper.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //_______________________________________________
28*b1cdbd2cSJim Jagielski // includes
29*b1cdbd2cSJim Jagielski #include <comphelper/configurationhelper.hxx>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XSingleServiceFactory.hpp>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski //_______________________________________________
36*b1cdbd2cSJim Jagielski // namespace
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski namespace comphelper{
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //_______________________________________________
43*b1cdbd2cSJim Jagielski // definitions
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski //-----------------------------------------------
openConfig(const css::uno::Reference<css::lang::XMultiServiceFactory> xSMGR,const::rtl::OUString & sPackage,sal_Int32 eMode)46*b1cdbd2cSJim Jagielski css::uno::Reference< css::uno::XInterface > ConfigurationHelper::openConfig(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR   ,
47*b1cdbd2cSJim Jagielski                                                                             const ::rtl::OUString&                                       sPackage,
48*b1cdbd2cSJim Jagielski                                                                                   sal_Int32                                              eMode   )
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski     css::uno::Reference< css::lang::XMultiServiceFactory > xConfigProvider(
51*b1cdbd2cSJim Jagielski         xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), css::uno::UNO_QUERY_THROW);
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski     ::comphelper::SequenceAsVector< css::uno::Any > lParams;
54*b1cdbd2cSJim Jagielski     css::beans::PropertyValue                       aParam ;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski     // set root path
57*b1cdbd2cSJim Jagielski     aParam.Name    = ::rtl::OUString::createFromAscii("nodepath");
58*b1cdbd2cSJim Jagielski     aParam.Value <<= sPackage;
59*b1cdbd2cSJim Jagielski     lParams.push_back(css::uno::makeAny(aParam));
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski     // enable all locales mode
62*b1cdbd2cSJim Jagielski     if ((eMode & ConfigurationHelper::E_ALL_LOCALES)==ConfigurationHelper::E_ALL_LOCALES)
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         aParam.Name    = ::rtl::OUString::createFromAscii("locale");
65*b1cdbd2cSJim Jagielski         aParam.Value <<= ::rtl::OUString::createFromAscii("*");
66*b1cdbd2cSJim Jagielski         lParams.push_back(css::uno::makeAny(aParam));
67*b1cdbd2cSJim Jagielski     }
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     // enable lazy writing
70*b1cdbd2cSJim Jagielski     sal_Bool bLazy = ((eMode & ConfigurationHelper::E_LAZY_WRITE)==ConfigurationHelper::E_LAZY_WRITE);
71*b1cdbd2cSJim Jagielski     aParam.Name    = ::rtl::OUString::createFromAscii("lazywrite");
72*b1cdbd2cSJim Jagielski     aParam.Value   = css::uno::makeAny(bLazy);
73*b1cdbd2cSJim Jagielski     lParams.push_back(css::uno::makeAny(aParam));
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski     // open it
76*b1cdbd2cSJim Jagielski     css::uno::Reference< css::uno::XInterface > xCFG;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     sal_Bool bReadOnly = ((eMode & ConfigurationHelper::E_READONLY)==ConfigurationHelper::E_READONLY);
79*b1cdbd2cSJim Jagielski     if (bReadOnly)
80*b1cdbd2cSJim Jagielski         xCFG = xConfigProvider->createInstanceWithArguments(
81*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"),
82*b1cdbd2cSJim Jagielski                 lParams.getAsConstList());
83*b1cdbd2cSJim Jagielski     else
84*b1cdbd2cSJim Jagielski         xCFG = xConfigProvider->createInstanceWithArguments(
85*b1cdbd2cSJim Jagielski                 ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
86*b1cdbd2cSJim Jagielski                 lParams.getAsConstList());
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     return xCFG;
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski //-----------------------------------------------
readRelativeKey(const css::uno::Reference<css::uno::XInterface> xCFG,const::rtl::OUString & sRelPath,const::rtl::OUString & sKey)92*b1cdbd2cSJim Jagielski css::uno::Any ConfigurationHelper::readRelativeKey(const css::uno::Reference< css::uno::XInterface > xCFG    ,
93*b1cdbd2cSJim Jagielski                                                    const ::rtl::OUString&                            sRelPath,
94*b1cdbd2cSJim Jagielski                                                    const ::rtl::OUString&                            sKey    )
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski     css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW);
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     css::uno::Reference< css::beans::XPropertySet > xProps;
99*b1cdbd2cSJim Jagielski     xAccess->getByHierarchicalName(sRelPath) >>= xProps;
100*b1cdbd2cSJim Jagielski     if (!xProps.is())
101*b1cdbd2cSJim Jagielski     {
102*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer sMsg(256);
103*b1cdbd2cSJim Jagielski         sMsg.appendAscii("The requested path \"");
104*b1cdbd2cSJim Jagielski         sMsg.append     (sRelPath               );
105*b1cdbd2cSJim Jagielski         sMsg.appendAscii("\" does not exists."  );
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski         throw css::container::NoSuchElementException(
108*b1cdbd2cSJim Jagielski                     sMsg.makeStringAndClear(),
109*b1cdbd2cSJim Jagielski                     css::uno::Reference< css::uno::XInterface >());
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski     return xProps->getPropertyValue(sKey);
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski //-----------------------------------------------
writeRelativeKey(const css::uno::Reference<css::uno::XInterface> xCFG,const::rtl::OUString & sRelPath,const::rtl::OUString & sKey,const css::uno::Any & aValue)115*b1cdbd2cSJim Jagielski void ConfigurationHelper::writeRelativeKey(const css::uno::Reference< css::uno::XInterface > xCFG    ,
116*b1cdbd2cSJim Jagielski                                            const ::rtl::OUString&                            sRelPath,
117*b1cdbd2cSJim Jagielski                                            const ::rtl::OUString&                            sKey    ,
118*b1cdbd2cSJim Jagielski                                            const css::uno::Any&                              aValue  )
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski     css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW);
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     css::uno::Reference< css::beans::XPropertySet > xProps;
123*b1cdbd2cSJim Jagielski     xAccess->getByHierarchicalName(sRelPath) >>= xProps;
124*b1cdbd2cSJim Jagielski     if (!xProps.is())
125*b1cdbd2cSJim Jagielski     {
126*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer sMsg(256);
127*b1cdbd2cSJim Jagielski         sMsg.appendAscii("The requested path \"");
128*b1cdbd2cSJim Jagielski         sMsg.append     (sRelPath               );
129*b1cdbd2cSJim Jagielski         sMsg.appendAscii("\" does not exists."  );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski         throw css::container::NoSuchElementException(
132*b1cdbd2cSJim Jagielski                     sMsg.makeStringAndClear(),
133*b1cdbd2cSJim Jagielski                     css::uno::Reference< css::uno::XInterface >());
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski     xProps->setPropertyValue(sKey, aValue);
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski //-----------------------------------------------
makeSureSetNodeExists(const css::uno::Reference<css::uno::XInterface> xCFG,const::rtl::OUString & sRelPathToSet,const::rtl::OUString & sSetNode)139*b1cdbd2cSJim Jagielski css::uno::Reference< css::uno::XInterface > ConfigurationHelper::makeSureSetNodeExists(const css::uno::Reference< css::uno::XInterface > xCFG         ,
140*b1cdbd2cSJim Jagielski                                                                                        const ::rtl::OUString&                            sRelPathToSet,
141*b1cdbd2cSJim Jagielski                                                                                        const ::rtl::OUString&                            sSetNode     )
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski     css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW);
144*b1cdbd2cSJim Jagielski     css::uno::Reference< css::container::XNameAccess > xSet;
145*b1cdbd2cSJim Jagielski     xAccess->getByHierarchicalName(sRelPathToSet) >>= xSet;
146*b1cdbd2cSJim Jagielski     if (!xSet.is())
147*b1cdbd2cSJim Jagielski     {
148*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer sMsg(256);
149*b1cdbd2cSJim Jagielski         sMsg.appendAscii("The requested path \"");
150*b1cdbd2cSJim Jagielski         sMsg.append     (sRelPathToSet          );
151*b1cdbd2cSJim Jagielski         sMsg.appendAscii("\" does not exists."  );
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski         throw css::container::NoSuchElementException(
154*b1cdbd2cSJim Jagielski                     sMsg.makeStringAndClear(),
155*b1cdbd2cSJim Jagielski                     css::uno::Reference< css::uno::XInterface >());
156*b1cdbd2cSJim Jagielski     }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski     css::uno::Reference< css::uno::XInterface > xNode;
159*b1cdbd2cSJim Jagielski     if (xSet->hasByName(sSetNode))
160*b1cdbd2cSJim Jagielski         xSet->getByName(sSetNode) >>= xNode;
161*b1cdbd2cSJim Jagielski     else
162*b1cdbd2cSJim Jagielski     {
163*b1cdbd2cSJim Jagielski         css::uno::Reference< css::lang::XSingleServiceFactory > xNodeFactory(xSet, css::uno::UNO_QUERY_THROW);
164*b1cdbd2cSJim Jagielski         xNode = xNodeFactory->createInstance();
165*b1cdbd2cSJim Jagielski         css::uno::Reference< css::container::XNameContainer > xSetReplace(xSet, css::uno::UNO_QUERY_THROW);
166*b1cdbd2cSJim Jagielski         xSetReplace->insertByName(sSetNode, css::uno::makeAny(xNode));
167*b1cdbd2cSJim Jagielski     }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     return xNode;
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski //-----------------------------------------------
readDirectKey(const css::uno::Reference<css::lang::XMultiServiceFactory> xSMGR,const::rtl::OUString & sPackage,const::rtl::OUString & sRelPath,const::rtl::OUString & sKey,sal_Int32 eMode)173*b1cdbd2cSJim Jagielski css::uno::Any ConfigurationHelper::readDirectKey(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR   ,
174*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString&                                       sPackage,
175*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString&                                       sRelPath,
176*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString&                                       sKey    ,
177*b1cdbd2cSJim Jagielski                                                        sal_Int32                                              eMode   )
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     css::uno::Reference< css::uno::XInterface > xCFG = ConfigurationHelper::openConfig(xSMGR, sPackage, eMode);
180*b1cdbd2cSJim Jagielski     return ConfigurationHelper::readRelativeKey(xCFG, sRelPath, sKey);
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski //-----------------------------------------------
writeDirectKey(const css::uno::Reference<css::lang::XMultiServiceFactory> xSMGR,const::rtl::OUString & sPackage,const::rtl::OUString & sRelPath,const::rtl::OUString & sKey,const css::uno::Any & aValue,sal_Int32 eMode)184*b1cdbd2cSJim Jagielski void ConfigurationHelper::writeDirectKey(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR   ,
185*b1cdbd2cSJim Jagielski                                          const ::rtl::OUString&                                       sPackage,
186*b1cdbd2cSJim Jagielski                                          const ::rtl::OUString&                                       sRelPath,
187*b1cdbd2cSJim Jagielski                                          const ::rtl::OUString&                                       sKey    ,
188*b1cdbd2cSJim Jagielski                                          const css::uno::Any&                                         aValue  ,
189*b1cdbd2cSJim Jagielski                                                sal_Int32                                              eMode   )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski     css::uno::Reference< css::uno::XInterface > xCFG = ConfigurationHelper::openConfig(xSMGR, sPackage, eMode);
192*b1cdbd2cSJim Jagielski     ConfigurationHelper::writeRelativeKey(xCFG, sRelPath, sKey, aValue);
193*b1cdbd2cSJim Jagielski     ConfigurationHelper::flush(xCFG);
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski //-----------------------------------------------
flush(const css::uno::Reference<css::uno::XInterface> & xCFG)197*b1cdbd2cSJim Jagielski void ConfigurationHelper::flush(const css::uno::Reference< css::uno::XInterface >& xCFG)
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski     css::uno::Reference< css::util::XChangesBatch > xBatch(xCFG, css::uno::UNO_QUERY_THROW);
200*b1cdbd2cSJim Jagielski     xBatch->commitChanges();
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski } // namespace comphelper
204