diff options
author | Noel Power <noel.power@suse.com> | 2013-04-25 11:10:24 +0100 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2013-04-26 15:30:36 +0100 |
commit | 96a6bddcbe52db803ce6faed7e2bc3030bee5c45 (patch) | |
tree | d07b6d238807f510877aa72f5df1cf6c01bde71f /scripting | |
parent | 4aadebb03603a82afb1659c6b16f89ed2375d139 (diff) |
fix memory leak with orphaned controls created on the fly
Change-Id: Iabdd7d906bd7f72592c8e4b2d2b1774807e9dbdb
Diffstat (limited to 'scripting')
-rw-r--r-- | scripting/source/vbaevents/eventhelper.cxx | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/scripting/source/vbaevents/eventhelper.cxx b/scripting/source/vbaevents/eventhelper.cxx index e7f90e29c62d..a28a13995572 100644 --- a/scripting/source/vbaevents/eventhelper.cxx +++ b/scripting/source/vbaevents/eventhelper.cxx @@ -316,11 +316,14 @@ class ScriptEventHelper { public: ScriptEventHelper( const Reference< XInterface >& xControl ); + ScriptEventHelper( const rtl::OUString& sCntrlServiceName ); + ~ScriptEventHelper(); Sequence< ScriptEventDescriptor > createEvents( const rtl::OUString& sCodeName ); Sequence< rtl::OUString > getEventListeners(); private: Reference< XComponentContext > m_xCtx; Reference< XInterface > m_xControl; + bool m_bDispose; }; bool @@ -365,11 +368,36 @@ eventMethodToDescriptor( const ::rtl::OUString& rEventMethod, ScriptEventDescrip } -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 rtl::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< rtl::OUString > ScriptEventHelper::getEventListeners() { @@ -1004,7 +1032,7 @@ public: VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext ); // XVBAToOOEventDescGen - virtual Sequence< ScriptEventDescriptor > SAL_CALL getEventDescriptions( const Reference< XInterface >& control, const rtl::OUString& sCodeName ) throw (RuntimeException); + virtual Sequence< ScriptEventDescriptor > SAL_CALL getEventDescriptions( const rtl::OUString& sCtrlServiceName, const rtl::OUString& sCodeName ) throw (RuntimeException); virtual Reference< XScriptEventsSupplier > SAL_CALL getEventSupplier( const Reference< XInterface >& xControl, const rtl::OUString& sCodeName ) throw (::com::sun::star::uno::RuntimeException); private: Reference< XComponentContext > m_xContext; @@ -1014,9 +1042,9 @@ private: VBAToOOEventDescGen::VBAToOOEventDescGen( const Reference< XComponentContext >& rxContext ):m_xContext( rxContext ) {} Sequence< ScriptEventDescriptor > SAL_CALL -VBAToOOEventDescGen::getEventDescriptions( const Reference< XInterface >& xControl, const rtl::OUString& sCodeName ) throw (RuntimeException) +VBAToOOEventDescGen::getEventDescriptions( const rtl::OUString& sCntrlServiceName, const rtl::OUString& sCodeName ) throw (RuntimeException) { - ScriptEventHelper evntHelper( xControl ); + ScriptEventHelper evntHelper( sCntrlServiceName ); return evntHelper.createEvents( sCodeName ); } |