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;
|
typedef set<IMessageSubscriber*> SubscribersSet;
|
||||||
static map<RString,SubscribersSet> g_MessageToSubscribers;
|
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()
|
MessageManager::MessageManager()
|
||||||
{
|
{
|
||||||
// Register with Lua.
|
// Register with Lua.
|
||||||
@@ -204,7 +225,7 @@ void MessageManager::Broadcast( const RString& sMessage ) const
|
|||||||
FOREACHS_CONST( IMessageSubscriber*, iter->second, p )
|
FOREACHS_CONST( IMessageSubscriber*, iter->second, p )
|
||||||
{
|
{
|
||||||
IMessageSubscriber *pSub = *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 )
|
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 )
|
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 ):
|
MessageSubscriber::MessageSubscriber( const MessageSubscriber &cpy ):
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "LuaManager.h"
|
#include "LuaManager.h"
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
|
class LuaTable;
|
||||||
|
|
||||||
enum MessageID
|
enum MessageID
|
||||||
{
|
{
|
||||||
@@ -134,18 +135,32 @@ enum MessageID
|
|||||||
const RString& MessageIDToString( MessageID m );
|
const RString& MessageIDToString( MessageID m );
|
||||||
#define MessageToString MessageIDToString
|
#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
|
class IMessageSubscriber
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~IMessageSubscriber() { }
|
virtual ~IMessageSubscriber() { }
|
||||||
virtual void HandleMessage( const RString& sMessage ) = 0;
|
virtual void HandleMessage( const Message &msg ) = 0;
|
||||||
virtual void ProcessMessages( float fDeltaTime );
|
virtual void ProcessMessages( float fDeltaTime );
|
||||||
void ClearMessages( const RString sMessage = "" );
|
void ClearMessages( const RString sMessage = "" );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void HandleMessageInternal( const RString& sMessage );
|
|
||||||
vector<RString> m_aMessages;
|
|
||||||
|
|
||||||
friend class MessageManager;
|
friend class MessageManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user