Files
libreoffice/cppuhelper/test/testpropshlp.cxx
Thomas Arnhold ba0a57702c remove OUString wrap for string literals
For some functions and all kinds of Exceptions.

CannotConvertException
CloseVetoException
DisposedException
EmptyUndoStackException
ErrorCodeIOException
Exception
GridInvalidDataException
GridInvalidModelException
IOException
IllegalAccessException
IllegalArgumentException
IllegalTypeException
IndexOutOfBoundsException
NoMasterException
NoSuchElementException
NoSupportException
PropertyVetoException
RuntimeException
SAXException
ScannerException
StorageWrappedTargetException
UnsupportedFlavorException
VetoException
WrappedTargetException
ZipIOException
throwGenericSQLException
throwIllegallArgumentException

createInstance
createInstanceWithContext
forName
getByName
getPackageManager
getPropertyValue
getUnpackedValueOrDefault
getValueByName
hasPropertyByName
openKey
setName
setPropertyValue
supportsService

bash command:

for i in `cat list`; do git grep "$i\s*(\s*OUString(\s*\"" -- '*.[hc]xx'
	| cut -d ':' -f1 | sort -u
	| xargs sed -i
		-e "s/\(\<$i\s*(\)\s*OUString(\s*\(\"[^\")\\]*\"\)\s*)\s*/\1\2/g"
		-e "s/\($i.*\)\"+ /\1\" + /g";
done

Change-Id: Iaf8e641b0abf28c082906014f87a183517630535
Reviewed-on: https://gerrit.libreoffice.org/4624
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Thomas Arnhold <thomas@arnhold.org>
Tested-by: Thomas Arnhold <thomas@arnhold.org>
2013-06-29 21:52:54 +00:00

1169 lines
44 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#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("a"), 0, getCppuType( (OUString *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //OUString
Property( OUString("b"), 1, getCppuCharType( ) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //Char
Property( OUString("c"), 2, getCppuType( (sal_Int32*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //sal_Int32
Property( OUString("d"), 5, getCppuType( (double*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //double
Property( OUString("e"), 7, getCppuBooleanType() ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), //BOOL
Property( OUString("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("f"), 8, getCppuType( (Any *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Any
Property( OUString("b"), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString("a"), 0, getCppuType( (OUString*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // OUString
Property( OUString("d"), 5, getCppuType( (double*)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Double
Property( OUString("c"), 2, getCppuType( (sal_Int32*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // sal_Int32
Property( OUString("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("b"), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString("f"), 8, getCppuType( (Any *)0) ,
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // any
Property( OUString("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("a"), 0, getCppuType( (OUString*)0),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // OUString
Property( OUString("b"), 1, getCppuCharType( ),
PropertyAttribute::READONLY | PropertyAttribute::MAYBEVOID ), // Char
Property( OUString("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("never exist"), "hasPropertyByName not correct" );
try
{
a1.getPropertyByName( OUString("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("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("a");
aS.getArray()[1] = OUString("d");
aS.getArray()[2] = OUString("f");
aS.getArray()[3] = OUString("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( *(static_cast< OBroadcastHelper * >(this)))
// MSCI 4 bug ! :
// OBroadcastHelper == OBroadcastHelperVar<OMultiTypeInterfaceContainerHelper>
, OPropertySetHelper(
*(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 > ( (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("BOOL") , PROPERTY_BOOL , getCppuBooleanType(), PropertyAttribute::READONLY ),
Property( OUString("INT16") , PROPERTY_INT16,
getCppuType( (sal_Int16*)0 ), PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED ),
Property( OUString("INT32") , PROPERTY_INT32, getCppuType( (sal_Int32*)0 ), PropertyAttribute::BOUND ),
Property( OUString("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("BOOL"), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString("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("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("BOOL"), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString("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("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("BOOL"), "PropertySetHelper: wrong name" );
}
break;
case PROPERTY_INT16:
{
OSL_ENSURE( evt.PropertyName == OUString("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("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("INT16"), xPS_L );
Sequence<OUString> szPN( 3 );
szPN.getArray()[0] = OUString("BOOL");
szPN.getArray()[1] = OUString("INT32");
szPN.getArray()[2] = OUString("Does not exist"); // must ne ignored by the addPropertiesChangeListener method
pPS->addPropertiesChangeListener( szPN, x1 );
szPN = Sequence<OUString>();
pPS->addPropertiesChangeListener( szPN, x1 );
pPS->addVetoableChangeListener( OUString("INT16"), x2 );
xPS->removePropertyChangeListener( OUString("INT16"), xPS_L );
pPS->removePropertiesChangeListener( x1 );
pPS->removePropertiesChangeListener( x1 );
pPS->removeVetoableChangeListener( OUString("INT16"), x2 );
// this exception must thrown
try
{
xPS->addPropertyChangeListener( OUString("Does not exist"), xPS_L );
OSL_FAIL( "PropertySetHelper: exeption not thrown" );
}
catch( UnknownPropertyException & /*e*/ )
{
}
try
{
xPS->addVetoableChangeListener( OUString("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("INT16"), xPS_L );
Sequence<OUString> szPN( 2 );
szPN.getArray()[0] = OUString("BOOL");
szPN.getArray()[1] = OUString("INT32");
pPS->addPropertiesChangeListener( szPN, x1 );
szPN = Sequence<OUString>();
pPS->addPropertiesChangeListener( szPN, x1 );
pPS->addVetoableChangeListener( OUString("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("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("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("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("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("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("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("INT16", aValue );
aValue = xPS->getPropertyValue("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("INT32", aValue );
aValue = xPS->getPropertyValue("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("BOOL");
valueNames.getArray()[1] = OUString("INT16");
valueNames.getArray()[2] = OUString("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("INT16"), xPS_L );
pPS->addVetoableChangeListener( OUString("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("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("INT16"), xPS_L );
pPS->removeVetoableChangeListener( OUString("INT16"), x2 );
}
// Test multi property set listener
{
Reference < XPropertiesChangeListener > x1( xPS_L, UNO_QUERY );
Reference < XVetoableChangeListener > x2( xPS_L, UNO_QUERY );
pPS->addVetoableChangeListener( OUString("INT16") , x2 );
Sequence<OUString> szPN( 4 );
szPN.getArray()[0] = OUString("BOOL");
szPN.getArray()[1] = OUString("INT32");
szPN.getArray()[2] = OUString("Does not exist"); // must ne ignored by the addPropertiesChangeListener method
szPN.getArray()[3] = OUString("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("INT16");
szPN.getArray()[1] = OUString("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("INT16");
szPN.getArray()[1] = OUString("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("INT16"), x2 );
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */