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 
25*b1cdbd2cSJim Jagielski #ifndef EXTENSIONS_OOOIMPROVEMENT_CONFIGURATIONHELPER_HXX
26*b1cdbd2cSJim Jagielski #define EXTENSIONS_OOOIMPROVEMENT_CONFIGURATIONHELPER_HXX
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XInterface.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XChangesBatch.hpp>
33*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski namespace oooimprovement
37*b1cdbd2cSJim Jagielski {
38*b1cdbd2cSJim Jagielski     #ifdef css
39*b1cdbd2cSJim Jagielski         #error css defined globally
40*b1cdbd2cSJim Jagielski     #endif
41*b1cdbd2cSJim Jagielski     #define css ::com::sun::star
42*b1cdbd2cSJim Jagielski     // Copy from comphelper module, we cant use that directly from an extension
43*b1cdbd2cSJim Jagielski     class MyConfigurationHelper
44*b1cdbd2cSJim Jagielski     {
45*b1cdbd2cSJim Jagielski         public:
46*b1cdbd2cSJim Jagielski             //-----------------------------------------------
47*b1cdbd2cSJim Jagielski             /** specify all possible modes, which can be used to open a configuration access.
48*b1cdbd2cSJim Jagielski              *
49*b1cdbd2cSJim Jagielski              *  @see    openConfig()
50*b1cdbd2cSJim Jagielski              *  @see    readDirectKey()
51*b1cdbd2cSJim Jagielski              *  @see    writeDirectKey()
52*b1cdbd2cSJim Jagielski              */
53*b1cdbd2cSJim Jagielski             enum EConfigurationModes
54*b1cdbd2cSJim Jagielski             {
55*b1cdbd2cSJim Jagielski                 /// opens configuration in read/write mode (without LAZY writing!)
56*b1cdbd2cSJim Jagielski                 E_STANDARD = 0,
57*b1cdbd2cSJim Jagielski                 /// configuration will be opened readonly
58*b1cdbd2cSJim Jagielski                 E_READONLY = 1,
59*b1cdbd2cSJim Jagielski                 /// all localized nodes will be interpreted as css::uno::XInterface instead of interpreting it as atomic value nodes
60*b1cdbd2cSJim Jagielski                 E_ALL_LOCALES = 2,
61*b1cdbd2cSJim Jagielski                 /// enable lazy writing
62*b1cdbd2cSJim Jagielski                 E_LAZY_WRITE = 4
63*b1cdbd2cSJim Jagielski             };
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski             //-----------------------------------------------
66*b1cdbd2cSJim Jagielski             /** returns access to the specified configuration package.
67*b1cdbd2cSJim Jagielski              *
68*b1cdbd2cSJim Jagielski              *  This method should be used, if e.g. more then one request to the same
69*b1cdbd2cSJim Jagielski              *  configuration package is needed. The configuration access can be cached
70*b1cdbd2cSJim Jagielski              *  outside and used inbetween.
71*b1cdbd2cSJim Jagielski              *
72*b1cdbd2cSJim Jagielski              *  @param  xSMGR
73*b1cdbd2cSJim Jagielski              *          the uno service manager, which should be used to create the
74*b1cdbd2cSJim Jagielski              *          configuration access.
75*b1cdbd2cSJim Jagielski              *
76*b1cdbd2cSJim Jagielski              *  @param  sPackage
77*b1cdbd2cSJim Jagielski              *          the name of the configuration package.
78*b1cdbd2cSJim Jagielski              *          e.g. <ul>
79*b1cdbd2cSJim Jagielski              *                  <li>org.openoffice.Office.Common</li>
80*b1cdbd2cSJim Jagielski              *                  <li>org.openoffice.Office.Common/Menu</li>
81*b1cdbd2cSJim Jagielski              *               </ul>
82*b1cdbd2cSJim Jagielski              *
83*b1cdbd2cSJim Jagielski              *  @param  eMode
84*b1cdbd2cSJim Jagielski              *          specify the open mode for the returned configuration access.
85*b1cdbd2cSJim Jagielski              *          It's interpreted as a flag field and can be any usefull combination
86*b1cdbd2cSJim Jagielski              *          of values of EConfigurationModes.
87*b1cdbd2cSJim Jagielski              *
88*b1cdbd2cSJim Jagielski              *  @throw  css::uno::Any exceptions the underlying configuration can throw.
89*b1cdbd2cSJim Jagielski              *          E.g. css::uno::Exception if the configuration could not be opened.
90*b1cdbd2cSJim Jagielski              */
91*b1cdbd2cSJim Jagielski             static css::uno::Reference< css::uno::XInterface> openConfig(
92*b1cdbd2cSJim Jagielski                 const css::uno::Reference< css::lang::XMultiServiceFactory> xSMGR,
93*b1cdbd2cSJim Jagielski                 const ::rtl::OUString& sPackage,
94*b1cdbd2cSJim Jagielski                 sal_Int32 eMode);
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski             //-----------------------------------------------
97*b1cdbd2cSJim Jagielski             /** reads the value of an existing(!) configuration key,
98*b1cdbd2cSJim Jagielski              *  which is searched relative to the specified configuration access.
99*b1cdbd2cSJim Jagielski              *
100*b1cdbd2cSJim Jagielski              *  This method must be used in combination with openConfig().
101*b1cdbd2cSJim Jagielski              *  The cached configuration access must be provided here ... and
102*b1cdbd2cSJim Jagielski              *  all operations are made relativ to this access point.
103*b1cdbd2cSJim Jagielski              *
104*b1cdbd2cSJim Jagielski              *  @param  xCFG
105*b1cdbd2cSJim Jagielski              *          the configuration root, where sRelPath should be interpreted.
106*b1cdbd2cSJim Jagielski              *          as relativ path
107*b1cdbd2cSJim Jagielski              *
108*b1cdbd2cSJim Jagielski              *  @param  sRelPath
109*b1cdbd2cSJim Jagielski              *          path relative to xCFG parameter.
110*b1cdbd2cSJim Jagielski              *
111*b1cdbd2cSJim Jagielski              *  @param  sKey
112*b1cdbd2cSJim Jagielski              *          the configuration node, where we should read the value.
113*b1cdbd2cSJim Jagielski              *
114*b1cdbd2cSJim Jagielski              *  @return [css.uno.css::uno::Any]
115*b1cdbd2cSJim Jagielski              *          the value of sKey.
116*b1cdbd2cSJim Jagielski              *
117*b1cdbd2cSJim Jagielski              *  @throw  css::uno::Any exceptions the underlying configuration can throw.
118*b1cdbd2cSJim Jagielski              *          E.g. css::container::NoSuchElementException if the specified
119*b1cdbd2cSJim Jagielski              *          key does not exists.
120*b1cdbd2cSJim Jagielski              */
121*b1cdbd2cSJim Jagielski             static css::uno::Any readRelativeKey(
122*b1cdbd2cSJim Jagielski                 const css::uno::Reference< css::uno::XInterface> xCFG,
123*b1cdbd2cSJim Jagielski                 const ::rtl::OUString& sRelPath,
124*b1cdbd2cSJim Jagielski                 const ::rtl::OUString& sKey);
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski         //-----------------------------------------------
127*b1cdbd2cSJim Jagielski         /** writes a new value for an existing(!) configuration key,
128*b1cdbd2cSJim Jagielski          *  which is searched relative to the specified configuration access.
129*b1cdbd2cSJim Jagielski          *
130*b1cdbd2cSJim Jagielski          *  This method must be used in combination with openConfig().
131*b1cdbd2cSJim Jagielski          *  The cached configuration access must be provided here ... and
132*b1cdbd2cSJim Jagielski          *  all operations are made relativ to this access point.
133*b1cdbd2cSJim Jagielski          *
134*b1cdbd2cSJim Jagielski          *  @param  xCFG
135*b1cdbd2cSJim Jagielski          *          the configuration root, where sRelPath should be interpreted.
136*b1cdbd2cSJim Jagielski          *          as relativ path
137*b1cdbd2cSJim Jagielski          *
138*b1cdbd2cSJim Jagielski          *  @param  sRelPath
139*b1cdbd2cSJim Jagielski          *          path relative to xCFG parameter.
140*b1cdbd2cSJim Jagielski          *
141*b1cdbd2cSJim Jagielski          *  @param  sKey
142*b1cdbd2cSJim Jagielski          *          the configuration node, where we should write the new value.
143*b1cdbd2cSJim Jagielski          *
144*b1cdbd2cSJim Jagielski          *  @param  aValue
145*b1cdbd2cSJim Jagielski          *          the new value for sKey.
146*b1cdbd2cSJim Jagielski          *
147*b1cdbd2cSJim Jagielski          *  @throw  css::uno::Any exceptions the underlying configuration can throw.
148*b1cdbd2cSJim Jagielski          *          E.g. css::container::NoSuchElementException if the specified
149*b1cdbd2cSJim Jagielski          *          key does not exists or css::uno::Exception if the provided configuration
150*b1cdbd2cSJim Jagielski          *          access does not allow writing for this key.
151*b1cdbd2cSJim Jagielski          */
152*b1cdbd2cSJim Jagielski         static void writeRelativeKey(
153*b1cdbd2cSJim Jagielski             const css::uno::Reference< css::uno::XInterface> xCFG,
154*b1cdbd2cSJim Jagielski             const ::rtl::OUString& sRelPath,
155*b1cdbd2cSJim Jagielski             const ::rtl::OUString& sKey,
156*b1cdbd2cSJim Jagielski             const css::uno::Any& aValue);
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski         //-----------------------------------------------
159*b1cdbd2cSJim Jagielski         /** commit all changes made on the specified configuration access.
160*b1cdbd2cSJim Jagielski          *
161*b1cdbd2cSJim Jagielski          *  This method must be used in combination with openConfig().
162*b1cdbd2cSJim Jagielski          *  The cached configuration access must be provided here.
163*b1cdbd2cSJim Jagielski          *
164*b1cdbd2cSJim Jagielski          *  @param  xCFG
165*b1cdbd2cSJim Jagielski          *          the configuration root, where changes should be commited.
166*b1cdbd2cSJim Jagielski          *
167*b1cdbd2cSJim Jagielski          *  @throw  css::uno::Any exceptions the underlying configuration can throw.
168*b1cdbd2cSJim Jagielski          *          E.g. uno::Exception if the provided configuration
169*b1cdbd2cSJim Jagielski          *          access does not allow writing for this set.
170*b1cdbd2cSJim Jagielski          */
171*b1cdbd2cSJim Jagielski         static void flush(const css::uno::Reference< css::uno::XInterface>& xCFG);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski         //-----------------------------------------------
174*b1cdbd2cSJim Jagielski         /** does the same then openConfig() & readRelativeKey() together.
175*b1cdbd2cSJim Jagielski          *
176*b1cdbd2cSJim Jagielski          * This method should be used for reading one key at one code place only.
177*b1cdbd2cSJim Jagielski          * Because it opens the specified configuration package, reads the key and
178*b1cdbd2cSJim Jagielski          * closes the configuration again.
179*b1cdbd2cSJim Jagielski          *
180*b1cdbd2cSJim Jagielski          * So its not very usefull to use this method for reading multiple keys at the same time.
181*b1cdbd2cSJim Jagielski          * (Excepting these keys exists inside different configuration packages ...))
182*b1cdbd2cSJim Jagielski          */
183*b1cdbd2cSJim Jagielski         static css::uno::Any readDirectKey(
184*b1cdbd2cSJim Jagielski             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             sal_Int32 eMode);
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski         //-----------------------------------------------
191*b1cdbd2cSJim Jagielski         /** does the same then openConfig() / writeRelativeKey() & flush() together.
192*b1cdbd2cSJim Jagielski          *
193*b1cdbd2cSJim Jagielski          * This method should be used for writing one key at one code place only.
194*b1cdbd2cSJim Jagielski          * Because it opens the specified configuration package, writes the key, flush
195*b1cdbd2cSJim Jagielski          * all changes and closes the configuration again.
196*b1cdbd2cSJim Jagielski          *
197*b1cdbd2cSJim Jagielski          * So its not very usefull to use this method for writing multiple keys at the same time.
198*b1cdbd2cSJim Jagielski          * (Excepting these keys exists inside different configuration packages ...))
199*b1cdbd2cSJim Jagielski          */
200*b1cdbd2cSJim Jagielski         static void writeDirectKey(
201*b1cdbd2cSJim Jagielski             const css::uno::Reference< css::lang::XMultiServiceFactory> xSMGR,
202*b1cdbd2cSJim Jagielski             const ::rtl::OUString& sPackage,
203*b1cdbd2cSJim Jagielski             const ::rtl::OUString& sRelPath,
204*b1cdbd2cSJim Jagielski             const ::rtl::OUString& sKey,
205*b1cdbd2cSJim Jagielski             const css::uno::Any& aValue,
206*b1cdbd2cSJim Jagielski             sal_Int32 eMode);
207*b1cdbd2cSJim Jagielski     };
208*b1cdbd2cSJim Jagielski     #undef css
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski #endif
211