diff options
| author | Vadim ProductEngine <vsavchuk@productengine.com> | 2011-12-20 20:44:38 +0200 | 
|---|---|---|
| committer | Vadim ProductEngine <vsavchuk@productengine.com> | 2011-12-20 20:44:38 +0200 | 
| commit | 5dc8e44c767f839e3d2d1d926bfdeee969f2492e (patch) | |
| tree | 56c89fffbde04a998c403156e50dc9e702f1b5ed /indra | |
| parent | 16b6a472477bd389771fe4022e425f77ca85c2bd (diff) | |
EXP-1499 FIXED Added some NULL checks in notifications UI code to avoid a crash on exit.
The crash happened if connection timed out while there were unread object inventory offers.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llchiclet.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llscriptfloater.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/llsyswellwindow.h | 1 | 
4 files changed, 28 insertions, 3 deletions
| diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index a076374903..045c9017be 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -250,6 +250,12 @@ LLIMWellChiclet::LLIMWellChiclet(const Params& p)  LLIMWellChiclet::~LLIMWellChiclet()  { +	LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance(); +	if (im_well_window) +	{ +		im_well_window->setSysWellChiclet(NULL); +	} +  	LLIMMgr::getInstance()->removeSessionObserver(this);  } diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 85a7e75271..6f98be1cb8 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -408,9 +408,16 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	}  	// remove related chiclet -	LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id); +	if (LLChicletBar::instanceExists()) +	{ +		LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id); +	} -	LLIMWellWindow::getInstance()->removeObjectRow(notification_id); +	LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance(); +	if (im_well_window) +	{ +		im_well_window->removeObjectRow(notification_id); +	}  	mNotifications.erase(notification_id); diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 3aa6a3b7e5..0cb6c85012 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -159,6 +159,7 @@ void LLSysWellWindow::setVisible(BOOL visible)  	LLTransientDockableFloater::setVisible(visible);  	// update notification channel state	 +	initChannel(); // make sure the channel still exists  	if(mChannel)  	{  		mChannel->updateShowToastsState(); @@ -598,6 +599,13 @@ LLIMWellWindow* LLIMWellWindow::getInstance(const LLSD& key /*= LLSD()*/)  	return LLFloaterReg::getTypedInstance<LLIMWellWindow>("im_well_window", key);  } + +// static +LLIMWellWindow* LLIMWellWindow::findInstance(const LLSD& key /*= LLSD()*/) +{ +	return LLFloaterReg::findTypedInstance<LLIMWellWindow>("im_well_window", key); +} +  BOOL LLIMWellWindow::postBuild()  {  	BOOL rv = LLSysWellWindow::postBuild(); @@ -751,7 +759,10 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)  {  	if (mMessageList->removeItemByValue(notification_id))  	{ -		mSysWellChiclet->updateWidget(isWindowEmpty()); +		if (mSysWellChiclet) +		{ +			mSysWellChiclet->updateWidget(isWindowEmpty()); +		}  	}  	else  	{ diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 52e5370505..272e9cfcb1 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -153,6 +153,7 @@ public:  	~LLIMWellWindow();  	static LLIMWellWindow* getInstance(const LLSD& key = LLSD()); +	static LLIMWellWindow* findInstance(const LLSD& key = LLSD());  	static void initClass() { getInstance(); }  	/*virtual*/ BOOL postBuild(); | 
