summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Power <noel.power@suse.com>2013-05-03 14:21:10 +0100
committerNoel Power <noel.power@suse.com>2013-05-07 09:56:27 +0100
commit17799461a4c4486becf98de8432ef97aab1d069d (patch)
treec9dfa28e4ec6473a888f1b2e67d353fa79742035
parent0b97f8578b2f8322c7c50555d6c5a118b9f278e3 (diff)
fix memory leak with orphaned controls created on the fly
-rw-r--r--forms/source/misc/InterfaceContainer.cxx3
-rw-r--r--oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl2
-rw-r--r--scripting/source/vbaevents/eventhelper.cxx38
3 files changed, 36 insertions, 7 deletions
diff --git a/forms/source/misc/InterfaceContainer.cxx b/forms/source/misc/InterfaceContainer.cxx
index 43253b8d1e38..3a1361db17cc 100644
--- a/forms/source/misc/InterfaceContainer.cxx
+++ b/forms/source/misc/InterfaceContainer.cxx
@@ -149,7 +149,8 @@ void OInterfaceContainer::impl_addVbEvents_nolck_nothrow( const sal_Int32 i_nIn
xProps->getPropertyValue( OUString("DefaultControl") ) >>= sServiceName;
Reference< ooo::vba::XVBAToOOEventDescGen > xDescSupplier( m_xServiceFactory->createInstance( OUString("ooo.vba.VBAToOOEventDesc") ), UNO_QUERY_THROW );
- Sequence< ScriptEventDescriptor > vbaEvents = xDescSupplier->getEventDescriptions( m_xServiceFactory->createInstance( sServiceName ), sCodeName );
+ Sequence< ScriptEventDescriptor > vbaEvents = xDescSupplier->getEventDescriptions( sServiceName , sCodeName );
+
// register the vba script events
m_xEventAttacher->registerScriptEvents( i_nIndex, vbaEvents );
}
diff --git a/oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl b/oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl
index 5dd6dbbeb5f1..dd925533cf80 100644
--- a/oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl
+++ b/oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl
@@ -24,7 +24,7 @@
module ooo { module vba {
interface XVBAToOOEventDescGen : com::sun::star::uno::XInterface
{
- sequence< com::sun::star::script::ScriptEventDescriptor > getEventDescriptions( [in] com::sun::star::uno::XInterface xControl, [in] string sCodeName );
+ sequence< com::sun::star::script::ScriptEventDescriptor > getEventDescriptions( [in] string controlServiceName, [in] string sCodeName );
com::sun::star::script::XScriptEventsSupplier getEventSupplier( [in] com::sun::star::uno::XInterface xControl, [in] string sCodeName );
};
diff --git a/scripting/source/vbaevents/eventhelper.cxx b/scripting/source/vbaevents/eventhelper.cxx
index 207973c9202d..5061fe8b4ea5 100644
--- a/scripting/source/vbaevents/eventhelper.cxx
+++ b/scripting/source/vbaevents/eventhelper.cxx
@@ -314,11 +314,14 @@ class ScriptEventHelper
{
public:
ScriptEventHelper( const Reference< XInterface >& xControl );
+ ScriptEventHelper( const OUString& sCntrlServiceName );
+ ~ScriptEventHelper();
Sequence< ScriptEventDescriptor > createEvents( const OUString& sCodeName );
Sequence< OUString > getEventListeners();
private:
Reference< XComponentContext > m_xCtx;
Reference< XInterface > m_xControl;
+ bool m_bDispose;
};
bool
@@ -363,11 +366,36 @@ eventMethodToDescriptor( const OUString& rEventMethod, ScriptEventDescriptor& ev
}
-ScriptEventHelper::ScriptEventHelper( const Reference< XInterface >& xControl ):
+ScriptEventHelper::ScriptEventHelper( const Reference< XInterface >& xControl ) :
m_xCtx( comphelper::getProcessComponentContext() ),
- m_xControl( xControl )
+ m_xControl( xControl ),
+ m_bDispose( false )
{}
+ScriptEventHelper::ScriptEventHelper( const OUString& sCntrlServiceName ) :
+ m_xCtx( comphelper::getProcessComponentContext() ),
+ m_bDispose( true )
+{
+ m_xControl.set( m_xCtx->getServiceManager()->createInstanceWithContext( sCntrlServiceName, m_xCtx ), uno::UNO_QUERY );
+}
+
+ScriptEventHelper::~ScriptEventHelper()
+{
+ // dispose control ( and remove any associated event registrations )
+ if ( m_bDispose )
+ {
+ try
+ {
+ uno::Reference< lang::XComponent > xComp( m_xControl, uno::UNO_QUERY_THROW );
+ xComp->dispose();
+ }
+ // destructor can't throw
+ catch( uno::Exception& )
+ {
+ }
+ }
+}
+
Sequence< OUString >
ScriptEventHelper::getEventListeners()
{
@@ -1002,7 +1030,7 @@ public:
VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext );
// XVBAToOOEventDescGen
- virtual Sequence< ScriptEventDescriptor > SAL_CALL getEventDescriptions( const Reference< XInterface >& control, const OUString& sCodeName ) throw (RuntimeException);
+ virtual Sequence< ScriptEventDescriptor > SAL_CALL getEventDescriptions( const OUString& sCtrlServiceName, const OUString& sCodeName ) throw (RuntimeException);
virtual Reference< XScriptEventsSupplier > SAL_CALL getEventSupplier( const Reference< XInterface >& xControl, const OUString& sCodeName ) throw (::com::sun::star::uno::RuntimeException);
private:
Reference< XComponentContext > m_xContext;
@@ -1012,9 +1040,9 @@ private:
VBAToOOEventDescGen::VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext ):m_xContext( rxContext ) {}
Sequence< ScriptEventDescriptor > SAL_CALL
-VBAToOOEventDescGen::getEventDescriptions( const Reference< XInterface >& xControl, const OUString& sCodeName ) throw (RuntimeException)
+VBAToOOEventDescGen::getEventDescriptions( const OUString& sCntrlServiceName, const OUString& sCodeName ) throw (RuntimeException)
{
- ScriptEventHelper evntHelper( xControl );
+ ScriptEventHelper evntHelper( sCntrlServiceName );
return evntHelper.createEvents( sCodeName );
}