From f97d794654cbf80afa0e4a60cda8147e94c11908 Mon Sep 17 00:00:00 2001 From: Gergo Mocsi Date: Mon, 17 Jun 2013 13:07:05 +0200 Subject: GSOC work week 0-1, allowing BASIC to recognize UNO interfaces Introduced a new function calles IsUnoInterface in SbiParser to determine, if a variable is a type of an UNO interface. It uses reflection.CoreReflection to do that, on success it returs true otherwise false. Change-Id: I18895127bcbd92dc7a25feb5d82a7d1343bde851 --- basic/source/comp/dim.cxx | 40 ++++++++++++++++++++++++++++++++++++++-- basic/source/inc/parser.hxx | 1 + 2 files changed, 39 insertions(+), 2 deletions(-) (limited to 'basic') diff --git a/basic/source/comp/dim.cxx b/basic/source/comp/dim.cxx index 81f6effee2bf..609436944b63 100644 --- a/basic/source/comp/dim.cxx +++ b/basic/source/comp/dim.cxx @@ -20,7 +20,17 @@ #include #include "sbcomp.hxx" #include "sbunoobj.hxx" - +#include +#include "com/sun/star/reflection/XIdlReflection.hpp" +#include +#include +#include +#include "com/sun/star/reflection/XInterfaceMemberTypeDescription.hpp" +#include "com/sun/star/reflection/XIdlMethod.hpp" +#include "com/sun/star/uno/Exception.hpp" + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; SbxObject* cloneTypeObjectImpl( const SbxObject& rTypeObj ); @@ -197,6 +207,7 @@ void SbiParser::DefVar( SbiOpcode eOp, bool bStatic ) bool bSwitchPool = false; bool bPersistantGlobal = false; SbiToken eFirstTok = eCurTok; + SvtMiscOptions aMiscOptions; if( pProc && ( eCurTok == GLOBAL || eCurTok == PUBLIC || eCurTok == PRIVATE ) ) Error( SbERR_NOT_IN_SUBR, eCurTok ); if( eCurTok == PUBLIC || eCurTok == GLOBAL ) @@ -391,7 +402,7 @@ void SbiParser::DefVar( SbiOpcode eOp, bool bStatic ) if( !bCompatible && !pDef->IsNew() ) { OUString aTypeName( aGblStrings.Find( pDef->GetTypeId() ) ); - if( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) == NULL ) + if( rTypeArray->Find( aTypeName, SbxCLASS_OBJECT ) == NULL && (aMiscOptions.IsExperimentalMode() && !IsUnoInterface(aTypeName))) { Error( SbERR_UNDEF_TYPE, aTypeName ); } @@ -1311,4 +1322,29 @@ void SbiParser::DefStatic( bool bPrivate ) } } +bool SbiParser::IsUnoInterface(const OUString& sTypeName) +{ + try + { + Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW ); + Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW ); + //DBG_ASSERT(xRefl.Is(), "No reflection class!"); ??? + if( !xRefl.is() ) + { + return false; + } + Reference< reflection::XIdlClass > xClass = xRefl->forName(sTypeName); + if( xClass != NULL ) + { + return true; + } + return false; + } + catch(const Exception& ex) + { + OSL_FAIL("Could not create reflection.CoreReflection."); + } + return false; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basic/source/inc/parser.hxx b/basic/source/inc/parser.hxx index d6c14a6b27ee..0ab6bcbb533b 100644 --- a/basic/source/inc/parser.hxx +++ b/basic/source/inc/parser.hxx @@ -57,6 +57,7 @@ class SbiParser : public SbiTokenizer void DefEnum( bool bPrivate ); // Parse enum declaration void DefDeclare( bool bPrivate ); void EnableCompatibility(); + bool IsUnoInterface(const OUString& sTypeName); public: SbxArrayRef rTypeArray; SbxArrayRef rEnumArray; -- cgit