diff options
| author | Nat Goodspeed <nat@lindenlab.com> | 2009-05-11 20:05:46 +0000 | 
|---|---|---|
| committer | Nat Goodspeed <nat@lindenlab.com> | 2009-05-11 20:05:46 +0000 | 
| commit | dc934629919bdcaea72c78e5291263914fb958ec (patch) | |
| tree | 0ac81213f607d9a3a133481758fa2274fe986aa3 /indra/llcommon/lleventfilter.cpp | |
| parent | 3800c0df910c83e987184d541b868168fc2b5bec (diff) | |
svn merge -r113003:119136 svn+ssh://svn.lindenlab.com/svn/linden/branches/login-api/login-api-2 svn+ssh://svn.lindenlab.com/svn/linden/branches/login-api/login-api-3
Diffstat (limited to 'indra/llcommon/lleventfilter.cpp')
| -rw-r--r-- | indra/llcommon/lleventfilter.cpp | 149 | 
1 files changed, 149 insertions, 0 deletions
| diff --git a/indra/llcommon/lleventfilter.cpp b/indra/llcommon/lleventfilter.cpp new file mode 100644 index 0000000000..74133781be --- /dev/null +++ b/indra/llcommon/lleventfilter.cpp @@ -0,0 +1,149 @@ +/** + * @file   lleventfilter.cpp + * @author Nat Goodspeed + * @date   2009-03-05 + * @brief  Implementation for lleventfilter. + *  + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "linden_common.h" +// associated header +#include "lleventfilter.h" +// STL headers +// std headers +// external library headers +#include <boost/bind.hpp> +// other Linden headers +#include "llerror.h"                // LL_ERRS +#include "llsdutil.h"               // llsd_matches() + +LLEventFilter::LLEventFilter(LLEventPump& source, const std::string& name, bool tweak): +    LLEventStream(name, tweak) +{ +    source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1)); +} + +LLEventMatching::LLEventMatching(const LLSD& pattern): +    LLEventFilter("matching"), +    mPattern(pattern) +{ +} + +LLEventMatching::LLEventMatching(LLEventPump& source, const LLSD& pattern): +    LLEventFilter(source, "matching"), +    mPattern(pattern) +{ +} + +bool LLEventMatching::post(const LLSD& event) +{ +    if (! llsd_matches(mPattern, event).empty()) +        return false; + +    return LLEventStream::post(event); +} + +LLEventTimeoutBase::LLEventTimeoutBase(): +    LLEventFilter("timeout") +{ +} + +LLEventTimeoutBase::LLEventTimeoutBase(LLEventPump& source): +    LLEventFilter(source, "timeout") +{ +} + +void LLEventTimeoutBase::actionAfter(F32 seconds, const Action& action) +{ +    setCountdown(seconds); +    mAction = action; +    if (! mMainloop.connected()) +    { +        LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop")); +        mMainloop = mainloop.listen(getName(), boost::bind(&LLEventTimeoutBase::tick, this, _1)); +    } +} + +class ErrorAfter +{ +public: +    ErrorAfter(const std::string& message): mMessage(message) {} + +    void operator()() +    { +        LL_ERRS("LLEventTimeout") << mMessage << LL_ENDL; +    } + +private: +    std::string mMessage; +}; + +void LLEventTimeoutBase::errorAfter(F32 seconds, const std::string& message) +{ +    actionAfter(seconds, ErrorAfter(message)); +} + +class EventAfter +{ +public: +    EventAfter(LLEventPump& pump, const LLSD& event): +        mPump(pump), +        mEvent(event) +    {} + +    void operator()() +    { +        mPump.post(mEvent); +    } + +private: +    LLEventPump& mPump; +    LLSD mEvent; +}; + +void LLEventTimeoutBase::eventAfter(F32 seconds, const LLSD& event) +{ +    actionAfter(seconds, EventAfter(*this, event)); +} + +bool LLEventTimeoutBase::post(const LLSD& event) +{ +    cancel(); +    return LLEventStream::post(event); +} + +void LLEventTimeoutBase::cancel() +{ +    mMainloop.disconnect(); +} + +bool LLEventTimeoutBase::tick(const LLSD&) +{ +    if (countdownElapsed()) +    { +        cancel(); +        mAction(); +    } +    return false;                   // show event to other listeners +} + +LLEventTimeout::LLEventTimeout() {} + +LLEventTimeout::LLEventTimeout(LLEventPump& source): +    LLEventTimeoutBase(source) +{ +} + +void LLEventTimeout::setCountdown(F32 seconds) +{ +    mTimer.setTimerExpirySec(seconds); +} + +bool LLEventTimeout::countdownElapsed() const +{ +    return mTimer.hasExpired(); +} | 
