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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llevent.cpp
  3.  * @brief LLEvent and LLEventListener base classes.
  4.  *
  5.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2006-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "linden_common.h"
  33. #include "llevent.h"
  34. using namespace LLOldEvents;
  35. /************************************************
  36.     Events
  37. ************************************************/
  38. // virtual
  39. LLEvent::~LLEvent()
  40. {
  41. }
  42. // virtual
  43. bool LLEvent::accept(LLEventListener* listener)
  44. {
  45. return true;
  46. }
  47. // virtual
  48. const std::string& LLEvent::desc()
  49. {
  50. return mDesc;
  51. }
  52. /************************************************
  53.     Observables
  54. ************************************************/
  55. LLObservable::LLObservable()
  56. : mDispatcher(new LLEventDispatcher())
  57. {
  58. }
  59. // virtual
  60. LLObservable::~LLObservable()
  61. {
  62. if (mDispatcher.notNull())
  63. {
  64. mDispatcher->disengage(this);
  65. mDispatcher = NULL;
  66. }
  67. }
  68. // virtual
  69. bool LLObservable::setDispatcher(LLPointer<LLEventDispatcher> dispatcher)
  70. {
  71. if (mDispatcher.notNull())
  72. {
  73. mDispatcher->disengage(this);
  74. mDispatcher = NULL;
  75. }
  76. if (dispatcher.notNull() || dispatcher->engage(this))
  77. {
  78. mDispatcher = dispatcher;
  79. return true;
  80. }
  81. return false;
  82. }
  83. // Returns the current dispatcher pointer.
  84. // virtual
  85. LLEventDispatcher* LLObservable::getDispatcher()
  86. {
  87. return mDispatcher;
  88. }
  89. // Notifies the dispatcher of an event being fired.
  90. void LLObservable::fireEvent(LLPointer<LLEvent> event, LLSD filter)
  91. {
  92. if (mDispatcher.notNull())
  93. {
  94. mDispatcher->fireEvent(event, filter);
  95. }
  96. }
  97. /************************************************
  98.     Dispatchers
  99. ************************************************/
  100. class LLEventDispatcher::Impl
  101. {
  102. public:
  103. virtual ~Impl() { }
  104. virtual bool engage(LLObservable* observable) { return true; }
  105. virtual void disengage(LLObservable* observable) { }
  106. virtual void addListener(LLEventListener *listener, LLSD filter, const LLSD& userdata) = 0;
  107. virtual void removeListener(LLEventListener *listener) = 0;
  108. virtual std::vector<LLListenerEntry> getListeners() const = 0;
  109. virtual bool fireEvent(LLPointer<LLEvent> event, LLSD filter) = 0;
  110. };
  111. bool LLEventDispatcher::engage(LLObservable* observable)
  112. {
  113. return impl->engage(observable);
  114. }
  115. void LLEventDispatcher::disengage(LLObservable* observable)
  116. {
  117. impl->disengage(observable);
  118. }
  119. void LLEventDispatcher::addListener(LLEventListener *listener, LLSD filter, const LLSD& userdata)
  120. {
  121. impl->addListener(listener, filter, userdata);
  122. }
  123. void LLEventDispatcher::removeListener(LLEventListener *listener)
  124. {
  125. impl->removeListener(listener);
  126. }
  127. std::vector<LLListenerEntry> LLEventDispatcher::getListeners() const
  128. {
  129. return impl->getListeners();
  130. }
  131. bool LLEventDispatcher::fireEvent(LLPointer<LLEvent> event, LLSD filter)
  132. {
  133. return impl->fireEvent(event, filter);
  134. }
  135. class LLSimpleDispatcher : public LLEventDispatcher::Impl
  136. {
  137. public:
  138. LLSimpleDispatcher(LLEventDispatcher *parent) : mParent(parent) { }
  139. virtual ~LLSimpleDispatcher();
  140. virtual void addListener(LLEventListener* listener, LLSD filter, const LLSD& userdata);
  141. virtual void removeListener(LLEventListener* listener);
  142. virtual std::vector<LLListenerEntry> getListeners() const;
  143. virtual bool fireEvent(LLPointer<LLEvent> event, LLSD filter);
  144. protected:
  145. std::vector<LLListenerEntry> mListeners;
  146. LLEventDispatcher *mParent;
  147. };
  148. LLSimpleDispatcher::~LLSimpleDispatcher()
  149. {
  150. while (mListeners.size() > 0)
  151. {
  152. removeListener(mListeners.begin()->listener);
  153. }
  154. }
  155. void LLSimpleDispatcher::addListener(LLEventListener* listener, LLSD filter, const LLSD& userdata)
  156. {
  157. if (listener == NULL) return;
  158. removeListener(listener);
  159. LLListenerEntry new_entry;
  160. new_entry.listener = listener;
  161. new_entry.filter = filter;
  162. new_entry.userdata = userdata;
  163. mListeners.push_back(new_entry);
  164. listener->handleAttach(mParent);
  165. }
  166. void LLSimpleDispatcher::removeListener(LLEventListener* listener)
  167. {
  168. std::vector<LLListenerEntry>::iterator itor = mListeners.begin();
  169. std::vector<LLListenerEntry>::iterator end = mListeners.end();
  170. for (; itor != end; ++itor)
  171. {
  172. if ((*itor).listener == listener)
  173. {
  174. mListeners.erase(itor);
  175. break;
  176. }
  177. }
  178. listener->handleDetach(mParent);
  179. }
  180. std::vector<LLListenerEntry> LLSimpleDispatcher::getListeners() const
  181. {
  182. std::vector<LLListenerEntry> ret;
  183. std::vector<LLListenerEntry>::const_iterator itor;
  184. for (itor=mListeners.begin(); itor!=mListeners.end(); ++itor)
  185. {
  186. ret.push_back(*itor);
  187. }
  188. return ret;
  189. }
  190. // virtual
  191. bool LLSimpleDispatcher::fireEvent(LLPointer<LLEvent> event, LLSD filter)
  192. {
  193. std::vector<LLListenerEntry>::iterator itor;
  194. std::string filter_string = filter.asString();
  195. for (itor=mListeners.begin(); itor!=mListeners.end(); ++itor)
  196. {
  197. LLListenerEntry& entry = *itor;
  198. if (filter_string == "" || entry.filter.asString() == filter_string)
  199. {
  200. (entry.listener)->handleEvent(event, (*itor).userdata);
  201. }
  202. }
  203. return true;
  204. }
  205. LLEventDispatcher::LLEventDispatcher()
  206. {
  207. impl = new LLSimpleDispatcher(this);
  208. }
  209. LLEventDispatcher::~LLEventDispatcher()
  210. {
  211. if (impl)
  212. {
  213. delete impl;
  214. impl = NULL;
  215. }
  216. }
  217. /************************************************
  218.     Listeners
  219. ************************************************/
  220. LLEventListener::~LLEventListener()
  221. {
  222. }
  223. LLSimpleListener::~LLSimpleListener()
  224. {
  225. clearDispatchers();
  226. }
  227. void LLSimpleListener::clearDispatchers()
  228. {
  229. // Remove myself from all listening dispatchers
  230. std::vector<LLEventDispatcher *>::iterator itor;
  231. while (mDispatchers.size() > 0)
  232. {
  233. itor = mDispatchers.begin();
  234. LLEventDispatcher *dispatcher = *itor;
  235. dispatcher->removeListener(this);
  236. itor = mDispatchers.begin();
  237. if (itor != mDispatchers.end() && (*itor) == dispatcher)
  238. {
  239. // Somehow, the dispatcher was not removed. Remove it forcibly
  240. mDispatchers.erase(itor);
  241. }
  242. }
  243. }
  244. bool LLSimpleListener::handleAttach(LLEventDispatcher *dispatcher)
  245. {
  246. // Add dispatcher if it doesn't already exist
  247. std::vector<LLEventDispatcher *>::iterator itor;
  248. for (itor = mDispatchers.begin(); itor != mDispatchers.end(); ++itor)
  249. {
  250. if ((*itor) == dispatcher) return true;
  251. }
  252. mDispatchers.push_back(dispatcher);
  253. return true;
  254. }
  255. bool LLSimpleListener::handleDetach(LLEventDispatcher *dispatcher)
  256. {
  257. // Remove dispatcher from list
  258. std::vector<LLEventDispatcher *>::iterator itor;
  259. for (itor = mDispatchers.begin(); itor != mDispatchers.end(); )
  260. {
  261. if ((*itor) == dispatcher)
  262. {
  263. itor = mDispatchers.erase(itor);
  264. }
  265. else
  266. {
  267. ++itor;
  268. }
  269. }
  270. return true;
  271. }