123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _EVENTMANAGER_H_
- #define _EVENTMANAGER_H_
- #ifndef _CONSOLE_H_
- #include "console/console.h"
- #endif
- #ifndef _DISPATCHER_H_
- #include "util/messaging/dispatcher.h"
- #endif
- #ifndef _TSIMPLEHASHTABLE_H
- #include "core/tSimpleHashTable.h"
- #endif
- //-----------------------------------------------------------------------------
- /// Listener class used by the EventManager to dispatch messages to specific
- /// callbacks.
- //-----------------------------------------------------------------------------
- class EventManagerListener : public Dispatcher::IMessageListener
- {
- friend class EventManager;
- /// Stores subscription information for a subscriber.
- struct Subscriber
- {
- SimObjectPtr< SimObject > listener; ///< The listener object.
- StringTableEntry callback; ///< The callback to execute when the event is triggered.
- StringTableEntry event; ///< The event being listened for.
- U32 callDepth;
- bool removeFlag;
- };
- /// Subscriber table hashed by event name.
- SimpleHashTable< Vector<Subscriber> > mSubscribers;
- public:
- // Ensure that the subscriber map doesn't use case-sensitive string comparisons.
- EventManagerListener(): mSubscribers(64, false) {}
- /// Called by the EventManager queue when an event is triggered. Calls all listeners subscribed to the triggered event.
- virtual bool onMessageReceived( StringTableEntry queue, const char* event, const char* data );
- virtual bool onMessageObjectReceived( StringTableEntry queue, Message *msg ) { return true; };
- };
- /// @addtogroup msgsys Message System
- // @{
- //-----------------------------------------------------------------------------
- /// The EventManager class is a wrapper for the standard messaging system. It
- /// provides functionality for management of event queues, events, and
- /// subscriptions.
- ///
- /// Creating an EventManager is as simple as calling <tt>new EventManager</tt>
- /// and specifying a queue name.
- ///
- /// Example Usage:
- ///
- /// @code
- /// // Create the EventManager.
- /// $MyEventManager = new EventManager() { queue = "MyEventManager"; };
- ///
- /// // Create an event.
- /// $MyEventManager.registerEvent( "SomeCoolEvent" );
- ///
- /// // Create a listener and subscribe.
- /// $MyListener = new ScriptMsgListener() { class = MyListener; };
- /// $MyEventManager.subscribe( $MyListener, "SomeCoolEvent" );
- ///
- /// function MyListener::onSomeCoolEvent( %this, %data )
- /// {
- /// echo( "onSomeCoolEvent Triggered" );
- /// }
- ///
- /// // Trigger the event.
- /// $MyEventManager.postEvent( "SomeCoolEvent", "Data" );
- /// @endcode
- //-----------------------------------------------------------------------------
- class EventManager : public SimObject
- {
- typedef SimObject Parent;
- private:
- /// The name of the message queue.
- StringTableEntry mQueue;
- /// Registered events.
- Vector<StringTableEntry> mEvents;
- /// The event listener. Listens for all events and dispatches them to the appropriate subscribers.
- EventManagerListener mListener;
- /// List of all EventManagers.
- static Vector<EventManager*> smEventManagers;
- /// Sets the message queue.
- static bool _setMessageQueue( void *obj, const char *index, const char *data )
- {
- static_cast<EventManager*>( obj )->setMessageQueue( data );
- return false;
- };
- public:
- DECLARE_CONOBJECT( EventManager );
- EventManager();
- virtual ~EventManager();
- static void initPersistFields();
- /// @name Properties
- /// @{
- StringTableEntry getMessageQueue() const { return mQueue; }
- void setMessageQueue( const char* queue );
- /// @}
- /// @name Event Management
- /// @{
- /// Checks if an event is registered.
- bool isRegisteredEvent( const char* eventName );
- /// Registers an event.
- bool registerEvent( const char* eventName );
- /// Removes an event.
- void unregisterEvent( const char* eventName );
- /// Removes all events.
- void unregisterAllEvents();
- /// Triggers an event.
- bool postEvent( const char* eventName, const char* data );
- /// Adds a subscription to an event.
- bool subscribe( SimObject *callbackObj, const char* event, const char* callback = NULL );
- /// Remove a subscriber from an event.
- void remove( SimObject *cbObj, const char* event );
- void removeAll( SimObject *cbObj );
- /// @}
- /// @name Debug Output
- /// @{
- /// Prints all registered events to the console.
- void dumpEvents();
- /// Prints all subscribers to the console.
- void dumpSubscribers();
- /// Prints subscribers to a specific event to the console.
- void dumpSubscribers( const char* event );
- /// @}
- /// @name Event Manager Tracking
- /// @{
- /// Adds an EventManager.
- static void addEventManager( EventManager* em ) { smEventManagers.push_back( em ); };
- /// Removes an EventManager.
- static void removeEventManager( EventManager* em )
- {
- for( Vector<EventManager*>::iterator iter = smEventManagers.begin(); iter != smEventManagers.end(); iter++ )
- {
- if( *iter == em )
- {
- smEventManagers.erase_fast( iter );
- break;
- }
- }
- };
- /// Retrieves an EventManager.
- static EventManager* getEventManager( const char* name )
- {
- StringTableEntry queue = StringTable->insert( name );
- for( Vector<EventManager*>::iterator iter = smEventManagers.begin(); iter != smEventManagers.end(); iter++ )
- {
- if( ( *iter )->mQueue == queue )
- return *iter;
- }
- return NULL;
- };
- /// Prints all the EventManagers to the console.
- static void printEventManagers()
- {
- for( Vector<EventManager*>::iterator iter = smEventManagers.begin(); iter != smEventManagers.end(); iter++ )
- ( *iter )->dumpSubscribers();
- }
-
- /// @}
- };
- // @}
- #endif // _EVENTMANAGER_H_
|