dvander@140: #ifndef _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@140: #define _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@140: dvander@211: #include dvander@211: dvander@229: #define NO_IDENTITY 0 dvander@215: dvander@140: namespace SourceMod dvander@140: { dvander@229: struct IdentityToken_t; dvander@229: typedef unsigned int HandleType_t; dvander@229: typedef HandleType_t IdentityType_t; dvander@140: /** dvander@140: * @brief Defines the base functionality required by a shared interface. dvander@140: */ dvander@140: class SMInterface dvander@140: { dvander@140: public: dvander@140: /** dvander@140: * @brief Must return an integer defining the interface's version. dvander@140: */ dvander@140: virtual unsigned int GetInterfaceVersion() =0; dvander@140: dvander@140: /** dvander@140: * @brief Must return a string defining the interface's unique name. dvander@140: */ dvander@140: virtual const char *GetInterfaceName() =0; dvander@140: dvander@140: /** dvander@140: * @brief Must return whether the requested version number is backwards comaptible. dvander@140: * Note: This can be overridden for breaking changes or custom versioning. dvander@140: * dvander@140: * @param version Version number to compare against. dvander@140: * @return True if compatible, false otherwise. dvander@140: */ dvander@140: virtual bool IsVersionCompatible(unsigned int version) dvander@140: { dvander@140: if (version > GetInterfaceVersion()) dvander@140: { dvander@140: return false; dvander@140: } dvander@140: dvander@140: return true; dvander@140: } dvander@140: }; dvander@140: dvander@140: /** dvander@140: * @brief Tracks dependencies and fires dependency listeners. dvander@140: */ dvander@140: class IShareSys dvander@140: { dvander@140: public: dvander@140: /** dvander@229: * @brief Adds an interface to the global interface system. dvander@140: * dvander@140: * @param iface Interface pointer (must be unique). dvander@211: * @param token Parent token of the module/interface. dvander@229: * @return True on success, false otherwise. dvander@140: */ dvander@229: virtual bool AddInterface(SMInterface *iface, IdentityToken_t *token) =0; dvander@140: dvander@140: /** dvander@140: * @brief Requests an interface from the global interface system. dvander@140: * If found, the interface's internal reference count will be increased. dvander@140: * dvander@140: * @param iface_name Interface name. dvander@140: * @param iface_vers Interface version to attempt to match. dvander@211: * @param token Object requesting this interface, in order to track dependencies. dvander@140: * @param pIface Pointer to store the return value in. dvander@140: */ dvander@140: virtual bool RequestInterface(const char *iface_name, dvander@211: unsigned int iface_vers, dvander@229: IdentityToken_t *token, dvander@229: SMInterface **pIface) =0; dvander@140: dvander@140: /** dvander@211: * @brief Adds a list of natives to the global native pool. dvander@211: * dvander@211: * @param token Identity token of parent object. dvander@211: * @param natives Array of natives to add, NULL terminated. dvander@140: */ dvander@229: virtual void AddNatives(IdentityToken_t *token, const sp_nativeinfo_t *natives[]) =0; dvander@229: dvander@229: /** dvander@229: * @brief Creates a new identity type. dvander@229: * NOTE: Module authors should never need to use this. Due to the current implementation, dvander@229: * there is a hardcoded limit of 15 types. Core uses up a few, so think carefully! dvander@229: * dvander@229: * @param name String containing type name. Must not be empty or NULL. dvander@229: * @return A new HandleType_t identifier, or 0 on failure. dvander@229: */ dvander@229: virtual IdentityType_t CreateIdentType(const char *name) =0; dvander@229: dvander@229: /** dvander@229: * @brief Finds an identity type by name. dvander@229: * DEFAULT IDENTITY TYPES: dvander@229: * "PLUGIN" - An IPlugin object. dvander@229: * "MODULE" - An IModule object. dvander@229: * "CORE" - An SMGlobalClass or other singleton. dvander@229: * dvander@229: * @param name String containing type name to search for. dvander@229: * @return A HandleType_t identifier if found, 0 otherwise. dvander@229: */ dvander@229: virtual IdentityType_t FindIdentType(const char *name) =0; dvander@229: dvander@229: /** dvander@229: * @brief Creates a new identity token. This token is guaranteed to be unique dvander@229: * amongst all other open identities. dvander@229: * dvander@229: * @param type Identity type. dvander@229: * @return A new IdentityToken_t identifier. dvander@229: */ dvander@229: virtual IdentityToken_t *CreateIdentity(IdentityType_t type) =0; dvander@229: dvander@229: /** dvander@229: * @brief Destroys an identity type. Note that this will delete any identities dvander@229: * that are under this type. dvander@229: * dvander@229: * @param type Identity type. dvander@229: */ dvander@229: virtual void DestroyIdentType(IdentityType_t type) =0; dvander@229: dvander@229: /** dvander@229: * @brief Destroys an identity token. Any handles being owned by this token, or dvander@229: * any handles being dvander@229: * dvander@229: * @param identity Identity to remove. dvander@229: */ dvander@229: virtual void DestroyIdentity(IdentityToken_t *identity) =0; dvander@140: }; dvander@140: }; dvander@140: dvander@140: #endif //_INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_