diff options
| author | Cho <cho@lindenlab.com> | 2013-01-18 02:05:09 +0000 | 
|---|---|---|
| committer | Cho <cho@lindenlab.com> | 2013-01-18 02:05:09 +0000 | 
| commit | 1780e78884c1b111f4a48bea578e28b370fbe45c (patch) | |
| tree | 5a97b12dd038a866ee32bbd06e5f0d4809914f75 /indra | |
| parent | e05449e7fe5e39f61c45504e27e109ffb4b68195 (diff) | |
CHUI-688 FIX Viewer crash when blocked user sends friend request
Added a check for notification_ptr being null in friendship_offer_callback
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/llviewermessage.cpp | 132 | 
1 files changed, 68 insertions, 64 deletions
| diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index db81e057de..4bff0222bd 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -189,70 +189,74 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  	const LLSD& payload = notification["payload"];  	LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID()); -	// add friend to recent people list -	LLRecentPeople::instance().add(payload["from_id"]); - -	switch(option) -	{ -	case 0: -	{ -		// accept -		LLAvatarTracker::formFriendship(payload["from_id"]); - -		const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); - -		// This will also trigger an onlinenotification if the user is online -		msg->newMessageFast(_PREHASH_AcceptFriendship); -		msg->nextBlockFast(_PREHASH_AgentData); -		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -		msg->nextBlockFast(_PREHASH_TransactionBlock); -		msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); -		msg->nextBlockFast(_PREHASH_FolderData); -		msg->addUUIDFast(_PREHASH_FolderID, fid); -		msg->sendReliable(LLHost(payload["sender"].asString())); - -		LLSD payload = notification["payload"]; -		LLNotificationsUtil::add("FriendshipAcceptedByMe", -				notification["substitutions"], payload); -		break; -	} -	case 1: // Decline -	{ -		LLSD payload = notification["payload"]; -		LLNotificationsUtil::add("FriendshipDeclinedByMe", -				notification["substitutions"], payload); -	} -	// fall-through -	case 2: // Send IM - decline and start IM session -		{ -			// decline -			// We no longer notify other viewers, but we DO still send -			// the rejection to the simulator to delete the pending userop. -			msg->newMessageFast(_PREHASH_DeclineFriendship); -			msg->nextBlockFast(_PREHASH_AgentData); -			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			msg->nextBlockFast(_PREHASH_TransactionBlock); -			msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); -			msg->sendReliable(LLHost(payload["sender"].asString())); - -			// start IM session -			if(2 == option) -			{ -				LLAvatarActions::startIM(payload["from_id"].asUUID()); -			} -	} -	default: -		// close button probably, possibly timed out -		break; -	} - -	LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm())); -	modified_form->setElementEnabled("Accept", false); -	modified_form->setElementEnabled("Decline", false); -	notification_ptr->updateForm(modified_form); -	notification_ptr->repost(); +    // this will be skipped if the user offering friendship is blocked +    if (notification_ptr) +    { +	    // add friend to recent people list +	    LLRecentPeople::instance().add(payload["from_id"]); + +	    switch(option) +	    { +	    case 0: +	    { +		    // accept +		    LLAvatarTracker::formFriendship(payload["from_id"]); + +		    const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + +		    // This will also trigger an onlinenotification if the user is online +		    msg->newMessageFast(_PREHASH_AcceptFriendship); +		    msg->nextBlockFast(_PREHASH_AgentData); +		    msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +		    msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +		    msg->nextBlockFast(_PREHASH_TransactionBlock); +		    msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); +		    msg->nextBlockFast(_PREHASH_FolderData); +		    msg->addUUIDFast(_PREHASH_FolderID, fid); +		    msg->sendReliable(LLHost(payload["sender"].asString())); + +		    LLSD payload = notification["payload"]; +		    LLNotificationsUtil::add("FriendshipAcceptedByMe", +				    notification["substitutions"], payload); +		    break; +	    } +	    case 1: // Decline +	    { +		    LLSD payload = notification["payload"]; +		    LLNotificationsUtil::add("FriendshipDeclinedByMe", +				    notification["substitutions"], payload); +	    } +	    // fall-through +	    case 2: // Send IM - decline and start IM session +		    { +			    // decline +			    // We no longer notify other viewers, but we DO still send +			    // the rejection to the simulator to delete the pending userop. +			    msg->newMessageFast(_PREHASH_DeclineFriendship); +			    msg->nextBlockFast(_PREHASH_AgentData); +			    msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +			    msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +			    msg->nextBlockFast(_PREHASH_TransactionBlock); +			    msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); +			    msg->sendReliable(LLHost(payload["sender"].asString())); + +			    // start IM session +			    if(2 == option) +			    { +				    LLAvatarActions::startIM(payload["from_id"].asUUID()); +			    } +	    } +	    default: +		    // close button probably, possibly timed out +		    break; +	    } + +	    LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm())); +	    modified_form->setElementEnabled("Accept", false); +	    modified_form->setElementEnabled("Decline", false); +	    notification_ptr->updateForm(modified_form); +	    notification_ptr->repost(); +    }  	return false;  } | 
