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:
@@ -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() )
|
||||
|
@@ -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 )
|
||||
|
Reference in New Issue
Block a user