1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2024-11-29 11:24:19 +01:00

added alias ability

fixed gamedll version finding fall through

--HG--
extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/trunk%40206
This commit is contained in:
David Anderson 2006-05-25 04:49:47 +00:00
parent c6c4c28db3
commit 581a0dc7a8
5 changed files with 250 additions and 24 deletions

View File

@ -44,11 +44,73 @@ CPluginManager::CPluginManager()
CPluginManager::~CPluginManager()
{
/*if (m_Plugins.size())
SourceHook::List<CNameAlias *>::iterator iter;
for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++)
{
UnloadAll();
m_Plugins.clear();
}*/
delete (*iter);
}
m_Aliases.clear();
}
const char *CPluginManager::LookupAlias(const char *alias)
{
SourceHook::List<CNameAlias *>::iterator iter;
CNameAlias *p;
for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++)
{
p = (*iter);
if (p->alias.compare(alias) == 0)
{
return p->value.c_str();
}
}
return NULL;
}
SourceHook::List<SourceMM::CNameAlias *>::iterator CPluginManager::_alias_begin()
{
return m_Aliases.begin();
}
SourceHook::List<SourceMM::CNameAlias *>::iterator CPluginManager::_alias_end()
{
return m_Aliases.end();
}
void CPluginManager::SetAlias(const char *alias, const char *value)
{
SourceHook::List<CNameAlias *>::iterator iter;
CNameAlias *p;
for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++)
{
p = (*iter);
if (p->alias.compare(alias) == 0)
{
if (value[0] == '\0')
{
iter = m_Aliases.erase(iter);
return;
} else {
p->value.assign(value);
return;
}
}
}
if (value[0] != '\0')
{
p = new CNameAlias;
p->alias.assign(alias);
p->value.assign(value);
m_Aliases.push_back(p);
}
}
CPluginManager::CPlugin::CPlugin() : m_Lib(NULL), m_API(NULL), m_Id(0), m_Source(0)
@ -261,7 +323,10 @@ CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source
if (error)
snprintf(error, maxlen, "File not found: %s", file);
pl->m_Status = Pl_NotFound;
} else {
}
if (fp)
{
fclose(fp);
fp = NULL;

View File

@ -43,6 +43,11 @@
namespace SourceMM
{
struct CNameAlias
{
SourceHook::String alias;
SourceHook::String value;
};
/**
* @brief Implements Plugin Manager API
*/
@ -77,6 +82,7 @@ namespace SourceMM
bool Pause(PluginId id, char *error, size_t maxlen);
bool Unpause(PluginId id, char *error, size_t maxlen);
bool UnloadAll();
void SetAlias(const char *alias, const char *value);
public:
bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source);
bool QueryRunning(PluginId id, char *error, size_t maxlength);
@ -106,6 +112,11 @@ namespace SourceMM
*/
bool Retry(PluginId id, char *error, size_t len);
//get alias info
const char *LookupAlias(const char *alias);
SourceHook::List<SourceMM::CNameAlias *>::iterator _alias_begin();
SourceHook::List<SourceMM::CNameAlias *>::iterator _alias_end();
//Internal iterators
SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _begin();
SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator _end();
@ -119,6 +130,7 @@ namespace SourceMM
private:
PluginId m_LastId;
SourceHook::List<CPlugin *> m_Plugins;
SourceHook::List<CNameAlias *> m_Aliases;
bool m_AllLoaded;
};
};

View File

