From ef3f28d0ce641e9d51d91412b176a1ecbdc69773 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Tue, 26 Nov 2013 19:37:50 +0100 Subject: winaccessibility: use rtl::Reference for listener lifecycle The manual acquire() call was apparently not coupled with a release()? Change-Id: I069c969619e9afce2a4b836642cc1675025b11d0 --- winaccessibility/inc/AccObject.hxx | 6 +- winaccessibility/inc/AccObjectWinManager.hxx | 5 +- winaccessibility/source/service/AccObject.cxx | 12 ++-- .../source/service/AccObjectWinManager.cxx | 68 +++++++++------------- 4 files changed, 41 insertions(+), 50 deletions(-) (limited to 'winaccessibility') diff --git a/winaccessibility/inc/AccObject.hxx b/winaccessibility/inc/AccObject.hxx index 4f19c0fa8fd4..934b95db1297 100644 --- a/winaccessibility/inc/AccObject.hxx +++ b/winaccessibility/inc/AccObject.hxx @@ -25,6 +25,8 @@ #include #include +#include + #include #include #include @@ -51,7 +53,7 @@ private: IMAccessible* m_pIMAcc; AccObject* m_pParentObj; IAccChildList m_childrenList; - AccEventListener* m_accListener; + ::rtl::Reference m_pListener; IAccSelectionList m_selectionList; ::com::sun::star::uno::Reference < ::com::sun::star::accessibility::XAccessible > m_xAccRef; @@ -86,7 +88,7 @@ public: void SetParentHWND(HWND hWnd);//need to set top window handle when send event to AT HWND GetParentHWND(); - void SetListener( AccEventListener* Listener ); + void SetListener(::rtl::Reference const& pListener); AccEventListener* getListener(); void SetParentObj(AccObject* pParentAccObj); diff --git a/winaccessibility/inc/AccObjectWinManager.hxx b/winaccessibility/inc/AccObjectWinManager.hxx index ab05a212a8e0..afe4fe0adbc8 100644 --- a/winaccessibility/inc/AccObjectWinManager.hxx +++ b/winaccessibility/inc/AccObjectWinManager.hxx @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include "ResIDGenerator.hxx" #include "UAccCOM.h" @@ -90,7 +90,8 @@ private: void DeleteFromHwndXAcc(com::sun::star::accessibility::XAccessible* pXAcc ); int UpdateAccSelection(com::sun::star::accessibility::XAccessible* pXAcc); - AccEventListener* createAccEventListener(com::sun::star::accessibility::XAccessible* pXAcc, AccObjectManagerAgent* Agent); + ::rtl::Reference CreateAccEventListener( + com::sun::star::accessibility::XAccessible* pXAcc); public: virtual ~AccObjectWinManager(); sal_Bool InsertAccObj( com::sun::star::accessibility::XAccessible* pXAcc,com::sun::star::accessibility::XAccessible* pParentXAcc,HWND pWnd); diff --git a/winaccessibility/source/service/AccObject.cxx b/winaccessibility/source/service/AccObject.cxx index 026dcd9f1c4c..ac51a0527348 100644 --- a/winaccessibility/source/service/AccObject.cxx +++ b/winaccessibility/source/service/AccObject.cxx @@ -144,12 +144,12 @@ const short ROLE_TABLE[][2] = * @return. */ AccObject::AccObject(XAccessible* pAcc, AccObjectManagerAgent* pAgent, - AccEventListener* listener) : + AccEventListener* pListener) : m_pIMAcc (NULL), m_resID (NULL), m_pParantID (NULL), m_pParentObj(NULL), - m_accListener (listener), + m_pListener (pListener), m_bShouldDestroy(sal_False), m_xAccRef( pAcc ) { @@ -1161,13 +1161,15 @@ void AccObject::SetParentHWND(HWND hWnd) { m_pParantID = hWnd; } -void AccObject::SetListener( AccEventListener* Listener ) + +void AccObject::SetListener(rtl::Reference const& pListener) { - m_accListener = Listener; + m_pListener = pListener; } + AccEventListener* AccObject::getListener() { - return m_accListener; + return m_pListener.get(); } long AccObject::GetResID() diff --git a/winaccessibility/source/service/AccObjectWinManager.cxx b/winaccessibility/source/service/AccObjectWinManager.cxx index b17bc818914c..a058683c355d 100644 --- a/winaccessibility/source/service/AccObjectWinManager.cxx +++ b/winaccessibility/source/service/AccObjectWinManager.cxx @@ -776,24 +776,16 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar } //end of file name - AccEventListener* listener = createAccEventListener(pXAcc, pAgent); - if(listener==NULL) + ::rtl::Reference const pListener = + CreateAccEventListener(pXAcc); + if (!pListener.is()) return sal_False; Reference xComponent(pRContext,UNO_QUERY); Reference broadcaster(xComponent,UNO_QUERY); if (broadcaster.is()) { - Reference pp ( - static_cast< XAccessibleEventListener* >(listener),UNO_QUERY ); - if(pp.is()) - { - broadcaster->addAccessibleEventListener(pp); - } - else - { - delete listener; - return sal_False; - } + Reference const xListener(pListener.get()); + broadcaster->addAccessibleEventListener(xListener); } else return sal_False; @@ -805,9 +797,7 @@ sal_Bool AccObjectWinManager::InsertAccObj( XAccessible* pXAcc,XAccessible* pPar AccObject* pCurObj = GetAccObjByXAcc(pXAcc); if( pCurObj ) { - pCurObj->SetListener( listener ); - if(listener != NULL) - listener->acquire(); + pCurObj->SetListener(pListener); } AccObject* pParentObj = GetAccObjByXAcc(pParentXAcc); @@ -830,32 +820,29 @@ void AccObjectWinManager::SaveTopWindowHandle(HWND hWnd, com::sun::star::accessi } -/** - * create the corresponding listener. - * @param pXAcc XAccessible interface. - * @param Agent The agent kept in all listeners,it's the sole interface by which - * listener communicate with windows manager. - * @return - */ -AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc, AccObjectManagerAgent* /* Agent */ ) +/** Create the corresponding listener. + * @param pXAcc XAccessible interface. + */ +::rtl::Reference +AccObjectWinManager::CreateAccEventListener(XAccessible* pXAcc) { - AccEventListener* listener = NULL; + ::rtl::Reference pRet; Reference xContext(pXAcc->getAccessibleContext(),UNO_QUERY); if(xContext.is()) { switch( xContext->getAccessibleRole() ) { case /*AccessibleRole::*/DIALOG: - listener = new AccDialogEventListener(pXAcc,pAgent); + pRet = new AccDialogEventListener(pXAcc,pAgent); break; case /*AccessibleRole::*/FRAME: - listener = new AccFrameEventListener(pXAcc,pAgent); + pRet = new AccFrameEventListener(pXAcc,pAgent); break; case /*AccessibleRole::*/WINDOW: - listener = new AccWindowEventListener(pXAcc,pAgent); + pRet = new AccWindowEventListener(pXAcc,pAgent); break; case /*AccessibleRole::*/ROOT_PANE: - listener = new AccFrameEventListener(pXAcc,pAgent); + pRet = new AccFrameEventListener(pXAcc,pAgent); break; //Container case /*AccessibleRole::*/CANVAS: @@ -879,11 +866,11 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc case /*AccessibleRole::*/TABLE_CELL: case /*AccessibleRole::*/TOOL_BAR: case /*AccessibleRole::*/VIEW_PORT: - listener = new AccContainerEventListener(pXAcc,pAgent); + pRet = new AccContainerEventListener(pXAcc,pAgent); break; case /*AccessibleRole::*/PARAGRAPH: case /*AccessibleRole::*/HEADING: - listener = new AccParagraphEventListener(pXAcc,pAgent); + pRet = new AccParagraphEventListener(pXAcc,pAgent); break; //Component case /*AccessibleRole::*/CHECK_BOX: @@ -901,15 +888,15 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc case /*AccessibleRole::*/TOOL_TIP: case /*AccessibleRole::*/SPIN_BOX: case DATE_EDITOR: - listener = new AccComponentEventListener(pXAcc,pAgent); + pRet = new AccComponentEventListener(pXAcc,pAgent); break; //text component case /*AccessibleRole::*/TEXT: - listener = new AccTextComponentEventListener(pXAcc,pAgent); + pRet = new AccTextComponentEventListener(pXAcc,pAgent); break; //menu case /*AccessibleRole::*/MENU: - listener = new AccMenuEventListener(pXAcc,pAgent); + pRet = new AccMenuEventListener(pXAcc,pAgent); break; //object container case /*AccessibleRole::*/SHAPE: @@ -917,27 +904,26 @@ AccEventListener* AccObjectWinManager::createAccEventListener(XAccessible* pXAcc case /*AccessibleRole::*/EMBEDDED_OBJECT: case /*AccessibleRole::*/GRAPHIC: case /*AccessibleRole::*/TEXT_FRAME: - listener = new AccObjectContainerEventListener(pXAcc,pAgent); + pRet = new AccObjectContainerEventListener(pXAcc,pAgent); break; //descendmanager case /*AccessibleRole::*/LIST: - listener = new AccListEventListener(pXAcc,pAgent); + pRet = new AccListEventListener(pXAcc,pAgent); break; case /*AccessibleRole::*/TREE: - listener = new AccTreeEventListener(pXAcc,pAgent); + pRet = new AccTreeEventListener(pXAcc,pAgent); break; //special case /*AccessibleRole::*/COLUMN_HEADER: case /*AccessibleRole::*/TABLE: - listener = new AccTableEventListener(pXAcc,pAgent); + pRet = new AccTableEventListener(pXAcc,pAgent); break; default: - listener = new AccContainerEventListener(pXAcc,pAgent); + pRet = new AccContainerEventListener(pXAcc,pAgent); break; } } - - return listener; + return pRet; } /** -- cgit v1.2.3