diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/lleventapi.h | 13 | ||||
| -rw-r--r-- | indra/llcommon/lleventdispatcher.cpp | 14 | ||||
| -rw-r--r-- | indra/llcommon/lleventdispatcher.h | 65 | 
3 files changed, 80 insertions, 12 deletions
| diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h index 2cd3b5bf89..96d1b03be8 100644 --- a/indra/llcommon/lleventapi.h +++ b/indra/llcommon/lleventapi.h @@ -46,6 +46,19 @@ public:      /// Get the documentation string      std::string getDesc() const { return mDesc; } +    /** +     * Publish only selected add() methods from LLEventDispatcher. +     * Every LLEventAPI add() @em must have a description string. +     */ +    template <typename CALLABLE> +    void add(const std::string& name, +             const std::string& desc, +             CALLABLE callable, +             const LLSD& required=LLSD()) +    { +        LLEventDispatcher::add(name, desc, callable, required); +    } +  private:      std::string mDesc;  }; diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp index 017bf3a521..5fa6059718 100644 --- a/indra/llcommon/lleventdispatcher.cpp +++ b/indra/llcommon/lleventdispatcher.cpp @@ -121,6 +121,20 @@ LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) cons      return found->second.mFunc;  } +LLSD LLEventDispatcher::getMetadata(const std::string& name) const +{ +    DispatchMap::const_iterator found = mDispatch.find(name); +    if (found == mDispatch.end()) +    { +        return LLSD(); +    } +    LLSD meta; +    meta["name"] = name; +    meta["desc"] = found->second.mDesc; +    meta["required"] = found->second.mRequired; +    return meta; +} +  LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):      LLEventDispatcher(pumpname, key),      mPump(pumpname, true),          // allow tweaking for uniqueness diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h index eba7b607f1..c8c4fe0c3c 100644 --- a/indra/llcommon/lleventdispatcher.h +++ b/indra/llcommon/lleventdispatcher.h @@ -19,6 +19,7 @@  #include <map>  #include <boost/function.hpp>  #include <boost/bind.hpp> +#include <boost/iterator/transform_iterator.hpp>  #include <typeinfo>  #include "llevents.h" @@ -73,6 +74,16 @@ public:          addMethod<CLASS>(name, desc, method, required);      } +    /// Convenience: for LLEventDispatcher, not every callable needs a +    /// documentation string. +    template <typename CALLABLE> +    void add(const std::string& name, +             CALLABLE callable, +             const LLSD& required=LLSD()) +    { +        add(name, "", callable, required); +    } +      /// Unregister a callable      bool remove(const std::string& name); @@ -87,10 +98,47 @@ public:      /// @a required prototype specified at add() time, die with LL_ERRS.      void operator()(const LLSD& event) const; +    /// @name Iterate over defined names +    //@{ +    typedef std::pair<std::string, std::string> NameDesc; + +private: +    struct DispatchEntry +    { +        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required): +            mFunc(func), +            mDesc(desc), +            mRequired(required) +        {} +        Callable mFunc; +        std::string mDesc; +        LLSD mRequired; +    }; +    typedef std::map<std::string, DispatchEntry> DispatchMap; + +public: +    /// We want the flexibility to redefine what data we store per name, +    /// therefore our public interface doesn't expose DispatchMap iterators, +    /// or DispatchMap itself, or DispatchEntry. Instead we explicitly +    /// transform each DispatchMap item to NameDesc on dereferencing. +    typedef boost::transform_iterator<NameDesc(*)(const DispatchMap::value_type&), DispatchMap::const_iterator> const_iterator; +    const_iterator begin() const +    { +        return boost::make_transform_iterator(mDispatch.begin(), makeNameDesc); +    } +    const_iterator end() const +    { +        return boost::make_transform_iterator(mDispatch.end(), makeNameDesc); +    } +    //@} +      /// Fetch the Callable for the specified name. If no such name was      /// registered, return an empty() Callable.      Callable get(const std::string& name) const; +    /// Get information about a specific Callable +    LLSD getMetadata(const std::string& name) const; +  private:      template <class CLASS, typename METHOD>      void addMethod(const std::string& name, const std::string& desc, @@ -111,19 +159,12 @@ private:      bool attemptCall(const std::string& name, const LLSD& event) const;      std::string mDesc, mKey; -    struct DispatchEntry -    { -        DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required): -            mFunc(func), -            mDesc(desc), -            mRequired(required) -        {} -        Callable mFunc; -        std::string mDesc; -        LLSD mRequired; -    }; -    typedef std::map<std::string, DispatchEntry> DispatchMap;      DispatchMap mDispatch; + +    static NameDesc makeNameDesc(const DispatchMap::value_type& item) +    { +        return NameDesc(item.first, item.second.mDesc); +    }  };  /** | 
