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_