diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2011-09-26 15:44:21 -0400 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2011-09-26 15:44:21 -0400 | 
| commit | ad9c28a2693f0e05f229697bb906216f99029bed (patch) | |
| tree | e03f6ac599b6fcc48936da1b0dff2ecd38d78acb /indra/llcommon | |
| parent | d475a96e94be90e68cf34bf6c25d8ab259aa47b5 (diff) | |
| parent | 773a8e499e3a62043a5247774a4c14cde20b8cd4 (diff) | |
Automated merge with http://hg.secondlife.com/viewer-development
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/lleventapi.cpp | 30 | ||||
| -rw-r--r-- | indra/llcommon/lleventapi.h | 83 | ||||
| -rw-r--r-- | indra/llcommon/llevents.cpp | 11 | 
3 files changed, 124 insertions, 0 deletions
| diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp index 4270c8b511..ff5459c1eb 100644 --- a/indra/llcommon/lleventapi.cpp +++ b/indra/llcommon/lleventapi.cpp @@ -34,6 +34,7 @@  // std headers  // external library headers  // other Linden headers +#include "llerror.h"  LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):      lbase(name, field), @@ -45,3 +46,32 @@ LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const s  LLEventAPI::~LLEventAPI()  {  } + +LLEventAPI::Response::Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey): +    mResp(seed), +    mReq(request), +    mKey(replyKey) +{} + +LLEventAPI::Response::~Response() +{ +    // When you instantiate a stack Response object, if the original +    // request requested a reply, send it when we leave this block, no +    // matter how. +    sendReply(mResp, mReq, mKey); +} + +void LLEventAPI::Response::warn(const std::string& warning) +{ +    LL_WARNS("LLEventAPI::Response") << warning << LL_ENDL; +    mResp["warnings"].append(warning); +} + +void LLEventAPI::Response::error(const std::string& error) +{ +    // Use LL_WARNS rather than LL_ERROR: we don't want the viewer to shut +    // down altogether. +    LL_WARNS("LLEventAPI::Response") << error << LL_ENDL; + +    mResp["error"] = error; +} diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h index d75d521e8e..1a37d780b6 100644 --- a/indra/llcommon/lleventapi.h +++ b/indra/llcommon/lleventapi.h @@ -76,6 +76,89 @@ public:          LLEventDispatcher::add(name, desc, callable, required);      } +    /** +     * Instantiate a Response object in any LLEventAPI subclass method that +     * wants to guarantee a reply (if requested) will be sent on exit from the +     * method. The reply will be sent if request.has(@a replyKey), default +     * "reply". If specified, the value of request[replyKey] is the name of +     * the LLEventPump on which to send the reply. Conventionally you might +     * code something like: +     * +     * @code +     * void MyEventAPI::someMethod(const LLSD& request) +     * { +     *     // Send a reply event as long as request.has("reply") +     *     Response response(LLSD(), request); +     *     // ... +     *     // will be sent in reply event +     *     response["somekey"] = some_data; +     * } +     * @endcode +     */ +    class LL_COMMON_API Response +    { +    public: +        /** +         * Instantiating a Response object in an LLEventAPI subclass method +         * ensures that, if desired, a reply event will be sent. +         * +         * @a seed is the initial reply LLSD that will be further decorated before +         * being sent as the reply +         * +         * @a request is the incoming request LLSD; we particularly care about +         * [replyKey] and ["reqid"] +         * +         * @a replyKey [default "reply"] is the string name of the LLEventPump +         * on which the caller wants a reply. If <tt>(! +         * request.has(replyKey))</tt>, no reply will be sent. +         */ +        Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey="reply"); +        ~Response(); + +        /** +         * @code +         * if (some condition) +         * { +         *     response.warn("warnings are logged and collected in [\"warnings\"]"); +         * } +         * @endcode +         */ +        void warn(const std::string& warning); +        /** +         * @code +         * if (some condition isn't met) +         * { +         *     // In a function returning void, you can validly 'return +         *     // expression' if the expression is itself of type void. But +         *     // returning is up to you; response.error() has no effect on +         *     // flow of control. +         *     return response.error("error message, logged and also sent as [\"error\"]"); +         * } +         * @endcode +         */ +        void error(const std::string& error); + +        /** +         * set other keys... +         * +         * @code +         * // set any attributes you want to be sent in the reply +         * response["info"] = some_value; +         * // ... +         * response["ok"] = went_well; +         * @endcode +         */ +        LLSD& operator[](const LLSD::String& key) { return mResp[key]; } +		 +		 /** +		 * set the response to the given data +		 */ +		void setResponse(LLSD const & response){ mResp = response; } + +        LLSD mResp, mReq; +        LLSD::String mKey; +    }; +  private:      std::string mDesc;  }; diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index ff03506e84..db1ea4792b 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -591,6 +591,17 @@ void LLReqID::stamp(LLSD& response) const  bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey)  { +    // If the original request has no value for replyKey, it's pointless to +    // construct or send a reply event: on which LLEventPump should we send +    // it? Allow that to be optional: if the caller wants to require replyKey, +    // it can so specify when registering the operation method. +    if (! request.has(replyKey)) +    { +        return false; +    } + +    // Here the request definitely contains replyKey; reasonable to proceed. +      // Copy 'reply' to modify it.      LLSD newreply(reply);      // Get the ["reqid"] element from request | 
