lleventfilter.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   lleventfilter.cpp
  3.  * @author Nat Goodspeed
  4.  * @date   2009-03-05
  5.  * @brief  Implementation for lleventfilter.
  6.  * 
  7.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2009-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. // Precompiled header
  35. #include "linden_common.h"
  36. // associated header
  37. #include "lleventfilter.h"
  38. // STL headers
  39. // std headers
  40. // external library headers
  41. #include <boost/bind.hpp>
  42. // other Linden headers
  43. #include "llerror.h"                // LL_ERRS
  44. #include "llsdutil.h"               // llsd_matches()
  45. LLEventFilter::LLEventFilter(LLEventPump& source, const std::string& name, bool tweak):
  46.     LLEventStream(name, tweak)
  47. {
  48.     source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1));
  49. }
  50. LLEventMatching::LLEventMatching(const LLSD& pattern):
  51.     LLEventFilter("matching"),
  52.     mPattern(pattern)
  53. {
  54. }
  55. LLEventMatching::LLEventMatching(LLEventPump& source, const LLSD& pattern):
  56.     LLEventFilter(source, "matching"),
  57.     mPattern(pattern)
  58. {
  59. }
  60. bool LLEventMatching::post(const LLSD& event)
  61. {
  62.     if (! llsd_matches(mPattern, event).empty())
  63.         return false;
  64.     return LLEventStream::post(event);
  65. }
  66. LLEventTimeoutBase::LLEventTimeoutBase():
  67.     LLEventFilter("timeout")
  68. {
  69. }
  70. LLEventTimeoutBase::LLEventTimeoutBase(LLEventPump& source):
  71.     LLEventFilter(source, "timeout")
  72. {
  73. }
  74. void LLEventTimeoutBase::actionAfter(F32 seconds, const Action& action)
  75. {
  76.     setCountdown(seconds);
  77.     mAction = action;
  78.     if (! mMainloop.connected())
  79.     {
  80.         LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
  81.         mMainloop = mainloop.listen(getName(), boost::bind(&LLEventTimeoutBase::tick, this, _1));
  82.     }
  83. }
  84. class ErrorAfter
  85. {
  86. public:
  87.     ErrorAfter(const std::string& message): mMessage(message) {}
  88.     void operator()()
  89.     {
  90.         LL_ERRS("LLEventTimeout") << mMessage << LL_ENDL;
  91.     }
  92. private:
  93.     std::string mMessage;
  94. };
  95. void LLEventTimeoutBase::errorAfter(F32 seconds, const std::string& message)
  96. {
  97.     actionAfter(seconds, ErrorAfter(message));
  98. }
  99. class EventAfter
  100. {
  101. public:
  102.     EventAfter(LLEventPump& pump, const LLSD& event):
  103.         mPump(pump),
  104.         mEvent(event)
  105.     {}
  106.     void operator()()
  107.     {
  108.         mPump.post(mEvent);
  109.     }
  110. private:
  111.     LLEventPump& mPump;
  112.     LLSD mEvent;
  113. };
  114. void LLEventTimeoutBase::eventAfter(F32 seconds, const LLSD& event)
  115. {
  116.     actionAfter(seconds, EventAfter(*this, event));
  117. }
  118. bool LLEventTimeoutBase::post(const LLSD& event)
  119. {
  120.     cancel();
  121.     return LLEventStream::post(event);
  122. }
  123. void LLEventTimeoutBase::cancel()
  124. {
  125.     mMainloop.disconnect();
  126. }
  127. bool LLEventTimeoutBase::tick(const LLSD&)
  128. {
  129.     if (countdownElapsed())
  130.     {
  131.         cancel();
  132.         mAction();
  133.     }
  134.     return false;                   // show event to other listeners
  135. }
  136. LLEventTimeout::LLEventTimeout() {}
  137. LLEventTimeout::LLEventTimeout(LLEventPump& source):
  138.     LLEventTimeoutBase(source)
  139. {
  140. }
  141. void LLEventTimeout::setCountdown(F32 seconds)
  142. {
  143.     mTimer.setTimerExpirySec(seconds);
  144. }
  145. bool LLEventTimeout::countdownElapsed() const
  146. {
  147.     return mTimer.hasExpired();
  148. }