xref: /trunk/main/configmgr/source/access.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 #ifndef INCLUDED_CONFIGMGR_SOURCE_ACCESS_HXX
25 #define INCLUDED_CONFIGMGR_SOURCE_ACCESS_HXX
26 
27 #include "sal/config.h"
28 
29 #include <map>
30 #include <set>
31 #include <vector>
32 
33 #include "boost/noncopyable.hpp"
34 #include "com/sun/star/beans/PropertyVetoException.hpp"
35 #include "com/sun/star/beans/UnknownPropertyException.hpp"
36 #include "com/sun/star/beans/XExactName.hpp"
37 #include "com/sun/star/beans/XHierarchicalPropertySet.hpp"
38 #include "com/sun/star/beans/XHierarchicalPropertySetInfo.hpp"
39 #include "com/sun/star/beans/XMultiHierarchicalPropertySet.hpp"
40 #include "com/sun/star/beans/XMultiPropertySet.hpp"
41 #include "com/sun/star/beans/XProperty.hpp"
42 #include "com/sun/star/beans/XPropertySet.hpp"
43 #include "com/sun/star/beans/XPropertySetInfo.hpp"
44 #include "com/sun/star/container/ElementExistException.hpp"
45 #include "com/sun/star/container/NoSuchElementException.hpp"
46 #include "com/sun/star/container/XContainer.hpp"
47 #include "com/sun/star/container/XHierarchicalName.hpp"
48 #include "com/sun/star/container/XHierarchicalNameAccess.hpp"
49 #include "com/sun/star/container/XNameContainer.hpp"
50 #include "com/sun/star/container/XNamed.hpp"
51 #include "com/sun/star/lang/IllegalArgumentException.hpp"
52 #include "com/sun/star/lang/NoSupportException.hpp"
53 #include "com/sun/star/lang/WrappedTargetException.hpp"
54 #include "com/sun/star/lang/XComponent.hpp"
55 #include "com/sun/star/lang/XServiceInfo.hpp"
56 #include "com/sun/star/lang/XTypeProvider.hpp"
57 #include "com/sun/star/lang/XSingleServiceFactory.hpp"
58 #include "com/sun/star/uno/Exception.hpp"
59 #include "com/sun/star/uno/Reference.hxx"
60 #include "com/sun/star/uno/RuntimeException.hpp"
61 #include "com/sun/star/uno/Sequence.hxx"
62 #include "cppuhelper/weak.hxx"
63 #include "osl/interlck.h"
64 #include "rtl/ref.hxx"
65 #include "sal/types.h"
66 
67 #include "modifications.hxx"
68 #include "path.hxx"
69 #include "type.hxx"
70 
71 namespace com { namespace sun { namespace star {
72     namespace beans {
73         class XHierarchicalPropertySetInfo;
74         class XPropertiesChangeListener;
75         class XPropertyChangeListener;
76         class XVetoableChangeListener;
77         struct Property;
78     }
79     namespace container { class XContainerListener; }
80     namespace lang { class XEventListener; }
81     namespace uno {
82         class Any;
83         class Type;
84         class XInterface;
85     }
86     namespace util { struct ElementChange; }
87 } } }
88 namespace rtl { class OUString; }
89 
90 namespace configmgr {
91 
92 class Broadcaster;
93 class Change;
94 class ChildAccess;
95 class Components;
96 class Node;
97 class RootAccess;
98 
99 class Access:
100     public cppu::OWeakObject, public com::sun::star::lang::XTypeProvider,
101     public com::sun::star::lang::XServiceInfo,
102     public com::sun::star::lang::XComponent,
103     public com::sun::star::container::XHierarchicalNameAccess,
104     public com::sun::star::container::XContainer,
105     public com::sun::star::beans::XExactName,
106     public com::sun::star::beans::XPropertySetInfo,
107     public com::sun::star::container::XHierarchicalName,
108     public com::sun::star::container::XNamed,
109     public com::sun::star::beans::XProperty,
110     public com::sun::star::beans::XPropertySet,
111     public com::sun::star::beans::XMultiPropertySet,
112     public com::sun::star::beans::XHierarchicalPropertySet,
113     public com::sun::star::beans::XMultiHierarchicalPropertySet,
114     public com::sun::star::beans::XHierarchicalPropertySetInfo,
115     public com::sun::star::container::XNameContainer,
116     public com::sun::star::lang::XSingleServiceFactory,
117     private boost::noncopyable
118 {
119 public:
120     oslInterlockedCount acquireCounting();
121 
122     void releaseNondeleting();
123 
124     bool isValue();
125 
126     void markChildAsModified(rtl::Reference< ChildAccess > const & child);
127 
128     void releaseChild(rtl::OUString const & name);
129 
130     virtual Path getAbsolutePath() = 0;
131 
132     virtual Path getRelativePath() = 0;
133 
134     virtual rtl::OUString getRelativePathRepresentation() = 0;
135 
136     virtual rtl::Reference< Node > getNode() = 0;
137 
138     virtual bool isFinalized() = 0;
139 
140     virtual void initBroadcaster(
141         Modifications::Node const & modifications, Broadcaster * broadcaster);
142 
143     using OWeakObject::acquire;
144     using OWeakObject::release;
145 
146 protected:
147     Access(Components & components);
148 
149     virtual ~Access();
150 
151     virtual rtl::OUString getNameInternal() = 0;
152 
153     virtual rtl::Reference< RootAccess > getRootAccess() = 0;
154 
155     virtual rtl::Reference< Access > getParentAccess() = 0;
156 
157     virtual void addTypes(std::vector< com::sun::star::uno::Type > * types)
158         const = 0;
159 
160     virtual void addSupportedServiceNames(
161         std::vector< rtl::OUString > * services) = 0;
162 
163     virtual void initDisposeBroadcaster(Broadcaster * broadcaster);
164 
165     virtual void clearListeners() throw ();
166 
167     virtual com::sun::star::uno::Any SAL_CALL queryInterface(
168         com::sun::star::uno::Type const & aType);
169 
170     Components & getComponents() const;
171 
172     void checkLocalizedPropertyAccess();
173 
174     rtl::Reference< Node > getParentNode();
175 
176     rtl::Reference< ChildAccess > getChild(rtl::OUString const & name);
177 
178     std::vector< rtl::Reference< ChildAccess > > getAllChildren();
179 
180     void checkValue(
181         com::sun::star::uno::Any const & value, Type type, bool nillable);
182 
183     void insertLocalizedValueChild(
184         rtl::OUString const & name, com::sun::star::uno::Any const & value,
185         Modifications * localModifications);
186 
187     void reportChildChanges(
188         std::vector< com::sun::star::util::ElementChange > * changes);
189 
190     void commitChildChanges(bool valid, Modifications * globalModifications);
191 
192     void initBroadcasterAndChanges(
193         Modifications::Node const & modifications, Broadcaster * broadcaster,
194         std::vector< com::sun::star::util::ElementChange > * changes);
195 
196     bool isDisposed() const;
197 
198 private:
199     struct ModifiedChild {
200         rtl::Reference< ChildAccess > child;
201         bool directlyModified;
202 
203         ModifiedChild();
204 
205         ModifiedChild(
206             rtl::Reference< ChildAccess > const & theChild,
207             bool theDirectlyModified);
208     };
209 
210     typedef std::map< rtl::OUString, ModifiedChild > ModifiedChildren;
211 
212     virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL
213     getTypes();
214 
215     virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL
216     getImplementationId();
217 
218     virtual rtl::OUString SAL_CALL getImplementationName();
219 
220     virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName);
221 
222     virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL
223     getSupportedServiceNames();
224 
225     virtual void SAL_CALL dispose();
226 
227     virtual void SAL_CALL addEventListener(
228         com::sun::star::uno::Reference< com::sun::star::lang::XEventListener >
229             const & xListener);
230 
231     virtual void SAL_CALL removeEventListener(
232         com::sun::star::uno::Reference< com::sun::star::lang::XEventListener >
233             const & aListener);
234 
235     virtual com::sun::star::uno::Type SAL_CALL getElementType();
236 
237     virtual sal_Bool SAL_CALL hasElements();
238 
239     virtual com::sun::star::uno::Any SAL_CALL getByName(
240         rtl::OUString const & aName);
241 
242     virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL
243     getElementNames();
244 
245     virtual sal_Bool SAL_CALL hasByName(rtl::OUString const & aName);
246 
247     virtual com::sun::star::uno::Any SAL_CALL getByHierarchicalName(
248         rtl::OUString const & aName);
249 
250     virtual sal_Bool SAL_CALL hasByHierarchicalName(rtl::OUString const & aName);
251 
252     virtual void SAL_CALL addContainerListener(
253         com::sun::star::uno::Reference<
254             com::sun::star::container::XContainerListener > const & xListener);
255 
256     virtual void SAL_CALL removeContainerListener(
257         com::sun::star::uno::Reference<
258             com::sun::star::container::XContainerListener > const & xListener);
259 
260     virtual rtl::OUString SAL_CALL getExactName(
261         rtl::OUString const & aApproximateName);
262 
263     virtual com::sun::star::uno::Sequence< com::sun::star::beans::Property >
264     SAL_CALL getProperties();
265 
266     virtual com::sun::star::beans::Property SAL_CALL getPropertyByName(
267         rtl::OUString const & aName);
268 
269     virtual sal_Bool SAL_CALL hasPropertyByName(rtl::OUString const & Name);
270 
271     virtual rtl::OUString SAL_CALL getHierarchicalName();
272 
273     virtual rtl::OUString SAL_CALL composeHierarchicalName(
274         rtl::OUString const & aRelativeName);
275 
276     virtual rtl::OUString SAL_CALL getName();
277 
278     virtual void SAL_CALL setName(rtl::OUString const & aName);
279 
280     virtual com::sun::star::beans::Property SAL_CALL getAsProperty();
281 
282     virtual
283     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo >
284     SAL_CALL getPropertySetInfo();
285 
286     virtual void SAL_CALL setPropertyValue(
287         rtl::OUString const & aPropertyName,
288         com::sun::star::uno::Any const & aValue);
289 
290     virtual com::sun::star::uno::Any SAL_CALL getPropertyValue(
291         rtl::OUString const & PropertyName);
292 
293     virtual void SAL_CALL addPropertyChangeListener(
294         rtl::OUString const & aPropertyName,
295         com::sun::star::uno::Reference<
296             com::sun::star::beans::XPropertyChangeListener > const & xListener);
297 
298     virtual void SAL_CALL removePropertyChangeListener(
299         rtl::OUString const & aPropertyName,
300         com::sun::star::uno::Reference<
301             com::sun::star::beans::XPropertyChangeListener > const & aListener);
302 
303     virtual void SAL_CALL addVetoableChangeListener(
304         rtl::OUString const & PropertyName,
305         com::sun::star::uno::Reference<
306             com::sun::star::beans::XVetoableChangeListener > const & aListener);
307 
308     virtual void SAL_CALL removeVetoableChangeListener(
309         rtl::OUString const & PropertyName,
310         com::sun::star::uno::Reference<
311             com::sun::star::beans::XVetoableChangeListener > const & aListener);
312 
313     virtual void SAL_CALL setPropertyValues(
314         com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames,
315         com::sun::star::uno::Sequence< com::sun::star::uno::Any > const &
316             aValues);
317 
318     virtual com::sun::star::uno::Sequence< com::sun::star::uno::Any > SAL_CALL
319     getPropertyValues(
320         com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames);
321 
322     virtual void SAL_CALL addPropertiesChangeListener(
323         com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames,
324         com::sun::star::uno::Reference<
325             com::sun::star::beans::XPropertiesChangeListener > const &
326                 xListener);
327 
328     virtual void SAL_CALL removePropertiesChangeListener(
329         com::sun::star::uno::Reference<
330             com::sun::star::beans::XPropertiesChangeListener > const &
331                 xListener);
332 
333     virtual void SAL_CALL firePropertiesChangeEvent(
334         com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames,
335         com::sun::star::uno::Reference<
336             com::sun::star::beans::XPropertiesChangeListener > const &
337                 xListener);
338 
339     virtual
340     com::sun::star::uno::Reference<
341         com::sun::star::beans::XHierarchicalPropertySetInfo > SAL_CALL
342     getHierarchicalPropertySetInfo();
343 
344     virtual void SAL_CALL setHierarchicalPropertyValue(
345         rtl::OUString const & aHierarchicalPropertyName,
346         com::sun::star::uno::Any const & aValue);
347 
348     virtual com::sun::star::uno::Any SAL_CALL getHierarchicalPropertyValue(
349         rtl::OUString const & aHierarchicalPropertyName);
350 
351     virtual void SAL_CALL setHierarchicalPropertyValues(
352         com::sun::star::uno::Sequence< rtl::OUString > const &
353             aHierarchicalPropertyNames,
354         com::sun::star::uno::Sequence< com::sun::star::uno::Any > const &
355             Values);
356 
357     virtual com::sun::star::uno::Sequence< com::sun::star::uno::Any > SAL_CALL
358     getHierarchicalPropertyValues(
359         com::sun::star::uno::Sequence< rtl::OUString > const &
360             aHierarchicalPropertyNames);
361 
362     virtual com::sun::star::beans::Property SAL_CALL
363     getPropertyByHierarchicalName(rtl::OUString const & aHierarchicalName);
364 
365     virtual sal_Bool SAL_CALL hasPropertyByHierarchicalName(
366         rtl::OUString const & aHierarchicalName);
367 
368     virtual void SAL_CALL replaceByName(
369         rtl::OUString const & aName, com::sun::star::uno::Any const & aElement);
370 
371     virtual void SAL_CALL insertByName(
372         rtl::OUString const & aName, com::sun::star::uno::Any const & aElement);
373 
374     virtual void SAL_CALL removeByName(rtl::OUString const & aName);
375 
376     virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
377     SAL_CALL createInstance();
378 
379     virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
380     SAL_CALL createInstanceWithArguments(
381         com::sun::star::uno::Sequence< com::sun::star::uno::Any > const &
382             aArguments);
383 
384     rtl::Reference< ChildAccess > getModifiedChild(
385         ModifiedChildren::iterator const & childIterator);
386 
387     rtl::Reference< ChildAccess > getUnmodifiedChild(
388         rtl::OUString const & name);
389 
390     rtl::Reference< ChildAccess > getSubChild(rtl::OUString const & path);
391 
392     bool setChildProperty(
393         rtl::OUString const & name, com::sun::star::uno::Any const & value,
394         Modifications * localModifications);
395 
396     com::sun::star::beans::Property asProperty();
397 
398     void checkFinalized();
399 
400     void checkKnownProperty(rtl::OUString const & descriptor);
401 
402     rtl::Reference< ChildAccess > getFreeSetMember(
403         com::sun::star::uno::Any const & value);
404 
405     rtl::Reference< Access > getNotificationRoot();
406 
407     typedef std::map< rtl::OUString, ChildAccess * > WeakChildMap;
408 
409     typedef
410         std::multiset<
411             com::sun::star::uno::Reference<
412                 com::sun::star::lang::XEventListener > >
413         DisposeListeners;
414 
415     typedef
416         std::multiset<
417             com::sun::star::uno::Reference<
418                 com::sun::star::container::XContainerListener > >
419         ContainerListeners;
420 
421     typedef
422         std::multiset<
423             com::sun::star::uno::Reference<
424                 com::sun::star::beans::XPropertyChangeListener > >
425         PropertyChangeListenersElement;
426 
427     typedef std::map< rtl::OUString, PropertyChangeListenersElement >
428         PropertyChangeListeners;
429 
430     typedef
431         std::multiset<
432             com::sun::star::uno::Reference<
433                 com::sun::star::beans::XVetoableChangeListener > >
434         VetoableChangeListenersElement;
435 
436     typedef std::map< rtl::OUString, VetoableChangeListenersElement >
437         VetoableChangeListeners;
438 
439     typedef
440         std::multiset<
441             com::sun::star::uno::Reference<
442                 com::sun::star::beans::XPropertiesChangeListener > >
443         PropertiesChangeListeners;
444 
445     Components & components_;
446     ModifiedChildren modifiedChildren_;
447     WeakChildMap cachedChildren_;
448     DisposeListeners disposeListeners_;
449     ContainerListeners containerListeners_;
450     PropertyChangeListeners propertyChangeListeners_;
451     VetoableChangeListeners vetoableChangeListeners_;
452     PropertiesChangeListeners propertiesChangeListeners_;
453     bool disposed_;
454 
455 #if OSL_DEBUG_LEVEL > 0
456 protected:
457     enum {
458         IS_ANY = 0, IS_GROUP = 0x01, IS_SET = 0x02, IS_EXTENSIBLE = 0x04,
459         IS_GROUP_MEMBER = 0x08, IS_SET_MEMBER = 0x10, IS_UPDATE = 0x20 };
460     bool thisIs(int what);
461 #endif
462 };
463 
464 }
465 
466 #endif
467