diff options
author | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
commit | 420b91db29485df39fd6e724e782c449158811cb (patch) | |
tree | b471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llmessage/lldispatcher.h |
Print done when done.
Diffstat (limited to 'indra/llmessage/lldispatcher.h')
-rw-r--r-- | indra/llmessage/lldispatcher.h | 95 |
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 |