core/systems/ForwardSys.h
author David Anderson <dvander@alliedmods.net>
Sun Nov 12 01:06:17 2006 +0000 (2006-11-12)
changeset 180 fe406c5f2aeb
child 183 78488edd8873
permissions -rw-r--r--
Initial import of forward system
dvander@180
     1
#ifndef _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
     2
#define _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
     3
dvander@180
     4
#include <IForwardSys.h>
dvander@180
     5
#include <IPluginSys.h>
dvander@180
     6
#include "sm_globals.h"
dvander@180
     7
#include <sh_list.h>
dvander@180
     8
#include <sh_stack.h>
dvander@180
     9
dvander@180
    10
using namespace SourceHook;
dvander@180
    11
dvander@180
    12
typedef List<IPluginFunction *>::iterator FuncIter;
dvander@180
    13
dvander@180
    14
//:TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX
dvander@180
    15
#define FORWARDS_NAME_MAX		64
dvander@180
    16
dvander@180
    17
struct NextCallInfo
dvander@180
    18
{
dvander@180
    19
	unsigned int recopy[SP_MAX_EXEC_PARAMS];
dvander@180
    20
	unsigned int sizes[SP_MAX_EXEC_PARAMS];
dvander@180
    21
	cell_t *orig_addrs[SP_MAX_EXEC_PARAMS];
dvander@180
    22
	unsigned int numrecopy;
dvander@180
    23
};
dvander@180
    24
dvander@180
    25
class CForward : public IChangeableForward, IFunctionCopybackReader
dvander@180
    26
{
dvander@180
    27
public: //ICallable
dvander@180
    28
	virtual int PushCell(cell_t cell);
dvander@180
    29
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@180
    30
	virtual int PushFloat(float number);
dvander@180
    31
	virtual int PushFloatByRef(float *number, int flags);
dvander@180
    32
	virtual int PushCells(cell_t array[], unsigned int numcells, bool each);
dvander@180
    33
	virtual int PushArray(cell_t *inarray, unsigned int cells, cell_t **phys_addr, int flags);
dvander@180
    34
	virtual int PushString(const char *string);
dvander@180
    35
	virtual int PushStringByRef(char *string, int flags);
dvander@180
    36
	virtual void Cancel();
dvander@180
    37
public: //IForward
dvander@180
    38
	virtual const char *GetForwardName();
dvander@180
    39
	virtual unsigned int GetFunctionCount();
dvander@180
    40
	virtual ExecType GetExecType();
dvander@180
    41
	virtual int Execute(cell_t *result, IForwardFilter *filter);
dvander@180
    42
public: //IChangeableForward
dvander@180
    43
	virtual bool RemoveFunction(IPluginFunction *func);
dvander@180
    44
	virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin);
dvander@180
    45
	virtual bool AddFunction(IPluginFunction *func);
dvander@180
    46
	virtual bool AddFunction(sp_context_t *ctx, funcid_t index);
dvander@180
    47
public: //IFunctionCopybackReader
dvander@180
    48
	virtual bool OnCopybackArray(unsigned int param, 
dvander@180
    49
								 unsigned int cells, 
dvander@180
    50
								 cell_t *source_addr, 
dvander@180
    51
								 cell_t *orig_addr, 
dvander@180
    52
								 int flags);
dvander@180
    53
public:
dvander@180
    54
	static CForward *CreateForward(const char *name, 
dvander@180
    55
								   ExecType et, 
dvander@180
    56
								   unsigned int num_params, 
dvander@180
    57
								   ParamType *types, 
dvander@180
    58
								   va_list ap);
dvander@180
    59
private:
dvander@180
    60
	void DumpAdditionQueue();
dvander@180
    61
	void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags);
dvander@180
    62
	inline int SetError(int err)
dvander@180
    63
	{
dvander@180
    64
		m_errstate = err;
dvander@180
    65
		return err;
dvander@180
    66
	}
dvander@180
    67
protected:
dvander@180
    68
	/* :TODO: I want a caching list type here.
dvander@180
    69
	 * Destroying these things and using new/delete for their members feels bad.
dvander@180
    70
	 */
dvander@180
    71
	List<IPluginFunction *> m_functions;
dvander@180
    72
dvander@180
    73
	/* Type and name information */
dvander@180
    74
	ParamType m_types[SP_MAX_EXEC_PARAMS];
dvander@180
    75
	char m_name[FORWARDS_NAME_MAX+1];
dvander@180
    76
	unsigned int m_numparams;
dvander@180
    77
	bool m_varargs;
dvander@180
    78
	ExecType m_ExecType;
dvander@180
    79
dvander@180
    80
	/* State information */
dvander@180
    81
	unsigned int m_curparam;
dvander@180
    82
	int m_errstate;
dvander@180
    83
	CStack<NextCallInfo> m_NextStack;
dvander@180
    84
	List<IPluginFunction *> m_AddQueue;
dvander@180
    85
	NextCallInfo m_CopyBacks;
dvander@180
    86
};
dvander@180
    87
dvander@180
    88
#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_