dvander@370: /**
ds@653: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1231: * SourceMod
ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
ds@1330: * =============================================================================
dvander@370: *
ds@1330: * This program is free software; you can redistribute it and/or modify it under
ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330: * Free Software Foundation.
dvander@1231: *
ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ds@1330: * details.
dvander@1231: *
ds@1330: * You should have received a copy of the GNU General Public License along with
ds@1330: * this program. If not, see .
dvander@1231: *
ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in
ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants
ds@1330: * this exception to all derivative works. AlliedModders LLC defines further
ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330: * or .
dvander@370: *
dvander@370: * Version: $Id$
dvander@370: */
dvander@370:
dvander@298: #ifndef _INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_
dvander@298: #define _INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_
dvander@298:
dvander@298: #include
dvander@298: #include
dvander@298: #include
dvander@298: #include
dvander@1391: #include
dvander@298: #include "sm_globals.h"
dvander@304: #include "ShareSys.h"
dvander@304: #include
dvander@305: #include
dvander@310: #include
faluco@1112: #include "PluginSys.h"
dvander@2086: #include "NativeOwner.h"
dvander@298:
voidedweasel@3511: class CPlayer;
voidedweasel@3511:
dvander@298: using namespace SourceMod;
dvander@298: using namespace SourceHook;
dvander@298:
dvander@1391: class CExtension;
dvander@1391:
dvander@1391: struct sm_extnative_t
dvander@1391: {
dvander@1391: CExtension *owner;
dvander@1391: const sp_nativeinfo_t *info;
dvander@1391: };
dvander@1391:
dvander@2086: class CExtension :
dvander@2086: public IExtension,
dvander@2086: public CNativeOwner
dvander@298: {
dvander@304: friend class CExtensionManager;
dvander@298: public:
dvander@1648: virtual ~CExtension();
dvander@298: public: //IExtension
dvander@298: IExtensionInterface *GetAPI();
dvander@298: const char *GetFilename();
skamonkey@3402: const char *GetPath() const;
dvander@298: IdentityToken_t *GetIdentity();
dvander@304: ITERATOR *FindFirstDependency(IExtension **pOwner, SMInterface **pInterface);
dvander@304: bool FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface);
dvander@304: void FreeDependencyIterator(ITERATOR *iter);
dvander@315: bool IsRunning(char *error, size_t maxlength);
dvander@298: public:
dvander@298: void SetError(const char *error);
dvander@2134: void AddDependency(const IfaceInfo *pInfo);
dvander@1150: void AddChildDependent(CExtension *pOther, SMInterface *iface);
dvander@304: void AddInterface(SMInterface *pInterface);
dvander@2086: void AddPlugin(CPlugin *pPlugin);
dvander@315: void MarkAllLoaded();
dvander@1572: void AddLibrary(const char *library);
dvander@1648: public:
dvander@1648: virtual bool Load(char *error, size_t maxlength);
dvander@1648: virtual bool IsLoaded() =0;
dvander@1648: virtual void Unload() =0;
kornholijo@2778: virtual bool Reload(char *error, size_t maxlength) =0;
dvander@2782: virtual bool IsSameFile(const char* file) =0;
dvander@1648: protected:
dvander@1648: void Initialize(const char *filename, const char *path);
dvander@1648: bool PerformAPICheck(char *error, size_t maxlength);
dvander@1648: void CreateIdentity();
dvander@1648: void DestroyIdentity();
dvander@1648: protected:
dvander@298: IdentityToken_t *m_pIdentToken;
dvander@298: IExtensionInterface *m_pAPI;
dvander@298: String m_File;
dvander@2782: String m_RealFile;
dvander@941: String m_Path;
dvander@298: String m_Error;
dvander@1150: List m_Deps; /** Dependencies */
dvander@1150: List m_ChildDeps; /** Children who might depend on us */
dvander@304: List m_Interfaces;
dvander@1572: List m_Libraries;
dvander@1648: unsigned int unload_code;
dvander@1648: bool m_bFullyLoaded;
dvander@1648: };
dvander@1648:
dvander@1648: class CLocalExtension : public CExtension
dvander@1648: {
dvander@1648: public:
dvander@1648: CLocalExtension(const char *filename);
dvander@1648: public:
dvander@1648: bool Load(char *error, size_t maxlength);
dvander@1648: bool IsLoaded();
dvander@1648: void Unload();
kornholijo@2778: bool Reload(char *error, size_t maxlength);
dvander@1648: bool IsExternal();
dvander@2782: bool IsSameFile(const char *file);
dvander@1648: private:
dvander@304: PluginId m_PlId;
dvander@1648: ILibrary *m_pLib;
dvander@1648: };
dvander@1648:
dvander@1648: class CRemoteExtension : public CExtension
dvander@1648: {
dvander@1648: public:
dvander@1648: CRemoteExtension(IExtensionInterface *pAPI, const char *filename, const char *path);
dvander@1648: public:
dvander@1648: bool Load(char *error, size_t maxlength);
dvander@1648: bool IsLoaded();
dvander@1648: void Unload();
kornholijo@2778: bool Reload(char *error, size_t maxlength);
dvander@1648: bool IsExternal();
dvander@2782: bool IsSameFile(const char *file);
dvander@298: };
dvander@298:
dvander@298: class CExtensionManager :
dvander@298: public IExtensionManager,
dvander@305: public SMGlobalClass,
dvander@310: public IPluginsListener,
dvander@310: public IRootConsoleCommand
dvander@298: {
dvander@1391: public:
dvander@1391: CExtensionManager();
dvander@1391: ~CExtensionManager();
dvander@298: public: //SMGlobalClass
dvander@298: void OnSourceModAllInitialized();
dvander@298: void OnSourceModShutdown();
dvander@298: public: //IExtensionManager
dvander@298: IExtension *LoadExtension(const char *path,
dvander@298: char *error,
ds@755: size_t maxlength);
dvander@298: bool UnloadExtension(IExtension *pExt);
dvander@298: IExtension *FindExtensionByFile(const char *file);
dvander@298: IExtension *FindExtensionByName(const char *ext);
dvander@1648: IExtension *LoadExternal(IExtensionInterface *pInterface,
dvander@1648: const char *filepath,
dvander@1648: const char *filename,
dvander@1648: char *error,
dvander@1648: size_t maxlength);
dvander@305: public: //IPluginsListener
dvander@305: void OnPluginDestroyed(IPlugin *plugin);
dvander@310: public: //IRootConsoleCommand
faluco@1541: void OnRootConsoleCommand(const char *cmdname, const CCommand &command);
dvander@298: public:
skamonkey@3402: IExtension *LoadAutoExtension(const char *path, bool bErrorOnMissing=true);
dvander@304: void BindDependency(IExtension *pOwner, IfaceInfo *pInfo);
dvander@304: void AddInterface(IExtension *pOwner, SMInterface *pInterface);
dvander@2086: void BindChildPlugin(IExtension *pParent, CPlugin *pPlugin);
dvander@315: void MarkAllLoaded();
dvander@324: void AddDependency(IExtension *pSource, const char *file, bool required, bool autoload);
dvander@397: void TryAutoload();
dvander@1572: void AddLibrary(IExtension *pSource, const char *library);
dvander@1573: bool LibraryExists(const char *library);
faluco@1993: void CallOnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax);
dvander@2134: void AddRawDependency(IExtension *ext, IdentityToken_t *other, void *iface);
dvander@868: public:
voidedweasel@3511: void ListExtensionsToClient(CPlayer *player, const CCommand &args);
voidedweasel@3511: public:
dvander@868: CExtension *GetExtensionFromIdent(IdentityToken_t *ptr);
dvander@1018: void Shutdown();
dvander@2086: CNativeOwner *GetNativeOwner(IExtension *pExt)
dvander@2086: {
dvander@2086: CExtension *p = (CExtension *)pExt;
dvander@2086: return p;
dvander@2086: }
dvander@298: private:
dvander@311: CExtension *FindByOrder(unsigned int num);
dvander@311: private:
dvander@298: List m_Libs;
dvander@298: };
dvander@298:
dvander@298: extern CExtensionManager g_Extensions;
dvander@298:
dvander@298: #endif //_INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_