office-gobmx/cppuhelper/test/testpropshlp.cxx
2011-11-27 13:03:19 -06:00

1182 lines
47 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#if !defined(OSL_DEBUG_LEVEL) || OSL_DEBUG_LEVEL == 0
# undef OSL_DEBUG_LEVEL
# define OSL_DEBUG_LEVEL 2
#endif
#include <osl/mutex.hxx>
#include <osl/diagnose.h>
#include <cppuhelper/propshlp.hxx>
#include <cppuhelper/weak.hxx>
#include <cppuhelper/proptypehlp.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <cppuhelper/implbase3.hxx>
using namespace ::cppu;
using namespace ::rtl;
using namespace ::osl;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
/**********************
*
**********************/
static Property * getPropertyTable1()
{
static Property *pTable = 0;
if( ! pTable ) {
MutexGuard guard( Mutex::getGlobalMutex() );
if( ! pTable ) {
static Property aTable[] =
{
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //OUString
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //Char
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("c") ), 2, getCppuType( (sal_Int32*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //sal_Int32
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("d") ), 5, getCppuType( (double*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //double
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("e") ), 7, getCppuBooleanType() ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //BOOL
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ) //Any
};
pTable = aTable;
}
}
return pTable;
}
static Property * getPropertyTable2()
{
static Property *pTable = 0;
if( ! pTable ) {
MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
if( ! pTable ) {
static Property aTable[] =
{
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Any
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // OUString
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("d") ), 5, getCppuType( (double*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Double
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("c") ), 2, getCppuType( (sal_Int32*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // sal_Int32
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("e") ), 7, getCppuBooleanType() ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ) // Bool
};
pTable = aTable;
}
}
return pTable;
}
static Property * getPropertyTable3()
{
static Property *pTable = 0;
if( ! pTable ) {
MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
if( ! pTable ) {
static Property aTable[] =
{
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 8, getCppuType( (Any *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // any
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ) // OUString
};
pTable = aTable;
}
}
return pTable;
}
static Property * getPropertyTable4()
{
static Property *pTable = 0;
if( ! pTable ) {
MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
if( ! pTable ) {
static Property aTable[] =
{
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("a") ), 0, getCppuType( (OUString*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // OUString
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("b") ), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("f") ), 2, getCppuType( (Any *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ) // Any
};
pTable = aTable;
}
}
return pTable;
}
/**********************
*
* Note : all Property names must be in the 127 ASCII subset !
*
**********************/
void test_PropertyArrayHelper()
{
// Test getProperties() and getCount()
{
OPropertyArrayHelper a1( getPropertyTable1(), 6 );
OSL_ENSURE( 6 == a1.getCount(), "not all properties inserted" );
Sequence< Property > aProps = a1.getProperties();
Property * pP = aProps.getArray();
OSL_ENSURE( 6 == aProps.getLength(), "getProperties() gives not all properties" );
for( int i = 0; i < 6; i++ )
{
OSL_ENSURE( pP[i].Name == getPropertyTable1()[i].Name , "Name not correct" );
OSL_ENSURE( pP[i].Handle == getPropertyTable1()[i].Handle, "Handle not correct" );
OSL_ENSURE( pP[i].Attributes == getPropertyTable1()[i].Attributes, "Attributes not correct" );
OSL_ENSURE( pP[i].Type == getPropertyTable1()[i].Type, "Type not correct" );
}
}
// Test sorting
{
OPropertyArrayHelper a1( getPropertyTable2(), 6, sal_False );
Sequence< Property > aProps = a1.getProperties();
Property * pP = aProps.getArray();
OSL_ENSURE( 6 == aProps.getLength(), "getProperties() gives not all properties" );
// table to switch to sorted
int a[] = { 2 , 1 , 4, 3, 5, 0 };
for( int i = 0; i < 6; i++ )
{
OSL_ENSURE( pP[i].Name == getPropertyTable2()[a[i]].Name , "Name not correct" );
OSL_ENSURE( pP[i].Handle == getPropertyTable2()[a[i]].Handle, "Handle not correct" );
OSL_ENSURE( pP[i].Attributes == getPropertyTable2()[a[i]].Attributes, "Attributes not correct" );
OSL_ENSURE( pP[i].Type == getPropertyTable2()[a[i]].Type, "Type not correct" );
}
}
// Test sorting
{
OPropertyArrayHelper a1( getPropertyTable3(), 3, sal_False );
Sequence< Property > aProps = a1.getProperties();
Property * pP = aProps.getArray();
OSL_ENSURE( 3 == aProps.getLength(), "getProperties() gives not all properties" );
// table to switch to sorted
int a[] = { 2 , 0 , 1 };
for( int i = 0; i < 3; i++ )
{
OSL_ENSURE( pP[i].Name == getPropertyTable3()[a[i]].Name , "Name not correct" );
OSL_ENSURE( pP[i].Handle == getPropertyTable3()[a[i]].Handle, "Handle not correct" );
OSL_ENSURE( pP[i].Attributes == getPropertyTable3()[a[i]].Attributes, "Attributes not correct" );
OSL_ENSURE( pP[i].Type == getPropertyTable3()[a[i]].Type, "Type not correct" );
}
}
// Test getPropertyByName and hasPropertyByName
{
OPropertyArrayHelper a1( getPropertyTable1(), 6 );
for( int i = 0; i < 6; i++ )
{
OSL_ENSURE( a1.hasPropertyByName( getPropertyTable1()[i].Name ), "hasPropertyByName not correct" );
Property aP = a1.getPropertyByName( getPropertyTable1()[i].Name );
OSL_ENSURE( aP.Name == getPropertyTable1()[i].Name , "Name not correct" );
OSL_ENSURE( aP.Handle == getPropertyTable1()[i].Handle, "Handle not correct" );
OSL_ENSURE( aP.Attributes == getPropertyTable1()[i].Attributes, "Attributes not correct" );
OSL_ENSURE( aP.Type == getPropertyTable1()[i].Type, "Type not correct" );
}
OSL_ENSURE( !a1.hasPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM("never exist") ) ), "hasPropertyByName not correct" );
try
{
a1.getPropertyByName( OUString( RTL_CONSTASCII_USTRINGPARAM("never exist") ) );
OSL_FAIL( "exeption not thrown" );
}
catch( UnknownPropertyException & )
{
}
}
// Test getHandleByName
{
OPropertyArrayHelper a1( getPropertyTable1(), 6 );
for( int i = 0; i < 6; i++ )
{
sal_Int32 Handle = a1.getHandleByName( getPropertyTable1()[i].Name );
OSL_ENSURE( Handle == getPropertyTable1()[i].Handle, "Handle not correct" );
}
sal_Int32 Handle = a1.getHandleByName( OUString( RTL_CONSTASCII_USTRINGPARAM("asdaf") ) );
OSL_ENSURE( Handle == -1, "Handle not correct" );
}
// Test fillPropertyMembersByHandle
{
OPropertyArrayHelper a1( getPropertyTable1(), 6 );
int i;
for( i = 0; i < 6; i++ )
{
sal_Int16 nAttributes;
OUString aPropName;
sal_Bool b = a1.fillPropertyMembersByHandle( &aPropName, &nAttributes, getPropertyTable1()[i].Handle );
OSL_ENSURE( b, "fillPropertyMembersByHandle: handle not found" );
OSL_ENSURE( nAttributes == getPropertyTable1()[i].Attributes, "fillPropertyMembersByHandle: Attributes not correct" );
OSL_ENSURE( aPropName == getPropertyTable1()[i].Name , "fillPropertyMembersByHandle: Name not correct" );
}
OSL_ENSURE( !a1.fillPropertyMembersByHandle( NULL, NULL, 66666 ), "fillPropertyMembersByHandle: handle found" );
// optimized table
OPropertyArrayHelper a4( getPropertyTable4(), 3 );
for( i = 0; i < 3; i++ )
{
sal_Int16 nAttributes;
OUString aPropName;
sal_Bool b = a1.fillPropertyMembersByHandle( &aPropName, &nAttributes, getPropertyTable4()[i].Handle );
OSL_ENSURE( b, "fillPropertyMembersByHandle: handle not found" );
OSL_ENSURE( nAttributes == getPropertyTable1()[i].Attributes, "fillPropertyMembersByHandle: Attributes not correct" );
OSL_ENSURE( aPropName == getPropertyTable1()[i].Name , "fillPropertyMembersByHandle: Name not correct" );
}
OSL_ENSURE( !a4.fillPropertyMembersByHandle( NULL, NULL, 66666 ), "fillPropertyMembersByHandle: handle found" );
}
// Test fillHandles
{
OPropertyArrayHelper a1( getPropertyTable1(), 6 );
Sequence< OUString > aS( 4 );
sal_Int32 Handles[4];
// muss sortiert sein
aS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("a") );
aS.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("d") );
aS.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("f") );
aS.getArray()[3] = OUString( RTL_CONSTASCII_USTRINGPARAM("t") );
sal_Int32 nHitCount = a1.fillHandles( Handles, aS );
OSL_ENSURE( nHitCount == 3, "wrong number of hits " );
OSL_ENSURE( Handles[0] == getPropertyTable1()[0].Handle, "Handle not correct" );
OSL_ENSURE( Handles[1] == getPropertyTable1()[3].Handle, "Handle not correct" );
OSL_ENSURE( Handles[2] == getPropertyTable1()[5].Handle, "Handle not correct" );
OSL_ENSURE( Handles[3] == -1, "Handle not correct" );
}
}
//----------------------------------------------------
// test_OPropertySetHelper
//----------------------------------------------------
struct MutexContainer
{
Mutex aMutex;
};
class test_OPropertySetHelper :
public MutexContainer,
public OBroadcastHelper ,
public OPropertySetHelper,
public OWeakObject
{
public:
test_OPropertySetHelper( Property * p, sal_Int32 n )
: MutexContainer()
, OBroadcastHelper( ((MutexContainer *)this)->aMutex )
// , OPropertySetHelper( *SAL_STATIC_CAST(OBroadcastHelper *,this))
// MSCI 4 bug ! :
// OBroadcastHelper == OBroadcastHelperVar<OMultiTypeInterfaceContainerHelper>
, OPropertySetHelper(
*SAL_STATIC_CAST(OBroadcastHelper *,this))
, bBOOL( sal_False )
, nINT16( 0 )
, nINT32( 0 )
, pBasicProps( p )
, nPropCount( n )
{
}
~test_OPropertySetHelper()
{
}
void dispose()
{
// see comphlp.cxx
sal_Bool bDoDispose = sal_False;
{
MutexGuard aGuard( rBHelper.rMutex );
if( !rBHelper.bDisposed && !rBHelper.bInDispose )
{
rBHelper.bInDispose = sal_True;
bDoDispose = sal_True;
}
}
if( bDoDispose )
{
disposing();
EventObject aEvt;
aEvt.Source = Reference < XInterface > ( SAL_STATIC_CAST( OWeakObject * ,this) );
rBHelper.aLC.disposeAndClear( aEvt );
rBHelper.bDisposed = sal_True;
rBHelper.bInDispose = sal_False;
}
}
// XInterface
Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(RuntimeException)
{
Any aRet( OPropertySetHelper::queryInterface( rType ) );
return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
}
void SAL_CALL acquire() throw()
{ OWeakObject::acquire(); }
void SAL_CALL release() throw()
{ OWeakObject::release(); }
// XPropertySet
Reference < XPropertySetInfo > SAL_CALL getPropertySetInfo()throw(RuntimeException);
using OPropertySetHelper::getFastPropertyValue;
sal_Bool bBOOL;
sal_Int16 nINT16;
sal_Int32 nINT32;
Property * pBasicProps;
sal_Int32 nPropCount;
protected:
IPropertyArrayHelper & SAL_CALL getInfoHelper() throw(RuntimeException);
sal_Bool SAL_CALL convertFastPropertyValue(
Any & rConvertedValue, Any & rOldValue,
sal_Int32 nHandle, const Any& rValue )
throw(IllegalArgumentException);
void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw(RuntimeException);
void SAL_CALL getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const throw(RuntimeException);
};
//----------------------------------------------------------------------
//------ The Properties of this implementation -------------------------
//----------------------------------------------------------------------
// Id must be the index into the array
#define PROPERTY_BOOL 0
#define PROPERTY_INT16 1
#define PROPERTY_INT32 2
// Max number of properties
#define PROPERTY_COUNT 4
// Names of Properties
/**
* All Properties of this implementation. Must be sorted by name.
*/
Property * getBasicProps()
{
static Property *pTable = 0;
if( ! pTable ) {
MutexGuard guard( ::osl::Mutex::getGlobalMutex() );
if( ! pTable ) {
static Property aBasicProps[PROPERTY_COUNT] =
{
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ) , PROPERTY_BOOL , getCppuBooleanType(), PropertyAttribute::READONLY ),
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , PROPERTY_INT16,
getCppuType( (sal_Int16*)0 ), PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED ),
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) , PROPERTY_INT32, getCppuType( (sal_Int32*)0 ), PropertyAttribute::BOUND ),
Property( OUString( RTL_CONSTASCII_USTRINGPARAM("TEST") ) , 55 , getCppuType( (sal_Int32*)0), PropertyAttribute::BOUND )
};
pTable = aBasicProps;
}
}
return pTable;
}
//----------------------------------------------------
// test_OPropertySetHelper_Listener
//----------------------------------------------------
class test_OPropertySetHelper_Listener
: public WeakImplHelper3< XPropertyChangeListener, XPropertiesChangeListener, XVetoableChangeListener >
{
public:
sal_Int32 nDisposing;
Mutex aMutex;
Any * pExceptedListenerValues;
sal_Int32 nCount;
sal_Int32 nCurrent;
test_OPropertySetHelper_Listener( Any * p = 0, sal_Int32 n = 0 )
: nDisposing( 0 )
, pExceptedListenerValues( p )
, nCount( n )
, nCurrent( 0 )
{
}
~test_OPropertySetHelper_Listener()
{
}
sal_Int32 getRefCount() const
{ return m_refCount; }
// XEventListener
void SAL_CALL disposing(const EventObject& /*evt*/) throw ( RuntimeException)
{
MutexGuard aGuard( aMutex );
nDisposing++;
}
// XPropertyChangeListener
void SAL_CALL propertyChange(const PropertyChangeEvent& evt) throw (RuntimeException)
{
if( !pExceptedListenerValues )
return;
MutexGuard aGuard( aMutex );
OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
switch( evt.PropertyHandle )
{
case PROPERTY_BOOL:
{
OSL_FAIL( "PropertySetHelper: BOOL cannot change" );
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
OSL_ENSURE( pExceptedListenerValues[nCurrent].getValueType().getTypeClass() == TypeClass_SHORT ,
"PropertySetHelper: wrong data type" );
sal_Int16 nInt16(0), nOldInt16(0);
pExceptedListenerValues[nCurrent] >>= nInt16;
evt.OldValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16, "PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt16;
evt.NewValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong new value" );
}
break;
case PROPERTY_INT32:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
sal_Int32 nInt32(0),nOldInt32(0);
pExceptedListenerValues[nCurrent] >>= nInt32;
evt.OldValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt32;
evt.NewValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong new value" );
}
break;
default:
OSL_FAIL( "XPropeSetHelper: invalid property handle" );
}
nCurrent += 2;
}
// XVetoableChangeListener
void SAL_CALL vetoableChange(const PropertyChangeEvent& evt) throw (PropertyVetoException, RuntimeException)
{
if( !pExceptedListenerValues )
return;
MutexGuard aGuard( aMutex );
OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
switch( evt.PropertyHandle )
{
case PROPERTY_BOOL:
{
OSL_FAIL( "PropertySetHelper: BOOL cannot change" );
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
sal_Int16 nInt16(0), nOldInt16(0);
pExceptedListenerValues[nCurrent] >>= nInt16;
evt.OldValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16,"PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt16;
evt.NewValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong new value" );
if( nOldInt16 == 100 )
{
nCurrent += 2;
throw PropertyVetoException();
}
}
break;
case PROPERTY_INT32:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
sal_Int32 nInt32(0),nOldInt32(0);
pExceptedListenerValues[nCurrent] >>= nInt32;
evt.OldValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt32;
evt.NewValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong new value" );
}
break;
default:
OSL_FAIL( "XPropeSetHelper: invalid property handle" );
}
nCurrent += 2;
}
// XPropertiesChangeListener
void SAL_CALL propertiesChange(const Sequence< PropertyChangeEvent >& evtSeq) throw (RuntimeException)
{
if( !pExceptedListenerValues )
return;
MutexGuard aGuard( aMutex );
for( sal_Int32 i = 0; i < evtSeq.getLength(); i++ )
{
const PropertyChangeEvent & evt = evtSeq.getConstArray()[i];
OSL_ENSURE( nCurrent +1 < nCount, "PropertySetHelper: too many listener calls" );
switch( evt.PropertyHandle )
{
case PROPERTY_BOOL:
{
OSL_FAIL( "PropertySetHelper: BOOL cannot change" );
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), "PropertySetHelper: wrong name" );
sal_Int16 nInt16(0), nOldInt16(0);
pExceptedListenerValues[nCurrent] >>= nInt16;
evt.OldValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt16;
evt.NewValue >>= nOldInt16;
OSL_ENSURE( nInt16 == nOldInt16 , "PropertySetHelper: wrong new value" );
}
break;
case PROPERTY_INT32:
{
OSL_ENSURE( evt.PropertyName == OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), "PropertySetHelper: wrong name" );
sal_Int32 nInt32(0),nOldInt32(0);
pExceptedListenerValues[nCurrent] >>= nInt32;
evt.OldValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong old value" );
pExceptedListenerValues[nCurrent+1] >>= nInt32;
evt.NewValue >>= nOldInt32;
OSL_ENSURE( nInt32 == nOldInt32 , "PropertySetHelper: wrong new value" );
}
break;
default:
OSL_FAIL( "XPropeSetHelper: invalid property handle" );
}
nCurrent += 2;
}
}
};
/**
* Create a table that map names to index values.
*/
IPropertyArrayHelper & test_OPropertySetHelper::getInfoHelper() throw(RuntimeException)
{
// no multi thread protection
static OPropertyArrayHelper aInfo( pBasicProps, nPropCount );
return aInfo;
}
// XPropertySet
Reference < XPropertySetInfo > test_OPropertySetHelper::getPropertySetInfo()
throw(RuntimeException)
{
// no multi thread protection
static Reference < XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
return xInfo;
}
// Return sal_True, value changed
sal_Bool test_OPropertySetHelper::convertFastPropertyValue
(
Any & rConvertedValue,
Any & rOldValue,
sal_Int32 nHandle,
const Any& rValue
)throw(IllegalArgumentException)
{
switch( nHandle )
{
case PROPERTY_BOOL:
{
sal_Bool b;
convertPropertyValue( b , rValue );
if( b != bBOOL )
{
rConvertedValue.setValue( &b , ::getCppuBooleanType() );
rOldValue.setValue( & bBOOL , ::getCppuBooleanType() );
return sal_True;
}
else
return sal_False;
}
case PROPERTY_INT16:
{
sal_Int16 n16;
convertPropertyValue( n16 , rValue );
if( n16 != nINT16 )
{
rConvertedValue <<= n16;
rOldValue <<= nINT16;
return sal_True;
}
else
return sal_False;
}
case PROPERTY_INT32:
{
sal_Int32 n32;
convertPropertyValue( n32 , rValue );
if( n32 != nINT32 )
{
rConvertedValue <<= n32;
rOldValue <<= nINT32;
return sal_True;
}
else
return sal_False;
}
default:
OSL_ENSURE( nHandle == -1, "invalid property handle" );
return sal_False;
}
}
/**
* only set the value.
*/
void test_OPropertySetHelper::setFastPropertyValue_NoBroadcast
(
sal_Int32 nHandle,
const Any& rValue
)throw(RuntimeException)
{
switch( nHandle )
{
case PROPERTY_BOOL:
OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_BOOLEAN, "invalid type" );
bBOOL = *((sal_Bool*)rValue.getValue());
break;
case PROPERTY_INT16:
OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_SHORT, "invalid type" );
rValue >>= nINT16;
break;
case PROPERTY_INT32:
OSL_ENSURE( rValue.getValueType().getTypeClass() == TypeClass_LONG, "invalid type" );
rValue >>= nINT32;
break;
default:
OSL_ENSURE( nHandle == -1, "invalid property handle" );
}
}
//--------------------------
void test_OPropertySetHelper::getFastPropertyValue( Any & rRet, sal_Int32 nHandle ) const
throw(RuntimeException)
{
switch( nHandle )
{
case PROPERTY_BOOL:
rRet.setValue( &bBOOL , getCppuBooleanType() );
break;
case PROPERTY_INT16:
rRet <<= nINT16;
break;
case PROPERTY_INT32:
rRet <<= nINT32;
break;
default:
OSL_ENSURE( nHandle == -1, "invalid property handle" );
}
}
void test_PropertySetHelper()
{
test_PropertyArrayHelper();
test_OPropertySetHelper * pPS;
Reference < XPropertySet > xPS;
Reference < XPropertyChangeListener > xPS_L;
test_OPropertySetHelper_Listener * pPS_L;
Reference < XInterface > x;
for( int z = 0; z < 2; z++ )
{
// first test aBasicProps Handles are { 0, 1, 2, 55 }
// first test getBasicProps() Handles are { 0, 1, 2 }
xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
xPS_L = static_cast< XPropertyChangeListener * >( pPS_L = new test_OPropertySetHelper_Listener() );
// Test queryInterface
Reference < XPropertySet > rProp( xPS , UNO_QUERY );
OSL_ENSURE( rProp.is() , "PropertySetHelper: XPropertySet nor supported" );
Reference < XMultiPropertySet > rMulti( xPS , UNO_QUERY );
OSL_ENSURE( rMulti.is() , "PropertySetHelper: XMultiPropertySet nor supported" );
Reference < XFastPropertySet > rFast( xPS , UNO_QUERY );
OSL_ENSURE( rFast.is() , "PropertySetHelper: XFastPropertySet nor supported" );
x = Reference < XInterface > ();
// Test add-remove listener
{
Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
Reference < XVetoableChangeListener > x2( xPS_L, UNO_QUERY );
xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
Sequence<OUString> szPN( 3 );
szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
pPS->addPropertiesChangeListener( szPN, x1 );
szPN = Sequence<OUString>();
pPS->addPropertiesChangeListener( szPN, x1 );
pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
pPS->removePropertiesChangeListener( x1 );
pPS->removePropertiesChangeListener( x1 );
pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
// this exception must thrown
try
{
xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), xPS_L );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
try
{
xPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), x2 );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
}
OSL_ENSURE( pPS_L->getRefCount() == 1, "PropertySetHelper: wrong reference count" );
// Test disposing
{
Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
Reference < XVetoableChangeListener > x2( xPS_L, UNO_QUERY );
xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
Sequence<OUString> szPN( 2 );
szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
pPS->addPropertiesChangeListener( szPN, x1 );
szPN = Sequence<OUString>();
pPS->addPropertiesChangeListener( szPN, x1 );
pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
pPS->dispose();
}
OSL_ENSURE( pPS_L->nDisposing == 4 , "PropertySetHelper: wrong disposing count" );
OSL_ENSURE( pPS_L->getRefCount() == 1 , "PropertySetHelper: wrong reference count" );
pPS_L->nDisposing = 0;
xPS = pPS = new test_OPropertySetHelper( getBasicProps(), PROPERTY_COUNT - z );
// Test set- and get- (Fast) propertyValue
{
// set read only property
try
{
// Readonly raises a vetoable exception
sal_Bool b = sal_True;
Any aBool;
aBool.setValue( &b , getCppuBooleanType() );
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ), aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( PropertyVetoException & /*e*/ )
{
}
try
{
// Readonly raises a vetoable exception
sal_Bool b = sal_True;
Any aBool;
aBool.setValue( &b , getCppuBooleanType() );
// BOOL i s0
pPS->setFastPropertyValue( PROPERTY_BOOL, aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( PropertyVetoException & /*e*/ )
{
}
// set unknown property
try
{
sal_Bool b = sal_True;
Any aBool;
aBool.setValue( &b , getCppuBooleanType() );
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ), aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
try
{
sal_Bool b = sal_True;
Any aBool;
aBool.setValue( &b , getCppuBooleanType() );
pPS->setFastPropertyValue( 3, aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
// get unknown property
try
{
Any aBool;
aBool = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ) );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
try
{
Any aBool;
aBool = ((XFastPropertySet *)pPS)->getFastPropertyValue( 3 );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
// set property with invalid type
try
{
Any aBool;
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( IllegalArgumentException & /*e*/ )
{
}
try
{
Any aBool;
pPS->setFastPropertyValue( PROPERTY_INT32, aBool );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( IllegalArgumentException & /*e*/ )
{
}
// narrowing conversion is not allowed!
try
{
Any aINT32;
aINT32 <<= (sal_Int32 ) 16;
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aINT32 );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( IllegalArgumentException & /*e*/ )
{
}
try
{
Any aINT32;
aINT32 <<= (sal_Int32) 16;
pPS->setFastPropertyValue( PROPERTY_INT16, aINT32 );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( IllegalArgumentException & /*e*/ )
{
}
Any aValue;
aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") ) );
sal_Bool b = *( (sal_Bool*)aValue.getValue());
OSL_ENSURE( ! b, "PropertySetHelper: wrong BOOL value" );
aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_BOOL );
b = *((sal_Bool*)aValue.getValue());
OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
sal_Int16 n16(0);
aValue <<=(sal_Int16)22;
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) );
aValue >>= n16;
OSL_ENSURE( 22 == n16 , "PropertySetHelper: wrong INT16 value" );
aValue <<= (sal_Int16)44;
((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT16 );
aValue >>= n16;
OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
// widening conversion
aValue <<= (sal_Int16)55;
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ), aValue );
aValue = xPS->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") ) );
sal_Int32 n32(0);
aValue >>= n32;
OSL_ENSURE( 55 == n32 , "PropertySetHelper: wrong INT32 value" );
aValue <<= (sal_Int16)66;
((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT32, aValue );
aValue = ((XFastPropertySet *)pPS)->getFastPropertyValue( PROPERTY_INT32 );
aValue >>= n32;
OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
Sequence< OUString >valueNames = Sequence<OUString>( 3 );
valueNames.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
valueNames.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
valueNames.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
Sequence< Any > aValues = pPS->getPropertyValues( valueNames );
b = *((sal_Bool*)aValues.getConstArray()[0].getValue());
aValues.getConstArray()[1] >>= n16;
aValues.getConstArray()[2] >>= n32;
OSL_ENSURE( !b, "PropertySetHelper: wrong BOOL value" );
OSL_ENSURE( 44 == n16, "PropertySetHelper: wrong INT16 value" );
OSL_ENSURE( 66 == n32, "PropertySetHelper: wrong INT32 value" );
}
pPS->nINT32 = 0;
pPS->nINT16 = 0;
// Test add-remove listener
{
Reference < XVetoableChangeListener > x2( xPS_L, UNO_QUERY );
xPS->addPropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
pPS_L->nCount = 10;
Sequence< Any > aSeq( pPS_L->nCount );
pPS_L->nCurrent = 0;
pPS_L->pExceptedListenerValues = aSeq.getArray();
pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value vetoable
pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 22; // new value vetoable
pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value bound
pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value bound
pPS_L->pExceptedListenerValues[4] <<= (sal_Int16) 22; // old value vetoable
pPS_L->pExceptedListenerValues[5] <<= (sal_Int16) 44; // new value vetoable
pPS_L->pExceptedListenerValues[6] <<= (sal_Int16) 22; // old value bound
pPS_L->pExceptedListenerValues[7] <<= (sal_Int16) 44; // new value bound
pPS_L->pExceptedListenerValues[8] <<= (sal_Int16) 44; // old value vetoable
pPS_L->pExceptedListenerValues[9] <<= (sal_Int16) 100; // new value vetoable exception
Any aValue;
aValue <<= (sal_Int16)22;
xPS->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), aValue );
aValue <<= (sal_Int16) 44;
((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
aValue <<= (sal_Int16)100;// exception
try
{
((XFastPropertySet *)pPS)->setFastPropertyValue( PROPERTY_INT16, aValue );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( PropertyVetoException & /*e*/ )
{
}
OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
pPS->nINT32 = 0;
pPS->nINT16 = 0;
pPS_L->nCount = 0;
pPS_L->nCurrent = 0;
pPS_L->pExceptedListenerValues = NULL;
xPS->removePropertyChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), xPS_L );
pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
}
// Test multi property set listener
{
Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
Reference < XVetoableChangeListener > x2( xPS_L, UNO_QUERY );
pPS->addVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ) , x2 );
Sequence<OUString> szPN( 4 );
szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("BOOL") );
szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
szPN.getArray()[2] = OUString( RTL_CONSTASCII_USTRINGPARAM("Does not exist") ); // must ne ignored by the addPropertiesChangeListener method
szPN.getArray()[3] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
pPS->addPropertiesChangeListener( szPN, x1 );
pPS_L->nCount = 6;
Sequence< Any > aSeq( pPS_L->nCount );
pPS_L->nCurrent = 0;
pPS_L->pExceptedListenerValues = aSeq.getArray();
pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value vetoable
pPS_L->pExceptedListenerValues[1] <<= (sal_Int16 ) 22; // new value vetoable
// INT32 is not constrained
pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value bound
pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 22; // new value bound
pPS_L->pExceptedListenerValues[4] <<= (sal_Int32) 0; // old value bound
pPS_L->pExceptedListenerValues[5] <<= (sal_Int32) 44; // new value bound
szPN = Sequence<OUString>( 2 );
szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT32") );
Sequence< Any > aValues( 2 );
aValues.getArray()[0] <<= (sal_Int16) 22;
aValues.getArray()[1] <<= (sal_Int16) 44;
pPS->setPropertyValues( szPN, aValues );
OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
//firePropertiesChangeEvent
pPS->nINT16 = 8;
pPS->nINT32 = 5;
pPS_L->nCount = 4;
pPS_L->nCurrent = 0;
pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 8; // old value
pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 8; // new value
pPS_L->pExceptedListenerValues[2] <<= (sal_Int32) 5; // old value
pPS_L->pExceptedListenerValues[3] <<= (sal_Int32) 5; // new value
pPS->firePropertiesChangeEvent( szPN, pPS_L );
OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
//vetoable exception with multible
szPN.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
szPN.getArray()[1] = OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") );
pPS->nINT32 = 0;
pPS->nINT16 = 0;
pPS_L->nCount = 4;
pPS_L->nCurrent = 0;
pPS_L->pExceptedListenerValues[0] <<= (sal_Int16) 0; // old value vetoable
pPS_L->pExceptedListenerValues[1] <<= (sal_Int16) 44; // new value vetoable
pPS_L->pExceptedListenerValues[2] <<= (sal_Int16) 0; // old value vetoable
pPS_L->pExceptedListenerValues[3] <<= (sal_Int16) 100; // new value vetoable
try
{
aValues.getArray()[0] <<= (sal_Int16)44;
aValues.getArray()[1] <<= (sal_Int16)100;
pPS->setPropertyValues( szPN, aValues );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch ( PropertyVetoException & /*e*/ )
{
}
OSL_ENSURE( pPS_L->nCount == pPS_L->nCurrent, "not all listeners called" );
pPS->removePropertiesChangeListener( x1 );
pPS->removeVetoableChangeListener( OUString( RTL_CONSTASCII_USTRINGPARAM("INT16") ), x2 );
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */