From 0fddf9656b5ff704859f590eac9df522cbe39ef0 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Thu, 27 Mar 2014 20:03:08 -0400
Subject: DRTVWR-363: re-enable commented-out
 LLNotificationsListener::listChannels() and its caller.

---
 indra/llui/llnotificationslistener.cpp | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 9e8e943ee6..3bbeb3a778 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -42,11 +42,10 @@ LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications
         "Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n"
         "If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.",
         &LLNotificationsListener::requestAdd);
-    /*    add("listChannels",
+    add("listChannels",
         "Post to [\"reply\"] a map of info on existing channels",
         &LLNotificationsListener::listChannels,
         LLSD().with("reply", LLSD()));
-    */
     add("listChannelNotifications",
         "Post to [\"reply\"] an array of info on notifications in channel [\"channel\"]",
         &LLNotificationsListener::listChannelNotifications,
@@ -117,15 +116,11 @@ void LLNotificationsListener::NotificationResponder(const std::string& reply_pum
 	reponse_event["response"] = response;
 	LLEventPumps::getInstance()->obtain(reply_pump).post(reponse_event);
 }
-/*
+
 void LLNotificationsListener::listChannels(const LLSD& params) const
 {
     LLReqID reqID(params);
     LLSD response(reqID.makeResponse());
-    for (LLNotifications::
-
-
-
     for (LLNotifications::ChannelMap::const_iterator cmi(mNotifications.mChannels.begin()),
                                                      cmend(mNotifications.mChannels.end());
          cmi != cmend; ++cmi)
@@ -136,7 +131,7 @@ void LLNotificationsListener::listChannels(const LLSD& params) const
     }
     LLEventPumps::instance().obtain(params["reply"]).post(response);
 }
-*/
+
 void LLNotificationsListener::listChannelNotifications(const LLSD& params) const
 {
     LLReqID reqID(params);
-- 
cgit v1.2.3


From ba892274b393550be3cc7a25ff0e8f86cc1344a9 Mon Sep 17 00:00:00 2001
From: Nat Goodspeed <nat@lindenlab.com>
Date: Fri, 28 Mar 2014 10:30:03 -0400
Subject: DRTVWR-363: Fix LLNotificationsListener::listChannels() channel walk.
 LLNotifications::ChannelMap went away when LLNotificationChannel became an
 LLInstanceTracker subclass. Iterate the universe of channels using
 LLNotificationChannel::beginInstances(), endInstances() instead. More
 troubling is that LLNotificationChannel::getParentChannelName() went away
 too. When LLNotificationChannel acquired a Params block and corresponding
 constructor, it acquired the ability to listen on multiple upstream sources.
 That meant that a single mParent string became inapplicable, and its access
 method was removed. (Curiously, mParent was not itself removed, but it was
 left unused.) Change mParent to mParents, a vector<string>, built by
 connectToChannel(). Introduce getParents(), an accessor returning an
 iterator_range over that vector. Change
 LLNotificationsListener::listChannels() to collect a "parents" key in the map
 returned for each channel, and -- for backwards compatibility -- capture the
 first entry in the "parents" array as "parent".

---
 indra/llui/llnotifications.cpp         |  1 +
 indra/llui/llnotifications.h           |  8 +++++++-
 indra/llui/llnotificationslistener.cpp | 16 +++++++++++-----
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 5c288c3f03..99641ae104 100755
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1189,6 +1189,7 @@ void LLNotificationChannel::connectToChannel( const std::string& channel_name )
 	}
 	else
 	{
+		mParents.push_back(channel_name);
 		LLNotificationChannelPtr p = LLNotifications::instance().getChannel(channel_name);
 		p->connectChanged(boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
 	}
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 6ac4a98806..39426d9a89 100755
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -88,6 +88,7 @@
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/type_traits.hpp>
 #include <boost/signals2.hpp>
+#include <boost/range.hpp>
 
 #include "llevents.h"
 #include "llfunctorregistry.h"
@@ -839,6 +840,11 @@ public:
 	typedef LLNotificationSet::iterator Iterator;
     
 	std::string getName() const { return mName; }
+	typedef std::vector<std::string>::const_iterator parents_iter;
+	boost::iterator_range<parents_iter> getParents() const
+	{
+		return boost::iterator_range<parents_iter>(mParents);
+	}
     
 	void connectToChannel(const std::string& channel_name);
     
@@ -853,7 +859,7 @@ public:
 
 private:
 	std::string mName;
-	std::string mParent;
+	std::vector<std::string> mParents;
 };
 
 // An interface class to provide a clean linker seam to the LLNotifications class.
diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 3bbeb3a778..b6a32a0e78 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -32,6 +32,7 @@
 #include "llnotificationtemplate.h"
 #include "llsd.h"
 #include "llui.h"
+#include <boost/foreach.hpp>
 
 LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) :
     LLEventAPI("LLNotifications",
@@ -121,13 +122,18 @@ void LLNotificationsListener::listChannels(const LLSD& params) const
 {
     LLReqID reqID(params);
     LLSD response(reqID.makeResponse());
-    for (LLNotifications::ChannelMap::const_iterator cmi(mNotifications.mChannels.begin()),
-                                                     cmend(mNotifications.mChannels.end());
+    for (LLNotificationChannel::instance_iter cmi(LLNotificationChannel::beginInstances()),
+                                              cmend(LLNotificationChannel::endInstances());
          cmi != cmend; ++cmi)
     {
-        LLSD channelInfo;
-        channelInfo["parent"] = cmi->second->getParentChannelName();
-        response[cmi->first] = channelInfo;
+        LLSD channelInfo, parents;
+        BOOST_FOREACH(const std::string& parent, cmi->getParents())
+        {
+            parents.append(parent);
+        }
+        channelInfo["parents"] = parents;
+        channelInfo["parent"] = parents.size()? parents[0] : "";
+        response[cmi->getName()] = channelInfo;
     }
     LLEventPumps::instance().obtain(params["reply"]).post(response);
 }
-- 
cgit v1.2.3