diff options
Diffstat (limited to 'indra/newview/llfloaterregiondebugconsole.cpp')
-rw-r--r-- | indra/newview/llfloaterregiondebugconsole.cpp | 422 |
1 files changed, 211 insertions, 211 deletions
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index 1e3be4ce71..701b443b8d 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -1,211 +1,211 @@ -/** - * @file llfloaterregiondebugconsole.h - * @author Brad Kittenbrink <brad@lindenlab.com> - * @brief Quick and dirty console for region debug settings - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterregiondebugconsole.h" - -#include "llagent.h" -#include "llhttpnode.h" -#include "lllineeditor.h" -#include "lltexteditor.h" -#include "llviewerregion.h" -#include "llcorehttputil.h" - -// 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. - 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 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 - { - LL_INFOS() << "Received response from the debug console: " - << input << LL_ENDL; - sConsoleReplySignal(input["body"].asString()); - } - }; -} - -boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb) -{ - return sConsoleReplySignal.connect(cb); -} - -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() -{ - 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.getRegionCapability("SimConsoleAsync"); - if (url.empty()) - { - // Fall back to see if the old API is supported. - url = gAgent.getRegionCapability("SimConsole"); - if (url.empty()) - { - mOutput->appendText( - CONSOLE_NOT_SUPPORTED + PROMPT, - false); - return true; - } - } - - mOutput->appendText("> ", false); - return true; -} - -void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param) -{ - LLLineEditor* input = static_cast<LLLineEditor*>(ctrl); - std::string text = input->getText() + "\n"; - - std::string url = gAgent.getRegionCapability("SimConsoleAsync"); - if (url.empty()) - { - // Fall back to the old API - url = gAgent.getRegionCapability("SimConsole"); - if (url.empty()) - { - text += CONSOLE_UNAVAILABLE + PROMPT; - } - else - { - LLSD postData = LLSD(input->getText()); - LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, postData, - boost::bind(&LLFloaterRegionDebugConsole::onConsoleSuccess, this, _1), - boost::bind(&LLFloaterRegionDebugConsole::onConsoleError, this, _1)); - } - } - else - { - LLSD postData = LLSD(input->getText()); - LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, postData, - NULL, - boost::bind(&LLFloaterRegionDebugConsole::onAsyncConsoleError, this, _1)); - - } - - mOutput->appendText(text, false); - input->clear(); -} - -void LLFloaterRegionDebugConsole::onAsyncConsoleError(LLSD result) -{ - LL_WARNS("Console") << UNABLE_TO_SEND_COMMAND << LL_ENDL; - sConsoleReplySignal(UNABLE_TO_SEND_COMMAND); -} - -void LLFloaterRegionDebugConsole::onConsoleError(LLSD result) -{ - LL_WARNS("Console") << UNABLE_TO_SEND_COMMAND << LL_ENDL; - if (mOutput) - { - mOutput->appendText( - UNABLE_TO_SEND_COMMAND + PROMPT, - false); - } - -} - -void LLFloaterRegionDebugConsole::onConsoleSuccess(LLSD result) -{ - if (mOutput) - { - LLSD response = result; - if (response.isMap() && response.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT)) - { - response = response[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT]; - } - mOutput->appendText( - response.asString() + PROMPT, false); - } -} - -void LLFloaterRegionDebugConsole::onReplyReceived(const std::string& output) -{ - mOutput->appendText(output + PROMPT, false); -} - -LLHTTPRegistration<ConsoleResponseNode> - gHTTPRegistrationMessageDebugConsoleResponse( - "/message/SimConsoleResponse"); +/**
+ * @file llfloaterregiondebugconsole.h
+ * @author Brad Kittenbrink <brad@lindenlab.com>
+ * @brief Quick and dirty console for region debug settings
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterregiondebugconsole.h"
+
+#include "llagent.h"
+#include "llhttpnode.h"
+#include "lllineeditor.h"
+#include "lltexteditor.h"
+#include "llviewerregion.h"
+#include "llcorehttputil.h"
+
+// 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.
+ 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 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
+ {
+ LL_INFOS() << "Received response from the debug console: "
+ << input << LL_ENDL;
+ sConsoleReplySignal(input["body"].asString());
+ }
+ };
+}
+
+boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb)
+{
+ return sConsoleReplySignal.connect(cb);
+}
+
+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()
+{
+ 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.getRegionCapability("SimConsoleAsync");
+ if (url.empty())
+ {
+ // Fall back to see if the old API is supported.
+ url = gAgent.getRegionCapability("SimConsole");
+ if (url.empty())
+ {
+ mOutput->appendText(
+ CONSOLE_NOT_SUPPORTED + PROMPT,
+ false);
+ return true;
+ }
+ }
+
+ mOutput->appendText("> ", false);
+ return true;
+}
+
+void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)
+{
+ LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);
+ std::string text = input->getText() + "\n";
+
+ std::string url = gAgent.getRegionCapability("SimConsoleAsync");
+ if (url.empty())
+ {
+ // Fall back to the old API
+ url = gAgent.getRegionCapability("SimConsole");
+ if (url.empty())
+ {
+ text += CONSOLE_UNAVAILABLE + PROMPT;
+ }
+ else
+ {
+ LLSD postData = LLSD(input->getText());
+ LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, postData,
+ boost::bind(&LLFloaterRegionDebugConsole::onConsoleSuccess, this, _1),
+ boost::bind(&LLFloaterRegionDebugConsole::onConsoleError, this, _1));
+ }
+ }
+ else
+ {
+ LLSD postData = LLSD(input->getText());
+ LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, postData,
+ NULL,
+ boost::bind(&LLFloaterRegionDebugConsole::onAsyncConsoleError, this, _1));
+
+ }
+
+ mOutput->appendText(text, false);
+ input->clear();
+}
+
+void LLFloaterRegionDebugConsole::onAsyncConsoleError(LLSD result)
+{
+ LL_WARNS("Console") << UNABLE_TO_SEND_COMMAND << LL_ENDL;
+ sConsoleReplySignal(UNABLE_TO_SEND_COMMAND);
+}
+
+void LLFloaterRegionDebugConsole::onConsoleError(LLSD result)
+{
+ LL_WARNS("Console") << UNABLE_TO_SEND_COMMAND << LL_ENDL;
+ if (mOutput)
+ {
+ mOutput->appendText(
+ UNABLE_TO_SEND_COMMAND + PROMPT,
+ false);
+ }
+
+}
+
+void LLFloaterRegionDebugConsole::onConsoleSuccess(LLSD result)
+{
+ if (mOutput)
+ {
+ LLSD response = result;
+ if (response.isMap() && response.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT))
+ {
+ response = response[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT];
+ }
+ mOutput->appendText(
+ response.asString() + PROMPT, false);
+ }
+}
+
+void LLFloaterRegionDebugConsole::onReplyReceived(const std::string& output)
+{
+ mOutput->appendText(output + PROMPT, false);
+}
+
+LLHTTPRegistration<ConsoleResponseNode>
+ gHTTPRegistrationMessageDebugConsoleResponse(
+ "/message/SimConsoleResponse");
|