From f0426b924f543c62268ac5098c0c2c6a44e68084 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Sat, 28 Nov 2009 17:43:21 +0200
Subject: [PATCH] implemented EXT-2889 "Incoming "grant modify rights" message
 should trigger notify toast and adding record to IM history"; fixed avatar
 icon in IM-floater when message added to IM-session; avoided popup of IM-tast
 when message added to IM-session;

--HG--
branch : product-engine
---
 indra/newview/CMakeLists.txt                  |  1 +
 indra/newview/llcallingcard.cpp               | 13 +--
 indra/newview/llimview.cpp                    | 19 ++--
 indra/newview/llimview.h                      |  5 ++
 indra/newview/llnotificationhandler.h         | 15 ++++
 indra/newview/llnotificationhandlerutil.cpp   | 88 +++++++++++++++++++
 indra/newview/llnotificationofferhandler.cpp  | 24 +----
 indra/newview/llnotificationscripthandler.cpp |  5 ++
 .../skins/default/xui/en/notifications.xml    |  8 +-
 9 files changed, 139 insertions(+), 39 deletions(-)
 create mode 100644 indra/newview/llnotificationhandlerutil.cpp

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7e89d97013..65b172b1843 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -292,6 +292,7 @@ set(viewer_SOURCE_FILES
     llnetmap.cpp
     llnotificationalerthandler.cpp
     llnotificationgrouphandler.cpp
+    llnotificationhandlerutil.cpp
     llnotificationmanager.cpp
     llnotificationofferhandler.cpp
     llnotificationscripthandler.cpp
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 476f1f41ac8..714bd20ab88 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -633,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
 			{
 				if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^  new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
 				{
-					std::string first, last;
+					std::string name;
 					LLSD args;
-					if(gCacheName->getName(agent_id, first, last))
+					if(gCacheName->getFullName(agent_id, name))
 					{
-						args["FIRST_NAME"] = first;
-						args["LAST_NAME"] = last;	
+						args["NAME"] = name;
 					}
+					LLSD payload;
+					payload["from_id"] = agent_id;
 					if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
 					{
-						LLNotificationsUtil::add("GrantedModifyRights",args);
+						LLNotificationsUtil::add("GrantedModifyRights",args, payload);
 					}
 					else
 					{
-						LLNotificationsUtil::add("RevokedModifyRights",args);
+						LLNotificationsUtil::add("RevokedModifyRights",args, payload);
 					}
 				}
 				(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index dff339fa637..2f885787391 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -476,19 +476,17 @@ bool LLIMModel::proccessOnlineOfflineNotification(
 }
 
 bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, 
-						   const std::string& utf8_text, bool log2file /* = true */) { 
+						   const std::string& utf8_text, bool log2file /* = true */)
+{
 	LLIMSession* session = findIMSession(session_id);
 
-	if (!session) 
+	if (!session)
 	{
 		llwarns << "session " << session_id << "does not exist " << llendl;
 		return false;
 	}
 
-	addToHistory(session_id, from, from_id, utf8_text);
-	if (log2file) logToFile(session_id, from, from_id, utf8_text);
-
-	session->mNumUnread++;
+	addMessageSilently(*session, from, from_id, utf8_text, log2file);
 
 	// notify listeners
 	LLSD arg;
@@ -503,6 +501,15 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 	return true;
 }
 
+void LLIMModel::addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& from_id,
+						   const std::string& utf8_text, bool log2file /* = true */)
+{
+	addToHistory(session.mSessionID, from, from_id, utf8_text);
+	if (log2file) logToFile(session.mSessionID, from, from_id, utf8_text);
+
+	session.mNumUnread++;
+}
+
 
 const std::string& LLIMModel::getName(const LLUUID& session_id) const
 {
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 79b0acad69a..72fd006222d 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -145,6 +145,11 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	 */
 	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
 
+	/**
+	 * Adds message without new message notification.
+	 */
+	void addMessageSilently(LLIMSession& session, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
+
 	/**
 	 * Add a system message to an IM Model
 	 */
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 29664e1919c..d42b0148d61 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -39,6 +39,7 @@
 //#include "llnotificationsutil.h"
 #include "llchannelmanager.h"
 #include "llchat.h"
+#include "llnotificationptr.h"
 
 namespace LLNotificationsUI
 {
@@ -256,6 +257,20 @@ class LLOfferHandler : public LLSysHandler
 	void onRejectToast(LLUUID& id);
 };
 
+class LLHandlerUtil
+{
+public:
+	/**
+	 * Checks sufficient conditions to log notification message to IM session.
+	 */
+	static bool canLogToIM(const LLNotificationPtr& notification);
+
+	/**
+	 * Writes notification message to IM session.
+	 */
+	static void logToIM(const LLNotificationPtr& notification);
+};
+
 }
 #endif
 
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
new file mode 100644
index 00000000000..e1236b935ee
--- /dev/null
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -0,0 +1,88 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Provides set of utility methods for notifications processing.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "llnotifications.h"
+#include "llimview.h"
+
+using namespace LLNotificationsUI;
+
+const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
+		REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
+				"ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
+				"ObjectGiveItemUnknownUser");
+
+// static
+bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
+{
+	return GRANTED_MODIFY_RIGHTS == notification->getName()
+			|| REVOKED_MODIFY_RIGHTS == notification->getName();
+}
+
+// static
+void LLHandlerUtil::logToIM(const LLNotificationPtr& notification)
+{
+	// add message to IM
+	const std::string
+			name =
+					notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+							: notification->getSubstitutions()["[NAME]"];
+
+	// don't create IM session with objects, it's necessary condition to log
+	if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
+			!= OBJECT_GIVE_ITEM_UNKNOWN_USER)
+	{
+		LLUUID from_id = notification->getPayload()["from_id"];
+		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
+				from_id);
+
+		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
+		if (session == NULL)
+		{
+			session_id = LLIMMgr::instance().addSession(name,
+					IM_NOTHING_SPECIAL, from_id);
+			session = LLIMModel::instance().findIMSession(session_id);
+		}
+
+		if (session == NULL)
+		{
+			llerrs << "session " << session_id << "does not exist " << llendl;
+			return;
+		}
+
+		LLIMModel::instance().addMessageSilently(*session, name, from_id,
+				notification->getMessage());
+	}
+}
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 45b5e884725..cfe7fd09ac1 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -37,8 +37,6 @@
 #include "lltoastnotifypanel.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
