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 #include "precompiled_configmgr.hxx"
25*b1cdbd2cSJim Jagielski #include "sal/config.h"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <vector>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/DisposedException.hpp"
30*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/EventObject.hpp"
31*b1cdbd2cSJim Jagielski #include "com/sun/star/lang/WrappedTargetException.hpp"
32*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Any.hxx"
33*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Reference.hxx"
34*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/RuntimeException.hpp"
35*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/Type.hxx"
36*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/XInterface.hpp"
37*b1cdbd2cSJim Jagielski #include "com/sun/star/util/ChangesEvent.hpp"
38*b1cdbd2cSJim Jagielski #include "com/sun/star/util/ChangesSet.hpp"
39*b1cdbd2cSJim Jagielski #include "com/sun/star/util/ElementChange.hpp"
40*b1cdbd2cSJim Jagielski #include "com/sun/star/util/XChangesBatch.hpp"
41*b1cdbd2cSJim Jagielski #include "com/sun/star/util/XChangesListener.hpp"
42*b1cdbd2cSJim Jagielski #include "com/sun/star/util/XChangesNotifier.hpp"
43*b1cdbd2cSJim Jagielski #include "comphelper/sequenceasvector.hxx"
44*b1cdbd2cSJim Jagielski #include "cppu/unotype.hxx"
45*b1cdbd2cSJim Jagielski #include "cppuhelper/queryinterface.hxx"
46*b1cdbd2cSJim Jagielski #include "cppuhelper/weak.hxx"
47*b1cdbd2cSJim Jagielski #include "osl/diagnose.h"
48*b1cdbd2cSJim Jagielski #include "osl/mutex.hxx"
49*b1cdbd2cSJim Jagielski #include "rtl/ref.hxx"
50*b1cdbd2cSJim Jagielski #include "rtl/ustring.h"
51*b1cdbd2cSJim Jagielski #include "rtl/ustring.hxx"
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #include "broadcaster.hxx"
54*b1cdbd2cSJim Jagielski #include "childaccess.hxx"
55*b1cdbd2cSJim Jagielski #include "components.hxx"
56*b1cdbd2cSJim Jagielski #include "data.hxx"
57*b1cdbd2cSJim Jagielski #include "lock.hxx"
58*b1cdbd2cSJim Jagielski #include "modifications.hxx"
59*b1cdbd2cSJim Jagielski #include "node.hxx"
60*b1cdbd2cSJim Jagielski #include "path.hxx"
61*b1cdbd2cSJim Jagielski #include "rootaccess.hxx"
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski namespace configmgr {
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski namespace {
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski namespace css = com::sun::star;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
RootAccess(Components & components,rtl::OUString const & pathRepresentation,rtl::OUString const & locale,bool update)71*b1cdbd2cSJim Jagielski RootAccess::RootAccess(
72*b1cdbd2cSJim Jagielski     Components & components, rtl::OUString const & pathRepresentation,
73*b1cdbd2cSJim Jagielski     rtl::OUString const & locale, bool update):
74*b1cdbd2cSJim Jagielski     Access(components), pathRepresentation_(pathRepresentation),
75*b1cdbd2cSJim Jagielski     locale_(locale), update_(update)
76*b1cdbd2cSJim Jagielski {}
77*b1cdbd2cSJim Jagielski 
getAbsolutePath()78*b1cdbd2cSJim Jagielski Path RootAccess::getAbsolutePath() {
79*b1cdbd2cSJim Jagielski     getNode();
80*b1cdbd2cSJim Jagielski     return path_;
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski 
initBroadcaster(Modifications::Node const & modifications,Broadcaster * broadcaster)83*b1cdbd2cSJim Jagielski void RootAccess::initBroadcaster(
84*b1cdbd2cSJim Jagielski     Modifications::Node const & modifications, Broadcaster * broadcaster)
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski     OSL_ASSERT(broadcaster != 0);
87*b1cdbd2cSJim Jagielski     comphelper::SequenceAsVector< css::util::ElementChange > changes;
88*b1cdbd2cSJim Jagielski     initBroadcasterAndChanges(
89*b1cdbd2cSJim Jagielski         modifications, broadcaster, changesListeners_.empty() ? 0 : &changes);
90*b1cdbd2cSJim Jagielski     if (!changes.empty()) {
91*b1cdbd2cSJim Jagielski         css::util::ChangesSet set(changes.getAsConstList());
92*b1cdbd2cSJim Jagielski         for (ChangesListeners::iterator i(changesListeners_.begin());
93*b1cdbd2cSJim Jagielski              i != changesListeners_.end(); ++i)
94*b1cdbd2cSJim Jagielski         {
95*b1cdbd2cSJim Jagielski             cppu::OWeakObject* pSource = static_cast< cppu::OWeakObject * >(this);
96*b1cdbd2cSJim Jagielski             css::uno::Reference< css::uno::XInterface > xBase( pSource, css::uno::UNO_QUERY );
97*b1cdbd2cSJim Jagielski             broadcaster->addChangesNotification(
98*b1cdbd2cSJim Jagielski                 *i,
99*b1cdbd2cSJim Jagielski                 css::util::ChangesEvent(
100*b1cdbd2cSJim Jagielski                     pSource, makeAny( xBase ), set));
101*b1cdbd2cSJim Jagielski         }
102*b1cdbd2cSJim Jagielski     }
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
acquire()105*b1cdbd2cSJim Jagielski void RootAccess::acquire() throw () {
106*b1cdbd2cSJim Jagielski     Access::acquire();
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski 
release()109*b1cdbd2cSJim Jagielski void RootAccess::release() throw () {
110*b1cdbd2cSJim Jagielski     Access::release();
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
getAbsolutePathRepresentation()113*b1cdbd2cSJim Jagielski rtl::OUString RootAccess::getAbsolutePathRepresentation() {
114*b1cdbd2cSJim Jagielski     getNode(); // turn pathRepresentation_ into canonic form
115*b1cdbd2cSJim Jagielski     return pathRepresentation_;
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
getLocale() const118*b1cdbd2cSJim Jagielski rtl::OUString RootAccess::getLocale() const {
119*b1cdbd2cSJim Jagielski     return locale_;
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski 
isUpdate() const122*b1cdbd2cSJim Jagielski bool RootAccess::isUpdate() const {
123*b1cdbd2cSJim Jagielski     return update_;
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
~RootAccess()126*b1cdbd2cSJim Jagielski RootAccess::~RootAccess() {
127*b1cdbd2cSJim Jagielski     osl::MutexGuard g(lock);
128*b1cdbd2cSJim Jagielski     getComponents().removeRootAccess(this);
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski 
getRelativePath()131*b1cdbd2cSJim Jagielski Path RootAccess::getRelativePath() {
132*b1cdbd2cSJim Jagielski     return Path();
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski 
getRelativePathRepresentation()135*b1cdbd2cSJim Jagielski rtl::OUString RootAccess::getRelativePathRepresentation() {
136*b1cdbd2cSJim Jagielski     return rtl::OUString();
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski 
getNode()139*b1cdbd2cSJim Jagielski rtl::Reference< Node > RootAccess::getNode() {
140*b1cdbd2cSJim Jagielski     if (!node_.is()) {
141*b1cdbd2cSJim Jagielski         rtl::OUString canonic;
142*b1cdbd2cSJim Jagielski         int finalizedLayer;
143*b1cdbd2cSJim Jagielski         node_ = getComponents().resolvePathRepresentation(
144*b1cdbd2cSJim Jagielski             pathRepresentation_, &canonic, &path_, &finalizedLayer);
145*b1cdbd2cSJim Jagielski         if (!node_.is()) {
146*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
147*b1cdbd2cSJim Jagielski                 (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cannot find ")) +
148*b1cdbd2cSJim Jagielski                  pathRepresentation_),
149*b1cdbd2cSJim Jagielski                 0);
150*b1cdbd2cSJim Jagielski                 // RootAccess::queryInterface indirectly calls
151*b1cdbd2cSJim Jagielski                 // RootAccess::getNode, so if this RootAccess were passed out in
152*b1cdbd2cSJim Jagielski                 // RuntimeException.Context, client code that called
153*b1cdbd2cSJim Jagielski                 // queryInterface on it would cause trouble; therefore,
154*b1cdbd2cSJim Jagielski                 // RuntimeException.Context is left null here
155*b1cdbd2cSJim Jagielski         }
156*b1cdbd2cSJim Jagielski         pathRepresentation_ = canonic;
157*b1cdbd2cSJim Jagielski         OSL_ASSERT(!path_.empty());
158*b1cdbd2cSJim Jagielski         name_ = path_.back();
159*b1cdbd2cSJim Jagielski         finalized_ = finalizedLayer != Data::NO_LAYER;
160*b1cdbd2cSJim Jagielski     }
161*b1cdbd2cSJim Jagielski     return node_;
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
isFinalized()164*b1cdbd2cSJim Jagielski bool RootAccess::isFinalized() {
165*b1cdbd2cSJim Jagielski     getNode();
166*b1cdbd2cSJim Jagielski     return finalized_;
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
getNameInternal()169*b1cdbd2cSJim Jagielski rtl::OUString RootAccess::getNameInternal() {
170*b1cdbd2cSJim Jagielski     getNode();
171*b1cdbd2cSJim Jagielski     return name_;
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
getRootAccess()174*b1cdbd2cSJim Jagielski rtl::Reference< RootAccess > RootAccess::getRootAccess() {
175*b1cdbd2cSJim Jagielski     return this;
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
getParentAccess()178*b1cdbd2cSJim Jagielski rtl::Reference< Access > RootAccess::getParentAccess() {
179*b1cdbd2cSJim Jagielski     return rtl::Reference< Access >();
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
addTypes(std::vector<css::uno::Type> * types) const182*b1cdbd2cSJim Jagielski void RootAccess::addTypes(std::vector< css::uno::Type > * types) const {
183*b1cdbd2cSJim Jagielski     OSL_ASSERT(types != 0);
184*b1cdbd2cSJim Jagielski     types->push_back(cppu::UnoType< css::util::XChangesNotifier >::get());
185*b1cdbd2cSJim Jagielski     types->push_back(cppu::UnoType< css::util::XChangesBatch >::get());
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski 
addSupportedServiceNames(std::vector<rtl::OUString> * services)188*b1cdbd2cSJim Jagielski void RootAccess::addSupportedServiceNames(
189*b1cdbd2cSJim Jagielski     std::vector< rtl::OUString > * services)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski     OSL_ASSERT(services != 0);
192*b1cdbd2cSJim Jagielski     services->push_back(
193*b1cdbd2cSJim Jagielski         rtl::OUString(
194*b1cdbd2cSJim Jagielski             RTL_CONSTASCII_USTRINGPARAM(
195*b1cdbd2cSJim Jagielski                 "com.sun.star.configuration.AccessRootElement")));
196*b1cdbd2cSJim Jagielski     if (update_) {
197*b1cdbd2cSJim Jagielski         services->push_back(
198*b1cdbd2cSJim Jagielski             rtl::OUString(
199*b1cdbd2cSJim Jagielski                 RTL_CONSTASCII_USTRINGPARAM(
200*b1cdbd2cSJim Jagielski                     "com.sun.star.configuration.UpdateRootElement")));
201*b1cdbd2cSJim Jagielski     }
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
initDisposeBroadcaster(Broadcaster * broadcaster)204*b1cdbd2cSJim Jagielski void RootAccess::initDisposeBroadcaster(Broadcaster * broadcaster) {
205*b1cdbd2cSJim Jagielski     OSL_ASSERT(broadcaster != 0);
206*b1cdbd2cSJim Jagielski     for (ChangesListeners::iterator i(changesListeners_.begin());
207*b1cdbd2cSJim Jagielski          i != changesListeners_.end(); ++i)
208*b1cdbd2cSJim Jagielski     {
209*b1cdbd2cSJim Jagielski         broadcaster->addDisposeNotification(
210*b1cdbd2cSJim Jagielski             i->get(),
211*b1cdbd2cSJim Jagielski             css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski     Access::initDisposeBroadcaster(broadcaster);
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
clearListeners()216*b1cdbd2cSJim Jagielski void RootAccess::clearListeners() throw() {
217*b1cdbd2cSJim Jagielski     changesListeners_.clear();
218*b1cdbd2cSJim Jagielski     Access::clearListeners();
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
queryInterface(css::uno::Type const & aType)221*b1cdbd2cSJim Jagielski css::uno::Any RootAccess::queryInterface(css::uno::Type const & aType)
222*b1cdbd2cSJim Jagielski     throw (css::uno::RuntimeException)
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_ANY));
225*b1cdbd2cSJim Jagielski     osl::MutexGuard g(lock);
226*b1cdbd2cSJim Jagielski     checkLocalizedPropertyAccess();
227*b1cdbd2cSJim Jagielski     css::uno::Any res(Access::queryInterface(aType));
228*b1cdbd2cSJim Jagielski     if (res.hasValue()) {
229*b1cdbd2cSJim Jagielski         return res;
230*b1cdbd2cSJim Jagielski     }
231*b1cdbd2cSJim Jagielski     res = cppu::queryInterface(
232*b1cdbd2cSJim Jagielski         aType, static_cast< css::util::XChangesNotifier * >(this));
233*b1cdbd2cSJim Jagielski     if (res.hasValue()) {
234*b1cdbd2cSJim Jagielski         return res;
235*b1cdbd2cSJim Jagielski     }
236*b1cdbd2cSJim Jagielski     if (!res.hasValue() && update_) {
237*b1cdbd2cSJim Jagielski         res = cppu::queryInterface(
238*b1cdbd2cSJim Jagielski             aType, static_cast< css::util::XChangesBatch * >(this));
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski     return res;
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
addChangesListener(css::uno::Reference<css::util::XChangesListener> const & aListener)243*b1cdbd2cSJim Jagielski void RootAccess::addChangesListener(
244*b1cdbd2cSJim Jagielski     css::uno::Reference< css::util::XChangesListener > const & aListener)
245*b1cdbd2cSJim Jagielski     throw (css::uno::RuntimeException)
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_ANY));
248*b1cdbd2cSJim Jagielski     {
249*b1cdbd2cSJim Jagielski         osl::MutexGuard g(lock);
250*b1cdbd2cSJim Jagielski         checkLocalizedPropertyAccess();
251*b1cdbd2cSJim Jagielski         if (!aListener.is()) {
252*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
253*b1cdbd2cSJim Jagielski                 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("null listener")),
254*b1cdbd2cSJim Jagielski                 static_cast< cppu::OWeakObject * >(this));
255*b1cdbd2cSJim Jagielski         }
256*b1cdbd2cSJim Jagielski         if (!isDisposed()) {
257*b1cdbd2cSJim Jagielski             changesListeners_.insert(aListener);
258*b1cdbd2cSJim Jagielski             return;
259*b1cdbd2cSJim Jagielski         }
260*b1cdbd2cSJim Jagielski     }
261*b1cdbd2cSJim Jagielski     try {
262*b1cdbd2cSJim Jagielski         aListener->disposing(
263*b1cdbd2cSJim Jagielski             css::lang::EventObject(static_cast< cppu::OWeakObject * >(this)));
264*b1cdbd2cSJim Jagielski     } catch (css::lang::DisposedException &) {}
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
removeChangesListener(css::uno::Reference<css::util::XChangesListener> const & aListener)267*b1cdbd2cSJim Jagielski void RootAccess::removeChangesListener(
268*b1cdbd2cSJim Jagielski     css::uno::Reference< css::util::XChangesListener > const & aListener)
269*b1cdbd2cSJim Jagielski     throw (css::uno::RuntimeException)
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_ANY));
272*b1cdbd2cSJim Jagielski     osl::MutexGuard g(lock);
273*b1cdbd2cSJim Jagielski     checkLocalizedPropertyAccess();
274*b1cdbd2cSJim Jagielski     ChangesListeners::iterator i(changesListeners_.find(aListener));
275*b1cdbd2cSJim Jagielski     if (i != changesListeners_.end()) {
276*b1cdbd2cSJim Jagielski         changesListeners_.erase(i);
277*b1cdbd2cSJim Jagielski     }
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski 
commitChanges()280*b1cdbd2cSJim Jagielski void RootAccess::commitChanges()
281*b1cdbd2cSJim Jagielski     throw (css::lang::WrappedTargetException, css::uno::RuntimeException)
282*b1cdbd2cSJim Jagielski {
283*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_UPDATE));
284*b1cdbd2cSJim Jagielski     Broadcaster bc;
285*b1cdbd2cSJim Jagielski     {
286*b1cdbd2cSJim Jagielski         osl::MutexGuard g(lock);
287*b1cdbd2cSJim Jagielski         checkLocalizedPropertyAccess();
288*b1cdbd2cSJim Jagielski         int finalizedLayer;
289*b1cdbd2cSJim Jagielski         Modifications globalMods;
290*b1cdbd2cSJim Jagielski         commitChildChanges(
291*b1cdbd2cSJim Jagielski             ((getComponents().resolvePathRepresentation(
292*b1cdbd2cSJim Jagielski                   pathRepresentation_, 0, 0, &finalizedLayer)
293*b1cdbd2cSJim Jagielski               == node_) &&
294*b1cdbd2cSJim Jagielski              finalizedLayer == Data::NO_LAYER),
295*b1cdbd2cSJim Jagielski             &globalMods);
296*b1cdbd2cSJim Jagielski         getComponents().writeModifications();
297*b1cdbd2cSJim Jagielski         getComponents().initGlobalBroadcaster(globalMods, this, &bc);
298*b1cdbd2cSJim Jagielski     }
299*b1cdbd2cSJim Jagielski     bc.send();
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
hasPendingChanges()302*b1cdbd2cSJim Jagielski sal_Bool RootAccess::hasPendingChanges() throw (css::uno::RuntimeException) {
303*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_UPDATE));
304*b1cdbd2cSJim Jagielski     osl::MutexGuard g(lock);
305*b1cdbd2cSJim Jagielski     checkLocalizedPropertyAccess();
306*b1cdbd2cSJim Jagielski     //TODO: Optimize:
307*b1cdbd2cSJim Jagielski     std::vector< css::util::ElementChange > changes;
308*b1cdbd2cSJim Jagielski     reportChildChanges(&changes);
309*b1cdbd2cSJim Jagielski     return !changes.empty();
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
getPendingChanges()312*b1cdbd2cSJim Jagielski css::util::ChangesSet RootAccess::getPendingChanges()
313*b1cdbd2cSJim Jagielski     throw (css::uno::RuntimeException)
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski     OSL_ASSERT(thisIs(IS_UPDATE));
316*b1cdbd2cSJim Jagielski     osl::MutexGuard g(lock);
317*b1cdbd2cSJim Jagielski     checkLocalizedPropertyAccess();
318*b1cdbd2cSJim Jagielski     comphelper::SequenceAsVector< css::util::ElementChange > changes;
319*b1cdbd2cSJim Jagielski     reportChildChanges(&changes);
320*b1cdbd2cSJim Jagielski     return changes.getAsConstList();
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski }
324