Make ~Window more robust

...in cases where the Window(WindowType) ctor did not call Window::ImplInit, so
many members are null; if then a derived class's ctor throws an exception,
~Window must be careful not to dereference those null members.

Change-Id: I12c4b1b5d7f3633387b85acf9da6d57c42e793b4
This commit is contained in:
Stephan Bergmann
2012-11-26 12:48:26 +01:00
parent a1ba48f312
commit f902bcda6e
2 changed files with 50 additions and 39 deletions

View File

@@ -268,6 +268,8 @@ void UnoWrapper::WindowDestroyed( Window* pWindow )
// ::com::sun::star::chaos::System-Windows suchen...
Window* pOverlap = pWindow->GetWindow( WINDOW_OVERLAP );
if ( pOverlap )
{
pOverlap = pOverlap->GetWindow( WINDOW_FIRSTOVERLAP );
while ( pOverlap )
{
@@ -282,6 +284,7 @@ void UnoWrapper::WindowDestroyed( Window* pWindow )
pOverlap = pNextOverlap;
}
}
Window* pParent = pWindow->GetParent();
if ( pParent && pParent->GetWindowPeer() )

View File

@@ -1105,11 +1105,11 @@ void Window::ImplRemoveWindow( sal_Bool bRemoveFrameData )
{
if ( mpWindowImpl->mpPrev )
mpWindowImpl->mpPrev->mpWindowImpl->mpNext = mpWindowImpl->mpNext;
else
else if ( mpWindowImpl->mpParent )
mpWindowImpl->mpParent->mpWindowImpl->mpFirstChild = mpWindowImpl->mpNext;
if ( mpWindowImpl->mpNext )
mpWindowImpl->mpNext->mpWindowImpl->mpPrev = mpWindowImpl->mpPrev;
else
else if ( mpWindowImpl->mpParent )
mpWindowImpl->mpParent->mpWindowImpl->mpLastChild = mpWindowImpl->mpPrev;
}
@@ -4368,7 +4368,10 @@ Window::~Window()
{
rtl::OStringBuffer aErrorStr;
sal_Bool bError = sal_False;
Window* pTempWin = mpWindowImpl->mpFrameData->mpFirstOverlap;
Window* pTempWin;
if (mpWindowImpl->mpFrameData != 0)
{
pTempWin = mpWindowImpl->mpFrameData->mpFirstOverlap;
while ( pTempWin )
{
if ( ImplIsRealParentPath( pTempWin ) )
@@ -4392,6 +4395,7 @@ Window::~Window()
GetpApp()->Abort(rtl::OStringToOUString(
aTempStr.makeStringAndClear(), RTL_TEXTENCODING_UTF8));
}
}
bError = sal_False;
pTempWin = pSVData->maWinData.mpFirstFrame;
@@ -4562,7 +4566,8 @@ Window::~Window()
}
if ( pOverlapWindow->mpWindowImpl->mpLastFocusWindow == this )
if ( pOverlapWindow != 0 &&
pOverlapWindow->mpWindowImpl->mpLastFocusWindow == this )
pOverlapWindow->mpWindowImpl->mpLastFocusWindow = NULL;
// reset hint for DefModalDialogParent
@@ -4570,12 +4575,15 @@ Window::~Window()
pSVData->maWinData.mpActiveApplicationFrame = NULL;
// reset marked windows
if ( mpWindowImpl->mpFrameData != 0 )
{
if ( mpWindowImpl->mpFrameData->mpFocusWin == this )
mpWindowImpl->mpFrameData->mpFocusWin = NULL;
if ( mpWindowImpl->mpFrameData->mpMouseMoveWin == this )
mpWindowImpl->mpFrameData->mpMouseMoveWin = NULL;
if ( mpWindowImpl->mpFrameData->mpMouseDownWin == this )
mpWindowImpl->mpFrameData->mpMouseDownWin = NULL;
}
// reset Deactivate-Window
if ( pSVData->maWinData.mpLastDeacWin == this )