From 5d743c3c58b37dc6e9f261babfd5181906af752b Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Wed, 30 Jun 2010 13:15:33 -0700
Subject: EXT-8172 FIX notification of missing media plugins causes an infinite
 loop reviewed by Nyx

---
 indra/llui/llnotifications.cpp                     | 32 ++++++++++------------
 indra/llui/llnotifications.h                       |  2 --
 .../newview/skins/default/xui/en/notifications.xml |  4 +++
 3 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 7b8f51ae3c..621e72ce38 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -560,21 +560,6 @@ void LLNotification::setResponseFunctor(const LLNotificationResponderPtr& respon
 	mResponder = responder;
 }
 
-bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const
-{
-	for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin(); 
-		required_fields_it != required_fields.end();
-		required_fields_it++)
-	{
-		std::string required_field_name = *required_fields_it;
-		if( ! getPayload().has(required_field_name))
-		{
-			return false; // a required field was not found
-		}
-	}
-	return true; // all required fields were found
-}
-
 bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
 {
 	if (this->mTemplatep->mName != that->mTemplatep->mName) 
@@ -583,11 +568,22 @@ bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
 	}
 	if (this->mTemplatep->mUnique)
 	{
+		const LLSD& these_substitutions = this->getSubstitutions();
+		const LLSD& those_substitutions = that->getSubstitutions();
+
 		// highlander bit sez there can only be one of these
-		return
-			this->payloadContainsAll(that->mTemplatep->mUniqueContext) &&
-			that->payloadContainsAll(this->mTemplatep->mUniqueContext);
+		for (std::vector<std::string>::const_iterator it = mTemplatep->mUniqueContext.begin(), end_it = mTemplatep->mUniqueContext.end();
+			it != end_it;
+			++it)
+		{
+			if (these_substitutions.get(*it).asString() != those_substitutions.get(*it).asString())
+			{
+				return false;
+			}
+		}
+		return true;
 	}
+
 	return false; 
 }
 
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index c942a32512..8bfada0e71 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -400,8 +400,6 @@ private:
 
 	void cancel();
 
-	bool payloadContainsAll(const std::vector<std::string>& required_fields) const;
-
 public:
 
 	// constructor from a saved notification
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 88732fee7d..290c8c55a9 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4886,6 +4886,10 @@ If you want to view streaming media on parcels that support it you should go to
    persist="true"
    type="notify">
 No Media Plugin was found to handle the "[MIME_TYPE]" mime type.  Media of this type will be unavailable.
+    <unique>
+      <context key="[MIME_TYPE]"/>
+    </unique>
+
   </notification>
   <notification
    icon="alertmodal.tga"
-- 
cgit v1.2.3