123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- //-----------------------------------------------------------------------------
- // 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 _DISPATCHER_H_
- #define _DISPATCHER_H_
- #ifndef _MESSAGE_H_
- #include "util/messaging/message.h"
- #endif
- #ifndef _CONSOLE_H_
- #include "console/console.h"
- #endif
- /// @addtogroup msgsys Message System
- // @{
- //-----------------------------------------------------------------------------
- /// @brief Namespace for the message dispatcher functions
- //-----------------------------------------------------------------------------
- namespace Dispatcher
- {
- // [tom, 2/19/2007] This semi colon prevents VS from auto indenting the comments
- // below, which is really annoying when you're trying to write docs.
- ;
- /// @addtogroup msgsys Message System
- // @{
- //-----------------------------------------------------------------------------
- // Interface for objects that receive messages
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- /// @brief Listener interface for objects that receive messages
- ///
- /// @see ScriptMsgListener
- //-----------------------------------------------------------------------------
- class IMessageListener
- {
- protected:
- /// List of queues this listener is registered with.
- Vector<StringTableEntry> mQueues;
- public:
- virtual ~IMessageListener();
- //-----------------------------------------------------------------------------
- /// @brief Callback for when messages are received
- ///
- /// @param queue The name of the queue the message was dispatched to
- /// @param msg The type of message
- /// @param data The data for the message
- /// @return false to prevent other listeners receiving this message, true otherwise
- /// @see onMessageObjectReceived()
- //-----------------------------------------------------------------------------
- virtual bool onMessageReceived(StringTableEntry queue, const char *msg, const char *data) = 0;
- //-----------------------------------------------------------------------------
- /// @brief Callback for when message objects are received
- ///
- /// @param queue The name of the queue the message was dispatched to
- /// @param msg The message object
- /// @return false to prevent other listeners receiving this message, true otherwise
- /// @see onMessageReceived()
- //-----------------------------------------------------------------------------
- virtual bool onMessageObjectReceived(StringTableEntry queue, Message *msg ) = 0;
- //-----------------------------------------------------------------------------
- /// @brief Callback for when the listener is added to a queue
- ///
- /// The default implementation of onAddToQueue() and onRemoveFromQueue()
- /// provide tracking of the queues this listener is added to through the
- /// #mQueues member. Overrides of onAddToQueue() or onRemoveFromQueue()
- /// should ensure they call the parent implementation in any overrides.
- ///
- /// @param queue The name of the queue that the listener added to
- /// @see onRemoveFromQueue()
- //-----------------------------------------------------------------------------
- virtual void onAddToQueue(StringTableEntry queue);
- //-----------------------------------------------------------------------------
- /// @brief Callback for when the listener is removed from a queue
- ///
- /// The default implementation of onAddToQueue() and onRemoveFromQueue()
- /// provide tracking of the queues this listener is added to through the
- /// #mQueues member. Overrides of onAddToQueue() or onRemoveFromQueue()
- /// should ensure they call the parent implementation in any overrides.
- ///
- /// @param queue The name of the queue the listener was removed from
- /// @see onAddToQueue()
- //-----------------------------------------------------------------------------
- virtual void onRemoveFromQueue(StringTableEntry queue);
- };
- //-----------------------------------------------------------------------------
- /// @brief Internal class for tracking message queues
- //-----------------------------------------------------------------------------
- struct MessageQueue
- {
- StringTableEntry mQueueName;
- VectorPtr<IMessageListener *> mListeners;
- MessageQueue() : mQueueName("")
- {
- }
- bool isEmpty() { return mListeners.size() == 0; }
- bool dispatchMessage(const char* event, const char* data)
- {
- for(VectorPtr<IMessageListener *>::iterator i = mListeners.begin();i != mListeners.end();i++)
- {
- if( !(*i)->onMessageReceived(mQueueName, event, data) )
- return false;
- }
- return true;
- }
- bool dispatchMessageObject(Message *msg)
- {
- for(VectorPtr<IMessageListener *>::iterator i = mListeners.begin();i != mListeners.end();i++)
- {
- if( !(*i)->onMessageObjectReceived(mQueueName, msg) )
- return false;
- }
- return true;
- }
- };
- //-----------------------------------------------------------------------------
- // Message Dispatcher Functions
- //-----------------------------------------------------------------------------
- /// @name Message Queue Management
- // @{
- //-----------------------------------------------------------------------------
- /// @brief Check if a message queue is registered
- ///
- /// @param name The name of the message queue
- /// @return true if the queue is registered, false otherwise
- /// @see registerMessageQueue(), unregisterMessageQueue()
- //-----------------------------------------------------------------------------
- extern bool isQueueRegistered(const char *name);
- //-----------------------------------------------------------------------------
- /// @brief Register a message queue
- ///
- /// @param name The name of the message queue to register
- /// @see isQueueRegistered(), unregisterMessageQueue()
- //-----------------------------------------------------------------------------
- extern void registerMessageQueue(const char *name);
- //-----------------------------------------------------------------------------
- /// @brief Register an anonymous message queue
- ///
- /// @return name of anonymous message queue for passing to other functions
- /// @see isQueueRegistered(), unregisterMessageQueue()
- //-----------------------------------------------------------------------------
- extern const char *registerAnonMessageQueue();
- //-----------------------------------------------------------------------------
- /// @brief Unregister a message queue
- ///
- /// @param name The name of the message queue
- /// @see registerMessageQueue(), isQueueRegistered()
- //-----------------------------------------------------------------------------
- extern void unregisterMessageQueue(const char *name);
- //-----------------------------------------------------------------------------
- /// @brief Register a listener with a queue to receive messages
- ///
- /// @param queue The name of the queue to register the listener with
- /// @param listener The listener interface that receives messages
- /// @return true for success, false otherwise
- /// @see unregisterMessageListener()
- //-----------------------------------------------------------------------------
- extern bool registerMessageListener(const char *queue, IMessageListener *listener);
- //-----------------------------------------------------------------------------
- /// @brief Unregister a listener with a queue
- ///
- /// @param queue The name of the queue to unregister the listener
- /// @param listener The listener interface that was passed to registerMessageListener()
- /// @see registerMessageListener()
- //-----------------------------------------------------------------------------
- extern void unregisterMessageListener(const char *queue, IMessageListener *listener);
- // @}
- /// @name Message Dispatcher
- // @{
- //-----------------------------------------------------------------------------
- /// @brief Dispatch a message to a queue
- ///
- /// @param queue Queue to dispatch the message to
- /// @param msg Message to dispatch
- /// @param data Data for message
- /// @return true for success, false for failure
- /// @see dispatchMessageObject()
- //-----------------------------------------------------------------------------
- extern bool dispatchMessage(const char *queue, const char *msg, const char *data);
- //-----------------------------------------------------------------------------
- /// @brief Dispatch a message object to a queue
- ///
- /// @param queue Queue to dispatch the message to
- /// @param msg Message to dispatch
- /// @return true for success, false for failure
- /// @see dispatchMessage()
- //-----------------------------------------------------------------------------
- extern bool dispatchMessageObject(const char *queue, Message *msg);
- // @}
- //-----------------------------------------------------------------------------
- // Internal Functions
- //-----------------------------------------------------------------------------
- /// @name Internal Functions
- // @{
- //-----------------------------------------------------------------------------
- /// @brief Internal function: Lock the dispatcher mutex.
- /// @return true for success, false for failure
- /// @see unlockDispatcherMutex()
- //-----------------------------------------------------------------------------
- extern bool lockDispatcherMutex();
- //-----------------------------------------------------------------------------
- /// @brief Internal function: Unlock the dispatcher mutex.
- /// @see lockDispatcherMutex()
- //-----------------------------------------------------------------------------
- extern void unlockDispatcherMutex();
- //-----------------------------------------------------------------------------
- /// @brief Internal function: obtain message queue. Dispatcher mutex must be locked.
- ///
- /// @param name Name of the queue
- /// @return Message queue
- /// @see lockDispatcherMutex(), unlockDispatcherMutex()
- //-----------------------------------------------------------------------------
- extern MessageQueue *getMessageQueue(const char *name);
- // @}
- // @}
- } // end namespace Dispatcher
- // @}
- #endif // _DISPATCHER_H_
|