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