summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Power <noel.power@suse.com>2013-07-24 17:23:54 +0100
committerNoel Power <noel.power@suse.com>2013-07-24 17:27:40 +0100
commit5016203ca41c83f9415388b868a531d30c20cb62 (patch)
treeb52003068879368be037cdf5a0068c7a700547db
parentfd35319cbf96e215cf52db70d947ff0b5cf96948 (diff)
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
-rw-r--r--basic/source/classes/sbunoobj.cxx27
-rw-r--r--basic/source/runtime/runtime.cxx3
2 files changed, 20 insertions, 10 deletions
diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx
index 001df2aa0b58..eaf1c8804f1e 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_Unicode( '.' ) );
- sal_Int32 nClassNameDot = rClass.lastIndexOf( '.' );
- if( nClassNameDot >= 0 )
+ OUString aClassName;
+ if ( SbiRuntime::isVBAEnabled() )
{
- aClassName += rClass.copy( 0, nClassNameDot + 1 ) + OUString( sal_Unicode( 'X' ) ) + rClass.copy( nClassNameDot + 1 );
- }
- else
- {
- aClassName += OUString( sal_Unicode( '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 4c2ffa97e661..18ea80a00211 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 );