diff -r 9981b8ecf935 -r 31f49899c0ae core/systems/ForwardSys.h --- a/core/systems/ForwardSys.h Mon Nov 24 08:25:36 2008 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * SourceMod - * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ - -#ifndef _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_ -#define _INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_ - -#include -#include -#include "sm_globals.h" -#include -#include -#include "sourcemod.h" - -using namespace SourceHook; - -typedef List::iterator FuncIter; - -/* :TODO: a global name max define for sourcepawn, should mirror compiler's sNAMEMAX */ -#define FORWARDS_NAME_MAX 64 - -struct ByrefInfo -{ - unsigned int cells; - cell_t *orig_addr; - int flags; - int sz_flags; -}; - -struct FwdParamInfo -{ - cell_t val; - ByrefInfo byref; - ParamType pushedas; -}; - -class CForward : public IChangeableForward -{ -public: //ICallable - virtual int PushCell(cell_t cell); - virtual int PushCellByRef(cell_t *cell, int flags); - virtual int PushFloat(float number); - virtual int PushFloatByRef(float *number, int flags); - virtual int PushArray(cell_t *inarray, unsigned int cells, int flags); - virtual int PushString(const char *string); - virtual int PushStringEx(char *buffer, size_t length, int sz_flags, int cp_flags); - virtual void Cancel(); -public: //IForward - virtual const char *GetForwardName(); - virtual unsigned int GetFunctionCount(); - virtual ExecType GetExecType(); - virtual int Execute(cell_t *result, IForwardFilter *filter); -public: //IChangeableForward - virtual bool RemoveFunction(IPluginFunction *func); - virtual unsigned int RemoveFunctionsOfPlugin(IPlugin *plugin); - virtual bool AddFunction(IPluginFunction *func); - virtual bool AddFunction(IPluginContext *ctx, funcid_t index); - virtual bool RemoveFunction(IPluginContext *ctx, funcid_t index); -public: - static CForward *CreateForward(const char *name, - ExecType et, - unsigned int num_params, - const ParamType *types, - va_list ap); -private: - void _Int_PushArray(cell_t *inarray, unsigned int cells, int flags); - void _Int_PushString(cell_t *inarray, unsigned int cells, int sz_flags, int cp_flags); - inline int SetError(int err) - { - m_errstate = err; - return err; - } -protected: - /* :TODO: I want a caching list type here. - * Destroying these things and using new/delete for their members feels bad. - */ - mutable List m_functions; - mutable List m_paused; - - /* Type and name information */ - FwdParamInfo m_params[SP_MAX_EXEC_PARAMS]; - ParamType m_types[SP_MAX_EXEC_PARAMS]; - char m_name[FORWARDS_NAME_MAX+1]; - unsigned int m_numparams; - unsigned int m_varargs; - ExecType m_ExecType; - - /* State information */ - unsigned int m_curparam; - int m_errstate; -}; - -class CForwardManager : - public IForwardManager, - public IPluginsListener, - public SMGlobalClass -{ - friend class CForward; -public: - ~CForwardManager(); -public: //IForwardManager - IForward *CreateForward(const char *name, - ExecType et, - unsigned int num_params, - const ParamType *types, - ...); - IChangeableForward *CreateForwardEx(const char *name, - ExecType et, - int num_params, - const ParamType *types, - ...); - IForward *FindForward(const char *name, IChangeableForward **ifchng); - void ReleaseForward(IForward *forward); -public: //IPluginsListener - void OnPluginLoaded(IPlugin *plugin); - void OnPluginUnloaded(IPlugin *plugin); - void OnPluginPauseChange(IPlugin *plugin, bool paused); -public: //SMGlobalClass - void OnSourceModAllInitialized(); -protected: - CForward *ForwardMake(); - void ForwardFree(CForward *fwd); -private: - CStack m_FreeForwards; - List m_managed; - List m_unmanaged; -}; - -extern CForwardManager g_Forwards; - -#endif //_INCLUDE_SOURCEMOD_FORWARDSYSTEM_H_