dvander@140: #ifndef _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@140: #define _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_ dvander@140: dvander@140: namespace SourceMod dvander@140: { 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: enum UnloadableParentType dvander@140: { dvander@140: ParentType_Module, dvander@140: ParentType_Plugin dvander@140: }; dvander@140: dvander@140: /** dvander@140: * @brief Denotes a top-level unloadable object. dvander@140: */ dvander@140: class IUnloadableParent dvander@140: { dvander@140: public: dvander@140: virtual UnloadableParentType GetParentType() =0; dvander@140: dvander@140: virtual void *GetParentToken() =0; dvander@140: dvander@140: /** dvander@140: * @brief Called when an interface this object has requested is removed. dvander@140: * dvander@140: * @param pIface Interface being removed. dvander@140: */ dvander@140: virtual void OnInterfaceUnlink(SMInterface *pIface) =0; dvander@140: protected: dvander@140: void *m_parent_token; dvander@140: }; dvander@140: dvander@140: /** dvander@140: * @brief Listens for unlinked objects. dvander@140: */ dvander@140: class IUnlinkListener dvander@140: { dvander@140: public: dvander@140: /** dvander@140: * @brief Called when a parent object is unloaded. dvander@140: * dvander@140: * @param parent The parent object which is dying. dvander@140: */ dvander@140: virtual void OnParentUnlink(IUnloadableParent *parent) dvander@140: { 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@140: * @brief Adds an interface to the global interface system dvander@140: * dvander@140: * @param iface Interface pointer (must be unique). dvander@140: * @param parent Parent unloadable token given to the module/interface. dvander@140: */ dvander@140: virtual bool AddInterface(SMInterface *iface, IUnloadableParent *parent) =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@140: * @param me 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@140: unsigned int iface_vers, dvander@140: IUnloadableParent *me, dvander@140: void **pIface) =0; dvander@140: dvander@140: /** dvander@140: * @brief Unloads an interface. dvander@140: * dvander@140: * @param iface Interface pointer. dvander@140: * @param parent Security token, trivial measure to prevent accidental unloads. dvander@140: * This token must match the one used with AddInterface(). dvander@140: */ dvander@140: virtual void RemoveInterface(SMInterface *iface, IUnloadableParent *parent) =0; dvander@140: dvander@140: /** dvander@140: * @brief Adds an unlink listener. dvander@140: * dvander@140: * @param pListener Listener pointer. dvander@140: */ dvander@140: virtual void AddUnlinkListener(IUnlinkListener *pListener) =0; dvander@140: dvander@140: /** dvander@140: * @brief Removes an unlink listener. dvander@140: * dvander@140: * @param pListener Listener pointer. dvander@140: */ dvander@140: virtual void RemoveUnlinkListener(IUnlinkListener *pListener) =0; dvander@140: }; dvander@140: }; dvander@140: dvander@140: #endif //_INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_