diff options
author | Noel Power <noel.power@suse.com> | 2013-07-24 17:23:54 +0100 |
---|---|---|
committer | Gergo Mocsi <gmocsi91@gmail.com> | 2013-09-02 18:16:48 +0200 |
commit | e70a436fe343c6689c0122b1bd31e04cb0d5f04b (patch) | |
tree | 31efaba57a27eb8618061be881d39fd19f6951f5 /basic | |
parent | GSOC work, cache implementation fix, code fixes (diff) | |
download | core-e70a436fe343c6689c0122b1bd31e04cb0d5f04b.tar.gz core-e70a436fe343c6689c0122b1bd31e04cb0d5f04b.zip |
fix runtime error when using extended types
note: using VBA objects with the code completion is not possible at
the moment. Unfortunately there is some hard coded hacks for flattening
the namespace used by checkUnoObject.
Change-Id: Ic3a3149f41a6959943e71fa7ac22ff4dab7f30a1
Diffstat (limited to 'basic')
-rw-r--r-- | basic/source/classes/sbunoobj.cxx | 27 | ||||
-rw-r--r-- | basic/source/runtime/runtime.cxx | 3 |
2 files changed, 20 insertions, 10 deletions
diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx index 9bc69079656c..c0b9c33936ee 100644 --- a/basic/source/classes/sbunoobj.cxx +++ b/basic/source/classes/sbunoobj.cxx @@ -67,6 +67,7 @@ #include <com/sun/star/bridge/oleautomation/Currency.hpp> #include <com/sun/star/bridge/oleautomation/XAutomationObject.hpp> #include <com/sun/star/script/XAutomationInvocation.hpp> +#include "basic/codecompletecache.hxx" using com::sun::star::uno::Reference; using namespace com::sun::star::uno; @@ -1731,16 +1732,24 @@ bool checkUnoObjectType( SbUnoObject* pUnoObj, const OUString& rClass ) which matches the interface names 'ooo.vba.excel.XWorkbooks' or 'ooo.vba.msforms.XLabel'. */ - OUString aClassName( "." ); - sal_Int32 nClassNameDot = rClass.lastIndexOf( '.' ); - if( nClassNameDot >= 0 ) + OUString aClassName; + if ( SbiRuntime::isVBAEnabled() ) { - aClassName += rClass.copy( 0, nClassNameDot + 1 ) + "X" + rClass.copy( nClassNameDot + 1 ); - } - else - { - aClassName += "X" + rClass; + aClassName = "."; + sal_Int32 nClassNameDot = rClass.lastIndexOf( '.' ); + if( nClassNameDot >= 0 ) + { + aClassName += rClass.copy( 0, nClassNameDot + 1 ) + OUString( sal_Unicode( 'X' ) ) + rClass.copy( nClassNameDot + 1 ); + } + else + { + aClassName += OUString( sal_Unicode( 'X' ) ) + rClass; + } } + else // assume extended type declaration support for basic ( can't get here + // otherwise. + aClassName = rClass; + Sequence< Type > aTypeSeq = xTypeProvider->getTypes(); const Type* pTypeArray = aTypeSeq.getConstArray(); sal_uInt32 nIfaceCount = aTypeSeq.getLength(); @@ -1779,7 +1788,7 @@ bool checkUnoObjectType( SbUnoObject* pUnoObj, const OUString& rClass ) // match interface name with passed class name OSL_TRACE("Checking if object implements %s", OUStringToOString( aClassName, RTL_TEXTENCODING_UTF8 ).getStr() ); - if ( (aClassName.getLength() < aInterfaceName.getLength()) && + if ( (aClassName.getLength() <= aInterfaceName.getLength()) && aInterfaceName.matchIgnoreAsciiCase( aClassName, aInterfaceName.getLength() - aClassName.getLength() ) ) { result = true; diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx index ed731f1c29f0..0cf478a329d3 100644 --- a/basic/source/runtime/runtime.cxx +++ b/basic/source/runtime/runtime.cxx @@ -64,6 +64,7 @@ #include "sb.hrc" #include "sbintern.hxx" #include "sbunoobj.hxx" +#include "basic/codecompletecache.hxx" using com::sun::star::uno::Reference; @@ -3264,7 +3265,7 @@ bool SbiRuntime::checkClass_Impl( const SbxVariableRef& refVal, { if( !implIsClass( pObj, aClass ) ) { - if ( bVBAEnabled && pObj->IsA( TYPE(SbUnoObject) ) ) + if ( ( bVBAEnabled || CodeCompleteOptions::IsExtendedTypeDeclaration() ) && pObj->IsA( TYPE(SbUnoObject) ) ) { SbUnoObject* pUnoObj = PTR_CAST(SbUnoObject,pObj); bOk = checkUnoObjectType( pUnoObj, aClass ); |