core/systems/ForwardSys.h
author Borja Ferrer <faluco@alliedmods.net>
Sun Jul 15 01:04:34 2007 +0000 (2007-07-15)
changeset 1112 152ceef17866
parent 653 ef60870067ff
child 1231 17badaf66ce4
permissions -rw-r--r--
added amb292, optional natives
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@370
     3
 * ===============================================================
dvander@370
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     5
 * ===============================================================
dvander@370
     6
 *
dvander@370
     7
 * This file is not open source and may not be copied without explicit
dvander@370
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     9
 * in whole or significant part.
dvander@370
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    11
 *
dvander@370
    12
 * Version: $Id$
dvander@370
    13
 */
dvander@370
    14
dvander@180
    15
#ifndef _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
    16
#define _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_
dvander@180
    17
dvander@180
    18
#include <IForwardSys.h>
dvander@180
    19
#include <IPluginSys.h>
dvander@180
    20
#include "sm_globals.h"
dvander@180
    21
#include <sh_list.h>
dvander@180
    22
#include <sh_stack.h>
dvander@211
    23
#include "sourcemod.h"
dvander@180
    24
dvander@180
    25
using namespace SourceHook;
dvander@180
    26
dvander@180
    27
typedef List<IPluginFunction *>::iterator FuncIter;
dvander@180
    28
dvander@180
    29
//:TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX
dvander@180
    30
#define FORWARDS_NAME_MAX		64
dvander@180
    31
dvander@183
    32
struct ByrefInfo
dvander@180
    33
{
dvander@183
    34
	unsigned int cells;
dvander@183
    35
	cell_t *orig_addr;
dvander@183
    36
	int flags;
faluco@192
    37
	int sz_flags;
dvander@180
    38
};
dvander@180
    39
dvander@183
    40
struct FwdParamInfo
dvander@183
    41
{
dvander@183
    42
	cell_t val;
dvander@183
    43
	ByrefInfo byref;
dvander@183
    44
	ParamType pushedas;
dvander@183
    45
};
dvander@183
    46
dvander@183
    47
class CForward : public IChangeableForward
dvander@180
    48
{
dvander@180
    49
public: //ICallable
dvander@180
    50
	virtual int PushCell(cell_t cell);
ds@585
    51
	virtual int PushCellByRef(cell_t *cell, int flags);
dvander@180
    52
	virtual int PushFloat(float number);
ds@585
    53
	virtual int PushFloatByRef(float *number, int flags);
dvander@589
    54
	virtual int PushArray(cell_t *inarray, unsigned int cells, int flags);
dvander@180
    55
	virtual int PushString(const char *string);
faluco@192
    56
	virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags);
dvander@180
    57
	virtual void Cancel();
dvander@180
    58
public: //IForward
dvander@615
    59
	virtual const char *GetForwardName();
dvander@615
    60
	virtual unsigned int GetFunctionCount();
dvander@615
    61
	virtual ExecType GetExecType();
dvander@180
    62
	virtual int Execute(cell_t *result, IForwardFilter *filter);
dvander@180
    63
public: //IChangeableForward
dvander@180
    64
	virtual bool RemoveFunction(IPluginFunction *func);
dvander@180
    65
	virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin);
dvander@180
    66
	virtual bool AddFunction(IPluginFunction *func);
dvander@327
    67
	virtual bool AddFunction(IPluginContext *ctx, funcid_t index);
ds@621
    68
	virtual bool RemoveFunction(IPluginContext *ctx, funcid_t index);
dvander@180
    69
public:
dvander@180
    70
	static CForward *CreateForward(const char *name, 
dvander@180
    71
								   ExecType et, 
dvander@180
    72
								   unsigned int num_params, 
ds@559
    73
								   const ParamType *types, 
dvander@180
    74
								   va_list ap);
dvander@180
    75
private:
dvander@180
    76
	void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags);
faluco@192
    77
	void _Int_PushString(cell_t *inarray, unsigned int cells, int sz_flags, int cp_flags);
dvander@180
    78
	inline int SetError(int err)
dvander@180
    79
	{
dvander@180
    80
		m_errstate = err;
dvander@180
    81
		return err;
dvander@180
    82
	}
dvander@180
    83
protected:
dvander@180
    84
	/* :TODO: I want a caching list type here.
dvander@180
    85
	 * Destroying these things and using new/delete for their members feels bad.
dvander@180
    86
	 */
dvander@464
    87
	mutable List<IPluginFunction *> m_functions;
dvander@527
    88
	mutable List<IPluginFunction *> m_paused;
dvander@180
    89
dvander@180
    90
	/* Type and name information */
dvander@183
    91
	FwdParamInfo m_params[SP_MAX_EXEC_PARAMS];
dvander@180
    92
	ParamType m_types[SP_MAX_EXEC_PARAMS];
dvander@180
    93
	char m_name[FORWARDS_NAME_MAX+1];
dvander@180
    94
	unsigned int m_numparams;
dvander@183
    95
	unsigned int m_varargs;
dvander@180
    96
	ExecType m_ExecType;
dvander@180
    97
dvander@180
    98
	/* State information */
dvander@180
    99
	unsigned int m_curparam;
dvander@180
   100
	int m_errstate;
dvander@180
   101
};
dvander@180
   102
dvander@211
   103
class CForwardManager : 
dvander@211
   104
	public IForwardManager,
dvander@211
   105
	public IPluginsListener,
dvander@211
   106
	public SMGlobalClass
dvander@186
   107
{
dvander@186
   108
	friend class CForward;
faluco@641
   109
public:
faluco@641
   110
	~CForwardManager();
dvander@211
   111
public: //IForwardManager
faluco@430
   112
	IForward *CreateForward(const char *name, 
dvander@186
   113
		ExecType et, 
dvander@186
   114
		unsigned int num_params, 
ds@559
   115
		const ParamType *types, 
dvander@186
   116
		...);
faluco@430
   117
	IChangeableForward *CreateForwardEx(const char *name, 
dvander@186
   118
		ExecType et, 
dvander@186
   119
		int num_params, 
ds@559
   120
		const ParamType *types, 
dvander@186
   121
		...);
faluco@430
   122
	IForward *FindForward(const char *name, IChangeableForward **ifchng);
faluco@430
   123
	void ReleaseForward(IForward *forward);
dvander@211
   124
public: //IPluginsListener
faluco@430
   125
	void OnPluginLoaded(IPlugin *plugin);
faluco@430
   126
	void OnPluginUnloaded(IPlugin *plugin);
faluco@430
   127
	void OnPluginPauseChange(IPlugin *plugin, bool paused);
dvander@211
   128
public: //SMGlobalClass
faluco@430
   129
	void OnSourceModAllInitialized();
dvander@186
   130
protected:
dvander@186
   131
	CForward *ForwardMake();
dvander@186
   132
	void ForwardFree(CForward *fwd);
dvander@186
   133
private:
dvander@186
   134
	CStack<CForward *> m_FreeForwards;
dvander@186
   135
	List<CForward *> m_managed;
dvander@186
   136
	List<CForward *> m_unmanaged;
dvander@186
   137
};
dvander@186
   138
dvander@186
   139
extern CForwardManager g_Forwards;
dvander@186
   140
dvander@180
   141
#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_