Added new AllPluginsLoaded callback

--HG--
extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/trunk%4019
This commit is contained in:
David Anderson 2005-04-18 18:21:57 +00:00
parent 096dfb6a6f
commit ddb34f91ea
4 changed files with 37 additions and 2 deletions

View File

@ -24,6 +24,7 @@ CPluginManager g_PluginMngr;
CPluginManager::CPluginManager() CPluginManager::CPluginManager()
{ {
m_LastId = Pl_MinId; m_LastId = Pl_MinId;
m_AllLoaded = false;
} }
CPluginManager::~CPluginManager() CPluginManager::~CPluginManager()
@ -84,6 +85,24 @@ CPluginManager::CPlugin *CPluginManager::FindById(PluginId id)
return NULL; return NULL;
} }
void CPluginManager::SetAllLoaded()
{
m_AllLoaded = true;
PluginIter i;
for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++)
{
if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API )
{
//004 is when we added this callback
if ( (*i)->m_API->GetApiVersion() < 004 )
{
(*i)->m_API->AllPluginsLoaded();
}
}
}
}
bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen)
{ {
CPlugin *pl = FindById(id); CPlugin *pl = FindById(id);
@ -179,6 +198,12 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source
if (pl->m_API->Load(pl->m_Id, static_cast<ISmmAPI *>(&g_SmmAPI), &(pl->fac_list), error, maxlen)) if (pl->m_API->Load(pl->m_Id, static_cast<ISmmAPI *>(&g_SmmAPI), &(pl->fac_list), error, maxlen))
{ {
pl->m_Status = Pl_Running; pl->m_Status = Pl_Running;
if (m_AllLoaded)
{
//API 004 is when we added this callback
if (pl->m_API->GetApiVersion() >= 4)
pl->m_API->AllPluginsLoaded();
}
} else { } else {
pl->m_Status = Pl_Refused; pl->m_Status = Pl_Refused;
} }

View File

@ -47,6 +47,7 @@ namespace SourceMM
public: public:
CPluginManager(); CPluginManager();
~CPluginManager(); ~CPluginManager();
void SetAllLoaded();
public: public:
PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen); PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen);
bool Unload(PluginId id, bool force, char *error, size_t maxlen); bool Unload(PluginId id, bool force, char *error, size_t maxlen);
@ -76,6 +77,7 @@ namespace SourceMM
private: private:
PluginId m_LastId; PluginId m_LastId;
std::list<CPlugin *> m_Plugins; std::list<CPlugin *> m_Plugins;
bool m_AllLoaded;
}; };
}; };

View File

@ -20,7 +20,7 @@
#include <sourcehook/sourcehook.h> #include <sourcehook/sourcehook.h>
#include "ISmmAPI.h" #include "ISmmAPI.h"
#define PLAPI_VERSION 003 #define PLAPI_VERSION 004
#define PLAPI_NAME "ISmmPlugin" #define PLAPI_NAME "ISmmPlugin"
struct factories struct factories
@ -83,6 +83,11 @@ public:
virtual const char *GetVersion() =0; virtual const char *GetVersion() =0;
virtual const char *GetDate() =0; virtual const char *GetDate() =0;
virtual const char *GetLogTag() =0; virtual const char *GetLogTag() =0;
public:
/**
* @brief Called when all plugins have been loaded - API version 4
*/
virtual void AllPluginsLoaded() =0;
}; };
#define PL_EXPOSURE CreateInterface #define PL_EXPOSURE CreateInterface

View File

@ -229,6 +229,9 @@ bool CServerGameDLL::DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn
LoadPluginsFromFile(full_path); LoadPluginsFromFile(full_path);
//All plugins are now loaded.
g_PluginMngr.SetAllLoaded();
return true; return true;
} }
} }
@ -251,7 +254,7 @@ bool CServerGameDLL::DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn
if (fdwReason == DLL_PROCESS_DETACH) if (fdwReason == DLL_PROCESS_DETACH)
{ {
if (g_GameDll.lib && g_GameDll.loaded) if (g_GameDll.lib && g_GameDll.loaded)
//dlclose(g_GameDll.lib); dlclose(g_GameDll.lib);
memset(&g_GameDll, 0, sizeof(GameDllInfo)); memset(&g_GameDll, 0, sizeof(GameDllInfo));
} }
return TRUE; return TRUE;