ShareSys::AddDependency now functions

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40947
This commit is contained in:
David Anderson 2007-06-16 01:34:05 +00:00
parent 173037a0e9
commit 74a2a1498c
2 changed files with 32 additions and 12 deletions

View File

@ -36,12 +36,18 @@ CExtension::CExtension(const char *filename, char *error, size_t maxlength)
char path[PLATFORM_MAX_PATH];
g_SourceMod.BuildPath(Path_SM, path, PLATFORM_MAX_PATH, "extensions/%s", filename);
m_Path.assign(path);
m_pLib = g_LibSys.OpenLibrary(path, error, maxlength);
m_pLib = NULL;
}
bool CExtension::Load(char *error, size_t maxlength)
{
m_pLib = g_LibSys.OpenLibrary(m_Path.c_str(), error, maxlength);
if (m_pLib == NULL)
{
return;
return false;
}
typedef IExtensionInterface *(*GETAPI)();
@ -52,7 +58,7 @@ CExtension::CExtension(const char *filename, char *error, size_t maxlength)
m_pLib->CloseLibrary();
m_pLib = NULL;
snprintf(error, maxlength, "Unable to find extension entry point");
return;
return false;
}
m_pAPI = pfnGetAPI();
@ -61,13 +67,13 @@ CExtension::CExtension(const char *filename, char *error, size_t maxlength)
m_pLib->CloseLibrary();
m_pLib = NULL;
snprintf(error, maxlength, "Extension version is too new to load (%d, max is %d)", m_pAPI->GetExtensionVersion(), SMINTERFACE_EXTENSIONAPI_VERSION);
return;
return false;
}
if (m_pAPI->IsMetamodExtension())
{
bool already;
m_PlId = g_pMMPlugins->Load(path, g_PLID, already, error, maxlength);
m_PlId = g_pMMPlugins->Load(m_Path.c_str(), g_PLID, already, error, maxlength);
}
m_pIdentToken = g_ShareSys.CreateIdentity(g_ExtType, this);
@ -88,7 +94,7 @@ CExtension::CExtension(const char *filename, char *error, size_t maxlength)
m_pLib = NULL;
g_ShareSys.DestroyIdentity(m_pIdentToken);
m_pIdentToken = NULL;
return;
return false;
} else {
/* Check if we're past load time */
if (!g_SourceMod.IsMapLoading())
@ -96,6 +102,8 @@ CExtension::CExtension(const char *filename, char *error, size_t maxlength)
m_pAPI->OnExtensionsAllLoaded();
}
}
return true;
}
CExtension::~CExtension()
@ -336,14 +344,17 @@ IExtension *CExtensionManager::LoadAutoExtension(const char *path)
char error[256];
CExtension *p = new CExtension(path, error, sizeof(error));
if (!p->IsLoaded())
/* We put us in the list beforehand so extensions that check for each other
* won't recursively load each other.
*/
m_Libs.push_back(p);
if (!p->Load(error, sizeof(error)) || !p->IsLoaded())
{
g_Logger.LogError("[SM] Unable to load extension \"%s\": %s", path, error);
p->SetError(error);
}
m_Libs.push_back(p);
return p;
}
@ -419,7 +430,7 @@ IExtension *CExtensionManager::LoadExtension(const char *file, ExtensionLifetime
/* :NOTE: lifetime is currently ignored */
if (!pExt->IsLoaded())
if (!pExt->Load(error, maxlength) || !pExt->IsLoaded())
{
delete pExt;
return NULL;
@ -631,8 +642,14 @@ void CExtensionManager::MarkAllLoaded()
void CExtensionManager::AddDependency(IExtension *pSource, const char *file, bool required, bool autoload)
{
/* :TODO: implement */
return;
/* This function doesn't really need to do anything now. We make sure the
* other extension is loaded, but handling of dependencies is really done
* by the interface fetcher.
*/
if (required || autoload)
{
LoadAutoExtension(file);
}
}
void CExtensionManager::OnRootConsoleCommand(const char *cmd, unsigned int argcount)

View File

@ -50,10 +50,13 @@ public:
void AddPlugin(IPlugin *pPlugin);
void RemovePlugin(IPlugin *pPlugin);
void MarkAllLoaded();
private:
bool Load(char *error, size_t maxlength);
private:
IdentityToken_t *m_pIdentToken;
IExtensionInterface *m_pAPI;
String m_File;
String m_Path;
ILibrary *m_pLib;
String m_Error;
List<IfaceInfo> m_Deps;