diff options
author | Noel Power <noel.power@suse.com> | 2013-05-03 14:21:10 +0100 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2013-05-09 14:11:20 +0100 |
commit | 2f3359dbe86ad5b64b1c8e5c41b2fec3be9242a5 (patch) | |
tree | fc7cba5b4ea012217eb6fff2e98230f9f160b017 | |
parent | 7e735236e93754078dffa0c5c85316be87a5ce9f (diff) |
fix memory leak with orphaned controls created on the fly
-rw-r--r-- | forms/source/misc/InterfaceContainer.cxx | 3 | ||||
-rw-r--r-- | oovbaapi/ooo/vba/XVBAToOOEventDescGen.idl | 2 | ||||
-rw-r--r-- | scripting/source/vbaevents/eventhelper.cxx | 38 |
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 ); } |