work on allowing parameters to messages: pass a Message
struct, not just a string
This commit is contained in:
@@ -141,6 +141,27 @@ static RageMutex g_Mutex( "MessageManager" );
|
||||
typedef set<IMessageSubscriber*> SubscribersSet;
|
||||
static map<RString,SubscribersSet> g_MessageToSubscribers;
|
||||
|
||||
Message::Message( const RString &s )
|
||||
{
|
||||
m_sName = s;
|
||||
m_pParams = new LuaTable;
|
||||
}
|
||||
|
||||
Message::~Message()
|
||||
{
|
||||
delete m_pParams;
|
||||
}
|
||||
|
||||
void Message::PushParamTable( lua_State *L )
|
||||
{
|
||||
m_pParams->PushSelf( L );
|
||||
|
||||
}
|
||||
|
||||
void Message::PushParam( lua_State *L, RString sName )
|
||||
{
|
||||
}
|
||||
|
||||
MessageManager::MessageManager()
|
||||
{
|
||||
// Register with Lua.
|
||||
@@ -204,7 +225,7 @@ void MessageManager::Broadcast( const RString& sMessage ) const
|
||||
FOREACHS_CONST( IMessageSubscriber*, iter->second, p )
|
||||
{
|
||||
IMessageSubscriber *pSub = *p;
|
||||
pSub->HandleMessageInternal( sMessage );
|
||||
pSub->HandleMessage( Message(sMessage) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,50 +236,10 @@ void MessageManager::Broadcast( MessageID m ) const
|
||||
|
||||
void IMessageSubscriber::ClearMessages( const RString sMessage )
|
||||
{
|
||||
LockMut(g_Mutex);
|
||||
|
||||
if( sMessage.empty() )
|
||||
{
|
||||
m_aMessages.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
RemoveIfEqual( m_aMessages, sMessage );
|
||||
}
|
||||
|
||||
void IMessageSubscriber::HandleMessageInternal( const RString& sMessage )
|
||||
{
|
||||
g_Mutex.Lock();
|
||||
m_aMessages.push_back( sMessage );
|
||||
g_Mutex.Unlock();
|
||||
}
|
||||
|
||||
void IMessageSubscriber::ProcessMessages( float fDeltaTime )
|
||||
{
|
||||
/* Important optimization for the vast majority of cases: don't lock the
|
||||
* mutex if we have no messages. */
|
||||
if( m_aMessages.empty() )
|
||||
return;
|
||||
|
||||
g_Mutex.Lock();
|
||||
for( unsigned i = 0; i < m_aMessages.size(); ++i )
|
||||
{
|
||||
/* Remove the message from the list. */
|
||||
const RString sMessage = m_aMessages[i];
|
||||
m_aMessages.erase( m_aMessages.begin()+i );
|
||||
--i;
|
||||
|
||||
unsigned iSize = m_aMessages.size();
|
||||
|
||||
g_Mutex.Unlock();
|
||||
HandleMessage( sMessage );
|
||||
g_Mutex.Lock();
|
||||
|
||||
/* If the size changed, start over. */
|
||||
if( iSize != m_aMessages.size() )
|
||||
i = 0;
|
||||
}
|
||||
g_Mutex.Unlock();
|
||||
}
|
||||
|
||||
MessageSubscriber::MessageSubscriber( const MessageSubscriber &cpy ):
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "LuaManager.h"
|
||||
struct lua_State;
|
||||
class LuaTable;
|
||||
|
||||
enum MessageID
|
||||
{
|
||||
@@ -134,18 +135,32 @@ enum MessageID
|
||||
const RString& MessageIDToString( MessageID m );
|
||||
#define MessageToString MessageIDToString
|
||||
|
||||
struct Message
|
||||
{
|
||||
explicit Message( const RString &s );
|
||||
~Message();
|
||||
RString GetName() const { return m_sName; }
|
||||
|
||||
void PushParamTable( lua_State *L );
|
||||
void PushParam( lua_State *L, RString sName );
|
||||
|
||||
bool operator==( const RString &s ) const { return m_sName == s; }
|
||||
bool operator==( MessageID id ) const { return MessageIDToString(id) == m_sName; }
|
||||
|
||||
private:
|
||||
RString m_sName;
|
||||
LuaTable *m_pParams;
|
||||
};
|
||||
|
||||
class IMessageSubscriber
|
||||
{
|
||||
public:
|
||||
virtual ~IMessageSubscriber() { }
|
||||
virtual void HandleMessage( const RString& sMessage ) = 0;
|
||||
virtual void HandleMessage( const Message &msg ) = 0;
|
||||
virtual void ProcessMessages( float fDeltaTime );
|
||||
void ClearMessages( const RString sMessage = "" );
|
||||
|
||||
private:
|
||||
void HandleMessageInternal( const RString& sMessage );
|
||||
vector<RString> m_aMessages;
|
||||
|
||||
friend class MessageManager;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user