diff options
Diffstat (limited to 'stoc/source/invocation/invocation.cxx')
-rw-r--r-- | stoc/source/invocation/invocation.cxx | 1234 |
1 files changed, 0 insertions, 1234 deletions
diff --git a/stoc/source/invocation/invocation.cxx b/stoc/source/invocation/invocation.cxx deleted file mode 100644 index e5b05d09c..000000000 --- a/stoc/source/invocation/invocation.cxx +++ /dev/null @@ -1,1234 +0,0 @@ -/* -*- 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. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_stoc.hxx" -#include <osl/mutex.hxx> -#include <cppuhelper/queryinterface.hxx> -#include <cppuhelper/weak.hxx> -#include <cppuhelper/factory.hxx> -#include <cppuhelper/implementationentry.hxx> -#include <cppuhelper/typeprovider.hxx> -#include <cppuhelper/implbase2.hxx> - -#include <com/sun/star/uno/DeploymentException.hpp> -#include <com/sun/star/script/FailReason.hpp> -#include <com/sun/star/script/XTypeConverter.hpp> -#include <com/sun/star/script/XInvocation.hpp> -#include <com/sun/star/script/XInvocation2.hpp> -#include <com/sun/star/reflection/XIdlReflection.hpp> -#include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/container/XIndexContainer.hpp> -#include <com/sun/star/container/XEnumerationAccess.hpp> -#include <com/sun/star/beans/XExactName.hpp> -#include <com/sun/star/beans/XMaterialHolder.hpp> -#include <com/sun/star/beans/XIntrospection.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/MethodConcept.hpp> -#include <com/sun/star/beans/PropertyConcept.hpp> -#include <com/sun/star/lang/XSingleServiceFactory.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XTypeProvider.hpp> -#include <com/sun/star/registry/XRegistryKey.hpp> - -#include <boost/scoped_array.hpp> -#include <rtl/ustrbuf.hxx> -#include <rtl/strbuf.hxx> - -#define SERVICENAME "com.sun.star.script.Invocation" -#define IMPLNAME "com.sun.star.comp.stoc.Invocation" - -using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::script; -using namespace com::sun::star::reflection; -using namespace com::sun::star::beans; -using namespace com::sun::star::registry; -using namespace com::sun::star::container; -using namespace cppu; -using namespace osl; -using ::rtl::OUString; - -namespace stoc_inv -{ -static rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT; - -static Sequence< OUString > inv_getSupportedServiceNames() -{ - Sequence< OUString > seqNames(1); - seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME)); - return seqNames; -} - -static OUString inv_getImplementationName() -{ - return OUString(RTL_CONSTASCII_USTRINGPARAM(IMPLNAME)); -} - -// TODO: Zentral implementieren -inline Reference<XIdlClass> TypeToIdlClass( const Type& rType, const Reference< XIdlReflection > & xRefl ) -{ - return xRefl->forName( rType.getTypeName() ); -} - - -//================================================================================================== -class Invocation_Impl - : public OWeakObject - , public XInvocation2 - , public XNameContainer - , public XIndexContainer - , public XEnumerationAccess - , public XExactName - , public XMaterialHolder - , public XTypeProvider -{ -public: - Invocation_Impl( const Any & rAdapted, const Reference<XTypeConverter> &, - const Reference<XIntrospection> &, - const Reference<XIdlReflection> & ); - virtual ~Invocation_Impl(); - - // XInterface - virtual Any SAL_CALL queryInterface( const Type & aType) throw( RuntimeException ); - virtual void SAL_CALL acquire() throw() { OWeakObject::acquire(); } - virtual void SAL_CALL release() throw() { OWeakObject::release(); } - - - // XTypeProvider - virtual Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) - throw(RuntimeException); - virtual Sequence< sal_Int8 > SAL_CALL getImplementationId( ) - throw( RuntimeException); - - // Methoden von XMaterialHolder - virtual Any SAL_CALL getMaterial(void) throw(RuntimeException); - - // ? XTool - virtual void SAL_CALL setMaterial( const Any& rMaterial ); - - // XInvocation - virtual Reference<XIntrospectionAccess> SAL_CALL getIntrospection(void) throw( RuntimeException ); - virtual Any SAL_CALL invoke(const OUString& FunctionName, const Sequence< Any >& Params, Sequence< sal_Int16 >& OutParamIndex, Sequence< Any >& OutParam) - throw( IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException ); - virtual void SAL_CALL setValue(const OUString& PropertyName, const Any& Value) - throw( UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException ); - virtual Any SAL_CALL getValue(const OUString& PropertyName) - throw( UnknownPropertyException, RuntimeException ); - virtual sal_Bool SAL_CALL hasMethod(const OUString& Name) throw( RuntimeException ); - virtual sal_Bool SAL_CALL hasProperty(const OUString& Name) throw( RuntimeException ); - - // XInvocation2 - virtual Sequence< OUString > SAL_CALL getMemberNames( ) - throw( RuntimeException ); - virtual Sequence< InvocationInfo > SAL_CALL getInfo( ) - throw( RuntimeException ); - virtual InvocationInfo SAL_CALL getInfoForName( const OUString& aName, sal_Bool bExact ) - throw( IllegalArgumentException, RuntimeException ); - - // All Access and Container methods are not thread save - // XElementAccess - virtual Type SAL_CALL getElementType(void) throw( RuntimeException ) - { return _xElementAccess->getElementType(); } - - virtual sal_Bool SAL_CALL hasElements(void) throw( RuntimeException ) - { return _xElementAccess->hasElements(); } - - // XNameContainer - virtual void SAL_CALL insertByName( const OUString& Name, const Any& Element ) - throw( IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException ) - { _xNameContainer->insertByName( Name, Element ); } - - virtual void SAL_CALL replaceByName( const OUString& Name, const Any& Element ) - throw( IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException ) - { _xNameContainer->replaceByName( Name, Element ); } - - virtual void SAL_CALL removeByName( const OUString& Name ) - throw( NoSuchElementException, WrappedTargetException, RuntimeException ) - { _xNameContainer->removeByName( Name ); } - - // XNameAccess - virtual Any SAL_CALL getByName( const OUString& Name ) - throw( NoSuchElementException, WrappedTargetException, RuntimeException ) - { return _xNameAccess->getByName( Name ); } - - virtual Sequence<OUString> SAL_CALL getElementNames(void) throw( RuntimeException ) - { return _xNameAccess->getElementNames(); } - - virtual sal_Bool SAL_CALL hasByName( const OUString& Name ) throw( RuntimeException ) - { return _xNameAccess->hasByName( Name ); } - - // XIndexContainer - virtual void SAL_CALL insertByIndex( sal_Int32 Index, const Any& Element ) - throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) - { _xIndexContainer->insertByIndex( Index, Element ); } - - virtual void SAL_CALL replaceByIndex( sal_Int32 Index, const Any& Element ) - throw( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) - { _xIndexContainer->replaceByIndex( Index, Element ); } - - virtual void SAL_CALL removeByIndex( sal_Int32 Index ) - throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) - { _xIndexContainer->removeByIndex( Index ); } - - // XIndexAccess - virtual sal_Int32 SAL_CALL getCount(void) throw( RuntimeException ) - { return _xIndexAccess->getCount(); } - - virtual Any SAL_CALL getByIndex( sal_Int32 Index ) - throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) - { return _xIndexAccess->getByIndex( Index ); } - - // XEnumerationAccess - virtual Reference<XEnumeration> SAL_CALL createEnumeration(void) throw( RuntimeException ) - { return _xEnumerationAccess->createEnumeration(); } - - // XExactName - virtual OUString SAL_CALL getExactName( const OUString& rApproximateName ) throw( RuntimeException ); - - - //===================================================================================================== -private: - void getInfoSequenceImpl( Sequence< OUString >* pStringSeq, Sequence< InvocationInfo >* pInfoSeq ); - void fillInfoForNameAccess( InvocationInfo& rInfo, const OUString& aName ); - void fillInfoForProperty( InvocationInfo& rInfo, const Property& rProp ); - void fillInfoForMethod( InvocationInfo& rInfo, const Reference< XIdlMethod > xMethod ); - - Reference<XTypeConverter> xTypeConverter; - Reference<XIntrospection> xIntrospection; - Reference<XIdlReflection> xCoreReflection; - - Any _aMaterial; - // _xDirect and (_xIntrospectionAccess, xPropertySet) are exclusive - Reference<XInvocation> _xDirect; - Reference<XInvocation2> _xDirect2; - Reference<XPropertySet> _xPropertySet; - Reference<XIntrospectionAccess> _xIntrospectionAccess; - - // supplied Interfaces - Reference<XNameContainer> _xNameContainer; - Reference<XNameAccess> _xNameAccess; - Reference<XIndexContainer> _xIndexContainer; - Reference<XIndexAccess> _xIndexAccess; - Reference<XEnumerationAccess> _xEnumerationAccess; - Reference<XElementAccess> _xElementAccess; - - // - Reference<XExactName> _xENDirect, _xENIntrospection, _xENNameAccess; -}; - - -//================================================================================================== -//================================================================================================== -//================================================================================================== - -//-------------------------------------------------------------------------------------------------- -Invocation_Impl::Invocation_Impl -( - const Any & rAdapted, - const Reference<XTypeConverter> & rTC, - const Reference<XIntrospection> & rI, - const Reference<XIdlReflection> & rCR -) - : xTypeConverter( rTC ) - , xIntrospection( rI ) - , xCoreReflection( rCR ) -{ - g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); - setMaterial( rAdapted ); -} - -Invocation_Impl::~Invocation_Impl() -{ - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); -} - -//################################################################################################## -//### INTERFACE IMPLEMENTATIONS #################################################################### -//################################################################################################## - - -Any SAL_CALL Invocation_Impl::queryInterface( const Type & aType ) - throw( RuntimeException ) -{ - // PropertySet-Implementation - Any a = ::cppu::queryInterface( aType, - SAL_STATIC_CAST(XInvocation*, this), - SAL_STATIC_CAST(XMaterialHolder*, this), - SAL_STATIC_CAST(XTypeProvider *,this) ); - if( a.hasValue() ) - { - return a; - } - - if( aType == getCppuType( (Reference<XExactName>*) NULL ) ) - { - // Ivocation does not support XExactName, if direct object supports - // XInvocation, but not XExactName. - if ((_xDirect.is() && _xENDirect.is()) || - (!_xDirect.is() && (_xENIntrospection.is() || _xENNameAccess.is()))) - { - return makeAny( Reference< XExactName >( SAL_STATIC_CAST(XExactName*, this) ) ); - } - } - else if ( aType == getCppuType( (Reference<XNameContainer>*) NULL ) ) - { - if( _xNameContainer.is() ) - return makeAny( Reference< XNameContainer >( SAL_STATIC_CAST(XNameContainer*, this) ) ); - } - else if ( aType == getCppuType( (Reference<XNameAccess>*) NULL ) ) - { - if( _xNameAccess.is() ) - return makeAny( Reference< XNameAccess >( SAL_STATIC_CAST(XNameAccess*, this) ) ); - } - else if ( aType == getCppuType( (Reference<XIndexContainer>*) NULL ) ) - { - if (_xIndexContainer.is()) - return makeAny( Reference< XIndexContainer >( SAL_STATIC_CAST(XIndexContainer*, this) ) ); - } - else if ( aType == getCppuType( (Reference<XIndexAccess>*) NULL ) ) - { - if (_xIndexAccess.is()) - return makeAny( Reference< XIndexAccess >( SAL_STATIC_CAST(XIndexAccess*, this) ) ); - } - else if ( aType == getCppuType( (Reference<XEnumerationAccess>*) NULL ) ) - { - if (_xEnumerationAccess.is()) - return makeAny( Reference< XEnumerationAccess >( SAL_STATIC_CAST(XEnumerationAccess*, this) ) ); - } - else if ( aType == getCppuType( (Reference<XElementAccess>*) NULL ) ) - { - if (_xElementAccess.is()) - { - return makeAny( Reference< XElementAccess >( - SAL_STATIC_CAST(XElementAccess*, SAL_STATIC_CAST(XNameContainer*, this) ) ) ); - } - } - else if ( aType == getCppuType( (Reference<XInvocation2>*) NULL ) ) - { - // Invocation does not support XInvocation2, if direct object supports - // XInvocation, but not XInvocation2. - if ( ( _xDirect.is() && _xDirect2.is()) || - (!_xDirect.is() && _xIntrospectionAccess.is() ) ) - { - return makeAny( Reference< XInvocation2 >( SAL_STATIC_CAST(XInvocation2*, this) ) ); - } - } - - return OWeakObject::queryInterface( aType ); -} - - -//-------------------------------------------------------------------------------------------------- -Any Invocation_Impl::getMaterial(void) throw(RuntimeException) -{ - // AB, 12.2.1999 Sicherstellen, dass das Material wenn moeglich - // aus der direkten Invocation bzw. von der Introspection geholt - // wird, da sonst Structs nicht korrekt behandelt werden - Reference<XMaterialHolder> xMaterialHolder; - if( _xDirect.is() ) - { - xMaterialHolder = Reference<XMaterialHolder>::query( _xDirect ); - //_xDirect->queryInterface( XMaterialHolder::getSmartUik(), xMaterialHolder ); - } - else if( _xIntrospectionAccess.is() ) - { - xMaterialHolder = Reference<XMaterialHolder>::query( _xIntrospectionAccess ); - //_xIntrospectionAccess->queryInterface( XMaterialHolder::getSmartUik(), xMaterialHolder ); - } - if( xMaterialHolder.is() ) - { - return xMaterialHolder->getMaterial(); - } - return _aMaterial; -} - -//-------------------------------------------------------------------------------------------------- -void Invocation_Impl::setMaterial( const Any& rMaterial ) -{ - // set the material first and only once - Reference<XInterface> xObj; - - if (rMaterial.getValueType().getTypeClass() == TypeClass_INTERFACE) - xObj = *(Reference<XInterface>*)rMaterial.getValue(); - _aMaterial = rMaterial; - - // Ersteinmal alles ausserhalb des guards machen - _xDirect = Reference<XInvocation>::query( xObj ); - - if( _xDirect.is() ) - { - // Objekt direkt befragen - _xElementAccess = Reference<XElementAccess>::query( _xDirect ); - _xEnumerationAccess = Reference<XEnumerationAccess>::query( _xDirect ); - _xIndexAccess = Reference<XIndexAccess>::query( _xDirect ); - _xIndexContainer = Reference<XIndexContainer>::query( _xDirect ); - _xNameAccess = Reference<XNameAccess>::query( _xDirect ); - _xNameContainer = Reference<XNameContainer>::query( _xDirect ); - _xENDirect = Reference<XExactName>::query( _xDirect ); - _xDirect2 = Reference<XInvocation2>::query( _xDirect ); - - // only once!!! - //_xIntrospectionAccess = XIntrospectionAccessRef(); - //_xPropertySet = XPropertySetRef(); - } - else - { - // Invocation ueber die Introspection machen - if (xIntrospection.is()) - { - _xIntrospectionAccess = xIntrospection->inspect( _aMaterial ); - if( _xIntrospectionAccess.is() ) - { - - _xElementAccess = Reference<XElementAccess>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XElementAccess>*) NULL ) ) ); - - _xEnumerationAccess = Reference<XEnumerationAccess>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XEnumerationAccess>*) NULL )) ); - - _xIndexAccess = Reference<XIndexAccess>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XIndexAccess>*) NULL ) ) ); - - _xIndexContainer = Reference<XIndexContainer>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XIndexContainer>*) NULL ) ) ); - - _xNameAccess = Reference<XNameAccess>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XNameAccess>*) NULL ) ) ); - - _xNameContainer = Reference<XNameContainer>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XNameContainer>*) NULL ) ) ); - - _xPropertySet = Reference<XPropertySet>::query( - _xIntrospectionAccess->queryAdapter( - getCppuType( (Reference<XPropertySet>*) NULL )) ); - - _xENIntrospection = Reference<XExactName>::query( _xIntrospectionAccess ); - if (_xNameAccess.is()) - _xENNameAccess = Reference<XExactName>::query( _xNameAccess ); - } - } - /* only once !!! - _xDirect = XInvocationRef(); - if( !_xIntrospectionAccess.is() ) - { - // reset - _xElementAccess = XElementAccessRef(); - _xEnumerationAccess = XEnumerationAccessRef(); - _xIndexAccess = XIndexAccessRef(); - _xIndexContainer = XIndexContainerRef(); - _xNameAccess = XNameAccessRef(); - _xNameContainer = XNameContainerRef(); - _xPropertySet = XPropertySetRef(); - } - */ - } -} - -//-------------------------------------------------------------------------------------------------- -OUString Invocation_Impl::getExactName( const OUString& rApproximateName ) - throw( RuntimeException ) -{ - if (_xENDirect.is()) - return _xENDirect->getExactName( rApproximateName ); - - OUString aRet; - if (_xENIntrospection.is()) - aRet = _xENIntrospection->getExactName( rApproximateName ); - if (!aRet.getLength() && _xENNameAccess.is()) - aRet = _xENNameAccess->getExactName( rApproximateName ); - return aRet; -} - -//-------------------------------------------------------------------------------------------------- -Reference<XIntrospectionAccess> Invocation_Impl::getIntrospection(void) - throw( RuntimeException ) -{ - if( _xDirect.is() ) - return _xDirect->getIntrospection(); - else - return _xIntrospectionAccess; -} - -//-------------------------------------------------------------------------------------------------- -sal_Bool Invocation_Impl::hasMethod( const OUString& Name ) - throw( RuntimeException ) -{ - if (_xDirect.is()) - return _xDirect->hasMethod( Name ); - if( _xIntrospectionAccess.is() ) - return _xIntrospectionAccess->hasMethod( Name, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); - return sal_False; -} - -//-------------------------------------------------------------------------------------------------- -sal_Bool Invocation_Impl::hasProperty( const OUString& Name ) - throw( RuntimeException ) -{ - if (_xDirect.is()) - return _xDirect->hasProperty( Name ); - // PropertySet - if( _xIntrospectionAccess.is() - && _xIntrospectionAccess->hasProperty( Name, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) - return sal_True; - // NameAccess - if( _xNameAccess.is() ) - return _xNameAccess->hasByName( Name ); - return sal_False; -} - -//-------------------------------------------------------------------------------------------------- -Any Invocation_Impl::getValue( const OUString& PropertyName ) - throw( UnknownPropertyException, RuntimeException ) -{ - if (_xDirect.is()) - return _xDirect->getValue( PropertyName ); - try - { - // PropertySet - if( _xIntrospectionAccess.is() && _xPropertySet.is() - && _xIntrospectionAccess->hasProperty - ( PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) - { - return _xPropertySet->getPropertyValue( PropertyName ); - } - // NameAccess - if( _xNameAccess.is() && _xNameAccess->hasByName( PropertyName ) ) - return _xNameAccess->getByName( PropertyName ); - } - catch (UnknownPropertyException &) - { - throw; - } - catch (RuntimeException &) - { - throw; - } - catch (Exception &) - { - } - - throw UnknownPropertyException( - OUString( RTL_CONSTASCII_USTRINGPARAM("cannot get value ") ) + PropertyName, - Reference< XInterface >() ); -} - -//-------------------------------------------------------------------------------------------------- -void Invocation_Impl::setValue( const OUString& PropertyName, const Any& Value ) - throw( UnknownPropertyException, CannotConvertException, InvocationTargetException, RuntimeException ) -{ - if (_xDirect.is()) - _xDirect->setValue( PropertyName, Value ); - else - { - try - { - // Properties - if( _xIntrospectionAccess.is() && _xPropertySet.is() - && _xIntrospectionAccess->hasProperty( - PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) - { - Property aProp = _xIntrospectionAccess->getProperty( - PropertyName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ); - Reference < XIdlClass > r = TypeToIdlClass( aProp.Type, xCoreReflection ); - if( r->isAssignableFrom( TypeToIdlClass( Value.getValueType(), xCoreReflection ) ) ) - _xPropertySet->setPropertyValue( PropertyName, Value ); - else if( xTypeConverter.is() ) - _xPropertySet->setPropertyValue( - PropertyName, xTypeConverter->convertTo( Value, aProp.Type ) ); - else - throw RuntimeException( - OUString( RTL_CONSTASCII_USTRINGPARAM("no type converter service!") ), - Reference< XInterface >() ); - } - // NameContainer - else if( _xNameContainer.is() ) - { - Any aConv; - Reference < XIdlClass > r = - TypeToIdlClass( _xNameContainer->getElementType(), xCoreReflection ); - if( r->isAssignableFrom(TypeToIdlClass( Value.getValueType(), xCoreReflection ) ) ) - aConv = Value; - else if( xTypeConverter.is() ) - aConv = xTypeConverter->convertTo( Value, _xNameContainer->getElementType() ); - else - throw RuntimeException( - OUString( RTL_CONSTASCII_USTRINGPARAM("no type converter service!") ), - Reference< XInterface >() ); - - // bei Vorhandensein ersetzen, ansonsten einfuegen - if (_xNameContainer->hasByName( PropertyName )) - _xNameContainer->replaceByName( PropertyName, aConv ); - else - _xNameContainer->insertByName( PropertyName, aConv ); - } - else - throw UnknownPropertyException( - OUString( RTL_CONSTASCII_USTRINGPARAM("no introspection nor name container!") ), - Reference< XInterface >() ); - } - catch (UnknownPropertyException &) - { - throw; - } - catch (CannotConvertException &) - { - throw; - } - catch (InvocationTargetException &) - { - throw; - } - catch (RuntimeException &) - { - throw; - } - catch (Exception & exc) - { - throw InvocationTargetException( - OUString( RTL_CONSTASCII_USTRINGPARAM("exception occurred in setValue(): ") ) + - exc.Message, Reference< XInterface >(), makeAny( exc /* though sliced */ ) ); - } - } -} - -//-------------------------------------------------------------------------------------------------- -Any Invocation_Impl::invoke( const OUString& FunctionName, const Sequence<Any>& InParams, - Sequence<sal_Int16>& OutIndizes, Sequence<Any>& OutParams ) - throw( IllegalArgumentException, CannotConvertException, InvocationTargetException, RuntimeException ) -{ - if (_xDirect.is()) - return _xDirect->invoke( FunctionName, InParams, OutIndizes, OutParams ); - - if (_xIntrospectionAccess.is()) - { - // throw NoSuchMethodException if not exist - Reference<XIdlMethod> xMethod = _xIntrospectionAccess->getMethod( - FunctionName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); - - // ParameterInfos - Sequence<ParamInfo> aFParams = xMethod->getParameterInfos(); - const ParamInfo* pFParams = aFParams.getConstArray(); - sal_Int32 nFParamsLen = aFParams.getLength(); - if (nFParamsLen != InParams.getLength()) - { - throw IllegalArgumentException( - OUString( RTL_CONSTASCII_USTRINGPARAM("incorrect number of parameters passed invoking function ") ) + FunctionName, - (OWeakObject *) this, (sal_Int16) 1 ); - } - - // IN Parameter - const Any* pInParams = InParams.getConstArray(); - - // Introspection Invoke Parameter - Sequence<Any> aInvokeParams( nFParamsLen ); - Any* pInvokeParams = aInvokeParams.getArray(); - - // OUT Indizes - OutIndizes.realloc( nFParamsLen ); - sal_Int16* pOutIndizes = OutIndizes.getArray(); - sal_uInt32 nOutIndex = 0; - - for ( sal_Int32 nPos = 0; nPos < nFParamsLen; ++nPos ) - { - try - { - const ParamInfo& rFParam = pFParams[nPos]; - const Reference<XIdlClass>& rDestType = rFParam.aType; - - // is IN/INOUT parameter? - if (rFParam.aMode != ParamMode_OUT) - { - if (rDestType->isAssignableFrom( TypeToIdlClass( pInParams[nPos].getValueType(), xCoreReflection ) )) - { - pInvokeParams[nPos] = pInParams[nPos]; - } - else if (xTypeConverter.is()) - { - Type aDestType( rDestType->getTypeClass(), rDestType->getName() ); - pInvokeParams[nPos] = xTypeConverter->convertTo( pInParams[nPos], aDestType ); - } - else - { - CannotConvertException aExc; - aExc.Context = *this; - aExc.Message = OUString( RTL_CONSTASCII_USTRINGPARAM("invocation type mismatch!") ); - throw aExc; - } - } - - // is OUT/INOUT parameter? - if (rFParam.aMode != ParamMode_IN) - { - pOutIndizes[nOutIndex] = (sal_Int16)nPos; - if (rFParam.aMode == ParamMode_OUT) - rDestType->createObject( pInvokeParams[nPos] ); // default init - ++nOutIndex; - } - } - catch( CannotConvertException& rExc ) - { - rExc.ArgumentIndex = nPos; // optionalen Parameter Index hinzufuegen - throw rExc; - } - } - - // execute Method - Any aRet = xMethod->invoke( _aMaterial, aInvokeParams ); - - // OUT Params - OutIndizes.realloc( nOutIndex ); - pOutIndizes = OutIndizes.getArray(); - OutParams.realloc( nOutIndex ); - Any* pOutParams = OutParams.getArray(); - - while (nOutIndex--) - { - pOutParams[nOutIndex] = pInvokeParams[ pOutIndizes[nOutIndex] ]; - } - - return aRet; - } - - RuntimeException aExc; - aExc.Context = *this; - aExc.Message = OUString( RTL_CONSTASCII_USTRINGPARAM("invocation lacking of introspection access!") ); - throw aExc; -} - -//-------------------------------------------------------------------------------------------------- - -// Struct to optimize sorting -struct MemberItem -{ - OUString aName; - - // Defines where the member comes from - enum Mode { NAMEACCESS, PROPERTYSET, METHOD } eMode; - - // Index to respective sequence - // (Index to NameAccess sequence for eMode==NAMEACCESS etc.) - sal_Int32 nIndex; -}; - -// Implementation of getting name or info -// String sequence will be filled when pStringSeq != NULL -// Info sequence will be filled when pInfoSeq != NULL -void Invocation_Impl::getInfoSequenceImpl -( - Sequence< OUString >* pStringSeq, - Sequence< InvocationInfo >* pInfoSeq -) -{ - //Sequence< OUString > aStrSeq; - //if( !pStringSeq ) - //pStringSeq = &aStrSeq; - - - // Get all needed sequences - Sequence<OUString> aNameAccessNames; - Sequence<Property> aPropertySeq; - Sequence< Reference< XIdlMethod > > aMethodSeq; - - if( _xNameAccess.is() ) - { - aNameAccessNames = _xNameAccess->getElementNames(); - } - - if( _xIntrospectionAccess.is() ) - { - aPropertySeq = _xIntrospectionAccess->getProperties - ( PropertyConcept::ALL - PropertyConcept::DANGEROUS ); - - aMethodSeq = _xIntrospectionAccess->getMethods - ( MethodConcept::ALL - MethodConcept::DANGEROUS ); - } - - sal_Int32 nNameAccessCount = aNameAccessNames.getLength(); - sal_Int32 nPropertyCount = aPropertySeq.getLength(); - sal_Int32 nMethodCount = aMethodSeq.getLength(); - sal_Int32 nTotalCount = nNameAccessCount + nPropertyCount + nMethodCount; - - // Create and fill array of MemberItems - boost::scoped_array< MemberItem > pItems( new MemberItem[ nTotalCount ] ); - const OUString* pStrings = aNameAccessNames.getConstArray(); - const Property* pProps = aPropertySeq.getConstArray(); - const Reference< XIdlMethod >* pMethods = aMethodSeq.getConstArray(); - - // Fill array of MemberItems - sal_Int32 i, iTotal = 0; - - // Name Access - for( i = 0 ; i < nNameAccessCount ; i++, iTotal++ ) - { - MemberItem& rItem = pItems[ iTotal ]; - rItem.aName = pStrings[ i ]; - rItem.eMode = MemberItem::NAMEACCESS; - rItem.nIndex = i; - } - - // Property set - for( i = 0 ; i < nPropertyCount ; i++, iTotal++ ) - { - MemberItem& rItem = pItems[ iTotal ]; - rItem.aName = pProps[ i ].Name; - rItem.eMode = MemberItem::PROPERTYSET; - rItem.nIndex = i; - } - - // Methods - for( i = 0 ; i < nMethodCount ; i++, iTotal++ ) - { - MemberItem& rItem = pItems[ iTotal ]; - Reference< XIdlMethod > xMethod = pMethods[ i ]; - rItem.aName = xMethod->getName(); - rItem.eMode = MemberItem::METHOD; - rItem.nIndex = i; - } - - // Setting up result sequences - OUString* pRetStrings = NULL; - if( pStringSeq ) - { - pStringSeq->realloc( nTotalCount ); - pRetStrings = pStringSeq->getArray(); - } - - InvocationInfo* pRetInfos = NULL; - if( pInfoSeq ) - { - pInfoSeq->realloc( nTotalCount ); - pRetInfos = pInfoSeq->getArray(); - } - - // Fill result sequences in the correct order of members - for( iTotal = 0 ; iTotal < nTotalCount ; iTotal++ ) - { - MemberItem& rItem = pItems[ iTotal ]; - if( pRetStrings ) - { - pRetStrings[ iTotal ] = rItem.aName; - } - - if( pRetInfos ) - { - if( rItem.eMode == MemberItem::NAMEACCESS ) - { - fillInfoForNameAccess( pRetInfos[ iTotal ], rItem.aName ); - } - else if( rItem.eMode == MemberItem::PROPERTYSET ) - { - fillInfoForProperty( pRetInfos[ iTotal ], pProps[ rItem.nIndex ] ); - } - else if( rItem.eMode == MemberItem::METHOD ) - { - fillInfoForMethod( pRetInfos[ iTotal ], pMethods[ rItem.nIndex ] ); - } - } - } -} - -// XInvocation2 -Sequence< OUString > SAL_CALL Invocation_Impl::getMemberNames( ) - throw( RuntimeException ) -{ - if( _xDirect2.is() ) - { - return _xDirect2->getMemberNames(); - } - Sequence< OUString > aRetSeq; - getInfoSequenceImpl( &aRetSeq, NULL ); - return aRetSeq; -} - -Sequence< InvocationInfo > SAL_CALL Invocation_Impl::getInfo( ) - throw( RuntimeException ) -{ - if( _xDirect2.is() ) - { - return _xDirect2->getInfo(); - } - Sequence< InvocationInfo > aRetSeq; - getInfoSequenceImpl( NULL, &aRetSeq ); - return aRetSeq; -} - -InvocationInfo SAL_CALL Invocation_Impl::getInfoForName( const OUString& aName, sal_Bool bExact ) - throw( IllegalArgumentException, RuntimeException ) -{ - if( _xDirect2.is() ) - { - return _xDirect2->getInfoForName( aName, bExact ); - } - - sal_Bool bFound = sal_False; - OUString aExactName = aName; - InvocationInfo aRetInfo; - - if( bExact ) - aExactName = getExactName( aName ); - if( aExactName.getLength() > 0 ) - { - if( _xIntrospectionAccess->hasMethod( aExactName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ) ) - { - Reference<XIdlMethod> xMethod = _xIntrospectionAccess->getMethod - ( aExactName, MethodConcept::ALL ^ MethodConcept::DANGEROUS ); - fillInfoForMethod( aRetInfo, xMethod ); - bFound = sal_True; - } - else - { - if( _xIntrospectionAccess.is() && _xIntrospectionAccess->hasProperty - ( aExactName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ) ) - { - Property aProp = _xIntrospectionAccess->getProperty - ( aExactName, PropertyConcept::ALL ^ PropertyConcept::DANGEROUS ); - fillInfoForProperty( aRetInfo, aProp ); - bFound = sal_True; - } - // NameAccess - else if( _xNameAccess.is() && _xNameAccess->hasByName( aExactName ) ) - { - fillInfoForNameAccess( aRetInfo, aExactName ); - bFound = sal_True; - } - } - } - if( !bFound ) - { - throw IllegalArgumentException( - OUString( RTL_CONSTASCII_USTRINGPARAM("Unknown name, getExactName() failed!") ), - (XWeak *)(OWeakObject *)this, 0 ); - } - return aRetInfo; -} - -// Helper functions to fill InvocationInfo for XNameAccess -void Invocation_Impl::fillInfoForNameAccess -( - InvocationInfo& rInfo, - const OUString& aName -) -{ - rInfo.aName = aName; - rInfo.eMemberType = MemberType_PROPERTY; - rInfo.PropertyAttribute = 0; - if( !_xNameContainer.is() ) - { - rInfo.PropertyAttribute = PropertyAttribute::READONLY; - } - rInfo.aType = _xNameAccess->getElementType(); -} - -void Invocation_Impl::fillInfoForProperty -( - InvocationInfo& rInfo, - const Property& rProp -) -{ - rInfo.aName = rProp.Name; - rInfo.eMemberType = MemberType_PROPERTY; - rInfo.PropertyAttribute = rProp.Attributes; - rInfo.aType = rProp.Type; -} - -void Invocation_Impl::fillInfoForMethod -( - InvocationInfo& rInfo, - const Reference< XIdlMethod > xMethod -) -{ - rInfo.aName = xMethod->getName(); - rInfo.eMemberType = MemberType_METHOD; - Reference< XIdlClass > xReturnClass = xMethod->getReturnType(); - Type aReturnType( xReturnClass->getTypeClass(), xReturnClass->getName() ); - rInfo.aType = aReturnType; - Sequence<ParamInfo> aParamInfos = xMethod->getParameterInfos(); - sal_Int32 nParamCount = aParamInfos.getLength(); - if( nParamCount > 0 ) - { - const ParamInfo* pInfos = aParamInfos.getConstArray(); - - rInfo.aParamTypes.realloc( nParamCount ); - Type* pParamTypes = rInfo.aParamTypes.getArray(); - rInfo.aParamModes.realloc( nParamCount ); - ParamMode* pParamModes = rInfo.aParamModes.getArray(); - - for( sal_Int32 i = 0 ; i < nParamCount ; i++ ) - { - Reference< XIdlClass > xParamClass = pInfos[i].aType; - Type aParamType( xParamClass->getTypeClass(), xParamClass->getName() ); - pParamTypes[ i ] = aParamType; - pParamModes[ i ] = pInfos[i].aMode; - } - } -} - - -// XTypeProvider -Sequence< Type > SAL_CALL Invocation_Impl::getTypes(void) throw( RuntimeException ) -{ - static Sequence< Type > const * s_pTypes = 0; - if (! s_pTypes) - { - Sequence< Type > types( 4 +8 ); - Type * pTypes = types.getArray(); - sal_Int32 n = 0; - - pTypes[ n++ ] = ::getCppuType( (Reference< XTypeProvider > const *)0 ); - pTypes[ n++ ] = ::getCppuType( (Reference< XWeak > const *)0 ); - pTypes[ n++ ] = ::getCppuType( (Reference< XInvocation > const *)0 ); - pTypes[ n++ ] = ::getCppuType( (Reference< XMaterialHolder > const *)0 ); - - // Ivocation does not support XExactName, if direct object supports - // XInvocation, but not XExactName. - if ((_xDirect.is() && _xENDirect.is()) || - (!_xDirect.is() && (_xENIntrospection.is() || _xENNameAccess.is()))) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XExactName > const *)0 ); - } - if( _xNameContainer.is() ) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XNameContainer > const *)0 ); - } - if( _xNameAccess.is() ) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XNameAccess > const *)0 ); - } - if (_xIndexContainer.is()) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XIndexContainer > const *)0 ); - } - if (_xIndexAccess.is()) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XIndexAccess > const *)0 ); - } - if (_xEnumerationAccess.is()) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XEnumerationAccess > const *)0 ); - } - if (_xElementAccess.is()) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XElementAccess > const *)0 ); - } - // Invocation does not support XInvocation2, if direct object supports - // XInvocation, but not XInvocation2. - if ( ( _xDirect.is() && _xDirect2.is()) || - (!_xDirect.is() && _xIntrospectionAccess.is() ) ) - { - pTypes[ n++ ] = ::getCppuType( (Reference< XInvocation2 > const *)0 ); - } - - types.realloc( n ); - - // store types - MutexGuard guard( Mutex::getGlobalMutex() ); - if (! s_pTypes) - { - static Sequence< Type > s_types( types ); - s_pTypes = &s_types; - } - } - return *s_pTypes; -} - -Sequence< sal_Int8 > SAL_CALL Invocation_Impl::getImplementationId( ) throw( RuntimeException) -{ - static OImplementationId *pId = 0; - if( ! pId ) - { - MutexGuard guard( Mutex::getGlobalMutex() ); - if( ! pId ) - { - static OImplementationId id( sal_False ); - pId = &id; - } - } - return pId->getImplementationId(); -} - -//================================================================================================== -//================================================================================================== -//================================================================================================== -class InvocationService - : public WeakImplHelper2< XSingleServiceFactory, XServiceInfo > -{ -public: - InvocationService( const Reference<XComponentContext> & xCtx ); - virtual ~InvocationService(); - - // XServiceInfo - OUString SAL_CALL getImplementationName() throw( RuntimeException ); - sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw( RuntimeException ); - Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw( RuntimeException ); - - // XSingleServiceFactory - Reference<XInterface> SAL_CALL createInstance(void) throw( Exception, RuntimeException ); - Reference<XInterface> SAL_CALL createInstanceWithArguments( - const Sequence<Any>& rArguments ) throw( Exception, RuntimeException ); -private: - Reference<XComponentContext> mxCtx; - Reference<XMultiComponentFactory> mxSMgr; - Reference<XTypeConverter> xTypeConverter; - Reference<XIntrospection> xIntrospection; - Reference<XIdlReflection> xCoreReflection; -}; - -InvocationService::InvocationService( const Reference<XComponentContext> & xCtx ) - : mxCtx( xCtx ) - , mxSMgr( xCtx->getServiceManager() ) -{ - g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); - xTypeConverter = Reference<XTypeConverter>( - mxSMgr->createInstanceWithContext( - OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter")), - xCtx ), - UNO_QUERY ); - xIntrospection = Reference<XIntrospection>( - mxSMgr->createInstanceWithContext( - OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.beans.Introspection")), - xCtx), - UNO_QUERY); - mxCtx->getValueByName( - OUString( - RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection")) ) - >>= xCoreReflection; - OSL_ENSURE( xCoreReflection.is(), "### CoreReflection singleton not accessable!?" ); - if (! xCoreReflection.is()) - { - throw DeploymentException( - OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.reflection.theCoreReflection singleton not accessable") ), - Reference< XInterface >() ); - } -// xCoreReflection = Reference<XIdlReflection>( -// mxSMgr->createInstanceWithContext( -// OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.CoreReflection")), -// xCtx), -// UNO_QUERY); -} - -InvocationService::~InvocationService() -{ - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); -} - -// XServiceInfo -OUString InvocationService::getImplementationName() throw( RuntimeException ) -{ - return inv_getImplementationName(); -} - -// XServiceInfo -sal_Bool InvocationService::supportsService(const OUString& ServiceName) throw( RuntimeException ) -{ - Sequence< OUString > aSNL = getSupportedServiceNames(); - const OUString * pArray = aSNL.getConstArray(); - for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) - if( pArray[i] == ServiceName ) - return sal_True; - return sal_False; -} - -// XServiceInfo -Sequence< OUString > InvocationService::getSupportedServiceNames(void) throw( RuntimeException ) -{ - return inv_getSupportedServiceNames(); -} - -//-------------------------------------------------------------------------------------------------- -Reference<XInterface> InvocationService::createInstance(void) throw( Exception, RuntimeException ) -{ - //TODO:throw( Exception(OUString( RTL_CONSTASCII_USTRINGPARAM("no default construction of invocation adapter possible!")), *this) ); - return Reference<XInterface>(); // dummy -} - -//-------------------------------------------------------------------------------------------------- -Reference<XInterface> InvocationService::createInstanceWithArguments( - const Sequence<Any>& rArguments ) throw( Exception, RuntimeException ) -{ - if (rArguments.getLength() == 1) - { - return Reference< XInterface > - ( *new Invocation_Impl( *rArguments.getConstArray(), - xTypeConverter, xIntrospection, xCoreReflection ) ); - } - else - { - //TODO:throw( Exception(OUString( RTL_CONSTASCII_USTRINGPARAM("no default construction of invocation adapter possible!")), *this) ); - return Reference<XInterface>(); - } -} - - -//************************************************************************* -Reference<XInterface> SAL_CALL InvocationService_CreateInstance( const Reference<XComponentContext> & xCtx ) - throw( RuntimeException ) -{ - Reference<XInterface> xService = Reference< XInterface > ( *new InvocationService( xCtx ) ); - return xService; -} - -} - -using namespace stoc_inv; -static struct ImplementationEntry g_entries[] = -{ - { - InvocationService_CreateInstance, inv_getImplementationName, - inv_getSupportedServiceNames, createSingleComponentFactory, - &g_moduleCount.modCnt , 0 - }, - { 0, 0, 0, 0, 0, 0 } -}; - -extern "C" -{ -sal_Bool SAL_CALL component_canUnload( TimeValue *pTime ) -{ - return g_moduleCount.canUnload( &g_moduleCount , pTime ); -} - -//================================================================================================== -SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey ) -{ - return component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey , g_entries ); -} -} - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |