From 816cf7db82f2e633631c334f44547714de6cbebc Mon Sep 17 00:00:00 2001
From: brad kittenbrink <brad@lindenlab.com>
Date: Thu, 29 Jul 2010 19:49:13 -0700
Subject: Adding a simple region debug console.

---
 indra/newview/CMakeLists.txt                       |  2 +
 indra/newview/llfloaterregiondebugconsole.cpp      | 93 ++++++++++++++++++++++
 indra/newview/llfloaterregiondebugconsole.h        | 55 +++++++++++++
 indra/newview/llviewerfloaterreg.cpp               |  2 +
 indra/newview/llviewermenu.cpp                     |  2 +-
 indra/newview/llviewerregion.cpp                   |  1 +
 .../xui/en/floater_region_debug_console.xml        | 37 +++++++++
 indra/newview/skins/default/xui/en/menu_viewer.xml | 12 +++
 8 files changed, 203 insertions(+), 1 deletion(-)
 create mode 100644 indra/newview/llfloaterregiondebugconsole.cpp
 create mode 100644 indra/newview/llfloaterregiondebugconsole.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_region_debug_console.xml

(limited to 'indra/newview')

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 92f701551b..53941af355 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -197,6 +197,7 @@ set(viewer_SOURCE_FILES
     llfloaterpostprocess.cpp
     llfloaterpreference.cpp
     llfloaterproperties.cpp
+    llfloaterregiondebugconsole.cpp
     llfloaterregioninfo.cpp
     llfloaterreporter.cpp
     llfloaterscriptdebug.cpp
@@ -723,6 +724,7 @@ set(viewer_HEADER_FILES
     llfloaterpostprocess.h
     llfloaterpreference.h
     llfloaterproperties.h
+    llfloaterregiondebugconsole.h
     llfloaterregioninfo.h
     llfloaterreporter.h
     llfloaterscriptdebug.h
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
new file mode 100644
index 0000000000..058f894800
--- /dev/null
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -0,0 +1,93 @@
+/** 
+ * @file llfloaterregiondebugconsole.h
+ * @author Brad Kittenbrink <brad@lindenlab.com>
+ * @brief Quick and dirty console for region debug settings
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ * 
+ * Copyright (c) 2010-2010, 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"
+
+#include "llfloaterregiondebugconsole.h"
+
+#include "llagent.h"
+#include "llhttpclient.h"
+#include "lllineeditor.h"
+#include "lltexteditor.h"
+#include "llviewerregion.h"
+
+class Responder : public LLHTTPClient::Responder {
+public:
+    Responder(LLTextEditor *output) : mOutput(output)
+    {
+    }
+
+    /*virtual*/
+    void error(U32 status, const std::string& reason)
+    {
+    }
+
+    /*virtual*/
+    void result(const LLSD& content)
+    {
+        std::string text = mOutput->getText();
+        text += '\n';
+        text += content.asString();
+        text += '\n';
+        mOutput->setText(text);
+    };
+
+    LLTextEditor * mOutput;
+};
+
+LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
+: LLFloater(key), mOutput(NULL)
+{
+}
+
+BOOL LLFloaterRegionDebugConsole::postBuild()
+{
+	getChild<LLLineEditor>("region_debug_console_input")->setCommitCallback(boost::bind(&LLFloaterRegionDebugConsole::onInput, this, _1, _2));
+	mOutput = getChild<LLTextEditor>("region_debug_console_output");
+	return TRUE;
+}
+
+void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
+{
+	LLLineEditor * input = static_cast<LLLineEditor*>(ctrl);
+	std::string text = mOutput->getText();
+    text += "\n\POST: ";
+	text += input->getText();
+	mOutput->setText(text);
+
+    std::string url = gAgent.getRegion()->getCapability("SimConsole");
+    LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput));
+
+	input->setText(std::string(""));
+}
+
diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h
new file mode 100644
index 0000000000..69d7773fec
--- /dev/null
+++ b/indra/newview/llfloaterregiondebugconsole.h
@@ -0,0 +1,55 @@
+/** 
+ * @file llfloaterregiondebugconsole.h
+ * @author Brad Kittenbrink <brad@lindenlab.com>
+ * @brief Quick and dirty console for region debug settings
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ * 
+ * Copyright (c) 2010-2010, 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$
+ */
+
+#ifndef LL_LLFLOATERREGIONDEBUGCONSOLE_H
+#define LL_LLFLOATERREGIONDEBUGCONSOLE_H
+
+#include "llfloater.h"
+#include "llhttpclient.h"
+
+class LLTextEditor;
+
+class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder
+{
+public:
+	LLFloaterRegionDebugConsole(LLSD const & key);
+
+	// virtual
+	BOOL postBuild();
+	
+	void onInput(LLUICtrl* ctrl, const LLSD& param);
+
+	LLTextEditor * mOutput;
+};
+
+#endif // LL_LLFLOATERREGIONDEBUGCONSOLE_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index efe59744bc..9e256864d2 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -87,6 +87,7 @@
 #include "llfloaterpostprocess.h"
 #include "llfloaterpreference.h"
 #include "llfloaterproperties.h"
+#include "llfloaterregiondebugconsole.h"
 #include "llfloaterregioninfo.h"
 #include "llfloaterreporter.h"
 #include "llfloaterscriptdebug.h"
@@ -236,6 +237,7 @@ void LLViewerFloaterReg::registerFloaters()
 	
 	LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
 	LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>);
+	LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>);
 	LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>);
 	
 	LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 635cc361f3..0822295ba1 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -558,7 +558,7 @@ class LLAdvancedCheckConsole : public view_listener_t
 			new_value = get_visibility( (void*)gDebugView->mMemoryView );
 		}
 #endif
-
+		
 		return new_value;
 	}
 };
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index da240cedbb..93666ee5f2 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1517,6 +1517,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
 	capabilityNames.append("SendUserReport");
 	capabilityNames.append("SendUserReportWithScreenshot");
 	capabilityNames.append("ServerReleaseNotes");
+	capabilityNames.append("SimConsole");
 	capabilityNames.append("StartGroupProposal");
 	capabilityNames.append("TextureStats");
 	capabilityNames.append("UntrustedSimulatorMessage");
diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
new file mode 100644
index 0000000000..591d77340a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+  name="region_debug_console"
+  title="Region Debug"
+  layout="topleft"
+  min_height="300"
+  min_width="300"
+  height="400"
+  width="600">
+  <text_editor
+  left="10"
+   type="string"
+   length="1"
+   follows="left|top|right|bottom"
+   font="Monospace"
+   height="366"
+   width="576"
+   ignore_tab="false"
+   layout="topleft"
+   max_length="65536"
+   name="region_debug_console_output"
+   show_line_numbers="false" 
+   word_wrap="true">
+  </text_editor>
+  <line_editor
+   border_style="line"
+   border_thickness="1"
+   follows="left|top|right"
+   font="SansSerif"
+   height="19"
+   layout="topleft"
+   bottom_delta="20"
+   max_length="127"
+   name="region_debug_console_input"
+   top_delta="0"
+   width="394" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 3557318705..8a3785d7c1 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2542,6 +2542,18 @@
                  function="ToggleControl"
                  parameter="DoubleClickAutoPilot" />
             </menu_item_check>
+            <menu_item_check
+             label="Region Debug Console"
+             name="Region Debug Console"
+             shortcut="control|shift|`"
+             use_mac_ctrl="true">
+                <menu_item_check.on_check
+                 function="Floater.Visible"
+                 parameter="region_debug_console" />
+                <menu_item_check.on_click
+                 function="Floater.Toggle"
+                 parameter="region_debug_console" />
+            </menu_item_check>
 
             <menu_item_separator />
             <menu_item_check
-- 
cgit v1.2.3


From 5a6a792920bb0dee35bcd711bd786d907bda556a Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Tue, 24 Aug 2010 09:41:35 -0700
Subject: fix for sim console not staying scrolled to bottom

---
 indra/newview/llfloaterregiondebugconsole.cpp               | 13 +++++--------
 .../skins/default/xui/en/floater_region_debug_console.xml   |  2 ++
 2 files changed, 7 insertions(+), 8 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 058f894800..8885fa0cb1 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -55,11 +55,9 @@ public:
     /*virtual*/
     void result(const LLSD& content)
     {
-        std::string text = mOutput->getText();
+        std::string text = content.asString();
         text += '\n';
-        text += content.asString();
-        text += '\n';
-        mOutput->setText(text);
+        mOutput->appendText(text, true);
     };
 
     LLTextEditor * mOutput;
@@ -80,14 +78,13 @@ BOOL LLFloaterRegionDebugConsole::postBuild()
 void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
 {
 	LLLineEditor * input = static_cast<LLLineEditor*>(ctrl);
-	std::string text = mOutput->getText();
-    text += "\n\POST: ";
+	std::string text = "\\POST: ";
 	text += input->getText();
-	mOutput->setText(text);
+	mOutput->appendText(text, true);
 
     std::string url = gAgent.getRegion()->getCapability("SimConsole");
     LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput));
 
-	input->setText(std::string(""));
+	input->clear();
 }
 
diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index 591d77340a..976fa35d3c 100644
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -9,6 +9,7 @@
   width="600">
   <text_editor
   left="10"
+  read_only="true" 
    type="string"
    length="1"
    follows="left|top|right|bottom"
@@ -18,6 +19,7 @@
    ignore_tab="false"
    layout="topleft"
    max_length="65536"
+    track_end="true" 
    name="region_debug_console_output"
    show_line_numbers="false" 
    word_wrap="true">
-- 
cgit v1.2.3


From 4b9abaaab9448df7e0773cdbaf1a5202a1f9e6c7 Mon Sep 17 00:00:00 2001
From: "Matthew Breindel (Falcon)" <falcon@lindenlab.com>
Date: Thu, 26 Aug 2010 17:09:15 -0700
Subject: Cleaned up the debug console a bit. Gave it a command history and
 proper scrolling to the bottom of the returned data.

---
 indra/newview/llfloaterregiondebugconsole.cpp      | 48 ++++++++++++++++------
 .../xui/en/floater_region_debug_console.xml        | 10 +++--
 2 files changed, 42 insertions(+), 16 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 058f894800..159dee7631 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -55,11 +55,8 @@ public:
     /*virtual*/
     void result(const LLSD& content)
     {
-        std::string text = mOutput->getText();
-        text += '\n';
-        text += content.asString();
-        text += '\n';
-        mOutput->setText(text);
+		std::string text = content.asString() + "\n\n> ";
+		mOutput->appendText(text, false);
     };
 
     LLTextEditor * mOutput;
@@ -72,22 +69,47 @@ LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
 
 BOOL LLFloaterRegionDebugConsole::postBuild()
 {
-	getChild<LLLineEditor>("region_debug_console_input")->setCommitCallback(boost::bind(&LLFloaterRegionDebugConsole::onInput, this, _1, _2));
+	LLLineEditor* input = getChild<LLLineEditor>("region_debug_console_input");
+	input->setEnableLineHistory(true);
+	input->setCommitCallback(boost::bind(&LLFloaterRegionDebugConsole::onInput, this, _1, _2));
+	input->setFocus(true);
+	input->setCommitOnFocusLost(false);
+
 	mOutput = getChild<LLTextEditor>("region_debug_console_output");
+
+	std::string url = gAgent.getRegion()->getCapability("SimConsole");
+	if ( url.size() == 0 )
+	{
+		mOutput->appendText("This region does not support the simulator console.\n\n> ", false);
+	}
+	else
+	{
+		mOutput->appendText("> ", false);
+	}
+	
+
 	return TRUE;
 }
 
 void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
 {
-	LLLineEditor * input = static_cast<LLLineEditor*>(ctrl);
-	std::string text = mOutput->getText();
-    text += "\n\POST: ";
-	text += input->getText();
-	mOutput->setText(text);
+	LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
+	std::string text = input->getText() + "\n";
+
 
     std::string url = gAgent.getRegion()->getCapability("SimConsole");
-    LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput));
 
-	input->setText(std::string(""));
+	if ( url.size() > 0 )
+	{
+		LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput));
+	}
+	else
+	{
+		text += "\nError: No console available for this region/simulator.\n\n> ";
+	}
+
+	mOutput->appendText(text, false);
+
+	input->clear();
 }
 
diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index 591d77340a..cf95257b0a 100644
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -6,7 +6,8 @@
   min_height="300"
   min_width="300"
   height="400"
-  width="600">
+  width="600"
+  default_tab_group="1">
   <text_editor
   left="10"
    type="string"
