summaryrefslogtreecommitdiff
path: root/scripting
diff options
context:
space:
mode:
authorNoel Power <noel.power@suse.com>2013-04-25 11:10:24 +0100
committerNoel Power <noel.power@suse.com>2013-04-26 15:30:36 +0100
commit96a6bddcbe52db803ce6faed7e2bc3030bee5c45 (patch)
treed07b6d238807f510877aa72f5df1cf6c01bde71f /scripting
parent4aadebb03603a82afb1659c6b16f89ed2375d139 (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.cxx38
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 );
}