xref: /trunk/main/cppuhelper/test/testpropshlp.cxx (revision 9d7e27ac)
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