public/IPluginFunction.h
author David Anderson <dvander@alliedmods.net>
Fri Jan 19 05:33:04 2007 +0000 (2007-01-19)
changeset 324 e23aca731e37
permissions -rw-r--r--
reorganized SourceMod for the public SDK
dvander@324
     1
#ifndef _INCLUDE_SOURCEMOD_PLUGINFUNCTION_INTERFACE_H_
dvander@324
     2
#define _INCLUDE_SOURCEMOD_PLUGINFUNCTION_INTERFACE_H_
dvander@324
     3
dvander@324
     4
#include <IPluginSys.h>
dvander@324
     5
dvander@324
     6
namespace SourceMod
dvander@324
     7
{
dvander@324
     8
	#define SM_PARAM_COPYBACK		(1<<0)		/* Copy an array/reference back after call */
dvander@324
     9
dvander@324
    10
	#define SM_PARAM_STRING_UTF8	(1<<0)		/* String should be UTF-8 handled */
dvander@324
    11
	#define SM_PARAM_STRING_COPY	(1<<1)		/* String should be copied into the plugin */
dvander@324
    12
dvander@324
    13
	/**
dvander@324
    14
	 * @brief Represents what a function needs to implement in order to be callable.
dvander@324
    15
	 */
dvander@324
    16
	class ICallable
dvander@324
    17
	{
dvander@324
    18
	public:
dvander@324
    19
		/**
dvander@324
    20
		 * @brief Pushes a cell onto the current call.
dvander@324
    21
		 *
dvander@324
    22
		 * @param cell		Parameter value to push.
dvander@324
    23
		 * @return			Error code, if any.
dvander@324
    24
		 */
dvander@324
    25
		virtual int PushCell(cell_t cell) =0;
dvander@324
    26
dvander@324
    27
		/**
dvander@324
    28
		 * @brief Pushes a cell by reference onto the current call.
dvander@324
    29
		 * NOTE: On Execute, the pointer passed will be modified if copyback is enabled.
dvander@324
    30
		 * NOTE: By reference parameters are cached and thus are not read until execution.
dvander@324
    31
		 *		 This means you cannot push a pointer, change it, and push it again and expect
dvander@324
    32
		 *       two different values to come out.
dvander@324
    33
		 *
dvander@324
    34
		 * @param cell		Address containing parameter value to push.
dvander@324
    35
		 * @param flags		Copy-back flags.
dvander@324
    36
		 * @return			Error code, if any.
dvander@324
    37
		 */
dvander@324
    38
		virtual int PushCellByRef(cell_t *cell, int flags) =0;
dvander@324
    39
dvander@324
    40
		/**
dvander@324
    41
		 * @brief Pushes a float onto the current call.
dvander@324
    42
		 *
dvander@324
    43
		 * @param float		Parameter value to push.
dvander@324
    44
		 * @return			Error code, if any.
dvander@324
    45
		 */
dvander@324
    46
		virtual int PushFloat(float number) =0;
dvander@324
    47
dvander@324
    48
		/**
dvander@324
    49
		 * @brief Pushes a float onto the current call by reference.
dvander@324
    50
		 * NOTE: On Execute, the pointer passed will be modified if copyback is enabled.
dvander@324
    51
		 * NOTE: By reference parameters are cached and thus are not read until execution.
dvander@324
    52
		 *		 This means you cannot push a pointer, change it, and push it again and expect
dvander@324
    53
		 *       two different values to come out.
dvander@324
    54
		 *
dvander@324
    55
		 * @param float		Parameter value to push.
dvander@324
    56
		 & @param flags		Copy-back flags.
dvander@324
    57
		 * @return			Error code, if any.
dvander@324
    58
		 */
dvander@324
    59
		virtual int PushFloatByRef(float *number, int flags) =0;
dvander@324
    60
dvander@324
    61
		/**
dvander@324
    62
		 * @brief Pushes an array of cells onto the current call.  
dvander@324
    63
		 * NOTE: On Execute, the pointer passed will be modified if non-NULL and copy-back
dvander@324
    64
		 * is enabled.
dvander@324
    65
		 * NOTE: By reference parameters are cached and thus are not read until execution.
dvander@324
    66
		 *		 This means you cannot push a pointer, change it, and push it again and expect
dvander@324
    67
		 *       two different values to come out.
dvander@324
    68
		 *
dvander@324
    69
		 * @param inarray	Array to copy, NULL if no initial array should be copied.
dvander@324
    70
		 * @param cells		Number of cells to allocate and optionally read from the input array.
dvander@324
    71
		 * @param phys_addr	Optional return address for physical array, if one was made.
dvander@324
    72
		 * @param flags		Whether or not changes should be copied back to the input array.
dvander@324
    73
		 * @return			Error code, if any.
dvander@324
    74
		 */
dvander@324
    75
		virtual int PushArray(cell_t *inarray, 
dvander@324
    76
								unsigned int cells, 
dvander@324
    77
								cell_t **phys_addr, 
dvander@324
    78
								int flags=0) =0;
dvander@324
    79
dvander@324
    80
		/**
dvander@324
    81
		 * @brief Pushes a string onto the current call.
dvander@324
    82
		 *
dvander@324
    83
		 * @param string	String to push.
dvander@324
    84
		 * @return			Error code, if any.
dvander@324
    85
		 */
dvander@324
    86
		virtual int PushString(const char *string) =0;
dvander@324
    87
dvander@324
    88
		/**
dvander@324
    89
		 * @brief Pushes a string or string buffer.
dvander@324
    90
		 * NOTE: On Execute, the pointer passed will be modified if copy-back is enabled.
dvander@324
    91
		 *
dvander@324
    92
		 * @param buffer	Pointer to string buffer.
dvander@324
    93
		 * @param length	Length of buffer.
dvander@324
    94
		 * @param sz_flags	String flags.
dvander@324
    95
		 * @param cp_flags	Copy-back flags.
dvander@324
    96
		 * @return			Error code, if any.
dvander@324
    97
		 */
dvander@324
    98
		virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags) =0;
dvander@324
    99
dvander@324
   100
		/**
dvander@324
   101
		 * @brief Cancels a function call that is being pushed but not yet executed.
dvander@324
   102
		 * This can be used be reset for CallFunction() use.
dvander@324
   103
		 */
dvander@324
   104
		virtual void Cancel() =0;
dvander@324
   105
	};
