dvander@370: /** dvander@370: * =============================================================== dvander@370: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@370: * =============================================================== dvander@370: * dvander@370: * This file is not open source and may not be copied without explicit dvander@370: * written permission of AlliedModders LLC. This file may not be redistributed dvander@370: * in whole or significant part. dvander@370: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php 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@298: #include "sm_globals.h" dvander@304: #include "ShareSys.h" dvander@304: #include dvander@305: #include dvander@310: #include dvander@298: dvander@298: using namespace SourceMod; dvander@298: using namespace SourceHook; dvander@298: dvander@298: class CExtension : public IExtension dvander@298: { dvander@304: friend class CExtensionManager; dvander@298: public: dvander@298: CExtension(const char *filename, char *error, size_t maxlen); dvander@298: ~CExtension(); dvander@298: public: //IExtension dvander@298: IExtensionInterface *GetAPI(); dvander@298: const char *GetFilename(); dvander@298: IdentityToken_t *GetIdentity(); dvander@298: bool IsLoaded(); 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@304: void AddDependency(IfaceInfo *pInfo); dvander@304: void AddInterface(SMInterface *pInterface); dvander@305: void AddPlugin(IPlugin *pPlugin); dvander@305: void RemovePlugin(IPlugin *pPlugin); dvander@315: void MarkAllLoaded(); dvander@298: private: dvander@298: IdentityToken_t *m_pIdentToken; dvander@298: IExtensionInterface *m_pAPI; dvander@298: String m_File; dvander@298: ILibrary *m_pLib; dvander@298: String m_Error; dvander@304: List m_Deps; dvander@304: List m_Interfaces; dvander@305: List m_Plugins; dvander@315: List m_Natives; dvander@304: PluginId m_PlId; dvander@311: unsigned int unload_code; dvander@315: bool m_FullyLoaded; 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@298: public: //SMGlobalClass dvander@298: void OnSourceModAllInitialized(); dvander@298: void OnSourceModShutdown(); dvander@298: public: //IExtensionManager dvander@298: IExtension *LoadExtension(const char *path, dvander@298: ExtensionLifetime lifetime, dvander@298: char *error, dvander@298: size_t err_max); dvander@298: bool UnloadExtension(IExtension *pExt); dvander@298: IExtension *FindExtensionByFile(const char *file); dvander@298: IExtension *FindExtensionByName(const char *ext); dvander@305: public: //IPluginsListener dvander@305: void OnPluginDestroyed(IPlugin *plugin); dvander@310: public: //IRootConsoleCommand dvander@310: void OnRootConsoleCommand(const char *cmd, unsigned int argcount); dvander@298: public: dvander@298: IExtension *LoadAutoExtension(const char *path); dvander@304: void BindDependency(IExtension *pOwner, IfaceInfo *pInfo); dvander@304: void AddInterface(IExtension *pOwner, SMInterface *pInterface); dvander@305: void BindChildPlugin(IExtension *pParent, IPlugin *pPlugin); dvander@315: void AddNatives(IExtension *pOwner, const sp_nativeinfo_t *natives); dvander@315: void BindAllNativesToPlugin(IPlugin *pPlugin); dvander@315: void MarkAllLoaded(); dvander@324: void AddDependency(IExtension *pSource, const char *file, bool required, bool autoload); dvander@397: void TryAutoload(); 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_