xref: /trunk/main/cppuhelper/test/testpropshlp.cxx (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 #if !defined(OSL_DEBUG_LEVEL) || OSL_DEBUG_LEVEL == 0
25 # undef OSL_DEBUG_LEVEL
26 # define OSL_DEBUG_LEVEL 2
27 #endif
28 
29 
30 // MARKER(update_precomp.py): autogen include statement, do not remove
31 #include "precompiled_cppuhelper.hxx"
32 #include <osl/mutex.hxx>
33 #include <osl/diagnose.h>
34 
35 #include <cppuhelper/propshlp.hxx>
36 #include <cppuhelper/weak.hxx>
37 
38 #include <cppuhelper/proptypehlp.hxx>
39 
40 #include <com/sun/star/uno/Any.hxx>
41 #include <com/sun/star/beans/PropertyAttribute.hpp>
42 
43 #include <cppuhelper/implbase3.hxx>
44 
45 using namespace ::cppu;
46 using namespace ::rtl;
47 using namespace ::osl;
48 using namespace ::com::sun::star::uno;
49 using namespace ::com::sun::star::beans;
50 using namespace ::com::sun::star::lang;
51 
52 
53 
54 /**********************
55 *
56 **********************/
getPropertyTable1()57 static Property * getPropertyTable1()
58 {
59     static Property *pTable = 0;
60 
61     if( ! pTable )  {
62         MutexGuard guard( Mutex::getGlobalMutex() );
63         if( ! pTable ) {
64             static Property aTable[] =
65             {
66                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString *)0) ,
67                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //OUString
68                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ) ,
69                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //Char
70                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("c") ), 2, getCppuType( (sal_Int32*)0) ,
71                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //sal_Int32
72                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("d") ), 5, getCppuType( (double*)0)     ,
73                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //double
74                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("e") ), 7, getCppuBooleanType()         ,
75                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //BOOL
76                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any*)0)        ,
77                              PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID )  //Any
78             };
79             pTable = aTable;
80         }
81     }
82     return pTable;
83 }
84 
85 
getPropertyTable2()86 static Property * getPropertyTable2()
87 {
88     static Property *pTable = 0;
89 
90     if( ! pTable )  {
91         MutexGuard guard(  ::osl::Mutex::getGlobalMutex() );
92         if( ! pTable ) {
93             static Property aTable[] =
94             {
95                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any *)0)   ,
96                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // Any
97                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
98                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // Char
99                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
100                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // OUString
101                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("d") ), 5, getCppuType( (double*)0) ,
102                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // Double
103                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("c") ), 2, getCppuType( (sal_Int32*)0),
104                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // sal_Int32
105                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("e") ), 7, getCppuBooleanType()         ,
106                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID )    // Bool
107             };
108             pTable = aTable;
109         }
110     }
111     return pTable;
112 }
113 
getPropertyTable3()114 static Property * getPropertyTable3()
115 {
116     static Property *pTable = 0;
117 
118     if( ! pTable )  {
119         MutexGuard guard(  ::osl::Mutex::getGlobalMutex() );
120         if( ! pTable ) {
121             static Property aTable[] =
122             {
123                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
124                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // Char
125                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any *)0)   ,
126                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // any
127                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
128                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID )    // OUString
129             };
130             pTable = aTable;
131         }
132     }
133     return pTable;
134 }
135 
136 
getPropertyTable4()137 static Property * getPropertyTable4()
138 {
139     static Property *pTable = 0;
140 
141     if( ! pTable )  {
142         MutexGuard guard(  ::osl::Mutex::getGlobalMutex() );
143         if( ! pTable ) {
144             static Property aTable[] =
145             {
146                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
147                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ),   // OUString
148                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
149                                      PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
150                 Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 2, getCppuType( (Any *)0)   ,
151                                     PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID )    // Any
152             };
153             pTable = aTable;
154         }
155     }
156     return pTable;
157 }
158 
159 
160 
161 /**********************
162 *
163 * Note : all Property names must be in the 127 ASCII subset !
164 *
165 **********************/
166 
167 
test_PropertyArrayHelper()168 void test_PropertyArrayHelper()
169 {
170     // Test getProperties() and getCount()
171     {
172         OPropertyArrayHelper a1( getPropertyTable1(), 6 );
173         OSL_ENSURE( 6 == a1.getCount(), "not all properties inserted" );
174         Sequence< Property > aProps = a1.getProperties();
175         Property * pP = aProps.getArray();
176         OSL_ENSURE( 6 == aProps.getLength(), "getProperties() gives not all properties" );
177         for( int i = 0; i < 6; i++ )
178         {
179             OSL_ENSURE( pP[i].Name      == getPropertyTable1()[i].Name , "Name not correct" );
180             OSL_ENSURE( pP[i].Handle        == getPropertyTable1()[i].Handle, "Handle not correct" );
181             OSL_ENSURE( pP[i].Attributes    == getPropertyTable1()[i].Attributes, "Attributes not correct" );
182             OSL_ENSURE( pP[i].Type == getPropertyTable1()[i].Type, "Type not correct" );
183         }
184     }
185 
186     // Test sorting
187     {
188         OPropertyArrayHelper a1( getPropertyTable2(), 6, sal_False );
189         Sequence< Property > aProps = a1.getProperties();
190         Property * pP = aProps.getArray();
191         OSL_ENSURE( 6 == aProps.getLength(), "getProperties() gives not all properties" );
192 
193         // table to switch to sorted
194         int a[] = { 2 , 1 , 4, 3, 5, 0 };
195         for( int i = 0; i < 6; i++ )
196         {
197             OSL_ENSURE( pP[i].Name == getPropertyTable2()[a[i]].Name , "Name not correct" );
198             OSL_ENSURE( pP[i].Handle == getPropertyTable2()[a[i]].Handle, "Handle not correct" );
199             OSL_ENSURE( pP[i].Attributes == getPropertyTable2()[a[i]].Attributes, "Attributes not correct" );
200             OSL_ENSURE( pP[i].Type == getPropertyTable2()[a[i]].Type, "Type not correct" );
201         }
202     }
203 
204     // Test sorting
205     {
206         OPropertyArrayHelper a1( getPropertyTable3(), 3, sal_False );
207         Sequence< Property > aProps = a1.getProperties();
208         Property * pP = aProps.getArray();
209         OSL_ENSURE( 3 == aProps.getLength(), "getProperties() gives not all properties" );
210         // table to switch to sorted
211         int a[] = { 2 , 0 , 1 };
212         for( int i = 0; i < 3; i++ )
213         {
214             OSL_ENSURE( pP[i].Name == getPropertyTable3()[a[i]].Name , "Name not correct" );
215             OSL_ENSURE( pP[i].Handle == getPropertyTable3()[a[i]].Handle, "Handle not correct" );
216             OSL_ENSURE( pP[i].Attributes == getPropertyTable3()[a[i]].Attributes, "Attributes not correct" );
217             OSL_ENSURE( pP[i].Type == getPropertyTable3()[a[i]].Type, "Type not correct" );
218         }
219     }
220 
221     // Test getPropertyByName and hasPropertyByName
222     {
223         OPropertyArrayHelper a1( getPropertyTable1(), 6 );
224         for( int i = 0; i < 6; i++ )
225         {
226             OSL_ENSURE( a1.hasPropertyByName( getPropertyTable1()[i].Name ), "hasPropertyByName not correct" );
227             Property aP = a1.getPropertyByName( getPropertyTable1()[i].Name );
228             OSL_ENSURE( aP.Name == getPropertyTable1()[i].Name , "Name not correct" );
229             OSL_ENSURE( aP.Handle == getPropertyTable1()[i].Handle, "Handle not correct" );
230             OSL_ENSURE( aP.Attributes == getPropertyTable1()[i].Attributes, "Attributes not correct" );
231             OSL_ENSURE( aP.Type == getPropertyTable1()[i].Type, "Type not correct" );
232         }
233 
234         OSL_ENSURE( !a1.hasPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM("never exist") ) ), "hasPropertyByName not correct" );
235         try
236         {
237             a1.getPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM("never exist") ) );
238             OSL_ENSURE( sal_False, "exception not thrown" );
239         }
240         catch( UnknownPropertyException & )
241         {
242         }
243     }
244 
245     // Test getHandleByName
246     {
247         OPropertyArrayHelper a1( getPropertyTable1(), 6 );
248         for( int i = 0; i < 6; i++ )
249         {
250             sal_Int32 Handle = a1.getHandleByName( getPropertyTable1()[i].Name );
251             OSL_ENSURE( Handle == getPropertyTable1()[i].Handle, "Handle not correct" );
252         }
253         sal_Int32 Handle = a1.getHandleByName( OUString( RTL_CONSTASCII_USTRINGPARAM("asdaf") ) );
254         OSL_ENSURE( Handle == -1, "Handle not correct" );
255     }
256 
257     // Test fillPropertyMembersByHandle
258     {
259         OPropertyArrayHelper a1( getPropertyTable1(), 6 );
260         int i;
261         for( i = 0; i < 6; i++ )
262         {
263             sal_Int16   nAttributes;
264             OUString aPropName;
265             sal_Bool b = a1.fillPropertyMembersByHandle( &aPropName, &nAttributes, getPropertyTable1()[i].Handle );
266             OSL_ENSURE( b, "fillPropertyMembersByHandle: handle not found" );
267             OSL_ENSURE( nAttributes == getPropertyTable1()[i].Attributes, "fillPropertyMembersByHandle: Attributes not correct" );
268             OSL_ENSURE( aPropName == getPropertyTable1()[i].Name , "fillPropertyMembersByHandle: Name not correct" );
269         }
270         OSL_ENSURE( !a1.fillPropertyMembersByHandle( NULL, NULL, 66666 ), "fillPropertyMembersByHandle: handle found" );
271         // optimized table
272         OPropertyArrayHelper a4( getPropertyTable4(), 3 );
273         for( i = 0; i < 3; i++ )
274         {
275             sal_Int16   nAttributes;
276             OUString aPropName;
277             sal_Bool b = a1.fillPropertyMembersByHandle( &aPropName, &nAttributes, getPropertyTable4()[i].Handle );
278             OSL_ENSURE( b, "fillPropertyMembersByHandle: handle not found" );
279             OSL_ENSURE( nAttributes == getPropertyTable1()[i].Attributes, "fillPropertyMembersByHandle: Attributes not correct" );
280             OSL_ENSURE( aPropName == getPropertyTable1()[i].Name , "fillPropertyMembersByHandle: Name not correct" );
281         }
282         OSL_ENSURE( !a4.fillPropertyMembersByHandle( NULL, NULL, 66666 ), "fillPropertyMembersByHandle: handle found" );
283     }
284 
285     // Test fillHandles
286     {
287         OPropertyArrayHelper a1( getPropertyTable1(), 6 );
288         Sequence< OUString > aS( 4 );
289         sal_Int32 Handles[4];
290         // muss sortiert sein
291         aS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("a") );
292         aS.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("d") );
293         aS.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("f") );
294         aS.getArray()[3] = OUString( RTL_CONSTASCII_USTRINGPARAM("t") );
295         sal_Int32 nHitCount = a1.fillHandles( Handles, aS );
296         OSL_ENSURE( nHitCount == 3, "wrong number of hits " );
297         OSL_ENSURE( Handles[0] == getPropertyTable1()[0].Handle, "Handle not correct" );
298         OSL_ENSURE( Handles[1] == getPropertyTable1()[3].Handle, "Handle not correct" );
299         OSL_ENSURE( Handles[2] == getPropertyTable1()[5].Handle, "Handle not correct" );
300         OSL_ENSURE( Handles[3] == -1, "Handle not correct" );
301     }
302 }
303 
304 
305 
306 
307 //----------------------------------------------------
308 //  test_OPropertySetHelper
309 //----------------------------------------------------
310 struct MutexContainer
311 {
312     Mutex aMutex;
313 };
314 class test_OPropertySetHelper :
315             public MutexContainer,
316             public OBroadcastHelper ,
317             public OPropertySetHelper,
318             public OWeakObject
319 {
320 public:
321 
test_OPropertySetHelper(Property * p,sal_Int32 n)322                     test_OPropertySetHelper( Property * p, sal_Int32    n )
323                         : MutexContainer()
324                         , OBroadcastHelper( ((MutexContainer *)this)->aMutex )
325 //                      , OPropertySetHelper( *SAL_STATIC_CAST(OBroadcastHelper *,this))
326                         // MSCI 4 bug ! :
327                         //      OBroadcastHelper == OBroadcastHelperVar<OMultiTypeInterfaceContainerHelper>
328                         , OPropertySetHelper(
329                                 *SAL_STATIC_CAST(OBroadcastHelper *,this))
330                         , bBOOL( sal_False )
331                         , nINT16( 0 )
332                         , nINT32( 0 )
333                         , pBasicProps( p )
334                         , nPropCount( n )
335                     {
336                     }
337 
338 
~test_OPropertySetHelper()339                     ~test_OPropertySetHelper()
340                     {
341                     }
342 
dispose()343     void dispose()
344                     {
345                         // see comphlp.cxx
346                         sal_Bool bDoDispose = sal_False;
347                         {
348                             MutexGuard aGuard( rBHelper.rMutex );
349                             if( !rBHelper.bDisposed && !rBHelper.bInDispose )
350                             {
351                                 rBHelper.bInDispose = sal_True;
352                                 bDoDispose = sal_True;
353                             }
354                         }
355                         if( bDoDispose )
356                         {
357                             disposing();
358                             EventObject aEvt;
359                             aEvt.Source = Reference < XInterface > ( SAL_STATIC_CAST( OWeakObject * ,this) );
360 
361                             rBHelper.aLC.disposeAndClear( aEvt );
362                             rBHelper.bDisposed = sal_True;
363                             rBHelper.bInDispose = sal_False;
364                         }
365                     }
366 
367     // XInterface
queryInterface(const::com::sun::star::uno::Type & rType)368     Any             SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
369                     {
370                         Any aRet( OPropertySetHelper::queryInterface( rType ) );
371                         return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
372                     }
acquire()373     void            SAL_CALL acquire() throw()
374                             { OWeakObject::acquire(); }
release()375     void            SAL_CALL release() throw()
376                             { OWeakObject::release(); }
377 
378     // XPropertySet
379     Reference < XPropertySetInfo >  SAL_CALL getPropertySetInfo();
380 
381     using OPropertySetHelper::getFastPropertyValue;
382 
383     sal_Bool                    bBOOL;
384     sal_Int16                   nINT16;
385     sal_Int32                   nINT32;
386     Property *                  pBasicProps;
387     sal_Int32                   nPropCount;
388 protected:
389     IPropertyArrayHelper & SAL_CALL getInfoHelper();
390     sal_Bool SAL_CALL convertFastPropertyValue(
391         Any & rConvertedValue, Any & rOldValue,
392         sal_Int32 nHandle, const Any& rValue );
393     void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue );
394     void SAL_CALL getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const;
395 };
396 
397 //----------------------------------------------------------------------
398 //------ The Properties of this implementation -------------------------
399 //----------------------------------------------------------------------
400 // Id must be the index into the array
401 #define PROPERTY_BOOL       0
402 #define PROPERTY_INT16      1
403 #define PROPERTY_INT32      2
404 
405 // Max number of properties
406 #define PROPERTY_COUNT                      4
407 // Names of Properties
408 /**
409  * All Properties of this implementation. Must be sorted by name.
410  */
getBasicProps()411 Property * getBasicProps()
412 {
413     static Property *pTable = 0;
414 
415     if( ! pTable )  {
416         MutexGuard guard(  ::osl::Mutex::getGlobalMutex() );
417         if( ! pTable ) {
418 
419             static Property aBasicProps[PROPERTY_COUNT] =
420             {
421                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") )  , PROPERTY_BOOL , getCppuBooleanType(), PropertyAttribute::READONLY ),
422                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , PROPERTY_INT16,
423                                 getCppuType( (sal_Int16*)0 ),   PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED ),
424                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) , PROPERTY_INT32, getCppuType( (sal_Int32*)0 ), PropertyAttribute::BOUND ),
425                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("TEST") )  , 55            , getCppuType( (sal_Int32*)0),  PropertyAttribute::BOUND )
426             };
427             pTable = aBasicProps;
428         }
429     }
430     return pTable;
431 }
432 
433 
434 //----------------------------------------------------
435 //  test_OPropertySetHelper_Listener
436 //----------------------------------------------------
437 class test_OPropertySetHelper_Listener
438     : public WeakImplHelper3< XPropertyChangeListener, XPropertiesChangeListener, XVetoableChangeListener >
439 {
440 public:
441     sal_Int32           nDisposing;
442     Mutex               aMutex;
443     Any *               pExceptedListenerValues;
444     sal_Int32           nCount;
445     sal_Int32           nCurrent;
446 
test_OPropertySetHelper_Listener(Any * p=0,sal_Int32 n=0)447                     test_OPropertySetHelper_Listener( Any * p = 0, sal_Int32 n = 0 )
448                         : nDisposing( 0 )
449                         , pExceptedListenerValues( p )
450                         , nCount( n )
451                         , nCurrent( 0 )
452                     {
453                     }
~test_OPropertySetHelper_Listener()454                     ~test_OPropertySetHelper_Listener()
455                     {
456                     }
457 
getRefCount()458     sal_Int32   getRefCount()
459         { return m_refCount; }
460 
461     // XEventListener
disposing(const EventObject &)462     void SAL_CALL disposing(const EventObject& /*evt*/)
463     {
464         MutexGuard aGuard( aMutex );
465         nDisposing++;
466     }
467 
468     // XPropertyChangeListener
propertyChange(const PropertyChangeEvent & evt)469     void SAL_CALL propertyChange(const PropertyChangeEvent& evt)
470     {
471         if( !pExceptedListenerValues )
472             return;
473         MutexGuard aGuard( aMutex );
474         OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
475 
476         switch( evt.PropertyHandle )
477         {
478             case PROPERTY_BOOL:
479                 {
480                 OSL_ENSURE( sal_False           , "PropertySetHelper: BOOL cannot change" );
481                 OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
482                 }
483             break;
484 
485             case PROPERTY_INT16:
486                 {
487                 OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
488 
489                 OSL_ENSURE( pExceptedListenerValues[nCurrent].getValueType().getTypeClass() == TypeClass_SHORT ,
490                             "PropertySetHelper: wrong data type" );
491 
492                 sal_Int16 nInt16, nOldInt16;
493                 pExceptedListenerValues[nCurrent]   >>= nInt16;
494                 evt.OldValue                        >>= nOldInt16;
495                 OSL_ENSURE( nInt16 == nOldInt16, "PropertySetHelper: wrong old value" );
496 
497 
498                 pExceptedListenerValues[nCurrent+1] >>= nInt16;
499                 evt.NewValue                        >>= nOldInt16;
500                 OSL_ENSURE( nInt16 == nOldInt16 ,   "PropertySetHelper: wrong new value" );
501                 }
502             break;
503 
504             case PROPERTY_INT32:
505                 {
506                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
507 
508                     sal_Int32 nInt32,nOldInt32;
509 
510                     pExceptedListenerValues[nCurrent] >>= nInt32;
511                     evt.OldValue >>= nOldInt32;
512                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong old value" );
513 
514                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
515                     evt.NewValue >>= nOldInt32;
516                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong new value" );
517                 }
518             break;
519 
520             default:
521                 OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
522         }
523         nCurrent += 2;
524     }
525 
526     // XVetoableChangeListener
vetoableChange(const PropertyChangeEvent & evt)527     void SAL_CALL vetoableChange(const PropertyChangeEvent& evt)
528     {
529         if( !pExceptedListenerValues )
530             return;
531         MutexGuard aGuard( aMutex );
532         OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
533 
534         switch( evt.PropertyHandle )
535         {
536             case PROPERTY_BOOL:
537                 {
538                     OSL_ENSURE( sal_False   , "PropertySetHelper: BOOL cannot change" );
539                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
540                 }
541             break;
542 
543             case PROPERTY_INT16:
544                 {
545                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
546 
547                     sal_Int16 nInt16, nOldInt16;
548                     pExceptedListenerValues[nCurrent]   >>= nInt16;
549                     evt.OldValue                        >>= nOldInt16;
550 
551                     OSL_ENSURE( nInt16 == nOldInt16,"PropertySetHelper: wrong old value" );
552 
553                     pExceptedListenerValues[nCurrent+1]     >>= nInt16;
554                     evt.NewValue                            >>= nOldInt16;
555                     OSL_ENSURE( nInt16 == nOldInt16 ,   "PropertySetHelper: wrong new value" );
556 
557                     if( nOldInt16 == 100 )
558                     {
559                         nCurrent += 2;
560                         throw PropertyVetoException();
561                     }
562                 }
563             break;
564 
565             case PROPERTY_INT32:
566                 {
567                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
568 
569                     sal_Int32 nInt32,nOldInt32;
570                     pExceptedListenerValues[nCurrent] >>= nInt32;
571                     evt.OldValue >>= nOldInt32;
572                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
573 
574                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
575                     evt.NewValue >>= nOldInt32;
576                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong new value" );
577                 }
578             break;
579 
580             default:
581                 OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
582         }
583         nCurrent += 2;
584     }
585 
586     // XPropertiesChangeListener
propertiesChange(const Sequence<PropertyChangeEvent> & evtSeq)587     void SAL_CALL propertiesChange(const Sequence< PropertyChangeEvent >& evtSeq)
588     {
589         if( !pExceptedListenerValues )
590             return;
591         MutexGuard aGuard( aMutex );
592         for( sal_Int32 i = 0; i < evtSeq.getLength(); i++ )
593         {
594             const PropertyChangeEvent & evt = evtSeq.getConstArray()[i];
595             OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
596 
597             switch( evt.PropertyHandle )
598             {
599                 case PROPERTY_BOOL:
600                     {
601                     OSL_ENSURE( sal_False, "PropertySetHelper: BOOL cannot change" );
602                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
603                     }
604                 break;
605 
606                 case PROPERTY_INT16:
607                     {
608                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
609 
610                     sal_Int16 nInt16, nOldInt16;
611                     pExceptedListenerValues[nCurrent]   >>= nInt16;
612                     evt.OldValue                        >>= nOldInt16;
613                     OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong old value" );
614 
615 
616                     pExceptedListenerValues[nCurrent+1] >>= nInt16;
617                     evt.NewValue                        >>= nOldInt16;
618                     OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong new value" );
619                     }
620                 break;
621 
622                 case PROPERTY_INT32:
623                     {
624                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
625 
626 
627                     sal_Int32 nInt32,nOldInt32;
628                     pExceptedListenerValues[nCurrent] >>= nInt32;
629                     evt.OldValue >>= nOldInt32;
630                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
631 
632                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
633                     evt.NewValue >>= nOldInt32;
634                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong new value" );
635                     }
636                 break;
637 
638                 default:
639                     OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
640             }
641             nCurrent += 2;
642         }
643     }
644 };
645 
646 /**
647  * Create a table that map names to index values.
648  */
getInfoHelper()649 IPropertyArrayHelper & test_OPropertySetHelper::getInfoHelper()
650 {
651     // no multi thread protection
652     static OPropertyArrayHelper aInfo( pBasicProps, nPropCount );
653     return aInfo;
654 }
655 
656 // XPropertySet
getPropertySetInfo()657 Reference < XPropertySetInfo >  test_OPropertySetHelper::getPropertySetInfo()
658 {
659     // no multi thread protection
660     static Reference < XPropertySetInfo >  xInfo( createPropertySetInfo( getInfoHelper() ) );
661     return xInfo;
662 }
663 
664 // Return sal_True, value changed
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)665 sal_Bool test_OPropertySetHelper::convertFastPropertyValue
666 (
667     Any & rConvertedValue,
668     Any & rOldValue,
669     sal_Int32 nHandle,
670     const Any& rValue
671 )
672 {
673     switch( nHandle )
674     {
675         case PROPERTY_BOOL:
676             {
677             sal_Bool b;
678             convertPropertyValue( b , rValue );
679             if( b != bBOOL )
680             {
681 
682                 rConvertedValue.setValue( &b , ::getCppuBooleanType()  );
683                 rOldValue.setValue( & bBOOL , ::getCppuBooleanType() );
684                 return sal_True;
685             }
686             else
687                 return sal_False;
688             }
689 
690         case PROPERTY_INT16:
691             {
692             sal_Int16 n16;
693             convertPropertyValue( n16 , rValue );
694 
695             if( n16 != nINT16 )
696             {
697                 rConvertedValue <<=  n16;
698                 rOldValue       <<= nINT16;
699                 return sal_True;
700             }
701             else
702                 return sal_False;
703             }
704 
705         case PROPERTY_INT32:
706             {
707             sal_Int32 n32;
708             convertPropertyValue( n32 , rValue );
709             if( n32 != nINT32 )
710             {
711                 rConvertedValue <<= n32;
712                 rOldValue       <<= nINT32;
713                 return sal_True;
714             }
715             else
716                 return sal_False;
717             }
718 
719         default:
720             OSL_ENSURE( nHandle == -1, "invalid property handle" );
721             return sal_False;
722     }
723 }
724 
725 /**
726  * only set the value.
727  */
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)728 void test_OPropertySetHelper::setFastPropertyValue_NoBroadcast
729 (
730     sal_Int32 nHandle,
731     const Any& rValue
732 )
733 {
734     switch( nHandle )
735     {
736         case PROPERTY_BOOL:
737             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_BOOLEAN, "invalid type" );
738             bBOOL = *((sal_Bool*)rValue.getValue());
739         break;
740 
741         case PROPERTY_INT16:
742             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_SHORT, "invalid type" );
743             rValue >>= nINT16;
744         break;
745 
746         case PROPERTY_INT32:
747             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_LONG, "invalid type" );
748             rValue >>= nINT32;
749         break;
750 
751         default:
752             OSL_ENSURE( nHandle == -1, "invalid property handle" );
753     }
754 }
755 
756 //--------------------------
getFastPropertyValue(Any & rRet,sal_Int32 nHandle) const757 void test_OPropertySetHelper::getFastPropertyValue( Any & rRet, sal_Int32 nHandle ) const
758 {
759     switch( nHandle )
760     {
761         case PROPERTY_BOOL:
762             rRet.setValue( &bBOOL , getCppuBooleanType() );
763         break;
764 
765         case PROPERTY_INT16:
766             rRet <<= nINT16;
767         break;
768 
769         case PROPERTY_INT32:
770             rRet <<= nINT32;
771         break;
772 
773         default:
774             OSL_ENSURE( nHandle == -1, "invalid property handle" );
775     }
776 }
777 
778 
test_PropertySetHelper()779 void test_PropertySetHelper()
780 {
781     test_PropertyArrayHelper();
782 
783     test_OPropertySetHelper * pPS;
784 
785     Reference < XPropertySet >  xPS;
786     Reference < XPropertyChangeListener > xPS_L;
787     test_OPropertySetHelper_Listener * pPS_L;
788 
789     Reference < XInterface > x;
790 
791     for( int z = 0; z < 2; z++ )
792     {
793         // first test aBasicProps Handles are { 0, 1, 2, 55 }
794         // first test getBasicProps() Handles are { 0, 1, 2 }
795         xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
796         xPS_L = static_cast< XPropertyChangeListener * >( pPS_L = new test_OPropertySetHelper_Listener() );
797 
798         // Test queryInterface
799         Reference < XPropertySet > rProp( xPS , UNO_QUERY );
800         OSL_ENSURE( rProp.is() , "PropertySetHelper: XPropertySet nor supported" );
801 
802         Reference < XMultiPropertySet > rMulti( xPS , UNO_QUERY );
803         OSL_ENSURE( rMulti.is() , "PropertySetHelper: XMultiPropertySet nor supported" );
804 
805         Reference < XFastPropertySet > rFast( xPS , UNO_QUERY );
806         OSL_ENSURE( rFast.is() , "PropertySetHelper: XFastPropertySet nor supported" );
807 
808         x = Reference < XInterface > ();
809 
810         // Test add-remove listener
811         {
812             Reference < XPropertiesChangeListener >     x1( xPS_L, UNO_QUERY );
813             Reference < XVetoableChangeListener >       x2( xPS_L, UNO_QUERY );
814 
815             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
816             Sequence<OUString> szPN( 3 );
817             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
818             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
819             szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
820             pPS->addPropertiesChangeListener( szPN, x1 );
821 
822             szPN = Sequence<OUString>();
823             pPS->addPropertiesChangeListener( szPN, x1 );
824             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
825 
826             xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
827             pPS->removePropertiesChangeListener( x1 );
828             pPS->removePropertiesChangeListener( x1 );
829             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
830 
831             // this exception must thrown
832             try
833             {
834                 xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), xPS_L );
835                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
836             }
837             catch( UnknownPropertyException & /*e*/ )
838             {
839 
840             }
841 
842             try
843             {
844                 xPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), x2 );
845                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
846             }
847             catch( UnknownPropertyException & /*e*/ )
848             {
849 
850             }
851 
852         }
853         OSL_ENSURE( pPS_L->getRefCount() == 1, "PropertySetHelper: wrong reference count" );
854 
855         // Test disposing
856         {
857             Reference < XPropertiesChangeListener >  x1( xPS_L, UNO_QUERY );
858             Reference < XVetoableChangeListener >    x2( xPS_L, UNO_QUERY );
859 
860             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
861             Sequence<OUString> szPN( 2 );
862             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
863             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
864             pPS->addPropertiesChangeListener( szPN, x1 );
865             szPN = Sequence<OUString>();
866             pPS->addPropertiesChangeListener( szPN, x1 );
867             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
868             pPS->dispose();
869         }
870         OSL_ENSURE( pPS_L->nDisposing == 4      , "PropertySetHelper: wrong disposing count" );
871         OSL_ENSURE( pPS_L->getRefCount() == 1   , "PropertySetHelper: wrong reference count" );
872         pPS_L->nDisposing = 0;
873         xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
874 
875         // Test set- and get- (Fast) propertyValue
876         {
877             // set read only property
878             try
879             {
880                 // Readonly raises a vetoable exception
881                 sal_Bool b = sal_True;
882                 Any aBool;
883                 aBool.setValue( &b , getCppuBooleanType() );
884                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), aBool );
885                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
886             }
887             catch( PropertyVetoException & /*e*/ )
888             {
889             }
890 
891             try
892             {
893                 // Readonly raises a vetoable exception
894                 sal_Bool b = sal_True;
895                 Any aBool;
896                 aBool.setValue( &b , getCppuBooleanType() );
897                 // BOOL i s0
898                 pPS->setFastPropertyValue( PROPERTY_BOOL, aBool );
899                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
900             }
901             catch( PropertyVetoException & /*e*/ )
902             {
903             }
904 
905             // set unknown property
906             try
907             {
908                 sal_Bool b = sal_True;
909                 Any aBool;
910                 aBool.setValue( &b , getCppuBooleanType() );
911                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), aBool );
912                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
913             }
914             catch( UnknownPropertyException & /*e*/ )
915             {
916             }
917 
918             try
919             {
920                 sal_Bool b = sal_True;
921                 Any aBool;
922                 aBool.setValue( &b , getCppuBooleanType() );
923                 pPS->setFastPropertyValue( 3, aBool );
924                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
925             }
926             catch( UnknownPropertyException & /*e*/ )
927             {
928             }
929 
930             // get unknown property
931             try
932             {
933                 Any aBool;
934                 aBool = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ) );
935                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
936             }
937             catch( UnknownPropertyException & /*e*/ )
938             {
939             }
940 
941             try
942             {
943                 Any aBool;
944                 aBool = ((XFastPropertySet *)pPS)->getFastPropertyValue( 3 );
945                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
946             }
947             catch( UnknownPropertyException & /*e*/ )
948             {
949             }
950 
951             // set property with invalid type
952             try
953             {
954                 Any aBool;
955                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aBool );
956                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
957             }
958             catch( IllegalArgumentException & /*e*/ )
959             {
960             }
961 
962             try
963             {
964                 Any aBool;
965                 pPS->setFastPropertyValue( PROPERTY_INT32, aBool );
966                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
967             }
968             catch( IllegalArgumentException & /*e*/ )
969             {
970             }
971 
972             // narrowing conversion is not allowed!
973             try
974             {
975                 Any aINT32;
976                 aINT32 <<= (sal_Int32 ) 16;
977                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aINT32 );
978                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
979             }
980             catch( IllegalArgumentException & /*e*/ )
981             {
982             }
983 
984 
985             try
986             {
987                 Any aINT32;
988                 aINT32 <<= (sal_Int32) 16;
989                 pPS->setFastPropertyValue( PROPERTY_INT16, aINT32 );
990                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
991             }
992             catch( IllegalArgumentException & /*e*/ )
993             {
994             }
995 
996 
997             Any aValue;
998             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ) );
999             sal_Bool b = *( (sal_Bool*)aValue.getValue());
1000             OSL_ENSURE( ! b, "PropertySetHelper: wrong BOOL value" );
1001             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_BOOL );
1002 
1003             b = *((sal_Bool*)aValue.getValue());
1004             OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
1005 
1006             sal_Int16 n16;
1007             aValue <<=(sal_Int16)22;
1008             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
1009             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) );
1010             aValue >>= n16;
1011             OSL_ENSURE( 22 == n16 , "PropertySetHelper: wrong INT16 value" );
1012             aValue <<= (sal_Int16)44;
1013             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1014 
1015             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT16 );
1016             aValue >>= n16;
1017             OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
1018 
1019             // widening conversion
1020             aValue <<= (sal_Int16)55;
1021             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aValue );
1022             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) );
1023             sal_Int32 n32;
1024             aValue >>= n32;
1025             OSL_ENSURE( 55 == n32 , "PropertySetHelper: wrong INT32 value" );
1026             aValue <<= (sal_Int16)66;
1027             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT32, aValue );
1028             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT32 );
1029             aValue >>= n32;
1030             OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
1031 
1032             Sequence< OUString >valueNames = Sequence<OUString>( 3 );
1033             valueNames.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
1034             valueNames.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1035             valueNames.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1036             Sequence< Any > aValues = pPS->getPropertyValues( valueNames );
1037 
1038             b = *((sal_Bool*)aValues.getConstArray()[0].getValue());
1039             aValues.getConstArray()[1] >>= n16;
1040             aValues.getConstArray()[2] >>= n32;
1041 
1042             OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
1043             OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
1044             OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
1045         }
1046         pPS->nINT32 = 0;
1047         pPS->nINT16 = 0;
1048 
1049         // Test add-remove listener
1050         {
1051             Reference < XVetoableChangeListener >  x2( xPS_L, UNO_QUERY );
1052 
1053             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
1054             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1055 
1056             pPS_L->nCount = 10;
1057             Sequence< Any > aSeq( pPS_L->nCount );
1058             pPS_L->nCurrent = 0;
1059 
1060             pPS_L->pExceptedListenerValues = aSeq.getArray();
1061 
1062             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1063             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 22; // new value  vetoable
1064             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   bound
1065             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value  bound
1066             pPS_L->pExceptedListenerValues[4] <<= (sal_Int16) 22; // old value  vetoable
1067             pPS_L->pExceptedListenerValues[5] <<= (sal_Int16) 44; // new value  vetoable
1068             pPS_L->pExceptedListenerValues[6] <<= (sal_Int16) 22; // old value  bound
1069             pPS_L->pExceptedListenerValues[7] <<= (sal_Int16) 44; // new value  bound
1070             pPS_L->pExceptedListenerValues[8] <<= (sal_Int16) 44; // old value  vetoable
1071             pPS_L->pExceptedListenerValues[9] <<= (sal_Int16) 100; // new value vetoable exception
1072 
1073             Any aValue;
1074             aValue <<= (sal_Int16)22;
1075             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
1076             aValue <<= (sal_Int16) 44;
1077             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1078             aValue <<= (sal_Int16)100;// exception
1079 
1080             try
1081             {
1082                 ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1083                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
1084             }
1085             catch( PropertyVetoException & /*e*/ )
1086             {
1087             }
1088 
1089             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1090             pPS->nINT32 = 0;
1091             pPS->nINT16 = 0;
1092             pPS_L->nCount = 0;
1093             pPS_L->nCurrent = 0;
1094             pPS_L->pExceptedListenerValues = NULL;
1095             xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
1096             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1097         }
1098 
1099         // Test multi property set listener
1100         {
1101             Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
1102             Reference < XVetoableChangeListener >  x2( xPS_L, UNO_QUERY );
1103 
1104             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , x2 );
1105             Sequence<OUString> szPN( 4 );
1106             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
1107             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1108             szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
1109             szPN.getArray()[3] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1110             pPS->addPropertiesChangeListener( szPN, x1 );
1111 
1112             pPS_L->nCount = 6;
1113             Sequence< Any > aSeq( pPS_L->nCount );
1114             pPS_L->nCurrent = 0;
1115             pPS_L->pExceptedListenerValues = aSeq.getArray();
1116             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1117             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16 ) 22; // new value vetoable
1118             // INT32 is not constrained
1119             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   bound
1120             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value  bound
1121             pPS_L->pExceptedListenerValues[4] <<= (sal_Int32) 0; // old value   bound
1122             pPS_L->pExceptedListenerValues[5] <<= (sal_Int32) 44; // new value  bound
1123 
1124             szPN = Sequence<OUString>( 2 );
1125             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1126             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1127             Sequence< Any > aValues( 2 );
1128             aValues.getArray()[0] <<= (sal_Int16) 22;
1129             aValues.getArray()[1] <<= (sal_Int16) 44;
1130             pPS->setPropertyValues( szPN, aValues );
1131             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1132 
1133             //firePropertiesChangeEvent
1134             pPS->nINT16 = 8;
1135             pPS->nINT32 = 5;
1136             pPS_L->nCount = 4;
1137             pPS_L->nCurrent = 0;
1138             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 8; // old value
1139             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 8; // new value
1140             pPS_L->pExceptedListenerValues[2] <<= (sal_Int32) 5; // old value
1141             pPS_L->pExceptedListenerValues[3] <<= (sal_Int32) 5; // new value
1142             pPS->firePropertiesChangeEvent( szPN, pPS_L );
1143             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1144 
1145 
1146             //vetoable exception with multiple
1147             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1148             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1149             pPS->nINT32 = 0;
1150             pPS->nINT16 = 0;
1151             pPS_L->nCount = 4;
1152             pPS_L->nCurrent = 0;
1153             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1154             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 44; // new value  vetoable
1155             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   vetoable
1156             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 100; // new value vetoable
1157 
1158             try
1159             {
1160                 aValues.getArray()[0] <<= (sal_Int16)44;
1161                 aValues.getArray()[1] <<= (sal_Int16)100;
1162                 pPS->setPropertyValues( szPN, aValues );
1163                 OSL_ENSURE( sal_False, "PropertySetHelper: exception not thrown" );
1164             }
1165             catch ( PropertyVetoException & /*e*/ )
1166             {
1167             }
1168 
1169             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1170             pPS->removePropertiesChangeListener( x1 );
1171             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1172         }
1173     }
1174 }
1175