core/systems/ExtensionSys.h
author Scott Ehlert <ds@alliedmods.net>
Thu Mar 22 21:50:20 2007 +0000 (2007-03-22)
changeset 653 ef60870067ff
parent 397 d78fcaa24fbb
child 755 66c9fde7f632
permissions -rw-r--r--
More consistency of some sort...

Oh god, what has possessed me to do this?
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@298
    15
#ifndef _INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_
dvander@298
    16
#define _INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_
dvander@298
    17
dvander@298
    18
#include <IExtensionSys.h>
dvander@298
    19
#include <ILibrarySys.h>
dvander@298
    20
#include <sh_list.h>
dvander@298
    21
#include <sh_string.h>
dvander@298
    22
#include "sm_globals.h"
dvander@304
    23
#include "ShareSys.h"
dvander@304
    24
#include <ISmmAPI.h>
dvander@305
    25
#include <IPluginSys.h>
dvander@310
    26
#include <IRootConsoleMenu.h>
dvander@298
    27
dvander@298
    28
using namespace SourceMod;
dvander@298
    29
using namespace SourceHook;
dvander@298
    30
dvander@298
    31
class CExtension : public IExtension
dvander@298
    32
{
dvander@304
    33
	friend class CExtensionManager;
dvander@298
    34
public:
dvander@298
    35
	CExtension(const char *filename, char *error, size_t maxlen);
dvander@298
    36
	~CExtension();
dvander@298
    37
public: //IExtension
dvander@298
    38
	IExtensionInterface *GetAPI();
dvander@298
    39
	const char *GetFilename();
dvander@298
    40
	IdentityToken_t *GetIdentity();
dvander@298
    41
	bool IsLoaded();
dvander@304
    42
	ITERATOR *FindFirstDependency(IExtension **pOwner, SMInterface **pInterface);
dvander@304
    43
	bool FindNextDependency(ITERATOR *iter, IExtension **pOwner, SMInterface **pInterface);
dvander@304
    44
	void FreeDependencyIterator(ITERATOR *iter);
dvander@315
    45
	bool IsRunning(char *error, size_t maxlength);
dvander@298
    46
public:
dvander@298
    47
	void SetError(const char *error);
dvander@304
    48
	void AddDependency(IfaceInfo *pInfo);
dvander@304
    49
	void AddInterface(SMInterface *pInterface);
dvander@305
    50
	void AddPlugin(IPlugin *pPlugin);
dvander@305
    51
	void RemovePlugin(IPlugin *pPlugin);
dvander@315
    52
	void MarkAllLoaded();
dvander@298
    53
private:
dvander@298
    54
	IdentityToken_t *m_pIdentToken;
dvander@298
    55
	IExtensionInterface *m_pAPI;
dvander@298
    56
	String m_File;
dvander@298
    57
	ILibrary *m_pLib;
dvander@298
    58
	String m_Error;
dvander@304
    59
	List<IfaceInfo> m_Deps;
dvander@304
    60
	List<SMInterface *> m_Interfaces;
dvander@305
    61
	List<IPlugin *> m_Plugins;
dvander@315
    62
	List<const sp_nativeinfo_t *> m_Natives;
dvander@304
    63
	PluginId m_PlId;
dvander@311
    64
	unsigned int unload_code;
dvander@315
    65
	bool m_FullyLoaded;
dvander@298
    66
};
dvander@298
    67
dvander@298
    68
class CExtensionManager : 
dvander@298
    69
	public IExtensionManager,
dvander@305
    70
	public SMGlobalClass,
dvander@310
    71
	public IPluginsListener,
dvander@310
    72
	public IRootConsoleCommand
dvander@298
    73
{
dvander@298
    74
public: //SMGlobalClass
dvander@298
    75
	void OnSourceModAllInitialized();
dvander@298
    76
	void OnSourceModShutdown();
dvander@298
    77
public: //IExtensionManager
dvander@298
    78
	IExtension *LoadExtension(const char *path, 
dvander@298
    79
		ExtensionLifetime lifetime, 
dvander@298
    80
		char *error,
dvander@298
    81
		size_t err_max);
dvander@298
    82
	bool UnloadExtension(IExtension *pExt);
dvander@298
    83
	IExtension *FindExtensionByFile(const char *file);
dvander@298
    84
	IExtension *FindExtensionByName(const char *ext);
dvander@305
    85
public: //IPluginsListener
dvander@305
    86
	void OnPluginDestroyed(IPlugin *plugin);
dvander@310
    87
public: //IRootConsoleCommand
dvander@310
    88
	void OnRootConsoleCommand(const char *cmd, unsigned int argcount);
dvander@298
    89
public:
dvander@298
    90
	IExtension *LoadAutoExtension(const char *path);
dvander@304
    91
	void BindDependency(IExtension *pOwner, IfaceInfo *pInfo);
dvander@304
    92
	void AddInterface(IExtension *pOwner, SMInterface *pInterface);
dvander@305
    93
	void BindChildPlugin(IExtension *pParent, IPlugin *pPlugin);
dvander@315
    94
	void AddNatives(IExtension *pOwner, const sp_nativeinfo_t *natives);
dvander@315
    95
	void BindAllNativesToPlugin(IPlugin *pPlugin);
dvander@315
    96
	void MarkAllLoaded();
dvander@324
    97
	void AddDependency(IExtension *pSource, const char *file, bool required, bool autoload);
dvander@397
    98
	void TryAutoload();
dvander@298
    99
private:
dvander@311
   100
	CExtension *FindByOrder(unsigned int num);
dvander@311
   101
private:
dvander@298
   102
	List<CExtension *> m_Libs;
dvander@298
   103
};
dvander@298
   104
dvander@298
   105
extern CExtensionManager g_Extensions;
dvander@298
   106
dvander@298
   107
#endif //_INCLUDE_SOURCEMOD_EXTENSION_SYSTEM_H_