Kaydet (Commit) da6de7da authored tarafından Noel Grandin's avatar Noel Grandin

use rtl::Reference in ScAddInListener

instead of manual ref counting

Change-Id: I04bdb5b34921da9ab08a55a95b99ff1635a9cda6
Reviewed-on: https://gerrit.libreoffice.org/43420Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst c85a2616
......@@ -26,6 +26,7 @@
#include <com/sun/star/sheet/XVolatileResult.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <cppuhelper/implbase.hxx>
#include <rtl/ref.hxx>
#include <list>
class ScDocument;
......@@ -40,7 +41,7 @@ private:
css::uno::Any aResult;
std::unique_ptr<ScAddInDocs> pDocs; // documents where this is used
static ::std::list<ScAddInListener*> aAllListeners;
static ::std::list<rtl::Reference<ScAddInListener>> aAllListeners;
// always allocated via CreateListener
ScAddInListener( css::uno::Reference<css::sheet::XVolatileResult> const & xVR,
......
......@@ -30,20 +30,19 @@ using namespace com::sun::star;
SC_SIMPLE_SERVICE_INFO( ScAddInListener, "ScAddInListener", "stardiv.one.sheet.AddInListener" )
::std::list<ScAddInListener*> ScAddInListener::aAllListeners;
::std::list<rtl::Reference<ScAddInListener>> ScAddInListener::aAllListeners;
ScAddInListener* ScAddInListener::CreateListener(
const uno::Reference<sheet::XVolatileResult>& xVR, ScDocument* pDoc )
{
ScAddInListener* pNew = new ScAddInListener( xVR, pDoc );
rtl::Reference<ScAddInListener> xNew = new ScAddInListener( xVR, pDoc );
pNew->acquire(); // for aAllListeners
aAllListeners.push_back( pNew );
aAllListeners.push_back( xNew );
if ( xVR.is() )
xVR->addResultListener( pNew ); // after at least 1 ref exists!
xVR->addResultListener( xNew.get() ); // after at least 1 ref exists!
return pNew;
return xNew.get();
}
ScAddInListener::ScAddInListener( uno::Reference<sheet::XVolatileResult> const & xVR, ScDocument* pDoc ) :
......@@ -62,11 +61,11 @@ ScAddInListener* ScAddInListener::Get( const uno::Reference<sheet::XVolatileResu
ScAddInListener* pLst = nullptr;
sheet::XVolatileResult* pComp = xVR.get();
for(::std::list<ScAddInListener*>::iterator iter = aAllListeners.begin(); iter != aAllListeners.end(); ++iter)
for(auto iter = aAllListeners.begin(); iter != aAllListeners.end(); ++iter)
{
if ( pComp == (*iter)->xVolRes.get() )
{
pLst = *iter;
pLst = iter->get();
break;
}
}
......@@ -76,7 +75,7 @@ ScAddInListener* ScAddInListener::Get( const uno::Reference<sheet::XVolatileResu
//TODO: move to some container object?
void ScAddInListener::RemoveDocument( ScDocument* pDocumentP )
{
::std::list<ScAddInListener*>::iterator iter = aAllListeners.begin();
auto iter = aAllListeners.begin();
while(iter != aAllListeners.end())
{
ScAddInDocs* p = (*iter)->pDocs.get();
......@@ -87,12 +86,7 @@ void ScAddInListener::RemoveDocument( ScDocument* pDocumentP )
if ( p->empty() )
{
if ( (*iter)->xVolRes.is() )
(*iter)->xVolRes->removeResultListener( *iter );
(*iter)->release(); // Ref for aAllListeners - pLst may be deleted here
// this AddIn is no longer used
// don't delete, just remove the ref for the list
(*iter)->xVolRes->removeResultListener( iter->get() );
iter = aAllListeners.erase( iter );
continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment