dvander@372: /** dvander@375: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1226: * SourceMod ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@372: * 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@379: * 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@1226: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1226: * 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@372: * dvander@372: * Version: $Id$ dvander@372: */ dvander@372: dvander@324: #ifndef _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@324: #define _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@324: dvander@372: /** dvander@372: * @file IShareSys.h dvander@372: * @brief Defines the Share System, responsible for shared resources and dependencies. dvander@372: * dvander@372: * The Share System also manages the Identity_t data type, although this is internally dvander@372: * implemented with the Handle System. dvander@372: */ dvander@372: dvander@324: #include dvander@324: dvander@324: dvander@324: namespace SourceMod dvander@324: { dvander@324: class IExtension; dvander@324: struct IdentityToken_t; dvander@372: dvander@372: /** Forward declaration from IHandleSys.h */ dvander@324: typedef unsigned int HandleType_t; dvander@372: dvander@372: /** Forward declaration from IHandleSys.h */ dvander@324: typedef HandleType_t IdentityType_t; dvander@372: dvander@324: /** dvander@324: * @brief Defines the base functionality required by a shared interface. dvander@324: */ dvander@324: class SMInterface dvander@324: { dvander@324: public: dvander@324: /** dvander@324: * @brief Must return an integer defining the interface's version. dvander@324: */ dvander@324: virtual unsigned int GetInterfaceVersion() =0; dvander@324: dvander@324: /** dvander@324: * @brief Must return a string defining the interface's unique name. dvander@324: */ dvander@324: virtual const char *GetInterfaceName() =0; dvander@324: dvander@324: /** ds@700: * @brief Must return whether the requested version number is backwards compatible. dvander@324: * Note: This can be overridden for breaking changes or custom versioning. dvander@324: * dvander@324: * @param version Version number to compare against. dvander@324: * @return True if compatible, false otherwise. dvander@324: */ dvander@324: virtual bool IsVersionCompatible(unsigned int version) dvander@324: { dvander@324: if (version > GetInterfaceVersion()) dvander@324: { dvander@324: return false; dvander@324: } dvander@324: dvander@324: return true; dvander@324: } dvander@324: }; dvander@324: dvander@324: /** dvander@324: * @brief Tracks dependencies and fires dependency listeners. dvander@324: */ dvander@324: class IShareSys dvander@324: { dvander@324: public: dvander@324: /** dvander@324: * @brief Adds an interface to the global interface system. dvander@324: * dvander@324: * @param myself Object adding this interface, in order to track dependencies. dvander@324: * @param iface Interface pointer (must be unique). dvander@324: * @return True on success, false otherwise. dvander@324: */ dvander@324: virtual bool AddInterface(IExtension *myself, SMInterface *iface) =0; dvander@324: dvander@324: /** dvander@324: * @brief Requests an interface from the global interface system. dvander@324: * If found, the interface's internal reference count will be increased. dvander@324: * dvander@324: * @param iface_name Interface name. dvander@324: * @param iface_vers Interface version to attempt to match. dvander@324: * @param myself Object requesting this interface, in order to track dependencies. dvander@324: * @param pIface Pointer to store the return value in. dvander@324: */ dvander@324: virtual bool RequestInterface(const char *iface_name, dvander@324: unsigned int iface_vers, dvander@324: IExtension *myself, dvander@324: SMInterface **pIface) =0; dvander@324: dvander@324: /** dvander@1391: * @brief Adds a list of natives to the global native pool, to be dvander@1391: * bound on plugin load. dvander@1391: * dvander@1391: * Adding natives does not bind them to any loaded plugins; the dvander@1391: * plugins must be reloaded for new natives to take effect. dvander@324: * dvander@372: * @param myself Identity token of parent object. dvander@1391: * @param natives Array of natives to add. The last entry in dvander@1391: * the array must be filled with NULLs to dvander@1391: * terminate the array. The array must be static dvander@1391: * as Core will cache the pointer for the dvander@1391: * lifetime of the extension. dvander@324: */ dvander@324: virtual void AddNatives(IExtension *myself, const sp_nativeinfo_t *natives) =0; dvander@324: dvander@324: /** dvander@324: * @brief Creates a new identity type. dvander@324: * NOTE: Module authors should never need to use this. Due to the current implementation, dvander@324: * there is a hardcoded limit of 15 types. Core uses up a few, so think carefully! dvander@324: * dvander@324: * @param name String containing type name. Must not be empty or NULL. dvander@324: * @return A new HandleType_t identifier, or 0 on failure. dvander@324: */ dvander@324: virtual IdentityType_t CreateIdentType(const char *name) =0; dvander@324: dvander@324: /** dvander@324: * @brief Finds an identity type by name. dvander@324: * DEFAULT IDENTITY TYPES: dvander@324: * "PLUGIN" - An IPlugin object. dvander@324: * "MODULE" - An IModule object. dvander@324: * "CORE" - An SMGlobalClass or other singleton. dvander@324: * dvander@324: * @param name String containing type name to search for. dvander@324: * @return A HandleType_t identifier if found, 0 otherwise. dvander@324: */ dvander@324: virtual IdentityType_t FindIdentType(const char *name) =0; dvander@324: dvander@324: /** dvander@868: * @brief Creates a new identity token. This token is guaranteed to be dvander@868: * unique amongst all other open identities. dvander@324: * dvander@324: * @param type Identity type. dvander@868: * @param ptr Private data pointer (cannot be NULL). dvander@868: * @return A new IdentityToken_t pointer, or NULL on failure. dvander@324: */ dvander@868: virtual IdentityToken_t *CreateIdentity(IdentityType_t type, void *ptr) =0; dvander@324: dvander@324: /** dvander@324: * @brief Destroys an identity type. Note that this will delete any identities dvander@324: * that are under this type. dvander@324: * dvander@324: * @param type Identity type. dvander@324: */ dvander@324: virtual void DestroyIdentType(IdentityType_t type) =0; dvander@324: dvander@324: /** dvander@324: * @brief Destroys an identity token. Any handles being owned by this token, or dvander@324: * any handles being dvander@324: * dvander@324: * @param identity Identity to remove. dvander@324: */ dvander@324: virtual void DestroyIdentity(IdentityToken_t *identity) =0; dvander@324: dvander@324: /** dvander@324: * @brief Requires an extension. This tells SourceMod that without this extension, dvander@324: * your extension should not be loaded. The name should not include the ".dll" or dvander@324: * the ".so" part of the file name. dvander@324: * dvander@324: * @param myself IExtension pointer to yourself. dvander@324: * @param filename File of extension to require. dvander@324: * @param require Whether or not this extension is a required dependency. dvander@324: * @param autoload Whether or not to autoload this extension. dvander@324: */ dvander@324: virtual void AddDependency(IExtension *myself, const char *filename, bool require, bool autoload) =0; dvander@1572: dvander@1572: /** dvander@1572: * @brief Registers a library name to an extension. dvander@1572: * dvander@1572: * @param myself Extension to register library to. dvander@1572: * @param name Library name. dvander@1572: */ dvander@1572: virtual void RegisterLibrary(IExtension *myself, const char *name) =0; dvander@1689: dvander@1689: /** dvander@2086: * @brief Adds natives that will override Core natives when called. dvander@1689: * dvander@1689: * A Core version of each native must exist. If one does not, then dvander@2086: * Core will simply ignore that entry. No more than one override dvander@2086: * can exist on a given native. dvander@1689: * dvander@1689: * Override natives represent a weak coupling. If the extension is dvander@2086: * unloaded, the native will be re-bound to the Core version. If dvander@2086: * the extension is loaded after plugins are loaded, the override dvander@2086: * will not take effect until those plugins are reloaded. dvander@1689: * dvander@1689: * @param myself Identity token of parent object. dvander@1689: * @param natives Array of natives to add. The last entry in dvander@1689: * the array must be filled with NULLs to dvander@1689: * terminate the array. The array must be static dvander@1689: * as Core will cache the pointer for the dvander@1689: * lifetime of the extension. dvander@1689: */ dvander@1689: virtual void OverrideNatives(IExtension *myself, const sp_nativeinfo_t *natives) =0; dvander@324: }; ds@432: } dvander@324: dvander@324: #endif //_INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_