2005-02-09 05:20:49 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "MessageManager.h"
|
|
|
|
|
#include "Foreach.h"
|
|
|
|
|
#include "RageUtil.h"
|
2005-07-12 03:07:54 +00:00
|
|
|
#include "RageThreads.h"
|
2005-02-24 12:27:30 +00:00
|
|
|
#include "EnumHelper.h"
|
2006-09-21 04:27:45 +00:00
|
|
|
#include "LuaManager.h"
|
2005-02-09 05:20:49 +00:00
|
|
|
|
2005-07-12 03:07:54 +00:00
|
|
|
#include <set>
|
|
|
|
|
#include <map>
|
|
|
|
|
|
2005-02-09 05:20:49 +00:00
|
|
|
MessageManager* MESSAGEMAN = NULL; // global and accessable from anywhere in our program
|
|
|
|
|
|
|
|
|
|
|
2006-11-13 22:36:39 +00:00
|
|
|
static const char *MessageIDNames[] = {
|
2005-10-28 01:44:19 +00:00
|
|
|
"CurrentGameChanged",
|
2005-05-07 08:34:20 +00:00
|
|
|
"CurrentStyleChanged",
|
2005-07-25 03:59:24 +00:00
|
|
|
"PlayModeChanged",
|
2008-09-18 09:06:59 +00:00
|
|
|
"CoinsChanged",
|
2005-02-24 12:27:30 +00:00
|
|
|
"CurrentSongChanged",
|
2005-02-25 05:23:29 +00:00
|
|
|
"CurrentStepsP1Changed",
|
|
|
|
|
"CurrentStepsP2Changed",
|
2005-05-18 07:14:19 +00:00
|
|
|
"CurrentCourseChanged",
|
|
|
|
|
"CurrentTrailP1Changed",
|
|
|
|
|
"CurrentTrailP2Changed",
|
2005-10-10 04:36:04 +00:00
|
|
|
"GameplayLeadInChanged",
|
2005-02-25 05:23:29 +00:00
|
|
|
"EditStepsTypeChanged",
|
2006-02-21 11:24:53 +00:00
|
|
|
"EditCourseDifficultyChanged",
|
2005-02-25 05:23:29 +00:00
|
|
|
"EditSourceStepsChanged",
|
|
|
|
|
"EditSourceStepsTypeChanged",
|
2007-05-15 19:32:39 +00:00
|
|
|
"PreferredStepsTypeChanged",
|
2007-05-07 17:18:56 +00:00
|
|
|
"PreferredDifficultyP1Changed",
|
|
|
|
|
"PreferredDifficultyP2Changed",
|
|
|
|
|
"PreferredCourseDifficultyP1Changed",
|
|
|
|
|
"PreferredCourseDifficultyP2Changed",
|
2005-06-26 21:31:07 +00:00
|
|
|
"EditCourseEntryIndexChanged",
|
2005-08-04 21:13:29 +00:00
|
|
|
"EditLocalProfileIDChanged",
|
2005-04-09 09:34:54 +00:00
|
|
|
"GoalCompleteP1",
|
|
|
|
|
"GoalCompleteP2",
|
2005-04-24 11:03:02 +00:00
|
|
|
"NoteCrossed",
|
2006-04-04 21:45:10 +00:00
|
|
|
"NoteWillCrossIn400Ms",
|
|
|
|
|
"NoteWillCrossIn800Ms",
|
|
|
|
|
"NoteWillCrossIn1200Ms",
|
2005-05-01 06:42:30 +00:00
|
|
|
"CardRemovedP1",
|
|
|
|
|
"CardRemovedP2",
|
2005-05-01 22:59:00 +00:00
|
|
|
"BeatCrossed",
|
2005-05-02 21:33:02 +00:00
|
|
|
"MenuUpP1",
|
|
|
|
|
"MenuUpP2",
|
|
|
|
|
"MenuDownP1",
|
|
|
|
|
"MenuDownP2",
|
|
|
|
|
"MenuLeftP1",
|
|
|
|
|
"MenuLeftP2",
|
|
|
|
|
"MenuRightP1",
|
|
|
|
|
"MenuRightP2",
|
2006-03-23 00:16:18 +00:00
|
|
|
"MenuSelectionChanged",
|
2007-02-15 11:30:22 +00:00
|
|
|
"PlayerJoined",
|
2007-03-25 09:37:14 +00:00
|
|
|
"PlayerUnjoined",
|
2005-05-19 23:29:39 +00:00
|
|
|
"AutosyncChanged",
|
2005-06-23 08:05:09 +00:00
|
|
|
"PreferredSongGroupChanged",
|
|
|
|
|
"PreferredCourseGroupChanged",
|
2005-09-09 21:49:29 +00:00
|
|
|
"SortOrderChanged",
|
2005-09-12 06:21:30 +00:00
|
|
|
"LessonTry1",
|
|
|
|
|
"LessonTry2",
|
|
|
|
|
"LessonTry3",
|
|
|
|
|
"LessonCleared",
|
|
|
|
|
"LessonFailed",
|
2005-11-29 23:15:11 +00:00
|
|
|
"StorageDevicesChanged",
|
2006-01-26 04:51:07 +00:00
|
|
|
"AutoJoyMappingApplied",
|
2006-03-26 08:10:53 +00:00
|
|
|
"ScreenChanged",
|
2006-11-09 04:32:23 +00:00
|
|
|
"SongModified",
|
2006-11-15 23:34:48 +00:00
|
|
|
"ScoreMultiplierChangedP1",
|
|
|
|
|
"ScoreMultiplierChangedP2",
|
|
|
|
|
"StarPowerChangedP1",
|
|
|
|
|
"StarPowerChangedP2",
|
|
|
|
|
"CurrentComboChangedP1",
|
|
|
|
|
"CurrentComboChangedP2",
|
|
|
|
|
"StarMeterChangedP1",
|
|
|
|
|
"StarMeterChangedP2",
|
|
|
|
|
"LifeMeterChangedP1",
|
|
|
|
|
"LifeMeterChangedP2",
|
2008-05-24 01:07:56 +00:00
|
|
|
"UpdateScreenHeader",
|
2005-02-24 12:27:30 +00:00
|
|
|
};
|
2006-11-13 22:36:39 +00:00
|
|
|
XToString( MessageID );
|
2005-02-24 12:27:30 +00:00
|
|
|
|
2005-07-12 03:07:54 +00:00
|
|
|
static RageMutex g_Mutex( "MessageManager" );
|
|
|
|
|
|
|
|
|
|
typedef set<IMessageSubscriber*> SubscribersSet;
|
2006-01-22 01:00:06 +00:00
|
|
|
static map<RString,SubscribersSet> g_MessageToSubscribers;
|
2005-02-24 12:27:30 +00:00
|
|
|
|
2006-11-13 23:07:02 +00:00
|
|
|
Message::Message( const RString &s )
|
|
|
|
|
{
|
|
|
|
|
m_sName = s;
|
|
|
|
|
m_pParams = new LuaTable;
|
2007-03-02 06:15:56 +00:00
|
|
|
m_bBroadcast = false;
|
2006-11-13 23:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
2007-02-03 06:17:02 +00:00
|
|
|
Message::Message( const RString &s, const LuaReference ¶ms )
|
|
|
|
|
{
|
|
|
|
|
m_sName = s;
|
2007-03-02 06:15:56 +00:00
|
|
|
m_bBroadcast = false;
|
2007-02-03 06:17:02 +00:00
|
|
|
Lua *L = LUA->Get();
|
|
|
|
|
m_pParams = new LuaTable; // XXX: creates an extra table
|
|
|
|
|
params.PushSelf( L );
|
|
|
|
|
m_pParams->SetFromStack( L );
|
|
|
|
|
LUA->Release( L );
|
|
|
|
|
// m_pParams = new LuaTable( params );
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 23:07:02 +00:00
|
|
|
Message::~Message()
|
|
|
|
|
{
|
|
|
|
|
delete m_pParams;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Message::PushParamTable( lua_State *L )
|
|
|
|
|
{
|
|
|
|
|
m_pParams->PushSelf( L );
|
2006-11-13 23:51:24 +00:00
|
|
|
}
|
2006-11-13 23:07:02 +00:00
|
|
|
|
2007-02-03 06:17:02 +00:00
|
|
|
void Message::SetParamTable( const LuaReference ¶ms )
|
|
|
|
|
{
|
|
|
|
|
Lua *L = LUA->Get();
|
|
|
|
|
params.PushSelf( L );
|
|
|
|
|
m_pParams->SetFromStack( L );
|
|
|
|
|
LUA->Release( L );
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 23:51:24 +00:00
|
|
|
const LuaReference &Message::GetParamTable() const
|
|
|
|
|
{
|
|
|
|
|
return *m_pParams;
|
2006-11-13 23:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
2007-01-15 04:17:15 +00:00
|
|
|
void Message::GetParamFromStack( lua_State *L, const RString &sName ) const
|
|
|
|
|
{
|
|
|
|
|
m_pParams->Get( L, sName );
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 23:51:24 +00:00
|
|
|
void Message::SetParamFromStack( lua_State *L, const RString &sName )
|
|
|
|
|
{
|
|
|
|
|
m_pParams->Set( L, sName );
|
|
|
|
|
}
|
|
|
|
|
|
2005-02-09 05:20:49 +00:00
|
|
|
MessageManager::MessageManager()
|
|
|
|
|
{
|
2006-09-21 04:27:45 +00:00
|
|
|
// Register with Lua.
|
|
|
|
|
{
|
|
|
|
|
Lua *L = LUA->Get();
|
|
|
|
|
lua_pushstring( L, "MESSAGEMAN" );
|
|
|
|
|
this->PushSelf( L );
|
|
|
|
|
lua_settable( L, LUA_GLOBALSINDEX );
|
|
|
|
|
LUA->Release( L );
|
|
|
|
|
}
|
2005-02-09 05:20:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MessageManager::~MessageManager()
|
|
|
|
|
{
|
2006-09-21 04:27:45 +00:00
|
|
|
// Unregister with Lua.
|
|
|
|
|
LUA->UnsetGlobal( "MESSAGEMAN" );
|
2005-02-09 05:20:49 +00:00
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
void MessageManager::Subscribe( IMessageSubscriber* pSubscriber, const RString& sMessage )
|
2005-02-09 05:20:49 +00:00
|
|
|
{
|
2005-07-12 03:07:54 +00:00
|
|
|
LockMut(g_Mutex);
|
|
|
|
|
|
|
|
|
|
SubscribersSet& subs = g_MessageToSubscribers[sMessage];
|
2009-01-06 17:54:21 +00:00
|
|
|
#ifdef DEBUG
|
2005-02-23 18:53:54 +00:00
|
|
|
SubscribersSet::iterator iter = subs.find(pSubscriber);
|
2008-02-15 09:44:36 +00:00
|
|
|
ASSERT_M( iter == subs.end(), ssprintf("already subscribed to '%s'",sMessage.c_str()) );
|
2005-02-09 05:20:49 +00:00
|
|
|
#endif
|
2005-02-23 18:53:54 +00:00
|
|
|
subs.insert( pSubscriber );
|
2005-02-09 05:20:49 +00:00
|
|
|
}
|
2005-02-24 15:40:05 +00:00
|
|
|
|
2006-11-13 22:36:39 +00:00
|
|
|
void MessageManager::Subscribe( IMessageSubscriber* pSubscriber, MessageID m )
|
2005-02-24 15:40:05 +00:00
|
|
|
{
|
2006-11-14 04:26:38 +00:00
|
|
|
Subscribe( pSubscriber, MessageIDToString(m) );
|
2005-02-24 15:40:05 +00:00
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
void MessageManager::Unsubscribe( IMessageSubscriber* pSubscriber, const RString& sMessage )
|
2005-02-09 05:20:49 +00:00
|
|
|
{
|
2005-07-12 03:07:54 +00:00
|
|
|
LockMut(g_Mutex);
|
|
|
|
|
|
|
|
|
|
SubscribersSet& subs = g_MessageToSubscribers[sMessage];
|
2005-02-23 18:53:54 +00:00
|
|
|
SubscribersSet::iterator iter = subs.find(pSubscriber);
|
2005-02-09 05:20:49 +00:00
|
|
|
ASSERT( iter != subs.end() );
|
|
|
|
|
subs.erase( iter );
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 22:36:39 +00:00
|
|
|
void MessageManager::Unsubscribe( IMessageSubscriber* pSubscriber, MessageID m )
|
2005-02-24 15:40:05 +00:00
|
|
|
{
|
2006-11-14 04:26:38 +00:00
|
|
|
Unsubscribe( pSubscriber, MessageIDToString(m) );
|
2005-02-24 15:40:05 +00:00
|
|
|
}
|
|
|
|
|
|
2007-03-02 06:15:56 +00:00
|
|
|
void MessageManager::Broadcast( Message &msg ) const
|
2005-02-09 05:20:49 +00:00
|
|
|
{
|
2007-03-02 06:15:56 +00:00
|
|
|
msg.SetBroadcast(true);
|
|
|
|
|
|
2005-07-12 03:07:54 +00:00
|
|
|
LockMut(g_Mutex);
|
|
|
|
|
|
2006-11-13 23:51:24 +00:00
|
|
|
map<RString,SubscribersSet>::const_iterator iter = g_MessageToSubscribers.find( msg.GetName() );
|
2005-07-12 03:07:54 +00:00
|
|
|
if( iter == g_MessageToSubscribers.end() )
|
2005-02-25 05:23:29 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
FOREACHS_CONST( IMessageSubscriber*, iter->second, p )
|
2005-02-09 05:20:49 +00:00
|
|
|
{
|
2005-02-25 05:23:29 +00:00
|
|
|
IMessageSubscriber *pSub = *p;
|
2006-11-13 23:51:24 +00:00
|
|
|
pSub->HandleMessage( msg );
|
2005-02-09 05:20:49 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 23:51:24 +00:00
|
|
|
void MessageManager::Broadcast( const RString& sMessage ) const
|
|
|
|
|
{
|
|
|
|
|
ASSERT( !sMessage.empty() );
|
2007-03-02 06:15:56 +00:00
|
|
|
Message msg(sMessage);
|
|
|
|
|
Broadcast( msg );
|
2006-11-13 23:51:24 +00:00
|
|
|
}
|
|
|
|
|
|
2006-11-13 22:36:39 +00:00
|
|
|
void MessageManager::Broadcast( MessageID m ) const
|
2005-02-26 00:38:54 +00:00
|
|
|
{
|
2006-11-14 04:26:38 +00:00
|
|
|
Broadcast( MessageIDToString(m) );
|
2005-02-26 00:38:54 +00:00
|
|
|
}
|
|
|
|
|
|
2009-01-05 08:46:22 +00:00
|
|
|
bool MessageManager::IsSubscribedToMessage( IMessageSubscriber* pSubscriber, const RString &sMessage ) const
|
|
|
|
|
{
|
|
|
|
|
SubscribersSet& subs = g_MessageToSubscribers[sMessage];
|
|
|
|
|
return subs.find( pSubscriber ) != subs.end();
|
|
|
|
|
}
|
|
|
|
|
|
2006-01-22 01:00:06 +00:00
|
|
|
void IMessageSubscriber::ClearMessages( const RString sMessage )
|
2005-07-12 03:07:54 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2006-05-31 05:28:15 +00:00
|
|
|
MessageSubscriber::MessageSubscriber( const MessageSubscriber &cpy ):
|
|
|
|
|
IMessageSubscriber(cpy)
|
2006-02-06 01:26:52 +00:00
|
|
|
{
|
2006-08-16 22:32:36 +00:00
|
|
|
FOREACH_CONST( RString, cpy.m_vsSubscribedTo, msg )
|
|
|
|
|
this->SubscribeToMessage( *msg );
|
2006-02-06 01:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
2008-05-27 17:40:30 +00:00
|
|
|
MessageSubscriber &MessageSubscriber::operator=(const MessageSubscriber &cpy)
|
|
|
|
|
{
|
|
|
|
|
if(&cpy == this)
|
|
|
|
|
return *this;
|
|
|
|
|
|
|
|
|
|
UnsubscribeAll();
|
|
|
|
|
|
|
|
|
|
FOREACH_CONST( RString, cpy.m_vsSubscribedTo, msg )
|
|
|
|
|
this->SubscribeToMessage( *msg );
|
|
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-06 01:26:52 +00:00
|
|
|
void MessageSubscriber::SubscribeToMessage( const RString &sMessageName )
|
|
|
|
|
{
|
|
|
|
|
MESSAGEMAN->Subscribe( this, sMessageName );
|
|
|
|
|
m_vsSubscribedTo.push_back( sMessageName );
|
|
|
|
|
}
|
|
|
|
|
|
2006-11-13 22:36:39 +00:00
|
|
|
void MessageSubscriber::SubscribeToMessage( MessageID message )
|
2006-02-06 01:26:52 +00:00
|
|
|
{
|
|
|
|
|
MESSAGEMAN->Subscribe( this, message );
|
2006-11-14 04:26:38 +00:00
|
|
|
m_vsSubscribedTo.push_back( MessageIDToString(message) );
|
2006-02-06 01:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MessageSubscriber::UnsubscribeAll()
|
|
|
|
|
{
|
|
|
|
|
FOREACH_CONST( RString, m_vsSubscribedTo, s )
|
|
|
|
|
MESSAGEMAN->Unsubscribe( this, *s );
|
|
|
|
|
m_vsSubscribedTo.clear();
|
|
|
|
|
}
|
|
|
|
|
|
2005-07-12 03:07:54 +00:00
|
|
|
|
2005-02-24 20:04:46 +00:00
|
|
|
// lua start
|
|
|
|
|
#include "LuaBinding.h"
|
|
|
|
|
|
2005-06-20 05:02:03 +00:00
|
|
|
class LunaMessageManager: public Luna<MessageManager>
|
2005-02-24 20:04:46 +00:00
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
static int Broadcast( T* p, lua_State *L )
|
|
|
|
|
{
|
2006-11-14 04:22:27 +00:00
|
|
|
if( !lua_istable(L, 2) && !lua_isnoneornil(L, 2) )
|
|
|
|
|
luaL_typerror( L, 2, "table or nil" );
|
|
|
|
|
|
|
|
|
|
LuaReference ParamTable;
|
|
|
|
|
lua_pushvalue( L, 2 );
|
|
|
|
|
ParamTable.SetFromStack( L );
|
|
|
|
|
|
2007-02-03 06:17:02 +00:00
|
|
|
Message msg( SArg(1), ParamTable );
|
|
|
|
|
p->Broadcast( msg );
|
2005-02-24 20:04:46 +00:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2006-09-27 20:30:29 +00:00
|
|
|
LunaMessageManager()
|
2005-02-24 20:04:46 +00:00
|
|
|
{
|
2006-09-27 20:30:29 +00:00
|
|
|
ADD_METHOD( Broadcast );
|
2005-02-24 20:04:46 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
LUA_REGISTER_CLASS( MessageManager )
|
|
|
|
|
// lua end
|
|
|
|
|
|
2005-02-09 05:20:49 +00:00
|
|
|
/*
|
|
|
|
|
* (c) 2003-2004 Chris Danford
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* 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, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* 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 OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|