xref: /AOO41X/main/cppuhelper/test/testpropshlp.cxx (revision 9d7e27acf3441a88e7e2e9d0bd0e0c145f24ac0d)
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, "exeption 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 ) throw(RuntimeException)
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()throw(RuntimeException);
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() throw(RuntimeException);
390     sal_Bool SAL_CALL convertFastPropertyValue(
391         Any & rConvertedValue, Any & rOldValue,
392         sal_Int32 nHandle, const Any& rValue )
393         throw(IllegalArgumentException);
394     void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw(RuntimeException);
395     void SAL_CALL getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const throw(RuntimeException);
396 };
397 
398 //----------------------------------------------------------------------
399 //------ The Properties of this implementation -------------------------
400 //----------------------------------------------------------------------
401 // Id must be the index into the array
402 #define PROPERTY_BOOL       0
403 #define PROPERTY_INT16      1
404 #define PROPERTY_INT32      2
405 
406 // Max number of properties
407 #define PROPERTY_COUNT                      4
408 // Names of Properties
409 /**
410  * All Properties of this implementation. Must be sorted by name.
411  */
getBasicProps()412 Property * getBasicProps()
413 {
414     static Property *pTable = 0;
415 
416     if( ! pTable )  {
417         MutexGuard guard(  ::osl::Mutex::getGlobalMutex() );
418         if( ! pTable ) {
419 
420             static Property aBasicProps[PROPERTY_COUNT] =
421             {
422                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") )  , PROPERTY_BOOL , getCppuBooleanType(), PropertyAttribute::READONLY ),
423                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , PROPERTY_INT16,
424                                 getCppuType( (sal_Int16*)0 ),   PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED ),
425                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) , PROPERTY_INT32, getCppuType( (sal_Int32*)0 ), PropertyAttribute::BOUND ),
426                  Property( OUString( RTL_CONSTASCII_USTRINGPARAM("TEST") )  , 55            , getCppuType( (sal_Int32*)0),  PropertyAttribute::BOUND )
427             };
428             pTable = aBasicProps;
429         }
430     }
431     return pTable;
432 }
433 
434 
435 //----------------------------------------------------
436 //  test_OPropertySetHelper_Listener
437 //----------------------------------------------------
438 class test_OPropertySetHelper_Listener
439     : public WeakImplHelper3< XPropertyChangeListener, XPropertiesChangeListener, XVetoableChangeListener >
440 {
441 public:
442     sal_Int32           nDisposing;
443     Mutex               aMutex;
444     Any *               pExceptedListenerValues;
445     sal_Int32           nCount;
446     sal_Int32           nCurrent;
447 
test_OPropertySetHelper_Listener(Any * p=0,sal_Int32 n=0)448                     test_OPropertySetHelper_Listener( Any * p = 0, sal_Int32 n = 0 )
449                         : nDisposing( 0 )
450                         , pExceptedListenerValues( p )
451                         , nCount( n )
452                         , nCurrent( 0 )
453                     {
454                     }
~test_OPropertySetHelper_Listener()455                     ~test_OPropertySetHelper_Listener()
456                     {
457                     }
458 
getRefCount()459     sal_Int32   getRefCount()
460         { return m_refCount; }
461 
462     // XEventListener
disposing(const EventObject &)463     void SAL_CALL disposing(const EventObject& /*evt*/) throw ( RuntimeException)
464     {
465         MutexGuard aGuard( aMutex );
466         nDisposing++;
467     }
468 
469     // XPropertyChangeListener
propertyChange(const PropertyChangeEvent & evt)470     void SAL_CALL propertyChange(const PropertyChangeEvent& evt) throw (RuntimeException)
471     {
472         if( !pExceptedListenerValues )
473             return;
474         MutexGuard aGuard( aMutex );
475         OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
476 
477         switch( evt.PropertyHandle )
478         {
479             case PROPERTY_BOOL:
480                 {
481                 OSL_ENSURE( sal_False           , "PropertySetHelper: BOOL cannot change" );
482                 OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
483                 }
484             break;
485 
486             case PROPERTY_INT16:
487                 {
488                 OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
489 
490                 OSL_ENSURE( pExceptedListenerValues[nCurrent].getValueType().getTypeClass() == TypeClass_SHORT ,
491                             "PropertySetHelper: wrong data type" );
492 
493                 sal_Int16 nInt16, nOldInt16;
494                 pExceptedListenerValues[nCurrent]   >>= nInt16;
495                 evt.OldValue                        >>= nOldInt16;
496                 OSL_ENSURE( nInt16 == nOldInt16, "PropertySetHelper: wrong old value" );
497 
498 
499                 pExceptedListenerValues[nCurrent+1] >>= nInt16;
500                 evt.NewValue                        >>= nOldInt16;
501                 OSL_ENSURE( nInt16 == nOldInt16 ,   "PropertySetHelper: wrong new value" );
502                 }
503             break;
504 
505             case PROPERTY_INT32:
506                 {
507                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
508 
509                     sal_Int32 nInt32,nOldInt32;
510 
511                     pExceptedListenerValues[nCurrent] >>= nInt32;
512                     evt.OldValue >>= nOldInt32;
513                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong old value" );
514 
515                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
516                     evt.NewValue >>= nOldInt32;
517                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong new value" );
518                 }
519             break;
520 
521             default:
522                 OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
523         }
524         nCurrent += 2;
525     }
526 
527     // XVetoableChangeListener
vetoableChange(const PropertyChangeEvent & evt)528     void SAL_CALL vetoableChange(const PropertyChangeEvent& evt) throw  (PropertyVetoException, RuntimeException)
529     {
530         if( !pExceptedListenerValues )
531             return;
532         MutexGuard aGuard( aMutex );
533         OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
534 
535         switch( evt.PropertyHandle )
536         {
537             case PROPERTY_BOOL:
538                 {
539                     OSL_ENSURE( sal_False   , "PropertySetHelper: BOOL cannot change" );
540                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
541                 }
542             break;
543 
544             case PROPERTY_INT16:
545                 {
546                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
547 
548                     sal_Int16 nInt16, nOldInt16;
549                     pExceptedListenerValues[nCurrent]   >>= nInt16;
550                     evt.OldValue                        >>= nOldInt16;
551 
552                     OSL_ENSURE( nInt16 == nOldInt16,"PropertySetHelper: wrong old value" );
553 
554                     pExceptedListenerValues[nCurrent+1]     >>= nInt16;
555                     evt.NewValue                            >>= nOldInt16;
556                     OSL_ENSURE( nInt16 == nOldInt16 ,   "PropertySetHelper: wrong new value" );
557 
558                     if( nOldInt16 == 100 )
559                     {
560                         nCurrent += 2;
561                         throw PropertyVetoException();
562                     }
563                 }
564             break;
565 
566             case PROPERTY_INT32:
567                 {
568                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
569 
570                     sal_Int32 nInt32,nOldInt32;
571                     pExceptedListenerValues[nCurrent] >>= nInt32;
572                     evt.OldValue >>= nOldInt32;
573                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
574 
575                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
576                     evt.NewValue >>= nOldInt32;
577                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong new value" );
578                 }
579             break;
580 
581             default:
582                 OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
583         }
584         nCurrent += 2;
585     }
586 
587     // XPropertiesChangeListener
propertiesChange(const Sequence<PropertyChangeEvent> & evtSeq)588     void SAL_CALL propertiesChange(const Sequence< PropertyChangeEvent >& evtSeq) throw (RuntimeException)
589     {
590         if( !pExceptedListenerValues )
591             return;
592         MutexGuard aGuard( aMutex );
593         for( sal_Int32 i = 0; i < evtSeq.getLength(); i++ )
594         {
595             const PropertyChangeEvent & evt = evtSeq.getConstArray()[i];
596             OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
597 
598             switch( evt.PropertyHandle )
599             {
600                 case PROPERTY_BOOL:
601                     {
602                     OSL_ENSURE( sal_False, "PropertySetHelper: BOOL cannot change" );
603                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
604                     }
605                 break;
606 
607                 case PROPERTY_INT16:
608                     {
609                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
610 
611                     sal_Int16 nInt16, nOldInt16;
612                     pExceptedListenerValues[nCurrent]   >>= nInt16;
613                     evt.OldValue                        >>= nOldInt16;
614                     OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong old value" );
615 
616 
617                     pExceptedListenerValues[nCurrent+1] >>= nInt16;
618                     evt.NewValue                        >>= nOldInt16;
619                     OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong new value" );
620                     }
621                 break;
622 
623                 case PROPERTY_INT32:
624                     {
625                     OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
626 
627 
628                     sal_Int32 nInt32,nOldInt32;
629                     pExceptedListenerValues[nCurrent] >>= nInt32;
630                     evt.OldValue >>= nOldInt32;
631                     OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
632 
633                     pExceptedListenerValues[nCurrent+1] >>= nInt32;
634                     evt.NewValue >>= nOldInt32;
635                     OSL_ENSURE( nInt32 == nOldInt32 ,   "PropertySetHelper: wrong new value" );
636                     }
637                 break;
638 
639                 default:
640                     OSL_ENSURE( sal_False, "XPropeSetHelper: invalid property handle" );
641             }
642             nCurrent += 2;
643         }
644     }
645 };
646 
647 /**
648  * Create a table that map names to index values.
649  */
getInfoHelper()650 IPropertyArrayHelper & test_OPropertySetHelper::getInfoHelper() throw(RuntimeException)
651 {
652     // no multi thread protection
653     static OPropertyArrayHelper aInfo( pBasicProps, nPropCount );
654     return aInfo;
655 }
656 
657 // XPropertySet
getPropertySetInfo()658 Reference < XPropertySetInfo >  test_OPropertySetHelper::getPropertySetInfo()
659     throw(RuntimeException)
660 {
661     // no multi thread protection
662     static Reference < XPropertySetInfo >  xInfo( createPropertySetInfo( getInfoHelper() ) );
663     return xInfo;
664 }
665 
666 // Return sal_True, value changed
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)667 sal_Bool test_OPropertySetHelper::convertFastPropertyValue
668 (
669     Any & rConvertedValue,
670     Any & rOldValue,
671     sal_Int32 nHandle,
672     const Any& rValue
673 )throw(IllegalArgumentException)
674 {
675     switch( nHandle )
676     {
677         case PROPERTY_BOOL:
678             {
679             sal_Bool b;
680             convertPropertyValue( b , rValue );
681             if( b != bBOOL )
682             {
683 
684                 rConvertedValue.setValue( &b , ::getCppuBooleanType()  );
685                 rOldValue.setValue( & bBOOL , ::getCppuBooleanType() );
686                 return sal_True;
687             }
688             else
689                 return sal_False;
690             }
691 
692         case PROPERTY_INT16:
693             {
694             sal_Int16 n16;
695             convertPropertyValue( n16 , rValue );
696 
697             if( n16 != nINT16 )
698             {
699                 rConvertedValue <<=  n16;
700                 rOldValue       <<= nINT16;
701                 return sal_True;
702             }
703             else
704                 return sal_False;
705             }
706 
707         case PROPERTY_INT32:
708             {
709             sal_Int32 n32;
710             convertPropertyValue( n32 , rValue );
711             if( n32 != nINT32 )
712             {
713                 rConvertedValue <<= n32;
714                 rOldValue       <<= nINT32;
715                 return sal_True;
716             }
717             else
718                 return sal_False;
719             }
720 
721         default:
722             OSL_ENSURE( nHandle == -1, "invalid property handle" );
723             return sal_False;
724     }
725 }
726 
727 /**
728  * only set the value.
729  */
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)730 void test_OPropertySetHelper::setFastPropertyValue_NoBroadcast
731 (
732     sal_Int32 nHandle,
733     const Any& rValue
734 )throw(RuntimeException)
735 {
736     switch( nHandle )
737     {
738         case PROPERTY_BOOL:
739             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_BOOLEAN, "invalid type" );
740             bBOOL = *((sal_Bool*)rValue.getValue());
741         break;
742 
743         case PROPERTY_INT16:
744             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_SHORT, "invalid type" );
745             rValue >>= nINT16;
746         break;
747 
748         case PROPERTY_INT32:
749             OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_LONG, "invalid type" );
750             rValue >>= nINT32;
751         break;
752 
753         default:
754             OSL_ENSURE( nHandle == -1, "invalid property handle" );
755     }
756 }
757 
758 //--------------------------
getFastPropertyValue(Any & rRet,sal_Int32 nHandle) const759 void test_OPropertySetHelper::getFastPropertyValue( Any & rRet, sal_Int32 nHandle ) const
760     throw(RuntimeException)
761 {
762     switch( nHandle )
763     {
764         case PROPERTY_BOOL:
765             rRet.setValue( &bBOOL , getCppuBooleanType() );
766         break;
767 
768         case PROPERTY_INT16:
769             rRet <<= nINT16;
770         break;
771 
772         case PROPERTY_INT32:
773             rRet <<= nINT32;
774         break;
775 
776         default:
777             OSL_ENSURE( nHandle == -1, "invalid property handle" );
778     }
779 }
780 
781 
test_PropertySetHelper()782 void test_PropertySetHelper()
783 {
784     test_PropertyArrayHelper();
785 
786     test_OPropertySetHelper * pPS;
787 
788     Reference < XPropertySet >  xPS;
789     Reference < XPropertyChangeListener > xPS_L;
790     test_OPropertySetHelper_Listener * pPS_L;
791 
792     Reference < XInterface > x;
793 
794     for( int z = 0; z < 2; z++ )
795     {
796         // first test aBasicProps Handles are { 0, 1, 2, 55 }
797         // first test getBasicProps() Handles are { 0, 1, 2 }
798         xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
799         xPS_L = static_cast< XPropertyChangeListener * >( pPS_L = new test_OPropertySetHelper_Listener() );
800 
801         // Test queryInterface
802         Reference < XPropertySet > rProp( xPS , UNO_QUERY );
803         OSL_ENSURE( rProp.is() , "PropertySetHelper: XPropertySet nor supported" );
804 
805         Reference < XMultiPropertySet > rMulti( xPS , UNO_QUERY );
806         OSL_ENSURE( rMulti.is() , "PropertySetHelper: XMultiPropertySet nor supported" );
807 
808         Reference < XFastPropertySet > rFast( xPS , UNO_QUERY );
809         OSL_ENSURE( rFast.is() , "PropertySetHelper: XFastPropertySet nor supported" );
810 
811         x = Reference < XInterface > ();
812 
813         // Test add-remove listener
814         {
815             Reference < XPropertiesChangeListener >     x1( xPS_L, UNO_QUERY );
816             Reference < XVetoableChangeListener >       x2( xPS_L, UNO_QUERY );
817 
818             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
819             Sequence<OUString> szPN( 3 );
820             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
821             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
822             szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
823             pPS->addPropertiesChangeListener( szPN, x1 );
824 
825             szPN = Sequence<OUString>();
826             pPS->addPropertiesChangeListener( szPN, x1 );
827             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
828 
829             xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
830             pPS->removePropertiesChangeListener( x1 );
831             pPS->removePropertiesChangeListener( x1 );
832             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
833 
834             // this exception must thrown
835             try
836             {
837                 xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), xPS_L );
838                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
839             }
840             catch( UnknownPropertyException & /*e*/ )
841             {
842 
843             }
844 
845             try
846             {
847                 xPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), x2 );
848                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
849             }
850             catch( UnknownPropertyException & /*e*/ )
851             {
852 
853             }
854 
855         }
856         OSL_ENSURE( pPS_L->getRefCount() == 1, "PropertySetHelper: wrong reference count" );
857 
858         // Test disposing
859         {
860             Reference < XPropertiesChangeListener >  x1( xPS_L, UNO_QUERY );
861             Reference < XVetoableChangeListener >    x2( xPS_L, UNO_QUERY );
862 
863             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
864             Sequence<OUString> szPN( 2 );
865             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
866             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
867             pPS->addPropertiesChangeListener( szPN, x1 );
868             szPN = Sequence<OUString>();
869             pPS->addPropertiesChangeListener( szPN, x1 );
870             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
871             pPS->dispose();
872         }
873         OSL_ENSURE( pPS_L->nDisposing == 4      , "PropertySetHelper: wrong disposing count" );
874         OSL_ENSURE( pPS_L->getRefCount() == 1   , "PropertySetHelper: wrong reference count" );
875         pPS_L->nDisposing = 0;
876         xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
877 
878         // Test set- and get- (Fast) propertyValue
879         {
880             // set read only property
881             try
882             {
883                 // Readonly raises a vetoable exception
884                 sal_Bool b = sal_True;
885                 Any aBool;
886                 aBool.setValue( &b , getCppuBooleanType() );
887                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), aBool );
888                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
889             }
890             catch( PropertyVetoException & /*e*/ )
891             {
892             }
893 
894             try
895             {
896                 // Readonly raises a vetoable exception
897                 sal_Bool b = sal_True;
898                 Any aBool;
899                 aBool.setValue( &b , getCppuBooleanType() );
900                 // BOOL i s0
901                 pPS->setFastPropertyValue( PROPERTY_BOOL, aBool );
902                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
903             }
904             catch( PropertyVetoException & /*e*/ )
905             {
906             }
907 
908             // set unknown property
909             try
910             {
911                 sal_Bool b = sal_True;
912                 Any aBool;
913                 aBool.setValue( &b , getCppuBooleanType() );
914                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), aBool );
915                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
916             }
917             catch( UnknownPropertyException & /*e*/ )
918             {
919             }
920 
921             try
922             {
923                 sal_Bool b = sal_True;
924                 Any aBool;
925                 aBool.setValue( &b , getCppuBooleanType() );
926                 pPS->setFastPropertyValue( 3, aBool );
927                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
928             }
929             catch( UnknownPropertyException & /*e*/ )
930             {
931             }
932 
933             // get unknown property
934             try
935             {
936                 Any aBool;
937                 aBool = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ) );
938                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
939             }
940             catch( UnknownPropertyException & /*e*/ )
941             {
942             }
943 
944             try
945             {
946                 Any aBool;
947                 aBool = ((XFastPropertySet *)pPS)->getFastPropertyValue( 3 );
948                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
949             }
950             catch( UnknownPropertyException & /*e*/ )
951             {
952             }
953 
954             // set property with invalid type
955             try
956             {
957                 Any aBool;
958                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aBool );
959                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
960             }
961             catch( IllegalArgumentException & /*e*/ )
962             {
963             }
964 
965             try
966             {
967                 Any aBool;
968                 pPS->setFastPropertyValue( PROPERTY_INT32, aBool );
969                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
970             }
971             catch( IllegalArgumentException & /*e*/ )
972             {
973             }
974 
975             // narrowing conversion is not allowed!
976             try
977             {
978                 Any aINT32;
979                 aINT32 <<= (sal_Int32 ) 16;
980                 xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aINT32 );
981                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
982             }
983             catch( IllegalArgumentException & /*e*/ )
984             {
985             }
986 
987 
988             try
989             {
990                 Any aINT32;
991                 aINT32 <<= (sal_Int32) 16;
992                 pPS->setFastPropertyValue( PROPERTY_INT16, aINT32 );
993                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
994             }
995             catch( IllegalArgumentException & /*e*/ )
996             {
997             }
998 
999 
1000             Any aValue;
1001             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ) );
1002             sal_Bool b = *( (sal_Bool*)aValue.getValue());
1003             OSL_ENSURE( ! b, "PropertySetHelper: wrong BOOL value" );
1004             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_BOOL );
1005 
1006             b = *((sal_Bool*)aValue.getValue());
1007             OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
1008 
1009             sal_Int16 n16;
1010             aValue <<=(sal_Int16)22;
1011             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
1012             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) );
1013             aValue >>= n16;
1014             OSL_ENSURE( 22 == n16 , "PropertySetHelper: wrong INT16 value" );
1015             aValue <<= (sal_Int16)44;
1016             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1017 
1018             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT16 );
1019             aValue >>= n16;
1020             OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
1021 
1022             // widening conversion
1023             aValue <<= (sal_Int16)55;
1024             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aValue );
1025             aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) );
1026             sal_Int32 n32;
1027             aValue >>= n32;
1028             OSL_ENSURE( 55 == n32 , "PropertySetHelper: wrong INT32 value" );
1029             aValue <<= (sal_Int16)66;
1030             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT32, aValue );
1031             aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT32 );
1032             aValue >>= n32;
1033             OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
1034 
1035             Sequence< OUString >valueNames = Sequence<OUString>( 3 );
1036             valueNames.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
1037             valueNames.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1038             valueNames.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1039             Sequence< Any > aValues = pPS->getPropertyValues( valueNames );
1040 
1041             b = *((sal_Bool*)aValues.getConstArray()[0].getValue());
1042             aValues.getConstArray()[1] >>= n16;
1043             aValues.getConstArray()[2] >>= n32;
1044 
1045             OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
1046             OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
1047             OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
1048         }
1049         pPS->nINT32 = 0;
1050         pPS->nINT16 = 0;
1051 
1052         // Test add-remove listener
1053         {
1054             Reference < XVetoableChangeListener >  x2( xPS_L, UNO_QUERY );
1055 
1056             xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
1057             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1058 
1059             pPS_L->nCount = 10;
1060             Sequence< Any > aSeq( pPS_L->nCount );
1061             pPS_L->nCurrent = 0;
1062 
1063             pPS_L->pExceptedListenerValues = aSeq.getArray();
1064 
1065             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1066             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 22; // new value  vetoable
1067             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   bound
1068             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value  bound
1069             pPS_L->pExceptedListenerValues[4] <<= (sal_Int16) 22; // old value  vetoable
1070             pPS_L->pExceptedListenerValues[5] <<= (sal_Int16) 44; // new value  vetoable
1071             pPS_L->pExceptedListenerValues[6] <<= (sal_Int16) 22; // old value  bound
1072             pPS_L->pExceptedListenerValues[7] <<= (sal_Int16) 44; // new value  bound
1073             pPS_L->pExceptedListenerValues[8] <<= (sal_Int16) 44; // old value  vetoable
1074             pPS_L->pExceptedListenerValues[9] <<= (sal_Int16) 100; // new value vetoable exception
1075 
1076             Any aValue;
1077             aValue <<= (sal_Int16)22;
1078             xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
1079             aValue <<= (sal_Int16) 44;
1080             ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1081             aValue <<= (sal_Int16)100;// exception
1082 
1083             try
1084             {
1085                 ((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
1086                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
1087             }
1088             catch( PropertyVetoException & /*e*/ )
1089             {
1090             }
1091 
1092             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1093             pPS->nINT32 = 0;
1094             pPS->nINT16 = 0;
1095             pPS_L->nCount = 0;
1096             pPS_L->nCurrent = 0;
1097             pPS_L->pExceptedListenerValues = NULL;
1098             xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
1099             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1100         }
1101 
1102         // Test multi property set listener
1103         {
1104             Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
1105             Reference < XVetoableChangeListener >  x2( xPS_L, UNO_QUERY );
1106 
1107             pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , x2 );
1108             Sequence<OUString> szPN( 4 );
1109             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
1110             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1111             szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
1112             szPN.getArray()[3] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1113             pPS->addPropertiesChangeListener( szPN, x1 );
1114 
1115             pPS_L->nCount = 6;
1116             Sequence< Any > aSeq( pPS_L->nCount );
1117             pPS_L->nCurrent = 0;
1118             pPS_L->pExceptedListenerValues = aSeq.getArray();
1119             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1120             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16 ) 22; // new value vetoable
1121             // INT32 is not constrained
1122             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   bound
1123             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value  bound
1124             pPS_L->pExceptedListenerValues[4] <<= (sal_Int32) 0; // old value   bound
1125             pPS_L->pExceptedListenerValues[5] <<= (sal_Int32) 44; // new value  bound
1126 
1127             szPN = Sequence<OUString>( 2 );
1128             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1129             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
1130             Sequence< Any > aValues( 2 );
1131             aValues.getArray()[0] <<= (sal_Int16) 22;
1132             aValues.getArray()[1] <<= (sal_Int16) 44;
1133             pPS->setPropertyValues( szPN, aValues );
1134             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1135 
1136             //firePropertiesChangeEvent
1137             pPS->nINT16 = 8;
1138             pPS->nINT32 = 5;
1139             pPS_L->nCount = 4;
1140             pPS_L->nCurrent = 0;
1141             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 8; // old value
1142             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 8; // new value
1143             pPS_L->pExceptedListenerValues[2] <<= (sal_Int32) 5; // old value
1144             pPS_L->pExceptedListenerValues[3] <<= (sal_Int32) 5; // new value
1145             pPS->firePropertiesChangeEvent( szPN, pPS_L );
1146             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1147 
1148 
1149             //vetoable exception with multible
1150             szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1151             szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
1152             pPS->nINT32 = 0;
1153             pPS->nINT16 = 0;
1154             pPS_L->nCount = 4;
1155             pPS_L->nCurrent = 0;
1156             pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value   vetoable
1157             pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 44; // new value  vetoable
1158             pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value   vetoable
1159             pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 100; // new value vetoable
1160 
1161             try
1162             {
1163                 aValues.getArray()[0] <<= (sal_Int16)44;
1164                 aValues.getArray()[1] <<= (sal_Int16)100;
1165                 pPS->setPropertyValues( szPN, aValues );
1166                 OSL_ENSURE( sal_False, "PropertySetHelper: exeption not thrown" );
1167             }
1168             catch ( PropertyVetoException & /*e*/ )
1169             {
1170             }
1171 
1172             OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
1173             pPS->removePropertiesChangeListener( x1 );
1174             pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
1175         }
1176     }
1177 }
1178