@@ -20,11 +21,14 @@
    max_length="65536"
    name="region_debug_console_output"
    show_line_numbers="false" 
-   word_wrap="true">
+   word_wrap="true"
+   track_end="true"
+   read_only="true">
   </text_editor>
   <line_editor
    border_style="line"
    border_thickness="1"
+   tab_group="1" 
    follows="left|top|right"
    font="SansSerif"
    height="19"
@@ -33,5 +37,5 @@
    max_length="127"
    name="region_debug_console_input"
    top_delta="0"
-   width="394" />
+   width="576" />
 </floater>
-- 
cgit v1.2.3


From 301112ac7a89266d7378a413f15200ea1bb44d9e Mon Sep 17 00:00:00 2001
From: "Matthew Breindel (Falcon)" <falcon@lindenlab.com>
Date: Thu, 26 Aug 2010 17:14:22 -0700
Subject: Fixed bad merge.

---
 indra/newview/skins/default/xui/en/floater_region_debug_console.xml | 1 -
 1 file changed, 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index b3bf28e285..bdb890f882 100644
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -10,7 +10,6 @@
   default_tab_group="1">
   <text_editor
   left="10"
-  read_only="true" 
    type="string"
    length="1"
    follows="left|top|right|bottom"
-- 
cgit v1.2.3


From a16680abe30ef7a363e2931e75561058b7f53772 Mon Sep 17 00:00:00 2001
From: "Matthew Breindel (Falcon)" <falcon@lindenlab.com>
Date: Thu, 26 Aug 2010 17:29:33 -0700
Subject: Removed duplicate item in floater_region_Debug_console.xml

---
 indra/newview/skins/default/xui/en/floater_region_debug_console.xml | 1 -
 1 file changed, 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index bdb890f882..cf95257b0a 100644
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -19,7 +19,6 @@
    ignore_tab="false"
    layout="topleft"
    max_length="65536"
-    track_end="true" 
    name="region_debug_console_output"
    show_line_numbers="false" 
    word_wrap="true"
-- 
cgit v1.2.3


From 9b97fc3f309518155f2b468ea94fc6f373620f2c Mon Sep 17 00:00:00 2001
From: Kyle Ambroff <ambroff@lindenlab.com>
Date: Sat, 23 Oct 2010 18:43:27 -0700
Subject: ER-219: Add an asynchronous api for the region debug console

Add support for a new capability, SimConsoleAsync. This is a replacement for
the deprecated SimConsole capability that provides an asynchronous API. The old
API is still supported, but the simulator will never support both.

For the new API, commands will be sent via HTTP POST to the SimConsoleAsync
capability, same as before. But the resulting output will be pushed to the
viewer view the event-poll, using the newly added SimConsoleResponse LLSD
message.

Will review with Simon or Falcon.
---
 indra/newview/llfloaterregiondebugconsole.cpp | 175 ++++++++++++++++++++------
 indra/newview/llfloaterregiondebugconsole.h   |   8 ++
 indra/newview/llviewerregion.cpp              |   1 +
 3 files changed, 149 insertions(+), 35 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 159dee7631..0e61fb8e0a 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -37,34 +37,113 @@
 
 #include "llagent.h"
 #include "llhttpclient.h"
+#include "llhttpnode.h"
 #include "lllineeditor.h"
 #include "lltexteditor.h"
 #include "llviewerregion.h"
 