dvander@324
   106
dvander@324
   107
	/**
dvander@324
   108
	 * @brief Encapsulates a function call in a plugin.
dvander@324
   109
	 * NOTE: Function calls must be atomic to one execution context.
dvander@324
   110
	 * NOTE: This object should not be deleted.  It lives for the lifetime of the plugin.
dvander@324
   111
	 */
dvander@324
   112
	class IPluginFunction : public ICallable
dvander@324
   113
	{
dvander@324
   114
	public:
dvander@324
   115
		/**
dvander@324
   116
		 * @brief Executes the forward, resets the pushed parameter list, and performs any copybacks.
dvander@324
   117
		 *
dvander@324
   118
		 * @param result		Pointer to store return value in.
dvander@324
   119
		 * @return				Error code, if any.
dvander@324
   120
		 */
dvander@324
   121
		virtual int Execute(cell_t *result) =0;
dvander@324
   122
dvander@324
   123
		/**
dvander@324
   124
		 * @brief Executes the function with the given parameter array.
dvander@324
   125
		 * Parameters are read in forward order (i.e. index 0 is parameter #1)
dvander@324
   126
		 * NOTE: You will get an error if you attempt to use CallFunction() with
dvander@324
   127
		 * previously pushed parameters.
dvander@324
   128
		 *
dvander@324
   129
		 * @param param			Array of cell parameters.
dvander@324
   130
		 * @param num_params	Number of parameters to push.
dvander@324
   131
		 * @param result		Pointer to store result of function on return.
dvander@324
   132
		 * @return				SourcePawn error code (if any).
dvander@324
   133
		 */
dvander@324
   134
		virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result) =0;
dvander@324
   135
dvander@324
   136
		/**
dvander@324
   137
		 * @brief Returns which plugin this function belongs to.
dvander@324
   138
		 *
dvander@324
   139
		 * @return				IPlugin pointer to parent plugin.
dvander@324
   140
		 */
dvander@324
   141
		virtual IPlugin *GetParentPlugin() =0;
dvander@324
   142
dvander@324
   143
		/**
dvander@324
   144
		 * @brief Returns the physical address of a by-reference parameter.
dvander@324
   145
		 *
dvander@324
   146
		 * @param				Parameter index to read (beginning at 0).
dvander@324
   147
		 * @return				Address, or NULL if invalid parameter specified.
dvander@324
   148
		 */
dvander@324
   149
		virtual cell_t *GetAddressOfPushedParam(unsigned int param) =0;
dvander@324
   150
	};
dvander@324
   151
};
dvander@324
   152
dvander@324
   153
#endif //_INCLUDE_SOURCEMOD_PLUGINFUNCTION_INTERFACE_H_