summaryrefslogtreecommitdiff
path: root/indra/llmessage/lldispatcher.h
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llmessage/lldispatcher.h
Print done when done.
Diffstat (limited to 'indra/llmessage/lldispatcher.h')
-rw-r--r--indra/llmessage/lldispatcher.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/indra/llmessage/lldispatcher.h b/indra/llmessage/lldispatcher.h
new file mode 100644
index 0000000000..e0eb706be1
--- /dev/null
+++ b/indra/llmessage/lldispatcher.h
@@ -0,0 +1,95 @@
+/**
+ * @file lldispatcher.h
+ * @brief LLDispatcher class header file.
+ *
+ * Copyright (c) 2004-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLDISPATCHER_H
+#define LL_LLDISPATCHER_H
+
+#include <map>
+#include <vector>
+#include <string>
+
+class LLDispatcher;
+class LLMessageSystem;
+class LLUUID;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLDispatchHandler
+//
+// Abstract base class for handling dispatches. Derive your own
+// classes, construct them, and add them to the dispatcher you want to
+// use.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLDispatchHandler
+{
+public:
+ typedef std::vector<std::string> sparam_t;
+ //typedef std::vector<S32> iparam_t;
+ LLDispatchHandler() {}
+ virtual ~LLDispatchHandler() {}
+ virtual bool operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& string) = 0;
+ //const iparam_t& integers) = 0;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLDispatcher
+//
+// Basic utility class that handles dispatching keyed operations to
+// function objects implemented as LLDispatchHandler derivations.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLDispatcher
+{
+public:
+ typedef std::string key_t;
+ typedef std::vector<std::string> keys_t;
+ typedef std::vector<std::string> sparam_t;
+ //typedef std::vector<S32> iparam_t;
+
+ // construct a dispatcher.
+ LLDispatcher();
+ virtual ~LLDispatcher();
+
+ // Returns if they keyed handler exists in this dispatcher.
+ bool isHandlerPresent(const key_t& name) const;
+
+ // copy all known keys onto keys_t structure
+ void copyAllHandlerNames(keys_t& names) const;
+
+ // Call this method with the name of the request that has come
+ // in. If the handler is present, it is called with the params and
+ // returns the return value from
+ bool dispatch(
+ const key_t& name,
+ const LLUUID& invoice,
+ const sparam_t& strings) const;
+ //const iparam_t& itegers) const;
+
+ // Add a handler. If one with the same key already exists, its
+ // pointer is returned, otherwise returns NULL. This object does
+ // not do memory management of the LLDispatchHandler, and relies
+ // on the caller to delete the object if necessary.
+ LLDispatchHandler* addHandler(const key_t& name, LLDispatchHandler* func);
+
+ // Helper method to unpack the dispatcher message bus
+ // format. Returns true on success.
+ static bool unpackMessage(
+ LLMessageSystem* msg,
+ key_t& method,
+ LLUUID& invoice,
+ sparam_t& parameters);
+
+protected:
+ typedef std::map<key_t, LLDispatchHandler*> dispatch_map_t;
+ dispatch_map_t mHandlers;
+};
+
+#endif // LL_LLDISPATCHER_H