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