core/interfaces/IForwardSys.h
author David Anderson <dvander@alliedmods.net>
Sat Nov 11 01:19:46 2006 +0000 (2006-11-11)
changeset 174 5611e4b3fa42
child 177 d29ade52d953
permissions -rw-r--r--
initial import of proposed forward API
dvander@174
     1
#ifndef _INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_
dvander@174
     2
#define _INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_
dvander@174
     3
dvander@174
     4
#include <IForwardSys.h>
dvander@174
     5
#include <IPluginSys.h>
dvander@174
     6
dvander@174
     7
#define SMINTERFACE_FORWARDMANAGER_NAME		"IForwardManager"
dvander@174
     8
#define SMINTERFACE_FORWARDMANAGER_VERSION	1
dvander@174
     9
dvander@174
    10
namespace SourceMod
dvander@174
    11
{
dvander@174
    12
	enum ResultType
dvander@174
    13
	{
dvander@174
    14
		Pl_Continue = 0,	/* No result */
dvander@174
    15
		Pl_Handled = 1,		/* Result was handled, stop at the end */
dvander@174
    16
		Pl_Stop = 2,		/* Result was handled, stop now */
dvander@174
    17
	};
dvander@174
    18
dvander@174
    19
	enum ExecType
dvander@174
    20
	{
dvander@174
    21
		ET_Ignore = 0,		/* Ignore all return values, return 0 */
dvander@174
    22
		ET_Single = 1,		/* Only return the first exec, ignore all others */
dvander@174
    23
		ET_Event = 2,		/* Acts as an event with the ResultTypes above, no mid-Stops allowed, returns highest */
dvander@174
    24
		ET_Hook = 3,		/* Acts as a hook with the ResultTypes above, mid-Stops allowed, returns highest */
dvander@174
    25
	};
dvander@174
    26
dvander@174
    27
	/**
dvander@174
    28
	 * @brief Abstracts multiple function calling.
dvander@174
    29
	 *
dvander@174
    30
	 * NOTE: Parameters should be pushed in forward order, unlike
dvander@174
    31
	 * the virtual machine/IPluginContext order.
dvander@174
    32
	 */
dvander@174
    33
	class IForward : public IPluginFunction
dvander@174
    34
	{
dvander@174
    35
	public:
dvander@174
    36
		/**
dvander@174
    37
		 * @brief Returns the name of the forward.
dvander@174
    38
		 *
dvander@174
    39
		 * @return			Forward name.
dvander@174
    40
		 */
dvander@174
    41
		virtual const char *GetForwardName() =0;
dvander@174
    42
dvander@174
    43
		/**
dvander@174
    44
		 * @brief Pushes a cell onto the current call.
dvander@174
    45
		 *
dvander@174
    46
		 * @param cell		Parameter value to push.
dvander@174
    47
		 * @return			True if successful, false if type or count mismatch.
dvander@174
    48
		 */
dvander@174
    49
		virtual bool PushCell(cell_t cell) =0;
dvander@174
    50
dvander@174
    51
		/**
dvander@174
    52
		 * @brief Pushes a float onto the current call.
dvander@174
    53
		 *
dvander@174
    54
		 * @param float		Parameter value to push.
dvander@174
    55
		 * @return			True if successful, false if type or count mismatch.
dvander@174
    56
		 */
dvander@174
    57
		virtual bool PushFloat(float number) =0;
dvander@174
    58
dvander@174
    59
		/**
dvander@174
    60
		 * @brief Pushes an array of cells onto the current call, each cell individually.
dvander@174
    61
		 * NOTE: This is essentially a crippled version of PushArray().
dvander@174
    62
		 *
dvander@174
    63
		 * @param array		Array of cells.
dvander@174
    64
		 * @param numcells	Number of cells in array.
dvander@174
    65
		 * @param each		Whether or not to push as an array or individual cells.
dvander@174
    66
		 * @return			True if successful, false if too many cells were pushed.
dvander@174
    67
		 */
dvander@174
    68
		virtual bool PushCells(cell_t array[], unsigned int numcells, bool each) =0;
dvander@174
    69
dvander@174
    70
		/**
dvander@174
    71
		 * @brief Pushes an array of cells onto the current call.  
dvander@174
    72
		 *
dvander@174
    73
		 * @param array		Array to copy, NULL if no initial array should be copied.
dvander@174
    74
		 * @param cells		Number of cells to allocate and optionally read from the input array.
dvander@174
    75
		 * @param phys_addr	Optional return address for physical array.
dvander@174
    76
		 * @param copyback	Whether or not changes should be copied back to the input array.
dvander@174
    77
		 * @return			True if successful, false otherwise.
dvander@174
    78
		 */
dvander@174
    79
		virtual bool PushArray(cell_t *inarray, size_t cells, cell_t **phys_addr, bool copyback) =0;
dvander@174
    80
dvander@174
    81
		/**
dvander@174
    82
		 * @brief Pushes a string onto the current call.
dvander@174
    83
		 *
dvander@174
    84
		 * @param string	String to push.
dvander@174
    85
		 * @return			True if successful, false if type or count mismatch.
dvander@174
    86
		 */
dvander@174
    87
		virtual bool PushString(const char *string) =0;
dvander@174
    88
dvander@174
    89
		/**
dvander@174
    90
		 * @brief Executes the forward, resets the pushed parameter list, and performs any copybacks.
dvander@174
    91
		 *
dvander@174
    92
		 * @param result		Pointer to store return value in (dependent on forward type).
dvander@174
    93
		 * @param last_err		Pointer to store number of successful executions in.
dvander@174
    94
		 * @return				Error code, if any.
dvander@174
    95
		 */
dvander@174
    96
		virtual int Execute(cell_t *result, unsigned int *num_functions) =0;
dvander@174
    97
dvander@174
    98
		/**
dvander@174
    99
		 * @brief Returns the number of functions in this forward.
dvander@174
   100
		 *
dvander@174
   101
		 * @return			Number of functions in forward.
dvander@174
   102
		 */
dvander@174
   103
		virtual unsigned int GetFunctionCount() =0;
dvander@174
   104
dvander@174
   105
		/**
dvander@174
   106
		 * @brief Returns the method of multi-calling this forward has.
dvander@174
   107
		 *
dvander@174
   108
		 * @return			ResultType of the forward.
dvander@174
   109
		 */
dvander@174
   110
		virtual ResultType GetResultType() =0;
dvander@174
   111
	};
dvander@174
   112
dvander@174
   113
dvander@174
   114
	class IChangeableForward : public IForward
dvander@174
   115
	{
dvander@174
   116
	public:
dvander@174
   117
		/** 
dvander@174
   118
		 * @brief Removes a function from the call list.
dvander@174
   119
		 *
dvander@174
   120
		 * @param func		Function to remove.
dvander@174
   121
		 */
dvander@174
   122
		virtual void RemoveFunction(IPluginFunction *func) =0;
dvander@174
   123
dvander@174
   124
		/** 
dvander@174
   125
		 * @brief Removes all instances of a plugin from the call list.
dvander@174
   126
		 *
dvander@174
   127
		 * @param plugin	Plugin to remove instances of.
dvander@174
   128
		 * @return			Number of functions removed therein.
dvander@174
   129
		 */
dvander@174
   130
		virtual void RemoveFunctionsOfPlugin(IPlugin *plugin) =0;
dvander@174
   131
dvander@174
   132
		/**
dvander@174
   133
		 * @brief Adds a function to the call list.
dvander@174
   134
		 *
dvander@174
   135
		 * @param func		Function to add.
dvander@174
   136
		 */
dvander@174
   137
		virtual void AddFunction(IPluginFunction *func) =0;
dvander@174
   138
	};
dvander@174
   139
dvander@174
   140
	enum ParamType
dvander@174
   141
	{
dvander@174
   142
		Param_Any = 0,
dvander@174
   143
		Param_Cell = 1,
dvander@174
   144
		Param_Float = 2,
dvander@174
   145
		Param_String = 3,
dvander@174
   146
		Param_Array = 4,
dvander@174
   147
		Param_VarArgs = 5,
dvander@174
   148
	};
dvander@174
   149
	
dvander@174
   150
	class IForwardManager : public SMInterface
dvander@174
   151
	{
dvander@174
   152
	public:
dvander@174
   153
		virtual const char *GetInterfaceName()
dvander@174
   154
		{
dvander@174
   155
			return SMINTERFACE_FORWARDMANAGER_NAME;
dvander@174
   156
		}
dvander@174
   157
		virtual unsigned int GetInterfaceVersion()
dvander@174
   158
		{
dvander@174
   159
			return SMINTERFACE_FORWARDMANAGER_VERSION;
dvander@174
   160
		}
dvander@174
   161
	public:
dvander@174
   162
		/**
dvander@174
   163
		 * @brief Creates a managed forward.  This forward exists globally.
dvander@174
   164
		 *  The name used to create the forward is used as its public function in all target plugins.
dvander@174
   165
		 *  As new non-private plugins become loaded or unloaded, they will be automatically added
dvander@174
   166
		 * or removed.  This is ideal for global, static forwards that are never changed.
dvander@174
   167
		 *
dvander@174
   168
		 * @param name			Name of public function to use in forward.
dvander@174
   169
		 * @param et			Execution type to be used.
dvander@174
   170
		 * @param num_params	Number of parameter this function will have.
dvander@174
   171
		 *						NOTE: For varargs, this should include the vararg parameter.
dvander@174
   172
		 * @param types			Array of type information about each parameter.  If NULL, types
dvander@174
   173
		 *						are read off the vararg stream.
dvander@174
   174
		 * @param ...			If types is NULL, num_params ParamTypes should be pushed.
dvander@174
   175
		 * @return				A new IForward on success, NULL if type combination is impossible.
dvander@174
   176
		 */
dvander@174
   177
		virtual IForward *CreateForward(const char *name, ExecType et, int num_params, ParamType *types, ...) =0;
dvander@174
   178
dvander@174
   179
		/**
dvander@174
   180
		 * @brief Creates an unmanaged forward.  This forward exists privately.
dvander@174
   181
		 * Unlike managed forwards, no functions are ever added by the Manager.
dvander@174
   182
		 * However, functions will be removed automatically if their parent plugin is unloaded.
dvander@174
   183
		 *
dvander@174
   184
		 * @param name			Name of forward (unused except for lookup, can be NULL for anonymous).
dvander@174
   185
		 * @param et			Execution type to be used.
dvander@174
   186
		 * @param num_params	Number of parameter this function will have.
dvander@174
   187
		 *						NOTE: For varargs, this should include the vararg parameter.
dvander@174
   188
		 * @param types			Array of type information about each parameter.  If NULL, types
dvander@174
   189
		 *						are read off the vararg stream.
dvander@174
   190
		 * @param ...			If types is NULL, num_params ParamTypes should be pushed.
dvander@174
   191
		 * @return				A new IChangeableForward on success, NULL if type combination is impossible.
dvander@174
   192
		 */
dvander@174
   193
		virtual IChangeableForward *CreateForwardEx(const char *name, 
dvander@174
   194
													ExecType et, 
dvander@174
   195
													int num_params, 
dvander@174
   196
													ParamType *types, 
dvander@174
   197
													...) =0;
dvander@174
   198
dvander@174
   199
		/**
dvander@174
   200
		 * @brief Finds a forward by name.  Does not return anonymous forwards (named NULL or "").
dvander@174
   201
		 *
dvander@174
   202
		 * @param name			Name of forward.
dvander@174
   203
		 * @param ifchng		Optionally store either NULL or an IChangeableForward pointer
dvander@174
   204
		 *                      depending on type of forward.
dvander@174
   205
		 * @return				IForward pointer, or NULL if none found matching the name.
dvander@174
   206
		 */
dvander@174
   207
		virtual IForward *FindForward(const char *name, IChangeableForward **ifchng) =0;
dvander@174
   208
	};
dvander@174
   209
};
dvander@174
   210
dvander@174
   211
#endif //_INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_