Files
itgmania212121/src/MessageManager.cpp
T

324 lines
7.7 KiB
C++
Raw Normal View History

2005-02-09 05:20:49 +00:00
#include "global.h"
#include "MessageManager.h"
#include "Foreach.h"
#include "RageUtil.h"
#include "RageThreads.h"
#include "EnumHelper.h"
2006-09-21 04:27:45 +00:00
#include "LuaManager.h"
2005-02-09 05:20:49 +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[] = {
"CurrentGameChanged",
2005-05-07 08:34:20 +00:00
"CurrentStyleChanged",
2005-07-25 03:59:24 +00:00
"PlayModeChanged",
"CoinsChanged",
"CurrentSongChanged",
2005-02-25 05:23:29 +00:00
"CurrentStepsP1Changed",
"CurrentStepsP2Changed",
2005-05-18 07:14:19 +00:00
"CurrentCourseChanged",
"CurrentTrailP1Changed",
"CurrentTrailP2Changed",
"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",
"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",
"NoteCrossed",
2006-04-04 21:45:10 +00:00
"NoteWillCrossIn400Ms",
"NoteWillCrossIn800Ms",
"NoteWillCrossIn1200Ms",
"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",
"PlayerJoined",
"PlayerUnjoined",
2005-05-19 23:29:39 +00:00
"AutosyncChanged",
2005-06-23 08:05:09 +00:00
"PreferredSongGroupChanged",
"PreferredCourseGroupChanged",
"SortOrderChanged",
"LessonTry1",
"LessonTry2",
"LessonTry3",
"LessonCleared",
"LessonFailed",
"StorageDevicesChanged",
"AutoJoyMappingApplied",
2006-03-26 08:10:53 +00:00
"ScreenChanged",
"SongModified",
2006-11-15 23:34:48 +00:00
"ScoreMultiplierChangedP1",
"ScoreMultiplierChangedP2",
"StarPowerChangedP1",
"StarPowerChangedP2",
"CurrentComboChangedP1",
"CurrentComboChangedP2",
"StarMeterChangedP1",
"StarMeterChangedP2",
"LifeMeterChangedP1",
"LifeMeterChangedP2",
"UpdateScreenHeader",
};
2006-11-13 22:36:39 +00:00
XToString( MessageID );
static RageMutex g_Mutex( "MessageManager" );
typedef set<IMessageSubscriber*> SubscribersSet;
2006-01-22 01:00:06 +00:00
static map<RString,SubscribersSet> g_MessageToSubscribers;
Message::Message( const RString &s )
{
m_sName = s;
m_pParams = new LuaTable;
2007-03-02 06:15:56 +00:00
m_bBroadcast = false;
}
Message::Message( const RString &s, const LuaReference &params )
{
m_sName = s;
2007-03-02 06:15:56 +00:00
m_bBroadcast = false;
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 );
}
Message::~Message()
{
delete m_pParams;
}
void Message::PushParamTable( lua_State *L )
{
m_pParams->PushSelf( L );
}
void Message::SetParamTable( const LuaReference &params )
{
Lua *L = LUA->Get();
params.PushSelf( L );
m_pParams->SetFromStack( L );
LUA->Release( L );
}
const LuaReference &Message::GetParamTable() const
{
return *m_pParams;
}
2007-01-15 04:17:15 +00:00
void Message::GetParamFromStack( lua_State *L, const RString &sName ) const
{
m_pParams->Get( L, sName );
}
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
{
LockMut(g_Mutex);
SubscribersSet& subs = g_MessageToSubscribers[sMessage];
2009-01-06 17:54:21 +00:00
#ifdef DEBUG
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
subs.insert( pSubscriber );
2005-02-09 05:20:49 +00:00
}
2006-11-13 22:36:39 +00:00
void MessageManager::Subscribe( IMessageSubscriber* pSubscriber, MessageID m )
{
2006-11-14 04:26:38 +00:00
Subscribe( pSubscriber, MessageIDToString(m) );
}
2006-01-22 01:00:06 +00:00
void MessageManager::Unsubscribe( IMessageSubscriber* pSubscriber, const RString& sMessage )
2005-02-09 05:20:49 +00:00
{
LockMut(g_Mutex);
SubscribersSet& subs = g_MessageToSubscribers[sMessage];
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 )
{
2006-11-14 04:26:38 +00:00
Unsubscribe( pSubscriber, MessageIDToString(m) );
}
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);
LockMut(g_Mutex);
map<RString,SubscribersSet>::const_iterator iter = g_MessageToSubscribers.find( msg.GetName() );
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;
pSub->HandleMessage( msg );
2005-02-09 05:20:49 +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 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
}
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 )
{
}
2006-05-31 05:28:15 +00:00
MessageSubscriber::MessageSubscriber( const MessageSubscriber &cpy ):
IMessageSubscriber(cpy)
{
2006-08-16 22:32:36 +00:00
FOREACH_CONST( RString, cpy.m_vsSubscribedTo, msg )
this->SubscribeToMessage( *msg );
}
MessageSubscriber &MessageSubscriber::operator=(const MessageSubscriber &cpy)
{
if(&cpy == this)
return *this;
UnsubscribeAll();
FOREACH_CONST( RString, cpy.m_vsSubscribedTo, msg )
this->SubscribeToMessage( *msg );
return *this;
}
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 )
{
MESSAGEMAN->Subscribe( this, message );
2006-11-14 04:26:38 +00:00
m_vsSubscribedTo.push_back( MessageIDToString(message) );
}
void MessageSubscriber::UnsubscribeAll()
{
FOREACH_CONST( RString, m_vsSubscribedTo, s )
MESSAGEMAN->Unsubscribe( this, *s );
m_vsSubscribedTo.clear();
}
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 );
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.
*/