work on allowing parameters to messages: pass a Message

struct, not just a string
This commit is contained in:
Glenn Maynard
2006-11-13 23:07:02 +00:00
parent ec061bebc3
commit c219f56a3b
2 changed files with 41 additions and 45 deletions
+22 -41
View File
@@ -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 ):
+19 -4
View File
@@ -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;
};