From c219f56a3bd0d9ea4f9d6ed84629ae8f18350823 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 13 Nov 2006 23:07:02 +0000 Subject: [PATCH] work on allowing parameters to messages: pass a Message struct, not just a string --- stepmania/src/MessageManager.cpp | 63 +++++++++++--------------------- stepmania/src/MessageManager.h | 23 ++++++++++-- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/stepmania/src/MessageManager.cpp b/stepmania/src/MessageManager.cpp index e8a44bcc98..20658adcce 100644 --- a/stepmania/src/MessageManager.cpp +++ b/stepmania/src/MessageManager.cpp @@ -141,6 +141,27 @@ static RageMutex g_Mutex( "MessageManager" ); typedef set SubscribersSet; static map 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 ): diff --git a/stepmania/src/MessageManager.h b/stepmania/src/MessageManager.h index 6dc486594b..cad5176d57 100644 --- a/stepmania/src/MessageManager.h +++ b/stepmania/src/MessageManager.h @@ -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 m_aMessages; - friend class MessageManager; };