-class Responder : public LLHTTPClient::Responder {
-public:
-    Responder(LLTextEditor *output) : mOutput(output)
-    {
-    }
-
-    /*virtual*/
-    void error(U32 status, const std::string& reason)
-    {
-    }
-
-    /*virtual*/
-    void result(const LLSD& content)
-    {
-		std::string text = content.asString() + "\n\n> ";
-		mOutput->appendText(text, false);
-    };
-
-    LLTextEditor * mOutput;
-};
+// Two versions of the sim console API are supported.
+//
+// SimConsole capability (deprecated):
+// This is the initial implementation that is supported by some versions of the
+// simulator. It is simple and straight forward, just POST a command and the
+// body of the response has the result. This API is deprecated because it
+// doesn't allow the sim to use any asynchronous API.
+//
+// SimConsoleAsync capability:
+// This capability replaces the original SimConsole capability. It is similar
+// in that the command is POSTed to the SimConsoleAsync cap, but the response
+// comes in through the event poll, which gives the simulator more flexibility
+// and allows it to perform complex operations without blocking any frames.
+//
+// We will assume the SimConsoleAsync capability is available, and fall back to
+// the SimConsole cap if it is not. The simulator will only support one or the
+// other.
+
+namespace
+{
+	// Signal used to notify the floater of responses from the asynchronous
+	// API.
+	typedef boost::signals2::signal<
+		void (const std::string& output)> console_reply_signal_t;
+	console_reply_signal_t sConsoleReplySignal;
+
+	const std::string PROMPT("\n\n> ");
+	const std::string UNABLE_TO_SEND_COMMAND(
+		"ERROR: The last command was not received by the server.");
+	const std::string CONSOLE_UNAVAILABLE(
+		"ERROR: No console available for this region/simulator.");
+	const std::string CONSOLE_NOT_SUPPORTED(
+		"This region does not support the simulator console.");
+
+	// This responder handles the initial response. Unless error() is called
+	// we assume that the simulator has received our request. Error will be
+	// called if this request times out.
+	class AsyncConsoleResponder : public LLHTTPClient::Responder
+	{
+	public:
+		/* virtual */
+		void error(U32 status, const std::string& reason)
+		{
+			sConsoleReplySignal(UNABLE_TO_SEND_COMMAND);
+		}
+	};
+
+	class ConsoleResponder : public LLHTTPClient::Responder
+	{
+	public:
+		ConsoleResponder(LLTextEditor *output) : mOutput(output)
+		{
+		}
+
+		/*virtual*/
+		void error(U32 status, const std::string& reason)
+		{
+			mOutput->appendText(
+				UNABLE_TO_SEND_COMMAND + PROMPT,
+				false);
+		}
+
+		/*virtual*/
+		void result(const LLSD& content)
+		{
+			mOutput->appendText(content.asString() + PROMPT, false);
+		}
+
+		LLTextEditor * mOutput;
+	};
+
+	// This handles responses for console commands sent via the asynchronous
+	// API.
+	class ConsoleResponseNode : public LLHTTPNode
+	{
+	public:
+		/* virtual */
+		void post(
+			LLHTTPNode::ResponsePtr reponse,
+			const LLSD& context,
+			const LLSD& input) const
+		{
+			llinfos << "Received response from the debug console: "
+				<< input << llendl;
+			sConsoleReplySignal(input["body"].asString());
+		}
+	};
+}
 
 LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
 : LLFloater(key), mOutput(NULL)
 {
+	mReplySignalConnection = sConsoleReplySignal.connect(
+		boost::bind(
+			&LLFloaterRegionDebugConsole::onReplyReceived,
+			this,
+			_1));
+}
+
+LLFloaterRegionDebugConsole::~LLFloaterRegionDebugConsole()
+{
+	mReplySignalConnection.disconnect();
 }
 
 BOOL LLFloaterRegionDebugConsole::postBuild()
@@ -77,17 +156,21 @@ BOOL LLFloaterRegionDebugConsole::postBuild()
 
 	mOutput = getChild<LLTextEditor>("region_debug_console_output");
 
-	std::string url = gAgent.getRegion()->getCapability("SimConsole");
-	if ( url.size() == 0 )
+	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+	if (url.empty())
 	{
-		mOutput->appendText("This region does not support the simulator console.\n\n> ", false);
+		// Fall back to see if the old API is supported.
+		url = gAgent.getRegion()->getCapability("SimConsole");
+		if (url.empty())
+		{
+			mOutput->appendText(
+				CONSOLE_NOT_SUPPORTED + PROMPT,
+				false);
+			return TRUE;
+		}
 	}
-	else
-	{
-		mOutput->appendText("> ", false);
-	}
-	
 
+	mOutput->appendText("> ", false);
 	return TRUE;
 }
 
@@ -96,20 +179,42 @@ void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
 	LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
 	std::string text = input->getText() + "\n";
 
