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