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_