core/systems/ForwardSys.h
author David Anderson <dvander@alliedmods.net>
Fri Dec 15 13:38:04 2006 +0000 (2006-12-15)
changeset 211 4c77142eaf36
parent 192 dee91851dcd4
child 327 e244337a9b38
permissions -rw-r--r--
Added global class initialization automation
Finalized basics of plugin loading
Began redoing how dependencies will be tracked
Renamed some bad names
Finished some stuff in ForwardSys
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@211
     9
#include "sourcemod.h"
dvander@180
    10
dvander@180
    11
using namespace SourceHook;
dvander@180
    12
dvander@180
    13
typedef List<IPluginFunction *>::iterator FuncIter;
dvander@180
    14
dvander@180
    15
//:TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX
dvander@180
    16
#define FORWARDS_NAME_MAX		64
dvander@180
    17
dvander@183
    18
struct ByrefInfo
dvander@180
    19
{
dvander@183
    20
	unsigned int cells;
dvander@183
    21
	cell_t *orig_addr;
dvander@183
    22
	int flags;
faluco@192
    23
	int sz_flags;
dvander@180
    24
};
dvander@180
    25
dvander@183
    26
struct FwdParamInfo
dvander@183
    27
{
dvander@183
    28
	cell_t val;
dvander@183
    29
	ByrefInfo byref;
dvander@183
    30
	ParamType pushedas;
dvander@183
    31
};
dvander@183
    32
dvander@183
    33
class CForward : public IChangeableForward
dvander@180
    34
{
dvander@180
    35
public: //ICallable
dvander@180
    36
	virtual int PushCell(cell_t cell);
dvander@180
    37
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@180
    38
	virtual int PushFloat(float number);
dvander@180
    39
	virtual int PushFloatByRef(float *number, int flags);
dvander@180
    40
	virtual int PushArray(cell_t *inarray, unsigned int cells, cell_t **phys_addr, int flags);
dvander@180
    41
	virtual int PushString(const char *string);
faluco@192
    42
	virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags);
dvander@180
    43
	virtual void Cancel();
dvander@180
    44
public: //IForward
dvander@180
    45
	virtual const char *GetForwardName();
dvander@180
    46
	virtual unsigned int GetFunctionCount();
dvander@180
    47
	virtual ExecType GetExecType();
dvander@180
    48
	virtual int Execute(cell_t *result, IForwardFilter *filter);
dvander@180
    49
public: //IChangeableForward
dvander@180
    50
	virtual bool RemoveFunction(IPluginFunction *func);
dvander@180
    51
	virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin);
dvander@180
    52
	virtual bool AddFunction(IPluginFunction *func);
dvander@180
    53
	virtual bool AddFunction(sp_context_t *ctx, funcid_t index);
dvander@180
    54
public:
dvander@180
    55
	static CForward *CreateForward(const char *name, 
dvander@180
    56
								   ExecType et, 
dvander@180
    57
								   unsigned int num_params, 
dvander@180
    58
								   ParamType *types, 
dvander@180
    59
								   va_list ap);
dvander@180
    60
private:
dvander@180
    61
	void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags);
faluco@192
    62
	void _Int_PushString(cell_t *inarray, unsigned int cells, int sz_flags, int cp_flags);
dvander@180
    63
	inline int SetError(int err)
dvander@180
    64
	{
dvander@180
    65
		m_errstate = err;
dvander@180
    66
		return err;
dvander@180
    67
	}
dvander@180
    68
protected:
dvander@180
    69
	/* :TODO: I want a caching list type here.
dvander@180
    70
	 * Destroying these things and using new/delete for their members feels bad.
dvander@180
    71
	 */
dvander@180
    72
	List<IPluginFunction *> m_functions;
dvander@180
    73
dvander@180
    74
	/* Type and name information */
dvander@183
    75
	FwdParamInfo m_params[SP_MAX_EXEC_PARAMS];
dvander@180
    76
	ParamType m_types[SP_MAX_EXEC_PARAMS];
dvander@180
    77
	char m_name[FORWARDS_NAME_MAX+1];
dvander@180
    78
	unsigned int m_numparams;
dvander@183
    79
	unsigned int m_varargs;
dvander@180
    80
	ExecType m_ExecType;
dvander@180
    81
dvander@180
    82
	/* State information */
dvander@180
    83
	unsigned int m_curparam;
dvander@180
    84
	int m_errstate;
dvander@180
    85
};
dvander@180
    86
dvander@211
    87
class CForwardManager : 
dvander@211
    88
	public IForwardManager,
dvander@211
    89
	public IPluginsListener,
dvander@211
    90
	public SMGlobalClass
dvander@186
    91
{
dvander@186
    92
	friend class CForward;
dvander@211
    93
public: //IForwardManager
dvander@186
    94
	virtual IForward *CreateForward(const char *name, 
dvander@186
    95
		ExecType et, 
dvander@186
    96
		unsigned int num_params, 
dvander@186
    97
		ParamType *types, 
dvander@186
    98
		...);
dvander@186
    99
	virtual IChangeableForward *CreateForwardEx(const char *name, 
dvander@186
   100
		ExecType et, 
dvander@186
   101
		int num_params, 
dvander@186
   102
		ParamType *types, 
dvander@186
   103
		...);
dvander@186
   104
	virtual IForward *FindForward(const char *name, IChangeableForward **ifchng);
dvander@186
   105
	virtual void ReleaseForward(IForward *forward);
dvander@211
   106
public: //IPluginsListener
dvander@211
   107
	virtual void OnPluginLoaded(IPlugin *plugin);
dvander@211
   108
	virtual void OnPluginUnloaded(IPlugin *plugin);
dvander@211
   109
public: //SMGlobalClass
dvander@211
   110
	virtual void OnSourceModAllInitialized();
dvander@211
   111
	virtual void OnSourceModShutdown();
dvander@186
   112
protected:
dvander@186
   113
	CForward *ForwardMake();
dvander@186
   114
	void ForwardFree(CForward *fwd);
dvander@186
   115
private:
dvander@186
   116
	CStack<CForward *> m_FreeForwards;
dvander@186
   117
	List<CForward *> m_managed;
dvander@186
   118
	List<CForward *> m_unmanaged;
dvander@186
   119
};
dvander@186
   120
dvander@186
   121
extern CForwardManager g_Forwards;
dvander@186
   122
dvander@180
   123
#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_