-#include "llimview.h"
-#include "llimfloater.h"
 #include "llnotificationmanager.h"
 #include "llnotifications.h"
 
@@ -92,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		// add message to IM
-		const std::string
-				name =
-						notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
-								: notification->getSubstitutions()["[NAME]"];
-
-		// don't create IM session with objects
-		if (notification->getName() != "ObjectGiveItem"
-				&& notification->getName() != "ObjectGiveItemUnknownUser")
-		{
-			LLUUID from_id = notification->getPayload()["from_id"];
-			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
-					from_id);
-			if (!LLIMMgr::instance().hasSession(session_id))
-			{
-				session_id = LLIMMgr::instance().addSession(name,
-						IM_NOTHING_SPECIAL, from_id);
-			}
-			LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
-					notification->getMessage());
-		}
+		LLHandlerUtil::logToIM(notification);
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
 
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 8c159b40e8e..6f91b6e58b4 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -96,6 +96,11 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
+		if (LLHandlerUtil::canLogToIM(notification))
+		{
+			LLHandlerUtil::logToIM(notification);
+		}
+
 		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
 		{
 			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 79ef1d104b9..49276172d57 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2382,15 +2382,15 @@ Please choose the male or female avatar. You can change your mind later.
   <notification
    icon="alertmodal.tga"
    name="GrantedModifyRights"
-   type="alertmodal">
-[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
+   type="notify">
+[NAME] has given you permission to edit their objects.
   </notification>
 
   <notification
    icon="alertmodal.tga"
    name="RevokedModifyRights"
-   type="alertmodal">
-Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
+   type="notify">
+Your privilege to modify [NAME]&apos;s objects has been revoked
   </notification>
 
   <notification
-- 
GitLab