summaryrefslogtreecommitdiff
path: root/indra/newview/llcommandhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llcommandhandler.cpp')
-rw-r--r--indra/newview/llcommandhandler.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
new file mode 100644
index 0000000000..47192c99f8
--- /dev/null
+++ b/indra/newview/llcommandhandler.cpp
@@ -0,0 +1,80 @@
+/**
+ * @file llcommandhandler.cpp
+ * @brief Central registry for text-driven "commands", most of
+ * which manipulate user interface. For example, the command
+ * "agent (uuid) about" will open the UI for an avatar's profile.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llcommandhandler.h"
+
+// system includes
+#include <boost/tokenizer.hpp>
+
+//---------------------------------------------------------------------------
+// Underlying registry for command handlers, not directly accessible.
+//---------------------------------------------------------------------------
+
+class LLCommandHandlerRegistry
+{
+public:
+ static LLCommandHandlerRegistry& instance();
+ void add(const char* cmd, LLCommandHandler* handler);
+ bool dispatch(const std::string& cmd, const std::vector<std::string>& params);
+
+private:
+ std::map<std::string, LLCommandHandler*> mMap;
+};
+
+// static
+LLCommandHandlerRegistry& LLCommandHandlerRegistry::instance()
+{
+ // Force this to be initialized on first call, because we're going
+ // to be adding items to the std::map before main() and we can't
+ // rely on a global being initialized in the right order.
+ static LLCommandHandlerRegistry instance;
+ return instance;
+}
+
+void LLCommandHandlerRegistry::add(const char* cmd, LLCommandHandler* handler)
+{
+ mMap[cmd] = handler;
+}
+
+bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
+ const std::vector<std::string>& params)
+{
+ std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd);
+ if (it == mMap.end()) return false;
+ LLCommandHandler* handler = it->second;
+ if (!handler) return false;
+ return handler->handle(params);
+}
+
+//---------------------------------------------------------------------------
+// Automatic registration of commands, runs before main()
+//---------------------------------------------------------------------------
+
+LLCommandHandler::LLCommandHandler(const char* cmd)
+{
+ LLCommandHandlerRegistry::instance().add(cmd, this);
+}
+
+LLCommandHandler::~LLCommandHandler()
+{
+ // Don't care about unregistering these, all the handlers
+ // should be static objects.
+}
+
+//---------------------------------------------------------------------------
+// Public interface
+//---------------------------------------------------------------------------
+
+// static
+bool LLCommandDispatcher::dispatch(const std::string& cmd, const std::vector<std::string>& params)
+{
+ return LLCommandHandlerRegistry::instance().dispatch(cmd, params);
+}