core/systems/PluginSys.h
author David Anderson <dvander@alliedmods.net>
Sat Nov 11 11:10:24 2006 +0000 (2006-11-11)
changeset 177 d29ade52d953
parent 176 c1699993453c
child 190 44cbb89d6a2d
permissions -rw-r--r--
Fleshed out forward system and extensively documented its design considerations
Implemented and did basic tests on new IPluginFunction type
Split function types into a separate file
dvander@173
     1
#ifndef _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_
dvander@173
     2
#define _INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_
dvander@173
     3
dvander@173
     4
#include <IPluginSys.h>
dvander@174
     5
#include <sh_list.h>
dvander@174
     6
#include <sh_stack.h>
dvander@173
     7
#include "sm_globals.h"
dvander@177
     8
#include "CFunction.h"
dvander@173
     9
dvander@174
    10
using namespace SourceHook;
dvander@174
    11
dvander@174
    12
#define SM_CONTEXTVAR_MYSELF	0
dvander@174
    13
dvander@173
    14
struct ContextPair
dvander@173
    15
{
dvander@173
    16
	ContextPair() : base(NULL), ctx(NULL)
dvander@173
    17
	{
dvander@173
    18
	};
dvander@173
    19
	IPluginContext *base;
dvander@173
    20
	sp_context_t *ctx;
dvander@173
    21
};
dvander@173
    22
dvander@173
    23
class CPlugin : public IPlugin
dvander@173
    24
{
dvander@174
    25
	friend class CPluginManager;
dvander@176
    26
	friend class CFunction;
dvander@173
    27
public:
dvander@174
    28
	virtual PluginType GetType() const;
dvander@173
    29
	virtual SourcePawn::IPluginContext *GetBaseContext() const;
dvander@173
    30
	virtual sp_context_t *GetContext() const;
dvander@173
    31
	virtual const sm_plugininfo_t *GetPublicInfo() const;
dvander@173
    32
	virtual const char *GetFilename() const;
dvander@173
    33
	virtual bool IsDebugging() const;
dvander@173
    34
	virtual PluginStatus GetStatus() const;
dvander@173
    35
	virtual bool SetPauseState(bool paused);
dvander@173
    36
	virtual unsigned int GetSerial() const;
dvander@173
    37
	virtual const sp_plugin_t *GetPluginStructure() const;
dvander@174
    38
	virtual IPluginFunction *GetFunctionByName(const char *public_name);
dvander@174
    39
	virtual IPluginFunction *GetFunctionById(funcid_t func_id);
dvander@173
    40
public:
dvander@173
    41
	static CPlugin *CreatePlugin(const char *file, 
dvander@173
    42
								bool debug_default, 
dvander@174
    43
								PluginType life, 
dvander@173
    44
								char *error, 
dvander@173
    45
								size_t maxlen);
dvander@173
    46
protected:
dvander@173
    47
	void UpdateInfo();
dvander@173
    48
private:
dvander@173
    49
	ContextPair m_ctx_current;
dvander@173
    50
	ContextPair m_ctx_backup;
dvander@174
    51
	PluginType m_type;
dvander@173
    52
	bool m_debugging;
dvander@173
    53
	char m_filename[PLATFORM_MAX_PATH+1];
dvander@173
    54
	PluginStatus m_status;
dvander@173
    55
	unsigned int m_serial;
dvander@173
    56
	sm_plugininfo_t m_info;
dvander@173
    57
	sp_plugin_t *m_plugin;
dvander@176
    58
	unsigned int m_funcsnum;
dvander@176
    59
	CFunction **m_priv_funcs;
dvander@176
    60
	CFunction **m_pub_funcs;
dvander@173
    61
};
dvander@173
    62
dvander@174
    63
class CPluginManager : public IPluginManager
dvander@174
    64
{
dvander@176
    65
	friend class CPlugin;
dvander@174
    66
public:
dvander@174
    67
	CPluginManager();
dvander@176
    68
	~CPluginManager();
dvander@174
    69
public:
dvander@174
    70
	class CPluginIterator : public IPluginIterator
dvander@174
    71
	{
dvander@174
    72
	public:
dvander@174
    73
		CPluginIterator(List<IPlugin *> *mylist);
dvander@174
    74
		virtual ~CPluginIterator();
dvander@174
    75
		virtual bool MorePlugins();
dvander@174
    76
		virtual IPlugin *GetPlugin();
dvander@174
    77
		virtual void NextPlugin();
dvander@174
    78
		virtual void Release();
dvander@174
    79
	public:
dvander@174
    80
		void Reset();
dvander@174
    81
	private:
dvander@174
    82
		List<IPlugin *> *mylist;
dvander@174
    83
		List<IPlugin *>::iterator current;
dvander@174
    84
	};
dvander@174
    85
	friend class CPluginManager::CPluginIterator;
dvander@174
    86
public:
dvander@174
    87
	virtual IPlugin *LoadPlugin(const char *path, 
dvander@174
    88
								bool debug,
dvander@174
    89
								PluginType type,
dvander@174
    90
								char error[],
dvander@174
    91
								size_t err_max);
dvander@174
    92
	virtual bool UnloadPlugin(IPlugin *plugin);
dvander@174
    93
	virtual IPlugin *FindPluginByContext(const sp_context_t *ctx);
dvander@174
    94
	virtual unsigned int GetPluginCount();
dvander@174
    95
	virtual IPluginIterator *GetPluginIterator();
dvander@174
    96
	virtual void AddPluginsListener(IPluginsListener *listener);
dvander@174
    97
	virtual void RemovePluginsListener(IPluginsListener *listener);
dvander@174
    98
protected:
dvander@174
    99
	void ReleaseIterator(CPluginIterator *iter);
dvander@176
   100
	CFunction *GetFunctionFromPool(funcid_t f, CPlugin *plugin);
dvander@176
   101
	void ReleaseFunctionToPool(CFunction *func);
dvander@174
   102
private:
dvander@174
   103
	List<IPluginsListener *> m_listeners;
dvander@174
   104
	List<IPlugin *> m_plugins;
dvander@174
   105
	CStack<CPluginManager::CPluginIterator *> m_iters;
dvander@176
   106
	CStack<CFunction *> m_funcpool;
dvander@174
   107
};
dvander@174
   108
dvander@174
   109
extern CPluginManager g_PluginMngr;
dvander@174
   110
dvander@173
   111
#endif //_INCLUDE_SOURCEMOD_PLUGINSYSTEM_H_