diff options
author | Gergo Mocsi <gmocsi91@gmail.com> | 2013-06-17 13:07:05 +0200 |
---|---|---|
committer | Gergo Mocsi <gmocsi91@gmail.com> | 2013-09-02 18:16:42 +0200 |
commit | f97d794654cbf80afa0e4a60cda8147e94c11908 (patch) | |
tree | 9b1b7f92becac1b7953067a1e7a7652b1e8827c8 | |
parent | 49656398d43fa03f8adb70b9be417f2fd65dd9ea (diff) |
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
-rw-r--r-- | basic/source/comp/dim.cxx | 40 | ||||
-rw-r--r-- | basic/source/inc/parser.hxx | 1 |
2 files changed, 39 insertions, 2 deletions
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 <basic/sbx.hxx> #include "sbcomp.hxx" #include "sbunoobj.hxx" - +#include <svtools/miscopt.hxx> +#include "com/sun/star/reflection/XIdlReflection.hpp" +#include <comphelper/namedvaluecollection.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/configurationhelper.hxx> +#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; |