-
-    std::string url = gAgent.getRegion()->getCapability("SimConsole");
-
-	if ( url.size() > 0 )
+	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+	if (url.empty())
 	{
-		LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput));
+		// Fall back to the old API
+		url = gAgent.getRegion()->getCapability("SimConsole");
+		if (url.empty())
+		{
+			text += CONSOLE_UNAVAILABLE + PROMPT;
+		}
+		else
+		{
+			// Using SimConsole (deprecated)
+			LLHTTPClient::post(
+				url,
+				LLSD(input->getText()),
+				new ConsoleResponder(mOutput));
+		}
 	}
 	else
 	{
-		text += "\nError: No console available for this region/simulator.\n\n> ";
+		// Using SimConsoleAsync
+		LLHTTPClient::post(
+			url,
+			LLSD(input->getText()),
+			new AsyncConsoleResponder);
 	}
 
 	mOutput->appendText(text, false);
-
 	input->clear();
 }
 
+void LLFloaterRegionDebugConsole::onReplyReceived(const std::string& output)
+{
+	mOutput->appendText(output + PROMPT, false);
+}
+
+LLHTTPRegistration<ConsoleResponseNode>
+	gHTTPRegistrationMessageDebugConsoleResponse(
+		"/message/SimConsoleResponse");
diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h
index 69d7773fec..4171a4da6b 100644
--- a/indra/newview/llfloaterregiondebugconsole.h
+++ b/indra/newview/llfloaterregiondebugconsole.h
@@ -34,6 +34,8 @@
 #ifndef LL_LLFLOATERREGIONDEBUGCONSOLE_H
 #define LL_LLFLOATERREGIONDEBUGCONSOLE_H
 
+#include <boost/signals2.hpp>
+
 #include "llfloater.h"
 #include "llhttpclient.h"
 
@@ -43,6 +45,7 @@ class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Respo
 {
 public:
 	LLFloaterRegionDebugConsole(LLSD const & key);
+	virtual ~LLFloaterRegionDebugConsole();
 
 	// virtual
 	BOOL postBuild();
@@ -50,6 +53,11 @@ public:
 	void onInput(LLUICtrl* ctrl, const LLSD& param);
 
 	LLTextEditor * mOutput;
+
+ private:
+	void onReplyReceived(const std::string& output);
+
+	boost::signals2::connection mReplySignalConnection;
 };
 
 #endif // LL_LLFLOATERREGIONDEBUGCONSOLE_H
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index abae44953b..45a2acfeef 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1400,6 +1400,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
 	capabilityNames.append("ServerReleaseNotes");
 	capabilityNames.append("SetDisplayName");
 	capabilityNames.append("SimConsole");
+	capabilityNames.append("SimConsoleAsync");
 	capabilityNames.append("StartGroupProposal");
 	capabilityNames.append("TextureStats");
 	capabilityNames.append("UntrustedSimulatorMessage");
-- 
cgit v1.2.3


From 7be4f43d1704a5d5318e4fd32ab95a132cd26ea3 Mon Sep 17 00:00:00 2001
From: Kyle Ambroff <ambroff@lindenlab.com>
Date: Mon, 25 Oct 2010 10:08:42 -0700
Subject: Null checks for mOutput for good luck.

---
 indra/newview/llfloaterregiondebugconsole.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index 0e61fb8e0a..b3b7645dd4 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -99,15 +99,22 @@ namespace
 		/*virtual*/
 		void error(U32 status, const std::string& reason)
 		{
-			mOutput->appendText(
-				UNABLE_TO_SEND_COMMAND + PROMPT,
-				false);
+			if (mOutput)
+			{
+				mOutput->appendText(
+					UNABLE_TO_SEND_COMMAND + PROMPT,
+					false);
+			}
 		}
 
 		/*virtual*/
 		void result(const LLSD& content)
 		{
-			mOutput->appendText(content.asString() + PROMPT, false);
+			if (mOutput)
+			{
+				mOutput->appendText(
+					content.asString() + PROMPT, false);
+			}
 		}
 
 		LLTextEditor * mOutput;
-- 
cgit v1.2.3


From 0dbf75ab657446b51e6e9795ddccc16bb9f6fd02 Mon Sep 17 00:00:00 2001
From: Kyle Ambroff <ambroff@lindenlab.com>
Date: Thu, 4 Nov 2010 12:37:02 -0700
Subject: ER-281: Object cache limit is too low in the viewer

* Bump CacheNumberOfRegionsForObjects up to 20k in the default settings.
* Make LLVOCache *actually* use this setting, with no upper bound.

