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