core/interfaces/IShareSys.h
author David Anderson <dvander@alliedmods.net>
Sat Nov 11 11:10:24 2006 +0000 (2006-11-11)
changeset 177 d29ade52d953
parent 140 2c25d4131b38
child 211 4c77142eaf36
permissions -rw-r--r--
Fleshed out forward system and extensively documented its design considerations
Implemented and did basic tests on new IPluginFunction type
Split function types into a separate file
dvander@140
     1
#ifndef _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_
dvander@140
     2
#define _INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_
dvander@140
     3
dvander@140
     4
namespace SourceMod
dvander@140
     5
{
dvander@140
     6
	/**
dvander@140
     7
	 * @brief Defines the base functionality required by a shared interface.
dvander@140
     8
	 */
dvander@140
     9
	class SMInterface
dvander@140
    10
	{
dvander@140
    11
	public:
dvander@140
    12
		/**
dvander@140
    13
		 * @brief Must return an integer defining the interface's version.
dvander@140
    14
		 */
dvander@140
    15
		virtual unsigned int GetInterfaceVersion() =0;
dvander@140
    16
dvander@140
    17
		/**
dvander@140
    18
		 * @brief Must return a string defining the interface's unique name.
dvander@140
    19
		 */
dvander@140
    20
		virtual const char *GetInterfaceName() =0;
dvander@140
    21
dvander@140
    22
		/**
dvander@140
    23
		 * @brief Must return whether the requested version number is backwards comaptible.
dvander@140
    24
		 * Note: This can be overridden for breaking changes or custom versioning.
dvander@140
    25
		 * 
dvander@140
    26
		 * @param version		Version number to compare against.
dvander@140
    27
		 * @return				True if compatible, false otherwise.
dvander@140
    28
		 */
dvander@140
    29
		virtual bool IsVersionCompatible(unsigned int version)
dvander@140
    30
		{
dvander@140
    31
			if (version > GetInterfaceVersion())
dvander@140
    32
			{
dvander@140
    33
				return false;
dvander@140
    34
			}
dvander@140
    35
dvander@140
    36
			return true;
dvander@140
    37
		}
dvander@140
    38
	};
dvander@140
    39
dvander@140
    40
	enum UnloadableParentType
dvander@140
    41
	{
dvander@140
    42
		ParentType_Module,
dvander@140
    43
		ParentType_Plugin
dvander@140
    44
	};
dvander@140
    45
dvander@140
    46
	/**
dvander@140
    47
	 * @brief Denotes a top-level unloadable object.
dvander@140
    48
	 */
dvander@140
    49
	class IUnloadableParent
dvander@140
    50
	{
dvander@140
    51
	public:
dvander@140
    52
		virtual UnloadableParentType GetParentType() =0;
dvander@140
    53
dvander@140
    54
		virtual void *GetParentToken() =0;
dvander@140
    55
	
dvander@140
    56
		/**
dvander@140
    57
		 * @brief Called when an interface this object has requested is removed.
dvander@140
    58
		 *
dvander@140
    59
		 * @param pIface		Interface being removed.
dvander@140
    60
		 */
dvander@140
    61
		virtual void OnInterfaceUnlink(SMInterface *pIface) =0;
dvander@140
    62
	protected:
dvander@140
    63
		void *m_parent_token;
dvander@140
    64
	};
dvander@140
    65
dvander@140
    66
	/**
dvander@140
    67
	 * @brief Listens for unlinked objects.
dvander@140
    68
	 */
dvander@140
    69
	class IUnlinkListener
dvander@140
    70
	{
dvander@140
    71
	public:
dvander@140
    72
		/**
dvander@140
    73
		 * @brief Called when a parent object is unloaded.
dvander@140
    74
		 *
dvander@140
    75
		 * @param parent		The parent object which is dying.
dvander@140
    76
		 */
dvander@140
    77
		virtual void OnParentUnlink(IUnloadableParent *parent)
dvander@140
    78
		{
dvander@140
    79
		}
dvander@140
    80
	};
dvander@140
    81
dvander@140
    82
	/**
dvander@140
    83
	 * @brief Tracks dependencies and fires dependency listeners.
dvander@140
    84
	 */
dvander@140
    85
	class IShareSys
dvander@140
    86
	{
dvander@140
    87
	public:
dvander@140
    88
		/**
dvander@140
    89
		 * @brief Adds an interface to the global interface system
dvander@140
    90
		 *
dvander@140
    91
		 * @param iface			Interface pointer (must be unique).
dvander@140
    92
		 * @param parent		Parent unloadable token given to the module/interface.
dvander@140
    93
		 */
dvander@140
    94
		virtual bool AddInterface(SMInterface *iface, IUnloadableParent *parent) =0;
dvander@140
    95
dvander@140
    96
		/**
dvander@140
    97
		 * @brief Requests an interface from the global interface system.
dvander@140
    98
		 * If found, the interface's internal reference count will be increased.
dvander@140
    99
		 *
dvander@140
   100
		 * @param iface_name	Interface name.
dvander@140
   101
		 * @param iface_vers	Interface version to attempt to match.
dvander@140
   102
		 * @param me			Object requesting this interface, in order to track dependencies.
dvander@140
   103
		 * @param pIface		Pointer to store the return value in.
dvander@140
   104
		 */
dvander@140
   105
		virtual bool RequestInterface(const char *iface_name, 
dvander@140
   106
										unsigned int iface_vers, 
dvander@140
   107
										IUnloadableParent *me,
dvander@140
   108
										void **pIface) =0;
dvander@140
   109
dvander@140
   110
		/**
dvander@140
   111
		 * @brief Unloads an interface.
dvander@140
   112
		 *
dvander@140
   113
		 * @param iface			Interface pointer.
dvander@140
   114
		 * @param parent		Security token, trivial measure to prevent accidental unloads.
dvander@140
   115
		 *                      This token must match the one used with AddInterface().
dvander@140
   116
		 */
dvander@140
   117
		virtual void RemoveInterface(SMInterface *iface, IUnloadableParent *parent) =0;
dvander@140
   118
dvander@140
   119
		/**
dvander@140
   120
		 * @brief Adds an unlink listener.
dvander@140
   121
		 *
dvander@140
   122
		 * @param pListener		Listener pointer.
dvander@140
   123
		 */
dvander@140
   124
		virtual void AddUnlinkListener(IUnlinkListener *pListener) =0;
dvander@140
   125
dvander@140
   126
		/**
dvander@140
   127
		 * @brief Removes an unlink listener.
dvander@140
   128
		 *
dvander@140
   129
		 * @param pListener		Listener pointer.
dvander@140
   130
		 */
dvander@140
   131
		virtual void RemoveUnlinkListener(IUnlinkListener *pListener) =0;
dvander@140
   132
	};
dvander@140
   133
};
dvander@140
   134
dvander@140
   135
#endif //_INCLUDE_SOURCEMOD_IFACE_SHARE_SYS_H_