diff options
| author | graham linden <graham@lindenlab.com> | 2013-03-11 14:26:33 -0700 | 
|---|---|---|
| committer | graham linden <graham@lindenlab.com> | 2013-03-11 14:26:33 -0700 | 
| commit | d4b3c23da11dd963915d078b169ac9ac0cf7b7bf (patch) | |
| tree | 2fb1148a7593872d2599754fe0bf87204314bf6a /indra/newview/llviewermessage.cpp | |
| parent | 85af4c7b7169a0ea38aad5d3759fd36b8ff021f4 (diff) | |
| parent | d348deb7049cbaef7c228000525c7ee5a265464c (diff) | |
Merged lindenlab/viewer-development into default
Diffstat (limited to 'indra/newview/llviewermessage.cpp')
| -rwxr-xr-x | indra/newview/llviewermessage.cpp | 390 | 
1 files changed, 210 insertions, 180 deletions
| diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a897eec551..2340436a01 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -65,10 +65,11 @@  #include "llfloatersnapshot.h"  #include "llhudeffecttrail.h"  #include "llhudmanager.h" +#include "llimview.h"  #include "llinventoryfunctions.h"  #include "llinventoryobserver.h"  #include "llinventorypanel.h" -#include "llnearbychat.h" +#include "llfloaterimnearbychat.h"  #include "llnotifications.h"  #include "llnotificationsutil.h"  #include "llpanelgrouplandmoney.h" @@ -120,6 +121,8 @@  #pragma warning (disable:4702)  #endif +extern void on_new_message(const LLSD& msg); +  //  // Constants  // @@ -184,78 +187,82 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	LLMessageSystem* msg = gMessageSystem;  	const LLSD& payload = notification["payload"]; - -	// 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"]; -		payload["SUPPRESS_TOAST"] = true; -		LLNotificationsUtil::add("FriendshipAcceptedByMe", -				notification["substitutions"], payload); -		break; -	} -	case 1: // Decline -	{ -		LLSD payload = notification["payload"]; -		payload["SUPPRESS_TOAST"] = true; -		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; -	} +	LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID()); + +    // 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;  }  static LLNotificationFunctorRegistration friendship_offer_callback_reg("OfferFriendship", friendship_offer_callback);  static LLNotificationFunctorRegistration friendship_offer_callback_reg_nm("OfferFriendshipNoMessage", friendship_offer_callback); -//const char BUSY_AUTO_RESPONSE[] =	"The Resident you messaged is in 'busy mode' which means they have " -//									"requested not to be disturbed. Your message will still be shown in their IM " -//									"panel for later viewing."; - -//  // Functions  // @@ -726,7 +733,7 @@ static void highlight_inventory_objects_in_panel(const std::vector<LLUUID>& item  		LLFolderView* fv = inventory_panel->getRootFolder();  		if (fv)  		{ -			LLFolderViewItem* fv_item = fv->getItemByID(item_id); +			LLFolderViewItem* fv_item = inventory_panel->getItemByID(item_id);  			if (fv_item)  			{  				LLFolderViewItem* fv_folder = fv_item->getParentFolder(); @@ -814,7 +821,13 @@ private:  		mSelectedItems.clear();  		if (LLInventoryPanel::getActiveInventoryPanel())  		{ -			mSelectedItems = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList(); +			std::set<LLFolderViewItem*> selection =    LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList(); +			for (std::set<LLFolderViewItem*>::iterator it = selection.begin(),    end_it = selection.end(); +				it != end_it; +				++it) +			{ +				mSelectedItems.insert(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID()); +			}  		}  		mSelectedItems.erase(mMoveIntoFolderID);  	} @@ -849,7 +862,15 @@ private:  		}  		// get selected items (without destination folder) -		selected_items_t selected_items = active_panel->getRootFolder()->getSelectionList(); +		selected_items_t selected_items; + 		 + 		std::set<LLFolderViewItem*> selection =    LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList(); +		for (std::set<LLFolderViewItem*>::iterator it = selection.begin(),    end_it = selection.end(); +			it != end_it; +			++it) +		{ +			selected_items.insert(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID()); +		}  		selected_items.erase(mMoveIntoFolderID);  		// compare stored & current sets of selected items @@ -1155,7 +1176,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)  		}  	}  } - +   // Return "true" if we have a preview method for that asset type, "false" otherwise  bool check_asset_previewable(const LLAssetType::EType asset_type)  { @@ -1344,6 +1365,8 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,  			gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));  } +std::string LLOfferInfo::mResponderType = "offer_info"; +  LLOfferInfo::LLOfferInfo()   : LLNotificationResponderInterface()   , mFromGroup(FALSE) @@ -1389,6 +1412,7 @@ LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)  LLSD LLOfferInfo::asLLSD()  {  	LLSD sd; +    sd["responder_type"] = mResponderType;  	sd["im_type"] = mIM;  	sd["from_id"] = mFromID;  	sd["from_group"] = mFromGroup; @@ -1478,16 +1502,15 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);  	} +	LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID()); +	  	// For muting, we need to add the mute, then decline the offer.  	// This must be done here because:  	// * callback may be called immediately,  	// * adding the mute sends a message,  	// * we can't build two messages at once. -	if (2 == button) // Block +	if (IOR_MUTE == button) // Block  	{ -		LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID()); - -		llassert(notification_ptr != NULL);  		if (notification_ptr != NULL)  		{  			gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3)); @@ -1500,8 +1523,8 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	// TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:  	from_string = chatHistory_string = mFromName; -	bool busy = gAgent.getBusy(); -	 +	LLNotificationFormPtr modified_form(notification_ptr ? new LLNotificationForm(*notification_ptr->getForm()) : new LLNotificationForm()); +  	switch(button)  	{  	case IOR_SHOW: @@ -1545,6 +1568,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  			LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL;  			break;  		} + +		if (modified_form != NULL) +		{ +			modified_form->setElementEnabled("Show", false); +		}  		break;  		// end switch (mIM) @@ -1557,9 +1585,14 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  			args["MESSAGE"] = log_message;  			LLNotificationsUtil::add("SystemMessageTip", args);  		} +  		break;  	case IOR_MUTE: +		if (modified_form != NULL) +		{ +			modified_form->setElementEnabled("Mute", false); +		}  		// MUTE falls through to decline  	case IOR_DECLINE:  		{ @@ -1589,12 +1622,13 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  			{  				opener = discard_agent_offer;  			} -			 -			 -			if (busy &&	(!mFromGroup && !mFromObject)) + +			if (modified_form != NULL)  			{ -				busy_message(gMessageSystem, mFromID); +				modified_form->setElementEnabled("Show", false); +				modified_form->setElementEnabled("Discard", false);  			} +  			break;  		}  	default: @@ -1614,6 +1648,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	{  		delete this;  	} +  	return false;  } @@ -1704,7 +1739,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		from_string = chatHistory_string = mFromName;  	} -	bool busy = gAgent.getBusy(); +	bool is_do_not_disturb = gAgent.isDoNotDisturb();  	switch(button)  	{ @@ -1777,9 +1812,9 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  				LLNotificationsUtil::add("SystemMessageTip", args);  			} -			if (busy &&	(!mFromGroup && !mFromObject)) +			if (is_do_not_disturb &&	(!mFromGroup && !mFromObject))  			{ -				busy_message(msg,mFromID); +				send_do_not_disturb_message(msg,mFromID);  			}  			break;  	} @@ -1931,6 +1966,7 @@ void inventory_offer_handler(LLOfferInfo* info)  		p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));  		info->mPersist = true;  		p.name = "UserGiveItem"; +		p.offer_from_agent = true;  		// Prefetch the item into your local inventory.  		LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID); @@ -1947,6 +1983,11 @@ void inventory_offer_handler(LLOfferInfo* info)  		// In viewer 2 we're now auto receiving inventory offers and messaging as such (not sending reject messages).  		info->send_auto_receive_response(); +        if (gAgent.isDoNotDisturb())  +        { +            send_do_not_disturb_message(gMessageSystem, info->mFromID); +        } +  		// Inform user that there is a script floater via toast system  		{  			payload["give_inventory_notification"] = TRUE; @@ -1991,6 +2032,18 @@ bool lure_callback(const LLSD& notification, const LLSD& response)  					   lure_id);  		break;  	} + +	LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID()); + +	if (notification_ptr) +	{ +		LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm())); +		modified_form->setElementEnabled("Teleport", false); +		modified_form->setElementEnabled("Cancel", false); +		notification_ptr->updateForm(modified_form); +		notification_ptr->repost(); +	} +  	return false;  }  static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback); @@ -2152,7 +2205,7 @@ static std::string clean_name_from_im(const std::string& name, EInstantMessage t  	case IM_SESSION_SEND:  	case IM_SESSION_LEAVE:  	//IM_FROM_TASK -	case IM_BUSY_AUTO_RESPONSE: +	case IM_DO_NOT_DISTURB_AUTO_RESPONSE:  	case IM_CONSOLE_AND_CHAT_HISTORY:  	case IM_LURE_USER:  	case IM_LURE_ACCEPTED: @@ -2193,16 +2246,7 @@ static std::string clean_name_from_task_im(const std::string& msg,  		// Don't try to clean up group names  		if (!from_group)  		{ -			if (LLAvatarNameCache::useDisplayNames()) -			{ -				// ...just convert to username -				final += LLCacheName::buildUsername(name); -			} -			else -			{ -				// ...strip out legacy "Resident" name -				final += LLCacheName::cleanFullName(name); -			} +			final += LLCacheName::buildUsername(name);  		}  		final += match[3].str();  		return final; @@ -2210,13 +2254,13 @@ static std::string clean_name_from_task_im(const std::string& msg,  	return msg;  } -void notification_display_name_callback(const LLUUID& id, +static void notification_display_name_callback(const LLUUID& id,  					  const LLAvatarName& av_name,  					  const std::string& name,   					  LLSD& substitutions,   					  const LLSD& payload)  { -	substitutions["NAME"] = av_name.mDisplayName; +	substitutions["NAME"] = av_name.getDisplayName();  	LLNotificationsUtil::add(name, substitutions, payload);  } @@ -2234,7 +2278,7 @@ protected:  };  // Callback for name resolution of a god/estate message -void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string message) +static void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string message)  {	  	LLSD args;  	args["NAME"] = av_name.getCompleteName(); @@ -2244,12 +2288,11 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m  	// Treat like a system message and put in chat history.  	chat.mText = av_name.getCompleteName() + ": " + message; -	LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); -	if(nearby_chat) +	LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"); +	if (nearby_chat)  	{  		nearby_chat->addMessage(chat);  	} -  }  void process_improved_im(LLMessageSystem *msg, void **user_data) @@ -2302,16 +2345,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	// IDEVO convert new-style "Resident" names for display  	name = clean_name_from_im(name, dialog); -	BOOL is_busy = gAgent.getBusy(); +	BOOL is_do_not_disturb = gAgent.isDoNotDisturb();  	BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)  		// object IMs contain sender object id in session_id (STORM-1209)  		|| dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id); -	BOOL is_linden = LLMuteList::getInstance()->isLinden(name);  	BOOL is_owned_by_me = FALSE;  	BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;  	BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly"); -	chat.mMuted = is_muted && !is_linden; +	chat.mMuted = is_muted;  	chat.mFromID = from_id;  	chat.mFromName = name;  	chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT; @@ -2329,7 +2371,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	LLNotification::Params params;  	switch(dialog) -	{ +	{   	case IM_CONSOLE_AND_CHAT_HISTORY:  		args["MESSAGE"] = message;  		payload["from_id"] = from_id; @@ -2349,29 +2391,18 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// do nothing -- don't distract newbies in  			// Prelude with global IMs  		} -		else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) +		else if (offline == IM_ONLINE  +					&& is_do_not_disturb +					&& from_id.notNull() //not a system message +					&& to_id.notNull()) //not global message  		{ -			// return a standard "busy" message, but only do it to online IM  +			// return a standard "do not disturb" message, but only do it to online IM   			// (i.e. not other auto responses and not store-and-forward IM)  			if (!gIMMgr->hasSession(session_id))  			{  				// if there is not a panel for this conversation (i.e. it is a new IM conversation  				// initiated by the other party) then... -				std::string my_name; -				LLAgentUI::buildFullname(my_name); -				std::string response = gSavedPerAccountSettings.getString("BusyModeResponse"); -				pack_instant_message( -					gMessageSystem, -					gAgent.getID(), -					FALSE, -					gAgent.getSessionID(), -					from_id, -					my_name, -					response, -					IM_ONLINE, -					IM_BUSY_AUTO_RESPONSE, -					session_id); -				gAgent.sendReliableMessage(); +				send_do_not_disturb_message(msg, from_id, session_id);  			}  			// now store incoming IM in chat history @@ -2386,6 +2417,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				from_id,  				name,  				buffer, +				IM_OFFLINE == offline,  				LLStringUtil::null,  				dialog,  				parent_estate_id, @@ -2420,24 +2452,25 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;  			bool mute_im = is_muted; -			if (accept_im_from_only_friend && !is_friend) +			if(accept_im_from_only_friend&&!is_friend)  			{  				if (!gIMMgr->isNonFriendSessionNotified(session_id))  				{  					std::string message = LLTrans::getString("IM_unblock_only_groups_friends"); -					gIMMgr->addMessage(session_id, from_id, name, message); +					gIMMgr->addMessage(session_id, from_id, name, message, IM_OFFLINE == offline);  					gIMMgr->addNotifiedNonFriendSessionID(session_id);  				}  				mute_im = true;  			} -			if (!mute_im || is_linden)  +			if (!mute_im)   			{  				gIMMgr->addMessage(  					session_id,  					from_id,  					name,  					buffer, +					IM_OFFLINE == offline,  					LLStringUtil::null,  					dialog,  					parent_estate_id, @@ -2582,7 +2615,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				payload["sender_name"] = name;  				payload["group_id"] = group_id;  				payload["inventory_name"] = item_name; -				payload["inventory_offer"] = info ? info->asLLSD() : LLSD(); +				if(info && info->asLLSD()) +				{ +					payload["inventory_offer"] = info->asLLSD(); +				}  				LLSD args;  				args["SUBJECT"] = subj; @@ -2604,11 +2640,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		break;  	case IM_GROUP_INVITATION:  		{ -			//if (!is_linden && (is_busy || is_muted)) -			if ((is_busy || is_muted)) +			if (is_do_not_disturb || is_muted)  			{ -				LLMessageSystem *msg = gMessageSystem; -				busy_message(msg,from_id); +				send_do_not_disturb_message(msg, from_id);  			}  			else  			{ @@ -2691,7 +2725,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			info->mFromName = name;  			info->mDesc = message;  			info->mHost = msg->getSender(); -			//if (((is_busy && !is_owned_by_me) || is_muted)) +			//if (((is_do_not_disturb && !is_owned_by_me) || is_muted))  			if (is_muted)  			{  				// Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331) @@ -2702,9 +2736,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				// Same as closing window  				info->forceResponse(IOR_DECLINE);  			} -			else if (is_busy && dialog != IM_TASK_INVENTORY_OFFERED) // busy mode must not affect interaction with objects (STORM-565) +			// old logic: busy mode must not affect interaction with objects (STORM-565) +			// new logic: inventory offers from in-world objects should be auto-declined (CHUI-519) +			else if (is_do_not_disturb && dialog == IM_TASK_INVENTORY_OFFERED)  			{ -				// Until throttling is implemented, busy mode should reject inventory instead of silently +				// Until throttling is implemented, do not disturb mode should reject inventory instead of silently  				// accepting it.  SEE SL-39554  				info->forceResponse(IOR_DECLINE);  			} @@ -2749,7 +2785,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	case IM_SESSION_SEND:  	{ -		if (is_busy) +		if (is_do_not_disturb)  		{  			return;  		} @@ -2778,6 +2814,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			from_id,  			name,  			buffer, +			IM_OFFLINE == offline,  			ll_safe_string((char*)binary_bucket),  			IM_SESSION_INVITE,  			parent_estate_id, @@ -2789,7 +2826,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	case IM_FROM_TASK:  		{ -			if (is_busy && !is_owned_by_me) +			if (is_do_not_disturb && !is_owned_by_me)  			{  				return;  			} @@ -2841,13 +2878,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Note: lie to Nearby Chat, pretending that this is NOT an IM, because  			// IMs from obejcts don't open IM sessions. -			LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); +			LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");  			if(!chat_from_system && nearby_chat)  			{  				chat.mOwnerID = from_id;  				LLSD args;  				args["slurl"] = location; -				args["type"] = LLNotificationsUI::NT_NEARBYCHAT;  				// Look for IRC-style emotes here so object name formatting is correct  				std::string prefix = message.substr(0, 4); @@ -2887,7 +2923,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		}  		break;  	case IM_FROM_TASK_AS_ALERT: -		if (is_busy && !is_owned_by_me) +		if (is_do_not_disturb && !is_owned_by_me)  		{  			return;  		} @@ -2898,17 +2934,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			LLNotificationsUtil::add("ObjectMessage", args);  		}  		break; -	case IM_BUSY_AUTO_RESPONSE: +	case IM_DO_NOT_DISTURB_AUTO_RESPONSE:  		if (is_muted)  		{ -			LL_DEBUGS("Messaging") << "Ignoring busy response from " << from_id << LL_ENDL; +			LL_DEBUGS("Messaging") << "Ignoring do-not-disturb response from " << from_id << LL_ENDL;  			return;  		}  		else  		{ -			// TODO: after LLTrans hits release, get "busy response" into translatable file -			buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str()); -			gIMMgr->addMessage(session_id, from_id, name, buffer); +			gIMMgr->addMessage(session_id, from_id, name, message);  		}  		break; @@ -2918,9 +2952,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{   				return;  			} -			else if (is_busy)  +			else if (is_do_not_disturb)   			{ -				busy_message(msg,from_id); +				send_do_not_disturb_message(msg, from_id);  			}  			else  			{ @@ -3141,17 +3175,16 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			payload["online"] = (offline == IM_ONLINE);  			payload["sender"] = msg->getSender().getIPandPort(); -			if (is_busy) -			{ -				busy_message(msg, from_id); -				LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); -			} -			else if (is_muted) +			if (is_muted)  			{  				LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1);  			}  			else  			{ +				if (is_do_not_disturb) +				{ +					send_do_not_disturb_message(msg, from_id); +				}  				args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString();  				if(message.empty())  				{ @@ -3184,12 +3217,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			args["NAME"] = name;  			LLSD payload;  			payload["from_id"] = from_id; -			LLAvatarNameCache::get(from_id, boost::bind(¬ification_display_name_callback, -														 _1, -														 _2, -														 "FriendshipAccepted", -														 args, -														 payload)); +			LLAvatarNameCache::get(from_id, boost::bind(¬ification_display_name_callback,_1,_2,"FriendshipAccepted",args,payload));  		}  		break; @@ -3207,15 +3235,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  	}  } -void busy_message (LLMessageSystem* msg, LLUUID from_id)  +void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id)  { -	if (gAgent.getBusy()) +	if (gAgent.isDoNotDisturb())  	{  		std::string my_name;  		LLAgentUI::buildFullname(my_name); -		std::string response = gSavedPerAccountSettings.getString("BusyModeResponse"); +		std::string response = gSavedPerAccountSettings.getString("DoNotDisturbModeResponse");  		pack_instant_message( -			gMessageSystem, +			msg,  			gAgent.getID(),  			FALSE,  			gAgent.getSessionID(), @@ -3223,7 +3251,8 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)  			my_name,  			response,  			IM_ONLINE, -			IM_BUSY_AUTO_RESPONSE); +			IM_DO_NOT_DISTURB_AUTO_RESPONSE, +			session_id);  		gAgent.sendReliableMessage();  	}  } @@ -3258,7 +3287,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)  		msg->nextBlockFast(_PREHASH_TransactionBlock);  		msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID());  		msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); -		busy_message(msg, notification["payload"]["source_id"].asUUID()); +		send_do_not_disturb_message(msg, notification["payload"]["source_id"].asUUID());  		break;  	default:  		// close button probably, possibly timed out @@ -3300,7 +3329,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)  	if(!source_name.empty())  	{ -		if (gAgent.getBusy()  +		if (gAgent.isDoNotDisturb()   			|| LLMuteList::getInstance()->isMuted(source_id, source_name, LLMute::flagTextChat))  		{  			// automatically decline offer @@ -3417,7 +3446,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		LLAvatarName av_name;  		if (LLAvatarNameCache::get(from_id, &av_name))  		{ -			chat.mFromName = av_name.mDisplayName; +			chat.mFromName = av_name.getDisplayName();  		}  		else  		{ @@ -3429,7 +3458,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		chat.mFromName = from_name;  	} -	BOOL is_busy = gAgent.getBusy(); +	BOOL is_do_not_disturb = gAgent.isDoNotDisturb();  	BOOL is_muted = FALSE;  	BOOL is_linden = FALSE; @@ -3463,7 +3492,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		// record last audible utterance  		if (is_audible -			&& (is_linden || (!is_muted && !is_busy))) +			&& (is_linden || (!is_muted && !is_do_not_disturb)))  		{  			if (chat.mChatType != CHAT_TYPE_START   				&& chat.mChatType != CHAT_TYPE_STOP) @@ -3558,7 +3587,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  			LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE);  			((LLVOAvatar*)chatter)->stopTyping(); -			if (!is_muted && !is_busy) +			if (!is_muted && !is_do_not_disturb)  			{  				visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles");  				std::string formated_msg = ""; @@ -3591,7 +3620,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		// pass owner_id to chat so that we can display the remote  		// object inspect for an object that is chatting with you  		LLSD args; -		args["type"] = LLNotificationsUI::NT_NEARBYCHAT;  		chat.mOwnerID = owner_id;  		if (gSavedSettings.getBOOL("TranslateChat") && chat.mSourceType != CHAT_SOURCE_SYSTEM) @@ -3610,6 +3638,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		{  			LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);  		} + +		LLSD msg_notify = LLSD(LLSD::emptyMap()); +		msg_notify["session_id"] = LLUUID(); +        msg_notify["from_id"] = chat.mFromID; +        on_new_message(msg_notify);  	}  } @@ -4097,14 +4130,14 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		gAgent.setFlying(gAgent.canFly());  	} -	// force simulator to recognize busy state -	if (gAgent.getBusy()) +	// force simulator to recognize do not disturb state +	if (gAgent.isDoNotDisturb())  	{ -		gAgent.setBusy(); +		gAgent.setDoNotDisturb(true);  	}  	else  	{ -		gAgent.clearBusy(); +		gAgent.setDoNotDisturb(false);  	}  	if (isAgentAvatarValid()) @@ -5614,11 +5647,9 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)  									_1, _2, _3,  									notification, final_args, payload));  	} -	else { -		LLAvatarNameCache::get(name_id, -							   boost::bind(&money_balance_avatar_notify, -										   _1, _2, -										   notification, final_args, payload));										    +	else  +	{ +		LLAvatarNameCache::get(name_id, boost::bind(&money_balance_avatar_notify, _1, _2, notification, final_args, payload));										     	}  } @@ -6794,7 +6825,6 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)  				//*TODO please rewrite all keys to the same case, lower or upper  				payload["from_id"] = target_id; -				payload["SUPPRESS_TOAST"] = true;  				LLNotificationsUtil::add("TeleportOfferSent", args, payload);  				// Add the recepient to the recent people list. @@ -6915,7 +6945,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**)  	std::string dir_visibility;  	msg->getString( "UserData", "DirectoryVisibility", dir_visibility); -	LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); +	LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email);  	LLFloaterSnapshot::setAgentEmail(email);  } | 
