xref: /AOO42X/main/cppuhelper/inc/cppuhelper/propshlp.hxx (revision 0949c247993d6b8bca709aa584c250f5b342a88d)
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 _CPPUHELPER_PROPSHLP_HXX
25 #define _CPPUHELPER_PROPSHLP_HXX
26 
27 #include <rtl/alloc.h>
28 
29 #include <cppuhelper/interfacecontainer.hxx>
30 #include "cppuhelper/cppuhelperdllapi.h"
31 
32 #include <com/sun/star/beans/XPropertySet.hpp>
33 #include <com/sun/star/beans/XMultiPropertySet.hpp>
34 #include <com/sun/star/beans/XFastPropertySet.hpp>
35 
36 #include <memory>
37 
38 
39 namespace cppu
40 {
41 
42 
43 /*************************************************************************
44 *************************************************************************/
45 
46 
47 /**
48    This interface is used by the OPropertyHelper, to access the property description.
49  */
50 class CPPUHELPER_DLLPUBLIC IPropertyArrayHelper
51 {
52 public:
53     // these are here to force memory de/allocation to sal lib.
operator new(size_t nSize)54     inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW( () )
55         { return ::rtl_allocateMemory( nSize ); }
operator delete(void * pMem)56     inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW( () )
57         { ::rtl_freeMemory( pMem ); }
operator new(size_t,void * pMem)58     inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW( () )
59         { return pMem; }
operator delete(void *,void *)60     inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW( () )
61         {}
62 
63     /**
64        Following the rule, the first virtual method implies the virtual destructor.
65      */
66     virtual ~IPropertyArrayHelper();
67 
68     /**
69        Return the property members Name and Attribute from the handle nHandle.
70        @param nHandle   the handle of a property. If the values of the handles
71                         are sorted in the same way as the names and the highest handle value
72                         is getCount() -1, than it must be an indexed access to the property array.
73        @param pPropName is an out parameter filled with property name of the property with the
74                             handle nHandle. May be NULL.
75        @param rAttributes is an out parameter filled with attributes of the property with the
76                             handle nHandle. May be NULL.
77        @return True, if the handle exist, otherwise false.
78      */
79     virtual sal_Bool SAL_CALL fillPropertyMembersByHandle(
80         ::rtl::OUString * pPropName, sal_Int16 * pAttributes, sal_Int32 nHandle ) = 0;
81     /**
82        Return the sequence of properties. The sequence is sorted by name.
83      */
84     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getProperties(void) = 0;
85     /**
86        Return the property with the name rPropertyName.
87        @param rPropertyName the name of the property.
88        @exception UnknownPropertyException  thrown if the property name is unknown.
89      */
90     virtual ::com::sun::star::beans::Property SAL_CALL getPropertyByName(
91         const ::rtl::OUString& rPropertyName )
92         throw (::com::sun::star::beans::UnknownPropertyException) = 0;
93     /**
94        Return true if the property with the name rPropertyName exist, otherwise false.
95        @param rPropertyName the name of the property.
96      */
97     virtual sal_Bool SAL_CALL hasPropertyByName(const ::rtl::OUString& rPropertyName) = 0;
98     /**
99        Return the handle of the property with the name rPropertyName.
100        If the property does not exist -1 is returned.
101        @param rPropertyName the name of the property.
102      */
103     virtual sal_Int32 SAL_CALL getHandleByName( const ::rtl::OUString & rPropertyName ) = 0;
104     /**
105        Fill the array with the handles of the properties.
106        @return the handles of the names from the pHandles array. -1
107        indicates an unknown property name.
108      */
109     virtual sal_Int32 SAL_CALL fillHandles(
110         /*out*/ sal_Int32 * pHandles, const ::com::sun::star::uno::Sequence< ::rtl::OUString > & rPropNames ) = 0;
111 };
112 
113 /**
114    You can use this helper class to map a XPropertySet-Interface to a XFast-
115    or a XMultiPropertySet interface.
116  */
117 class CPPUHELPER_DLLPUBLIC OPropertyArrayHelper : public IPropertyArrayHelper
118 {
119 public:
120      /**
121        Create an object which supports the common property interfaces.
122 
123        @param pProps    array of properties
124                         The array pProps should be sorted.
125        @param nElements is the number of properties in the pProps structure.
126        @param bSorted   indicates that the elements are sorted.
127       *********/
128     OPropertyArrayHelper(
129         ::com::sun::star::beans::Property *pProps,
130         sal_Int32 nElements ,
131         sal_Bool bSorted = sal_True )
132         SAL_THROW( () );
133 
134      /**
135        Create an object which supports the common property interfaces.
136        @param aProps     sequence of properties which are supported by this helper.
137                          The sequence aProps should be sorted.
138        @param bSorted    indicates that the elements are sorted.
139      */
140     OPropertyArrayHelper(
141         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > & aProps,
142         sal_Bool bSorted = sal_True )
143         SAL_THROW( () );
144 
145     /**
146        Return the number of properties.
147      */
148     sal_Int32 SAL_CALL getCount() const SAL_THROW( () );
149     /**
150        Return the property members Name and Attribute from the handle nHandle.
151        @param nHandle   the handle of a property. If the values of the handles
152                         are sorted in the same way as the names and the highest handle value
153                         is getCount() -1, than it is only an indexed access to the property array.
154                         Otherwise it is a linear search through the array.
155        @param pPropName is an out parameter filled with property name of the property with the
156                             handle nHandle. May be NULL.
157        @param rAttributes is an out parameter filled with attributes of the property with the
158                             handle nHandle. May be NULL.
159        @return True, if the handle exist, otherwise false.
160      */
161     virtual sal_Bool SAL_CALL fillPropertyMembersByHandle(
162         ::rtl::OUString * pPropName, sal_Int16 * pAttributes, sal_Int32 nHandle );
163     /**
164        Return the sequence of properties. The sequence is sorted by name.
165      */
166     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getProperties(void);
167     /**
168        Return the property with the name rPropertyName.
169        @param rPropertyName the name of the property.
170        @exception UnknownPropertyException  thrown if the property name is unknown.
171      */
172     virtual ::com::sun::star::beans::Property SAL_CALL getPropertyByName(
173         const ::rtl::OUString& rPropertyName )
174         throw (::com::sun::star::beans::UnknownPropertyException);
175     /**
176        Return true if the property with the name rPropertyName exist, otherwise false.
177        @param rPropertyName the name of the property.
178      */
179     virtual sal_Bool SAL_CALL hasPropertyByName(const ::rtl::OUString& rPropertyName);
180     /**
181        Return the handle of the property with the name rPropertyName.
182        If the property does not exist -1 is returned.
183        @param rPropertyName the name of the property.
184      */
185     virtual sal_Int32 SAL_CALL getHandleByName( const ::rtl::OUString & rPropertyName );
186     /**
187        Fill the array with the handles of the properties.
188        @return the handles of the names from the pHandles array. -1
189        indicates an unknown property name.
190      */
191     virtual sal_Int32 SAL_CALL fillHandles(
192         /*out*/sal_Int32 * pHandles, const ::com::sun::star::uno::Sequence< ::rtl::OUString > & rPropNames );
193 
194 protected:
195     /** reserved for future use. do not use.
196      */
197     void * m_pReserved;
198 
199 private:
200     void init( sal_Bool bSorted ) SAL_THROW( () );
201 
202     /** The sequence generated from the pProperties array. */
203     ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > aInfos;
204 
205     /**
206        True, If the values of the handles are sorted in the same way as the names
207        and the highest handle value is getCount() -1, otherwise false.
208      */
209     sal_Bool                    bRightOrdered;
210 };
211 
212 
213 //-----------------------------------------------------------------------------
214 // helper defines needed for an interface container with a 32 bit key values
215 
216 struct equalInt32_Impl
217 {
operator ()cppu::equalInt32_Impl218     bool operator()(const sal_Int32 & i1 , const sal_Int32 & i2) const SAL_THROW( () )
219         { return i1 == i2; }
220 };
221 
222 struct hashInt32_Impl
223 {
operator ()cppu::hashInt32_Impl224     size_t operator()(const sal_Int32 & i) const SAL_THROW( () )
225         { return i; }
226 };
227 /** Specialized class for key type sal_Int32,
228     without explicit usage of STL symbols.
229 */
230 class CPPUHELPER_DLLPUBLIC OMultiTypeInterfaceContainerHelperInt32
231 {
232 public:
233     // these are here to force memory de/allocation to sal lib.
operator new(size_t nSize)234     inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW( () )
235         { return ::rtl_allocateMemory( nSize ); }
operator delete(void * pMem)236     inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW( () )
237         { ::rtl_freeMemory( pMem ); }
operator new(size_t,void * pMem)238     inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW( () )
239         { return pMem; }
operator delete(void *,void *)240     inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW( () )
241         {}
242 
243     /**
244       Create a container of interface containers.
245 
246       @param rMutex the mutex to protect multi thread access.
247                         The lifetime must be longer than the lifetime
248                         of this object.
249      */
250     OMultiTypeInterfaceContainerHelperInt32( ::osl::Mutex & ) SAL_THROW( () );
251     /**
252       Delete all containers.
253      */
254     ~OMultiTypeInterfaceContainerHelperInt32() SAL_THROW( () );
255 
256     /**
257       Return all id's under which at least one interface is added.
258      */
259     ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL getContainedTypes() const SAL_THROW( () );
260 
261     /**
262       Return the container created under this key.
263       @return the container created under this key. If the container
264                 was not created, null was returned.
265      */
266     OInterfaceContainerHelper * SAL_CALL getContainer( const sal_Int32 & rKey ) const SAL_THROW( () );
267 
268     /**
269       Insert an element in the container specified with the key. The position is not specified.
270       @param rKey       the id of the container.
271       @param rxIFace    the added interface. It is allowed to insert null or
272                         the same pointer more than once.
273       @return the new count of elements in the container.
274      */
275     sal_Int32 SAL_CALL addInterface(
276         const sal_Int32 & rKey,
277         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & r )
278         SAL_THROW( () );
279 
280     /**
281       Remove an element from the container specified with the key.
282       It uses the equal definition of uno objects to remove the interfaces.
283       @param rKey       the id of the container.
284       @param rxIFace    the removed interface.
285       @return the new count of elements in the container.
286      */
287     sal_Int32 SAL_CALL removeInterface(
288         const sal_Int32 & rKey,
289         const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > & rxIFace )
290         SAL_THROW( () );
291 
292     /**
293       Call disposing on all object in the container that
294       support XEventListener. Than clear the container.
295      */
296     void    SAL_CALL disposeAndClear( const ::com::sun::star::lang::EventObject & rEvt ) SAL_THROW( () );
297     /**
298       Remove all elements of all containers. Does not delete the container.
299      */
300     void SAL_CALL clear() SAL_THROW( () );
301 
302     typedef sal_Int32 keyType;
303 private:
304     void *m_pMap;
305     ::osl::Mutex &  rMutex;
306 
307     inline OMultiTypeInterfaceContainerHelperInt32( const OMultiTypeInterfaceContainerHelperInt32 & ) SAL_THROW( () );
308     inline OMultiTypeInterfaceContainerHelperInt32 & operator = ( const OMultiTypeInterfaceContainerHelperInt32 & ) SAL_THROW( () );
309 };
310 
311 
312 /** An interface to extend event notification actions.
313   */
314 class IEventNotificationHook
315 {
316 public:
317     /**
318         Method to be called by OPropertySetHelper::fire.
319 
320         @param bIgnoreRuntimeExceptionsWhileFiring
321                         indicates whether occurring RuntimeExceptions shall be
322                         ignored when firing notifications
323 
324         @see OPropertySetHelper::fire
325      */
326     virtual void fireEvents(
327         sal_Int32 * pnHandles,
328         sal_Int32 nCount,
329         sal_Bool bVetoable,
330         bool bIgnoreRuntimeExceptionsWhileFiring) = 0;
331 };
332 
333 
334 
335 /**
336    This abstract class maps the methods of the interfaces XMultiPropertySet, XFastPropertySet
337    and XPropertySet to the methods getInfoHelper, convertFastPropertyValue,
338    setFastPropertyValue_NoBroadcast and getFastPropertyValue. You must derive from
339    this class and overload the methods.
340    It provides a standard implementation of the XPropertySetInfo.
341    The XPropertiesChangeListener are inserted in the rBHelper.aLC structure.
342    The XPropertyChangeListener and XVetoableChangeListener with no names are inserted
343    in the rBHelper.aLC structure. So it is possible to advise property listeners with
344    the connection point interfaces. But only listeners that listen to all property changes.
345 
346  */
347 class CPPUHELPER_DLLPUBLIC OPropertySetHelper : public ::com::sun::star::beans::XMultiPropertySet,
348                            public ::com::sun::star::beans::XFastPropertySet,
349                            public ::com::sun::star::beans::XPropertySet
350 {
351 public:
352     /**
353        @param rBHelper  this structure contains the basic members of
354                         a broadcaster.
355                         The lifetime must be longer than the lifetime
356                         of this object. Stored in the variable rBHelper.
357      */
358     OPropertySetHelper( OBroadcastHelper & rBHelper ) SAL_THROW( () );
359 
360     /** Constructor.
361 
362         @param rBHelper
363                         this structure contains the basic members of
364                         a broadcaster.
365                         The lifetime must be longer than the lifetime
366                         of this object. Stored in the variable rBHelper.
367 
368         @param bIgnoreRuntimeExceptionsWhileFiring
369                         indicates whether occurring RuntimeExceptions will be
370                         ignored when firing notifications (vetoableChange((),
371                         propertyChange()) to listeners.
372                         PropertyVetoExceptions may still be thrown.
373                         This flag is useful in a inter-process scenarios when
374                         remote bridges may break down
375                         (firing DisposedExceptions).
376     */
377     OPropertySetHelper(
378         OBroadcastHelper & rBHelper, bool bIgnoreRuntimeExceptionsWhileFiring );
379 
380     /** Constructor.
381 
382         @param rBHelper
383                         this structure contains the basic members of
384                         a broadcaster.
385                         The lifetime must be longer than the lifetime
386                         of this object. Stored in the variable rBHelper.
387 
388         @param i_pFireEvents
389                         additional event notifier
390 
391         @param bIgnoreRuntimeExceptionsWhileFiring
392                         indicates whether occurring RuntimeExceptions will be
393                         ignored when firing notifications (vetoableChange((),
394                         propertyChange()) to listeners.
395                         PropertyVetoExceptions may still be thrown.
396                         This flag is useful in a inter-process scenarios when
397                         remote bridges may break down
398                         (firing DisposedExceptions).
399     */
400     OPropertySetHelper(
401         OBroadcastHelper & rBHelper,
402         IEventNotificationHook *i_pFireEvents,
403         bool bIgnoreRuntimeExceptionsWhileFiring = false);
404 
405     /**
406        Only returns a reference to XMultiPropertySet, XFastPropertySet, XPropertySet and
407        XEventListener.
408      */
409     ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
410         throw (::com::sun::star::uno::RuntimeException);
411 
412     /** eases implementing XTypeProvider::getTypes, returns the types of XMultiPropertySet, XFastPropertySet, XPropertySet
413      */
414     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > getTypes()
415         throw(::com::sun::star::uno::RuntimeException);
416 
417     /**
418        Send a disposing notification to the listeners in the containers aBoundLC
419        and aVetoableLC.
420 
421        @see OComponentHelper
422      */
423     void SAL_CALL disposing() SAL_THROW( () );
424 
425     /**
426        Throw UnknownPropertyException or PropertyVetoException if the property with the name
427        rPropertyName does not exist or is readonly. Otherwise rPropertyName is changed to its handle
428        value and setFastPropertyValue is called.
429      */
430     virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& rPropertyName, const ::com::sun::star::uno::Any& aValue )
431         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
432     /**
433        Throw UnknownPropertyException if the property with the name
434        rPropertyName does not exist.
435      */
436     virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(const ::rtl::OUString& aPropertyName)
437         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
438     /** Ignored if the property is not bound. */
439     virtual void SAL_CALL addPropertyChangeListener(
440         const ::rtl::OUString& aPropertyName,
441         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener)
442         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
443 
444     /** Ignored if the property is not bound. */
445     virtual void SAL_CALL removePropertyChangeListener(
446         const ::rtl::OUString& aPropertyName,
447         const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertyChangeListener >& aListener)
448         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
449 
450     /** Ignored if the property is not constrained. */
451     virtual void SAL_CALL addVetoableChangeListener(
452         const ::rtl::OUString& aPropertyName,
453         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener)
454         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
455 
456     /** Ignored if the property is not constrained. */
457     virtual void SAL_CALL removeVetoableChangeListener(
458         const ::rtl::OUString& aPropertyName,
459         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener > & aListener )
460         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
461 
462     /**
463        Throw UnknownPropertyException or PropertyVetoException if the property with the name
464        rPropertyName does not exist or is readonly. Otherwise the method convertFastPropertyValue
465        is called, then the vetoable listeners are notified. After this the value of the property
466        is changed with the setFastPropertyValue_NoBroadcast method and the bound listeners are
467        notified.
468       */
469     virtual void SAL_CALL setFastPropertyValue( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
470         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
471 
472     /**
473        @exception com::sun::star::beans::UnknownPropertyException
474          if the property with the handle nHandle does not exist.
475      */
476     virtual ::com::sun::star::uno::Any SAL_CALL getFastPropertyValue( sal_Int32 nHandle )
477         throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
478 
479     // XMultiPropertySet
480     virtual void SAL_CALL setPropertyValues(
481         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames,
482         const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Values )
483         throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
484 
485     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL getPropertyValues(
486         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames )
487         throw(::com::sun::star::uno::RuntimeException);
488 
489     virtual void SAL_CALL addPropertiesChangeListener(
490         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames,
491         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& Listener )
492         throw(::com::sun::star::uno::RuntimeException);
493 
494     virtual void SAL_CALL removePropertiesChangeListener(
495         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& Listener )
496         throw(::com::sun::star::uno::RuntimeException);
497 
498     virtual void SAL_CALL firePropertiesChangeEvent(
499         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames,
500         const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener > & Listener )
501         throw(::com::sun::star::uno::RuntimeException);
502     /**
503        The property sequence is created in the call. The interface isn't used after the call.
504      */
505     static ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySetInfo > SAL_CALL
506         createPropertySetInfo( IPropertyArrayHelper & rProperties ) SAL_THROW( () );
507 protected:
508     /**
509        This method fire events to all registered property listeners.
510        @param pnHandles     the id's of the properties that changed.
511        @param pNewValues    the new values of the properties.
512        @param pOldValues    the old values of the properties.
513        @param nCount        the number of elements in the arrays pnHandles, pNewValues and pOldValues.
514        @param bVetoable true means fire to VetoableChangeListener, false means fire to
515                 XPropertyChangedListener and XMultiPropertyChangedListener.
516      */
517     void SAL_CALL fire(
518         sal_Int32 * pnHandles,
519         const ::com::sun::star::uno::Any * pNewValues,
520         const ::com::sun::star::uno::Any * pOldValues,
521         sal_Int32 nCount,
522         sal_Bool bVetoable );
523 
524     /**
525        Set multiple properties with the handles.
526        @param nSeqLen   the length of the arrays pHandles and Values.
527        @param pHandles the handles of the properties. The number of elements
528             in the Values sequence is the length of the handle array. A value of -1
529             of a handle means invalid property. These are ignored.
530        @param pValues the values of the properties.
531        @param nHitCount the number of valid entries in the handle array.
532      */
533     void SAL_CALL setFastPropertyValues(
534         sal_Int32 nSeqLen,
535         sal_Int32 * pHandles,
536         const ::com::sun::star::uno::Any * pValues,
537         sal_Int32 nHitCount )
538         SAL_THROW( (::com::sun::star::uno::Exception) );
539 
540     /**
541        This abstract method must return the name to index table. This table contains all property
542        names and types of this object. The method is not implemented in this class.
543      */
544     virtual IPropertyArrayHelper & SAL_CALL getInfoHelper() = 0;
545 
546     /**
547        Converted the value rValue and return the result in rConvertedValue and the
548        old value in rOldValue. A IllegalArgumentException is thrown.
549        The method is not implemented in this class. After this call the vetoable
550        listeners are notified.
551 
552        @param rConvertedValue the converted value. Only set if return is true.
553        @param rOldValue the old value. Only set if return is true.
554        @param nHandle the handle of the property.
555        @return true if the value converted.
556      */
557     virtual sal_Bool SAL_CALL convertFastPropertyValue(
558         ::com::sun::star::uno::Any & rConvertedValue,
559         ::com::sun::star::uno::Any & rOldValue,
560         sal_Int32 nHandle,
561         const ::com::sun::star::uno::Any& rValue )
562         throw (::com::sun::star::lang::IllegalArgumentException) = 0;
563 
564     /** The same as setFastPropertyValue; nHandle is always valid.
565         The changes must not be broadcasted in this method.
566         The method is implemented in a derived class.
567 
568         @attention
569         Although you are permitted to throw any UNO exception, only the following
570         are valid for usage:
571         -- ::com::sun::star::beans::UnknownPropertyException
572         -- ::com::sun::star::beans::PropertyVetoException
573         -- ::com::sun::star::lang::IllegalArgumentException
574         -- ::com::sun::star::lang::WrappedTargetException
575         -- ::com::sun::star::uno::RuntimeException
576 
577         @param nHandle
578                handle
579         @param rValue
580                value
581     */
582     virtual void SAL_CALL setFastPropertyValue_NoBroadcast(
583         sal_Int32 nHandle,
584         const ::com::sun::star::uno::Any& rValue )
585         throw (::com::sun::star::uno::Exception) = 0;
586     /**
587        The same as getFastPropertyValue, but return the value through rValue and nHandle
588        is always valid.
589        The method is not implemented in this class.
590      */
591     virtual void SAL_CALL getFastPropertyValue(
592         ::com::sun::star::uno::Any& rValue,
593         sal_Int32 nHandle ) const = 0;
594 
595     /** sets an dependent property's value
596 
597         <p>Sometimes setting a given property needs to implicitly modify another property's value. Calling |setPropertyValue|
598         from within |setFastPropertyValue_NoBroadcast| is not an option here, as it would notify the property listeners
599         while our mutex is still locked. Setting the dependent property's value directly (e.g. by calling |setFastPropertyValue_NoBroadcast|
600         recursively) is not an option, too, since it would miss firing the property change event.</p>
601 
602         <p>So, in such cases, you use |setDependentFastPropertyValue| from within |setFastPropertyValue_NoBroadcast|.
603         It will convert and actually set the property value (invoking |convertFastPropertyValue| and |setFastPropertyValue_NoBroadcast|
604         for the given handle and value), and add the property change event to the list of events to be notified
605         when the bottom-most |setFastPropertyValue_NoBroadcast| on the stack returns.</p>
606 
607         <p><strong>Note</strong>: The method will <em>not</em> invoke veto listeners for the property.</p>
608 
609         <p><strong>Note</strong>: It's the caller's responsibility to ensure that our mutex is locked. This is
610         canonically given when the method is invoked from within |setFastPropertyValue_NoBroadcast|, in other
611         contexts, you might need to take own measures.</p>
612     */
613     void    setDependentFastPropertyValue(
614                 sal_Int32 i_handle,
615                 const ::com::sun::star::uno::Any& i_value
616             );
617 
618     /** The common data of a broadcaster. Use the mutex, disposing state and the listener container. */
619     OBroadcastHelper    &rBHelper;
620     /**
621        Container for the XPropertyChangedListener. The listeners are inserted by handle.
622      */
623     OMultiTypeInterfaceContainerHelperInt32 aBoundLC;
624     /**
625        Container for the XPropertyVetoableListener. The listeners are inserted by handle.
626      */
627     OMultiTypeInterfaceContainerHelperInt32 aVetoableLC;
628 
629     class Impl;
630 
631     /** reserved for future use. finally, the future has arrived...
632      */
633     const std::auto_ptr<Impl> m_pReserved;
634 
635 private:
636     OPropertySetHelper( const OPropertySetHelper & ) SAL_THROW( () );
637     OPropertySetHelper &    operator = ( const OPropertySetHelper & ) SAL_THROW( () );
638 
639     /** notifies the given changes in property's values, <em>plus</em> all property changes collected during recent
640         |setDependentFastPropertyValue| calls.
641     */
642     void    impl_fireAll(
643                 sal_Int32* i_handles,
644                 const ::com::sun::star::uno::Any * i_newValues,
645                 const ::com::sun::star::uno::Any * i_oldValues,
646                 sal_Int32 i_count
647             );
648 
649 public:
650 // Suppress warning about virtual functions but non-virtual destructor:
651 #if defined __GNUC__
652 #pragma GCC system_header
653 #elif defined _MSC_VER
654 #pragma warning(push)
655 #pragma warning(disable: 4265)
656 #endif
657     /**
658        You must call disposing before destruction.
659      */
660     ~OPropertySetHelper() SAL_THROW( () );
661 };
662 #if defined _MSC_VER
663 #pragma warning(pop)
664 #endif
665 
666 } // end namespace cppuhelper
667 #endif  //
668