lleventfilter.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
- /**
- * @file lleventfilter.cpp
- * @author Nat Goodspeed
- * @date 2009-03-05
- * @brief Implementation for lleventfilter.
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009-2010, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/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();
- }