@ -371,6 +371,12 @@ CON_COMMAND(meta, "Metamod:Source Menu")
const char *file = e->Cmd_Argv(2);
char full_path[255];
const char *alias = g_PluginMngr.LookupAlias(file);
if (alias)
{
file = alias;
}
if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0)
{
g_SmmAPI.PathFormat(full_path, sizeof(full_path)-1, "%s", file);
@ -410,12 +416,105 @@ CON_COMMAND(meta, "Metamod:Source Menu")
return;
}
} else if ( (strcmp(command, "alias") == 0) ||
(strcmp(command, "aliases") == 0) ) {
if (args >= 4)
{
const char *alias = e->Cmd_Argv(2);
const char *value = e->Cmd_Argv(3);
g_PluginMngr.SetAlias(alias, value);
if (value[0] == '\0')
{
CONMSG("Deleted alias: %s.\n", alias);
} else {
CONMSG("Set alias \"%s\" to: %s\n", alias, value);
}
} else if (args >= 3) {
const char *alias = e->Cmd_Argv(2);
const char *value = g_PluginMngr.LookupAlias(alias);
if (value)
{
CONMSG("Alias \"%s\" is set to: %s\n", alias, value);
} else {
CONMSG("Alias \"%s\" was not found.\n", alias);
}
} else {
SourceHook::List<SourceMM::CNameAlias *>::iterator iter, end;
SourceMM::CNameAlias *p;
iter = g_PluginMngr._alias_begin();
end = g_PluginMngr._alias_end();
size_t total = 0;
if (iter != end)
{
CONMSG("%-10.9s %s\n", "Alias", "File");
CONMSG(" --- \n");
for (; iter!=end; iter++)
{
p = (*iter);
CONMSG("%-10.9s %s\n", p->alias.c_str(), p->value.c_str());
total++;
}
CONMSG(" --- \n");
CONMSG("%d aliases total.\n", total);
} else {
CONMSG("No aliases found.\n");
}
}
return;
} else if (strcmp(command, "unload") == 0) {
if (args >= 3)
{
int id = atoi(e->Cmd_Argv(2));
const char *file = e->Cmd_Argv(2);
int id = atoi(file);
char error[255]={0};
if (id == 0 && isalpha(file[0]))
{
char full_path[255];
const char *alias = g_PluginMngr.LookupAlias(file);
if (alias)
{
file = alias;
}
/* first check if it's a known filename */
if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0)
{
g_SmmAPI.PathFormat(full_path, sizeof(full_path)-1, "%s", file);
snprintf(full_path, sizeof(full_path)-1, "%s", file);
} else {
const char *ext = UTIL_GetExtension(file);
#if defined WIN32 || defined _WIN32
ext = ext ? "" : ".dll";
#else
ext = ext ? "" : "_i486.so";
#endif
g_SmmAPI.PathFormat(full_path, sizeof(full_path)-1, "%s/%s%s", g_ModPath.c_str(), file, ext);
}
SourceHook::List<SourceMM::CPluginManager::CPlugin *>::iterator iter, end;
SourceMM::CPluginManager::CPlugin *pl;
iter = g_PluginMngr._begin();
end = g_PluginMngr._end();
for (; iter!=end; iter++)
{
pl = (*iter);
if (strcmp(pl->m_File.c_str(), full_path) == 0)
{
id = pl->m_Id;
break;
}
}
if (id == 0)
{
CONMSG("Plugin \"%s\" not found.\n", full_path);
return;
}
}
if (!g_PluginMngr.Unload(id, false, error, sizeof(error)-1))
{
CONMSG("Unload failed: %s\n", error);
@ -423,13 +522,10 @@ CON_COMMAND(meta, "Metamod:Source Menu")
}
CONMSG("Plugin %d unloaded.\n", id);
return;
} else {
CONMSG("Usage: meta unload <id>\n");
return;
}
return;
} else if (strcmp(command, "force_unload") == 0) {
if (args >= 3)
{
@ -485,6 +581,7 @@ CON_COMMAND(meta, "Metamod:Source Menu")
CONMSG("Metamod:Source Menu\n");
CONMSG("usage: meta <command> [arguments]\n");
CONMSG(" alias - list or set an alias\n");
CONMSG(" clear - Unload all plugins forcefully\n");
CONMSG(" cmds - Show plugin commands\n");
CONMSG(" cvars - Show plugin cvars\n");

View File

@ -376,10 +376,13 @@ SMM_API void *CreateInterface(const char *iface, int *ret)
{
//This is the interface we want! Right now we support versions 3 and 4.
int version = atoi(&(iface[len]));
int sizeTooBig = 0; //rename this to sizeWrong in the future!
if (version < MIN_GAMEDLL_VERSION || version > MAX_GAMEDLL_VERSION)
{
Error("GameDLL version %d is not supported by Metamod!", version);
return NULL;
//maybe this will get used in the future
sizeTooBig = version;
if (ret)
*ret = IFACE_FAILED;
}
SourceHook::List<GameDllInfo *>::iterator iter;
GameDllInfo *pInfo = NULL;
@ -401,8 +404,17 @@ SMM_API void *CreateInterface(const char *iface, int *ret)
}
if (g_GameDll.loaded)
{
InitMainStates();
if (sizeTooBig)
{
Error("This mod version requires a SourceMM update (ServerGameDLL%03d)!", sizeTooBig);
if (ret)
*ret = IFACE_FAILED;
return NULL;
} else {
InitMainStates();
}
} else {
sizeTooBig = 0;
if (ret)
*ret = IFACE_FAILED;
return NULL;
@ -457,22 +469,22 @@ void DLLShutdown_handler()
RETURN_META(MRES_SUPERCEDE);
}
int LoadPluginsFromFile(const char *file)
int LoadPluginsFromFile(const char *_file)
{
FILE *fp;
int total = 0, skipped=0;
PluginId id;
bool already;
fp = fopen(file, "rt");
fp = fopen(_file, "rt");
if (!fp)
{
LogMessage("[META] Could not open plugins file %s\n", file);
LogMessage("[META] Could not open plugins file %s\n", _file);
return -1;
}
char buffer[255], error[255], full_path[128];
const char *ptr, *ext;
const char *ptr, *ext, *file;
size_t length;
while (!feof(fp))
{
@ -482,18 +494,58 @@ int LoadPluginsFromFile(const char *file)
if (!length)
continue;
if (buffer[length-1] == '\n')
buffer[length-1] = '\0';
buffer[--length] = '\0';
UTIL_TrimLeft(buffer);
UTIL_TrimRight(buffer);
if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0)
continue;
file = buffer;
if (buffer[0] == '"')
{
char *cptr = buffer;
file = ++cptr;
while (*cptr)
{
if (*cptr == '"')
{
*cptr = '\0';
break;
}
cptr++;
}
} else {
char *cptr = buffer;
while (*cptr)
{
if (isspace(*cptr))
{
char *optr = cptr;
while (*cptr && isspace(*cptr))
cptr++;
*optr = '\0';
UTIL_TrimRight(cptr);
if (*cptr && isalpha(*cptr))
{
g_PluginMngr.SetAlias(buffer, cptr);
file = cptr;
}
break;
}
cptr++;
}
}
if (!file[0])
{
continue;
}
//First find if it's an absolute path or not...
if (buffer[0] == '/' || strncmp(&(buffer[1]), ":\\", 2) == 0)
if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0)
{
//If we're in an absolute path, ignore our normal heuristics
id = g_PluginMngr.Load(buffer, Pl_File, already, error, sizeof(error)-1);
id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)-1);
if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused)
{
LogMessage("[META] Failed to load plugin %s. %s", buffer, error);
@ -505,7 +557,7 @@ int LoadPluginsFromFile(const char *file)
}
} else {
//Attempt to find a file extension
ptr = UTIL_GetExtension(buffer);
ptr = UTIL_GetExtension(file);
//Add an extension if there's none there
if (!ptr)
{
@ -518,7 +570,7 @@ int LoadPluginsFromFile(const char *file)
ext = "";
}
//Format the new path
g_SmmAPI.PathFormat(full_path, sizeof(full_path)-1, "%s/%s%s", g_ModPath.c_str(), buffer, ext);
g_SmmAPI.PathFormat(full_path, sizeof(full_path)-1, "%s/%s%s", g_ModPath.c_str(), file, ext);
id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)-1);
if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused)
{

View File

@ -39,11 +39,11 @@
#define SM_MAJOR_VERSION 1 //never need to increase this
#define SM_VERS_API_MAJOR 1 //increase this on a breaking change
#define SM_VERS_API_MINOR 3 //increase this on a non-breaking API change
#define SM_VERS_RELEASE 1 //increase this on a bug-fix release.
#define SM_VERS_RELEASE 2 //increase this on a bug-fix release.
//We need a good CServerGameDLL version to work properly. We support these inclusively.
#define MIN_GAMEDLL_VERSION 3
#define MAX_GAMEDLL_VERSION 5
#define MAX_GAMEDLL_VERSION 4
/**
* @brief Entry point for HL2 Engine