Reviewed with Kelly.
---
 indra/newview/app_settings/settings.xml |  4 ++--
 indra/newview/llvocache.cpp             | 13 ++++++-------
 2 files changed, 8 insertions(+), 9 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7172f0359a..4da2ea2aef 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1150,13 +1150,13 @@
     <key>CacheNumberOfRegionsForObjects</key>
     <map>
       <key>Comment</key>
-      <string>Controls number of regions to be cached for objects, ranges from 16 to 128.</string>
+      <string>Controls number of regions to be cached for objects.</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>U32</string>
       <key>Value</key>
-      <integer>128</integer>
+      <integer>20000</integer>
     </map>
     <key>CacheSize</key>
     <map>
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 8bdb8e069e..34e9babe2c 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -223,7 +223,6 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
 // Format string used to construct filename for the object cache
 static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc";
 
-const U32 MAX_NUM_OBJECT_ENTRIES = 128 ;
 const U32 NUM_ENTRIES_TO_PURGE = 16 ;
 const char* object_cache_dirname = "objectcache";
 const char* header_filename = "object.cache";
@@ -291,9 +290,9 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
 	if (!mReadOnly)
 	{
 		LLFile::mkdir(mObjectCacheDirName);
-	}	
-	mCacheSize = llclamp(size,
-			     MAX_NUM_OBJECT_ENTRIES, NUM_ENTRIES_TO_PURGE);
+	}
+
+	mCacheSize = size;
 
 	mMetaInfo.mVersion = cache_version;
 	readCacheHeader();
@@ -424,7 +423,7 @@ void LLVOCache::readCacheHeader()
 
 		HeaderEntryInfo* entry ;
 		mNumEntries = 0 ;
-		while(mNumEntries < MAX_NUM_OBJECT_ENTRIES)
+		while(mNumEntries < mCacheSize)
 		{
 			entry = new HeaderEntryInfo() ;
 			if(!checkRead(apr_file, entry, sizeof(HeaderEntryInfo)))
@@ -477,10 +476,10 @@ void LLVOCache::writeCacheHeader()
 	}
 
 	mNumEntries = mHeaderEntryQueue.size() ;
-	if(mNumEntries < MAX_NUM_OBJECT_ENTRIES)
+	if(mNumEntries < mCacheSize)
 	{
 		HeaderEntryInfo* entry = new HeaderEntryInfo() ;
-		for(S32 i = mNumEntries ; i < MAX_NUM_OBJECT_ENTRIES ; i++)
+		for(S32 i = mNumEntries ; i < mCacheSize; i++)
 		{
 			//fill the cache with the default entry.
 			if(!checkWrite(apr_file, entry, sizeof(HeaderEntryInfo)))
-- 
cgit v1.2.3


From 7e9572fab5643f52a44f06249109f7e77b656e3b Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Wed, 17 Nov 2010 15:21:58 +0200
Subject: STORM-589 FIXED Add a Preference that allows users to display the
 grid selection drop-down on the login screen

- Added a control_name for the "Show Grid Selection at login" checkbox
---
 indra/newview/skins/default/xui/en/panel_preferences_advanced.xml | 1 +
 1 file changed, 1 insertion(+)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 15d1222d00..cfc7a0d5ae 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -88,6 +88,7 @@
      top_pad="20"
      width="237"/>
     <check_box
+     control_name="ForceShowGrid"
      follows="top|left"
      height="15"
      label="Show Grid Selection at login"
-- 
cgit v1.2.3


From 14b2b796abf4e2f1538ca337f675166a22478868 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Wed, 17 Nov 2010 15:31:23 +0200
Subject: STORM-590 FIXED Add Preferences to enable the display of the Advanced
 and Development menus

- Added control_names for the "Show Advanced Menu" and "QAMode" checkboxes
---
 indra/newview/skins/default/xui/en/panel_preferences_advanced.xml | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'indra/newview')

diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 15d1222d00..ae9711418e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -97,6 +97,7 @@
      top_pad="5"
      width="237"/>
     <check_box
+     control_name="UseDebugMenus"
      follows="top|left"
      height="15"
      label="Show Advanced Menu"
@@ -106,6 +107,7 @@
      top_pad="5"
      width="237"/>
     <check_box
+     control_name="QAMode"
      follows="top|left"
      height="15"
      label="Show Developer Menu"
-- 
cgit v1.2.3